背景:
在做自动化测试过程中,会涉及到环境数据库快照的备份和还原。sqlServer还比较简单,执行下快照备份还原即可。mysql稍微麻烦点,因为自身自带的备份和还原都太慢了效率过低,这里需要用到外挂mydumper和myloader进行多线程的备份还原,提高效率。
一、SQlServer
sqlServer比较简单,方式也比较多,如果jenkins对应的运行节点是windows,直接在windows中存放快照备份还原的sql脚本文件,然后再jenkins中执行bat命令即可。如果运行节点是Linux, 也可以运行sql文件,还可以通过docker容器运行。
Windows:
set osql="C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\OSQL.exe"
echo "=========清理日志文件==========="
cd /d D:\sql
%osql% -S 10.5.11.110\sql2016 -U sa -P Mysoft95938 -d AutoTest_RegressionTest -i .\restore.sql
Linux:
touch 还原数据库脚本.sh
cat>>还原数据库脚本.sh<<EOF
sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
-p 1433:1433 --name sql-tools -h sql-tools -d mcr.microsoft.com/mssql/server:2019-latest
sudo docker exec -i sql-tools /opt/mssql-tools/bin/sqlcmd -S 10.5.11.110 -U sa -P "Mysoft95938" \
-Q "USE master
GO
ALTER DATABASE [AutoTest_OP_FW0506] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
RESTORE DATABASE [AutoTest_OP_FW0506] FROM DATABASE_SNAPSHOT = 'AutoTest_OP_FW0506_snapshot' ;
GO
ALTER DATABASE [AutoTest_OP_FW0506] SET MULTI_USER WITH ROLLBACK IMMEDIATE;"
sudo docker stop sql-tools
sudo docker rm /sql-tools
EOF
echo ---------脚本赋权----------
chmod 777 还原数据库脚本.sh
echo ---------执行脚本----------
sh 还原数据库脚本.sh
rm 还原数据库脚本.sh
二、Mysql
2.1 mysql使用mydumper进行备份:
cd ~/data/dbBak
rm -r -f testCreateBak.log
#rm -rf ${bakFileName}
touch testCreateBak.log
mydumper -h ${host} -P ${port} -u ${userName} -p ${password} --database ${dbName} -o ~/data/dbBak/${bakFileName} -c -e -G -E -R -t 100 --long-query-guard 7200 --complete-insert -v 3 --logfile testCreateBak.log &
# 读取日志文件最后一行,判备份是否结束
completeMark='Finished dump'
flag=false
# 指定时间内循环操作,直到最后一行标志为备份结束
time0=$(date "+%s")
echo $time0
while((($(date "+%s")-time0)<=300))
do
lastLine=$(tail testCreateBak.log)
if [[ $lastLine =~ $completeMark ]]
then
echo "备份结束!"
flag=true
break
elif [[ $lastLine =~ 'ERROR' ]]
then
echo "备份失败!"
exit 1
break
else
echo "备份进行中!"
sleep 5
fi
done
if [ $flag == 'false' ]
then
exit 1
fi
2.2 使用myloader进行数据库还原:
cd ~/data/dbBak
rm -r -f testRecoverDB.log
touch testRecoverDB.log
myloader -h ${host} -P ${port} -u ${userName} -p ${password} --database ${dbName} -d ~/data/dbBak/${bakFileName} -o -t 100 -v 3 --logfile testRecoverDB.log &
# 读取日志文件最后一行,判断还原是否结束
completeMark='Starting table checksum verificatio'
# 指定时间内循环操作,直到最后一行标志为还原结束
time0=$(date "+%s")
echo $time0
while((($(date "+%s")-time0)<=600))
do
lastLine=$(tail testRecoverDB.log)
if [[ $lastLine =~ $completeMark ]]
then
echo "还原结束!"
break
elif [[ $lastLine =~ 'ERROR' ]]
then
echo "还原失败!"
exit 1
else
echo "还原进行中!"
sleep 5
fi
done