多数应用场景下,我们需要对重要数据进行备份、并放置到一个安全的地方,以备不时之需。
常见的 MySQL 数据备份方式有,直接打包复制对应的数据库或表文件(物理备份)、
mysqldump全量逻辑备份、xtrabackup增量逻辑备份等。常见的数据存储方式有,本机存储、FTP 上传到远程服务器、云存储(如阿里云OSS、七牛云存储等)、甚至本地也行。
我们可能不想每次都手动去备份,也不想每次都那么耗时间的去下载,也不想就放在服务器上丢了,因为我们需要异地备份。那我们可以尝试,写个脚本定时备份数据库,然后自动上传到指定服务器或云存储。
这里,我们说说 Linux 服务器下备份 MySQL 并上传到七牛云存储的方式。
备份肯定是以备不时之需,万一出了个啥意外,真就只能rm -rf,然后跑路咯!
手动备份谁都会,那我还写博客记录个啥啊,话不多说,上干货。
准备
-
crontab服务:定时服务,一般系统有自带,使用cron表达式计算时间。 -
gzip命令: 如果需要压缩就请保证能够正确正确执行gzip,不用压缩的话,要不要都不所谓。 -
mysqldump命令:相信都不陌生,mysql备份用的 -
qshell工具:qshell是七牛云官方利用七牛文档上公开的 API 实现的一个方便开发者测试和使用七牛 API 服务的命令行工具。详细参考. -
七牛云账号:其实就是用来储存的,谁便你用啥,有阿里的OSS,又拍云,七牛云,我这里选用的七牛云。七牛对个人提供10G的免费存储空间,可供我们个人使用。注册地址
存放私有数据的话创建一个私有的bucket就行,你要共有我也管不了对吧。
qshell安装配置
其实这些官方文档上都有,没办法啊,好人做到家。
-
//wget下载qshell安装包 wget http://devtools.qiniu.com/qshell-linux-x64-v2.4.0.zip //建议改个名字,不然有点长 mv qshell-linux-x64-v2.4.0.zip qshell.zip //准备unzip yum install unzip -
//解压 unzip -o -d ./qshell qshell.zip cd qshell //重命名 mv qshell-linux-x64-v2.4.0 qshell //添加配置项,方便全局都能使用qshell命令 vim ~/.bashrc //添加配置项 export PATH=$PATH:/root 你的解压目录 //使配置项生效 source ~/.bashrc -
然后你敲
qshell是可以看到命令提示的,说明安装好了。 -
然后我们需要配置账户:
qshell account ak sk nameak和sk为注册七牛云账号的key,name就为账号名称 随便叫啥都行 -
qshell user ls:可以列举账户下所有的账户信息 -
安装开启命令自动补全:
yum install bash-completion -y
到这里qshell的配置也就算是告一段落了。
shell脚本编写
创建存放脚本以及数据库dump备份文件存储目录地址:mkdir ~/data/backup/sql & mkdir ~/script
请先自行创建,不然后面报错你也会创建的
编辑备份脚本文件~/script/backup.sh,内容如下:
#!/bin/sh
# mysql data backup script
#
# use mysqldump --help,get more detail.
dbname=yourdatabasename
user=mysqluser
password=mysqlpassword
bakDir=~/data/backup/sql
logFile=~/data/backup/backup.log
datetime=`date +%Y%m%d%H%M%S`
keepDay=7
echo "-------------------------------------------" >> $logFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $logFile
echo "--------------------------" >> $logFile
cd $bakDir
bakFile=$dbname.$datetime.sql.gz
mysqldump -u$user -p$password $dbname | gzip > $bakFile
echo "数据库 [$dbname] 备份完成" >> $logFile
echo "$bakDir/$bakFile" >> $logFile
echo "开始上传备份文件至七牛云存储" >> $logFile
/root/qshell/qshell rput backup database/$bakFile $bakFile --overwrite | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" >> $logFile 2>&1
echo "删除${keepDay}天前的备份文件" >> $logFile
find $bakDir -ctime +$keepDay >> $logFile
find $bakDir -ctime +$keepDay -exec rm -rf {} \;
echo " " >> $logFile
echo " " >> $logFile
当时我处理的时候瞬间懵逼了,我TM用的是Docker啊,宿主机上是没有mysql的怎么搞。
凡事不要慌,冷静、思考 想想还有什么解决方案:
docker exec -i mysql bin/bash进入容器运行mysqldump然后docker cp 出来在进行备份,其实这样也不是不行,再来看看下面的方式。
#!/bin/sh
# mysql data backup script
#
# use mysqldump --help,get more detail.
dbname=yourdatabasename
user=mysqluser
password=mysqlpassword
bakDir=~/data/backup/sql
logFile=~/data/backup/backup.log
datetime=`date +%Y%m%d%H%M%S`
keepDay=7
echo "-------------------------------------------" >> $logFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $logFile
echo "--------------------------" >> $logFile
cd $bakDir
bakFile=$dbname.$datetime.sql.gz
docker exec -i mysql mysqldump -u$user -p$password $dbname | gzip > $bakFile
echo "数据库 [$dbname] 备份完成" >> $logFile
echo "$bakDir/$bakFile" >> $logFile
echo "开始上传备份文件至七牛云存储" >> $logFile
/usr/local/cloudtour/qshell/qshell rput yazhilv-backup database/$bakFile $bakFile --overwrite | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" >> $logFile 2>&1
echo "删除${keepDay}天前的备份文件" >> $logFile
find $bakDir -ctime +$keepDay >> $logFile
find $bakDir -ctime +$keepDay -exec rm -rf {} \;
echo " " >> $logFile
echo " " >> $logFile
注意:是docker exec -i 千万不要 docker exec -it -it进入容器不会继续执行了。
这总方式其实跟我一开始想的没什么区别,docker exec执行的直接打包在宿主机,省去了 docker cp 这一步
你可以查看logfile其实也就是shell脚本种输出的东西。
你可以先运行一下脚本查看一下是否执行成功:./backup.sh
如果没问题就可以添加定时任务了,将backup.sh脚本添加到crontab定时器中去执行:
-
cd /etc/cron.d -
vim backup.cron:添加如下内容#每天凌晨2点执行备份脚本 0 2 * * * /root/data/script/backup.sh -
crontab backup.cron crontab -l #查看定时任
cron 表达式的详细用法请自行百度。
不出意外,七牛云上已经有备份的sql了。
END
最后特别说一下qshell 是七牛云的一个命令行工具,用go语言编写。我挺看好这门语言的,说不出为什么,可能是logo的地鼠太萌了。