定时备份docker部署Mysql脚本
一、说明
数据库中的数据作为软件系统最重要的部分,如何做好数据库备份特别重要,本文主要是介绍两个脚本:
- 定时备份Mysql脚本:
定时备份Docker中Mysql的数据库并将sql传输到另一个服务器(这样可以保证及时一个服务器硬件出现问题,也可以保证数据最多丢失一天的数据); - 定时恢复Mysq:
定时恢复sql文件到Docker中的mysql数据库中。
二、备份sql脚本
#!/bin/bash
# 查询容器id mysq_mysql为我的mysql数据容器名称前缀
CONTAINER_ID=`docker ps -a | grep "mysql_mysql" | awk '{print $1}' | head -n 1`
# mysql 账号
MYSQL_USERNAME="username"
#mysql 密码
MYSQL_PASSWORD="password"
#备份sql目录
data_dir="/usr/local/fengpin-soft/mysql/deploy/backups/sql/"
#查询所有数据库包含prod的数据库
databases=`docker exec -i $CONTAINER_ID mysql --user=$MYSQL_USERNAME -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)" | grep "prod"`
#回显所有查询出来数据库
echo "生产数据库有:$databases;"
#循环备份数据库
for db in $databases; do
echo "备份$db数据库"
docker exec -i $CONTAINER_ID mysqldump -u$MYSQL_USERNAME -p$MYSQL_PASSWORD --quick -C --default-character-set=utf8 --databases $db > "$data_dir/$db`date +%Y%m%d`.sql"
#将当天备份的所有文件传输到其他服务器
echo ---------------------scp to otherserver start --------------------
# 利用expect将备份的sql发送到其他服务器
expect -c "
spawn scp $data_dir/$db`date +%Y%m%d`.sql root@192.168.100.98:/usr/local/backups/99mysqlbackups/
expect {
\"*assword\" {set timeout 300; send \"另一个服务器密码\r\"; exp_continue;}
\"yes/no\" {send \"yes\r\";}
}
expect eof"
echo ---------------------scp to otherserver end --------------------
done
# 如果程序执行出错 发送邮件
if [ $? -ne 0 ];then
# 任务失败,发送邮件
echo -e "执行数据库任务失败" | mail -s '执行数据库任务失败' 719535422@qq.com
exit -1
fi
#删除所有日期超过15天的备份文件
find $data_dir -mtime +15 -name '*.sql' -exec rm -rf {} \;
三、添加定时任务
# 编辑定时任务,在命令行输入
crontab -e
# 按 i 键进入编辑模式,添加定时任务,执行刚才的脚本,并将日志输出到mysql_dumps.log文件中
0 13 * * * sh /usr/local/fengpin-soft/mysql/deploy/backups/sh/mysql_dumps.sh > /usr/local/fengpin-soft/mysql/deploy/backups/sh/mysql_dumps.log 2>&1
# 按ESC 输入 :wq退出即可
四、 恢复脚本
#!/bin/bash
#查询mysql的容器id
CONTAINER_ID=`docker ps -a | grep "mysql_mysql" | awk '{print $1}' | head -n 1`
# mysql 账号
MYSQL_USERNAME="username"
#mysql 密码
MYSQL_PASSWORD="password"
#要恢复的sql文件名称,根据备份脚本文件名称: 数据库名+日期.sql
FILENAME=gen_back_prod`date +%Y%m%d`.sql
echo "开始恢复sql到公司生产数据库"
echo "]备份数据库文件名为$FILENAME"
#备份sql目录
data_dir="/usr/local/fengpin-soft/mysql/deploy/backups/hncloudsql/"
# 恢复sql到mysql相应数据库中
docker exec -i $CONTAINER_ID mysql -u$MYSQL_USERNAME -p$MYSQL_PASSWORD gen_back_prod < "$data_dir/$FILENAME"
echo "结束恢复sql到公司生产数据库"
#如果执行出现异常则发送邮件
if [ $? -ne 0 ];then
# 任务失败,发送邮件
echo -e "执行数据库任务失败" | mail -s '执行数据库任务失败' 719535422@qq.com
exit -1
fi
#删除所有日期超过15天的备份文件
find $data_dir -mtime +15 -name '*.sql' -exec rm -rf {} \;
# 添加定时任务和备份相同操作