主要是 mysql 数据库数据备份以及 /opt/metersphere/data 路径下的 body 和 jar 目录备份
手动备份
#数据库备份:
docker exec -i mysql mysqldump -uroot -pPassword123@mysql metersphere > metersphere.sql
#body/jar 目录备份
zip -r XXX.zip /opt/metersphere/data/body /opt/metersphere/data/jar
若备份数据库时出现mysqldump: Error 2020: Got packet bigger than ‘max_allowed_packet’ bytes when dumping tableapi_scenario_report_detailat row: 94,则添加max_allowed_packet参数,如下:
docker exec -i mysql mysqldump -uroot -pPassword123@mysql metersphere --max_allowed_packet=2G > metersphere.sql
定时任务自动备份
1. 备份
备份脚本默认保留最近的7份备份文件(如每天备份一次,则保留最近7天的备份文件)。为加强数据的安全性,备份脚本中采取本地加远程备份两种策略。远程备份默认未开启,如果需要开启异地备份,可以将 ms_backup.sh 脚本中 isRemote 值修改为 true。脚本备份方式周一到周六是精简备份,周未为全量备份。
1.1 主从复制
数据库搭建主从节点即可。
1.2 异地主机备份
1.2.1 准备⼯作:配置远程机器免密登录
1#本地机器:数据库所在的机器
#远程机器:存放备份⽂件的机器
#1、远程机器执⾏
mkdir -p ~/.ssh
chmod 764 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys
2、本地机器执⾏
ssh-keygen #此处会提示输⼊密码 可以直接回⻋跳过
cd ~/.ssh/
scp id_rsa.pub root@远程服务器ip:~/.ssh/
3、远程机器执⾏,将公钥追加⾄⽂件末尾
cat id_rsa.pub >> authorized_keys
4、本地机器验证免密登录远程机器
ssh root@远程服务器ip
1.2.2 创建备份脚本
在本地服务器创建名为 ms_backup.sh 备份脚本
#!/bin/bash
#历史备份数据保留天数
keepBackupNum=7
#备份文件输出目录
backupDir=/opt/db_bak
#数据库用户名
username=root
#数据库密码
password=Password123@mysql
#需要备份的库名
dbName=metersphere
#备份文件的后缀名称
currentTime=`date "+%Y-%m-%d-%H-%M-%S"`
#备份文件的完整名称
backupTarFileName=ms_db_$currentTime.tar.gz
#导出sql文件的完整名称
dumpSqlFilePath=$backupDir/ms_db_$currentTime.sql
#是否使用远程备份
isRemote=false
#推送远程服务器ip地址
remoteIp=10.1.12.13
#推送远程服务器用户名
remoteUser=root
#推送远程服务器目录
remotePath=/opt/db_back/28082
#数据库是否内置
isBuiltIn=true
#设置周天全量备份
DAY_OF_WEEK=$(date +%u)
echo dumpSqlFilePath=$dumpSqlFilePath
#没有备份文件夹则创建
if [ ! -d "$backupDir" ];then
mkdir -p "$backupDir"
else
echo "--------------开始进行备份-----------------"
fi
if [ "${isBuiltIn}" = "true" ]; then
if [ "${DAY_OF_WEEK}" = "7" ]; then
#内置全量备份
echo "内置全量备份"
docker exec -i mysql mysqldump -u${username} -p${password} ${dbName} --max_allowed_packet=2G > $dumpSqlFilePath
else
echo "内置精简备份"
#内置精简数据备份(忽略报告数据、操作日志、消息通知的信息)
docker exec -i mysql mysqldump -u${username} -p${password} ${dbName} --ignore-table=metersphere.operating_log --ignore-table=metersphere.notification --ignore-table=metersphere.api_scenario_report_detail --ignore-table=metersphere.api_scenario_report_result --ignore-table=metersphere.api_scenario_report_structure --max_allowed_packet=2G > $dumpSqlFilePath
fi
else
if [ "${DAY_OF_WEEK}" = "7" ]; then
#外置全量备份
mysqldump -u${username} -p${password} ${dbName} --max_allowed_packet=2G > $dumpSqlFilePath
else
#外置精简数据备份(忽略报告数据、操作日志、消息通知的信息)
mysqldump -u${username} -p${password} ${dbName} --ignore-table=metersphere.operating_log --ignore-table=metersphere.notification --ignore-table=metersphere.api_scenario_report_detail --ignore-table=metersphere.api_scenario_report_result --ignore-table=metersphere.api_scenario_report_structure --max_allowed_packet=2G > $dumpSqlFilePath
fi
fi
cd $backupDir
tar zcvf $backupTarFileName $dumpSqlFilePath
if [ "${isRemote}" = "true" ]; then
#发送备份文件到远程机器
scp $backupTarFileName $remoteUser@$remoteIp:$remotePath 2>> "error.log"
if [ $? -eq 0 ]; then
echo "---------------远程备份完成----------------"
else
echo "---------------远程备份失败----------------"
fi
fi
rm -rf $backupDir/ms_db_$currentTime.sql
#remove outdated backup files
output=`ls -lt $backupDir/*.tar.gz | awk '{print $9}'`
step=0
echo "---------------开始清理$keepBackupNum天前备份数据----------------"
for backupFile in $output ;do
step=$((step+1))
echo step=$step
echo $backupFile
if [ $step -gt $keepBackupNum ];then
echo Remove outdated backup $backupFile
rm -rf $backupFile
fi
done
echo "---------------结束清理$keepBackupNum天前备份数据----------------"
2.3 创建定时任务
在本地服务器创建名为 install_ms_backup.sh 定时任务脚本
#!/bin/bash
#每天凌晨⼀点执⾏备份脚本
chmod +x /opt/db_bak/ms_backup.sh
timedate_fields="0 1 * * *"
cmd="bash /opt/db_bak/ms_backup.sh"
crontab -l | grep "$cmd " > /dev/null 2>&1
if test $? -ne 0; then
crontab -l > crontab.tmp
echo "$timedate_fields $cmd" >> crontab.tmp
crontab crontab.tmp
fi
2.3 执行定时任务脚本
chmod +x ms_backup.sh.sh
chmod +x install_ms_backup.sh
sh install_ms_backup.sh