概述

环境: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点执行:

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

注意:

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