方案
以一天一次的频率,在每天凌晨2:00备份生产环境数据库至文件服务器。为保证备份文件不过多占用文件服务器空间,备份文件以tgz压缩包格式保存且只保存7天的备份文件。另外每次备份都保存备份日志,一旦出现备份不成功等意外情况保证有据可查。
实现思路
在文件服务器上,编写备份shell脚本,以mysqldump方式远程备份正式环境mysql中的生产数据库,压缩备份好的sql文件,再删除源文件。然后文件试服务器上设置定时任务,每天2:00执行该脚本。一旦正式环境数据库出现异常,则解压最近的备份压缩包,然后在测试服务器使用备份sql远程对正式环境数据库进行还原。脚本内容如下
#! /bin/bash
#备份文件存放目录,自行修改
BakDir=/home/mysql/backup
#备份日志文件,自行修改
LogFile=/home/mysql/bak.log
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
#可使用whereis命令查看本地mysqldump全路径进行替换
#修改-u -p -h后的数据用户名、密码、服务器地址,以及将mysql替换为要备份数据库名
/usr/bin/mysqldump -uroot -proot -hlocalhost mysql --quick >$DumpFile
#替换tar全路径
/usr/bin/tar -zvcf $GZDumpFile $Date.sql
#替换rm全路径
/usr/bin/rm $DumpFile
End=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin 结束:$End $GZDumpFile succ >>$LogFile
filenum=`find $BakDir -name "*.sql.tgz*" | wc -l`
if [ $filenum -gt 7 ]; then
filenum=`find $BakDir -mtime +7 -name "*.sql.tgz*" -exec rm -f {} \;`
fi
操作
1.在测试服务器上新建存放备份文件和日志文件的目录
2.根据注释修改backup.sh的相应数值,将backup.sh复制到测试服务器上。(修改完后需手动执行backup.sh验证修改是否正确,正确情况下会产生一个bak.log日志文件及tgz备份文件)
3.在测试服务器上设置定时任务 ①crontab -e进入任务编辑器 ②编辑内容 0 2 * * * /home/mysql/backup.sh(后面修改为测试服务器上backup.sh文件的路径) ③保存编辑任务退出 ④ systemctl restart crond重启定时任务服务
4.为防止出现测试服务器重启定时任务不启动,导致shell脚本失效的情况,需保证定时任务服务在开机启动项中 ①systemctl list-unit-files | grep enable查看是否有crond.service服务 ②如果没有则执行命令systemctl enable crond将定时任务加到开机启动项中
5.当出现需要还原数据库的情况时 ① 解压备份压缩文件tar -zxvf FileName.sql.tgz(最新备份文件名) ② 使用备份文件还原数据 mysql -uroot -proot -hlocalhost jeeplus_dj <20191021.sql(解压后备份文件,修改前面对应参数)
一切操作完成后,可通过修改定时任务执行时间及备份文件名称快速生成多个备份文件,进行验证。这种操作较繁琐。也可在操作完成后几天关注备份生成情况及备份日志验证操作正确性。