最近业务中遇到需要对数据库进行定时备份的情况,但是数据库是docker启动的mysql镜像,查找一番资料后找到下面这种方便快捷的方式。

docker启动的mysql备份脚本

这里的容器名称和密码替换成自己的,同时还使用-mtime +30 -delete删除最后修改时间为30天的文件,方式备份太多吧硬盘撑爆。

#!/bin/bash
#定义备份文件的名称
BACKUP_NAME=$(date +"%Y%m%d%H%M%S").sql
#定义备份目录
BACKUP_DIR=/mysql/backup
#定义容器名称
CONTAINER_NAME=mysql
#执行备份命令
docker exec $CONTAINER_NAME /usr/bin/mysqldump -u root --password=password chatgpt > $BACKUP_DIR/$BACKUP_NAME
#压缩备份文件
gzip $BACKUP_DIR/$BACKUP_NAME
#删除一个月前的备份
find $BACKUP_DIR -type f -name "*.gz" -mtime +30 -delete
#记录备份日志到out.log文件
echo "Backup completed at $(date)" >> $BACKUP_DIR/out.log

定时任务设置

使用常用的crontab进行定时任务执行。

crontab -e
#最后一行加上
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
0 2 * * * /mysql/backup/backup.sh

使用rsync将数据库备份文件异地同步

在源服务器上生成SSH Key:

ssh-keygen -t rsa

将公钥文件拷贝到目标服务器上:

ssh-copy-id user@backup_server

ssh-copy-id user@backup_server 命令是将本地机器的公钥拷贝到远程服务器上的 ~/.ssh/authorized_keys 文件中,从而实现免密码登录远程服务器。

具体来说,当我们通过 ssh 登录远程服务器时,通常需要输入密码。但是,如果在本地机器生成公钥,并将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中,那么就可以实现免密码登录。ssh-copy-id 命令就是帮助我们实现这个过程的。执行这个命令后,会要求输入远程服务器的密码,然后自动将本地机器的公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中。这样,在下一次登录远程服务器时,就可以直接免密码登录了。

使用rsync进行同步时,加上-e选项指定使用SSH协议,并且不需要输入密码:

rsync -avz --delete -e "ssh -i /path/to/private/key" /mysql/backup user@backup_server:/mysql/rsync

在使用rsync命令进行远程同步时,-e选项可以指定使用的远程shell程序。在上面的命令中,使用了ssh作为远程shell程序,并且使用了-i选项指定了ssh私钥文件的路径,即ssh -i /path/to/private/key。这个选项表示使用指定路径下的私钥文件进行ssh连接,可以避免在每次连接时输入密码。

完善定时执行脚本,将同步指令加进去

#!/bin/bash
#定义备份文件的名称
BACKUP_NAME=$(date +"%Y%m%d%H%M%S").sql
#定义备份目录
BACKUP_DIR=/mysql/backup
#定义容器名称
CONTAINER_NAME=mysql
#执行备份命令
docker exec $CONTAINER_NAME /usr/bin/mysqldump -u root --password=password chatgpt > $BACKUP_DIR/$BACKUP_NAME
#压缩备份文件
gzip $BACKUP_DIR/$BACKUP_NAME
#删除一个月前的备份
find $BACKUP_DIR -type f -name "*.gz" -mtime +30 -delete
#记录备份日志到out.log文件
echo "Backup completed at $(date)" >> $BACKUP_DIR/out.log
#同步文件
rsync -avz --delete -e "ssh -i /path/to/private/key" /mysql/backup user@backup_server:/mysql/rsync
#记录同步日志到out.log文件
echo "Rsync completed at $(date)" >> $BACKUP_DIR/out.log