最近业务中遇到需要对数据库进行定时备份的情况,但是数据库是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