概述

环境:docker
数据库版本:mysql 5.7.34
目的:每天定时把一个库的数据备份到本机里。
容器名称:mysql
备份目录:/data/backup
由于mysqldump的时候会要求输入密码,无法做到自动备份。本案例通过++docker的exec执行容器命令的方式创建login-path和实现自动备份。++

1.创建login-path

login-path是MySQL5.6开始支持的新特性。通过借助mysql_config_editor工具将登陆MySQL服务的认证信息加密保存在.mylogin.cnf文件(默认位于用户主目录) 。之后,MySQL客户端工具可通过读取该加密文件连接MySQL,避免重复输入登录信息。创建方法如下:

docker exec -it mysql mysql_config_editor set --login-path=root_login --host=10.1.0.1 --user=root --password

这里会要求输入一次密码。
创建完后,在容器里的/root目录里创建一个.mylogin.cnf文件。查看文件如下:

docker exec -it mysql ls -la /root/.mylogin.cnf
-rw------- 1 root root 136 Apr 22 21:28 /root/.mylogin.cnf

其中可配置项
-h,--host=name 添加host到登陆文件中
-G,--login-path=name 在登录文件中为login path添加名字(默认为client)
-p,--password 在登陆文件中添加密码(该密码会被mysql_config_editor自动加密)
-u,--user 添加用户名到登陆文件中
-S,--socket=name 添加sock文件路径到登陆文件中
-P,--port=name 添加登陆端口到登陆文件中

关于 mysql_config_editor 的其他用法:

显示指定用户的login-path的配置:

mysql_config_editor print --login-path=root_login

显示所有用户的login-path的配置:

mysql_config_editor print --all

删除指定用户的login-path的配置:

mysql_config_editor remove --login-path=root_login

2. 备份数据

创建完login-path后,执行mysqldump的时候通过指定login-path就可以直接备份了。命令如下:

docker exec -it mysql mysqldump --login-path=root_login blog_db > /data/backup/blog_db_$(date +%Y%m%d).sql

3. 定时执行

执行完mysqldump后,就可以在本机的/data/backup目录上看到这个备份的文件了。
把命令写到 /etc/crontab定时每天凌晨3点执行:

00 03 * * * root /usr/bin/docker exec mysql mysqldump --login-path=root_login blog_db > /data/backup/blog_db_$(date +\%Y\%m\%d).sql'

注意:

  1. 由于这个login-path是放在容器里,当容器删除的时候就会消失。
  2. crontab里的%需要加\进行转移,不然定时任务执行不成功。

如果是在系统上的mysqldump进行备份,则可以这样设置crontab:

00 03 * * * root  HOME=/root  /usr/bin/mysqldump --login-path=root_login blog_db > /data/db_backup/blog_$(date +\%Y\%m\%d_\%H\%M\%S).sql 

cron 执行任务时,环境变量非常“干净”,$HOME可能不是你以为的那个用户目录。不过如果你已经把 HOME=/root设对了,并且凭证文件就在/root/.mylogin.cnf,通常不需要再额外设置 MYSQL_TEST_LOGIN_FILE,否则就还需要设置MYSQL_TEST_LOGIN_FILE指定 .mylogin.cnf 文件位置。