定时备份mysql(docker)并上传至OSS(七牛云)

多数应用场景下,我们需要对重要数据进行备份、并放置到一个安全的地方,以备不时之需。

常见的 MySQL 数据备份方式有,直接打包复制对应的数据库或表文件(物理备份)、mysqldump 全量逻辑备份、xtrabackup 增量逻辑备份等。

常见的数据存储方式有,本机存储、FTP 上传到远程服务器、云存储(如阿里云OSS、七牛云存储等)、甚至本地也行。

我们可能不想每次都手动去备份,也不想每次都那么耗时间的去下载,也不想就放在服务器上丢了,因为我们需要异地备份。那我们可以尝试,写个脚本定时备份数据库,然后自动上传到指定服务器或云存储。

这里,我们说说 Linux 服务器下备份 MySQL 并上传到七牛云存储的方式。

备份肯定是以备不时之需,万一出了个啥意外,真就只能rm -rf,然后跑路咯!

手动备份谁都会,那我还写博客记录个啥啊,话不多说,上干货。

准备

  • crontab 服务:定时服务,一般系统有自带,使用cron表达式计算时间。

  • gzip 命令: 如果需要压缩就请保证能够正确正确执行gzip,不用压缩的话,要不要都不所谓。

  • mysqldump 命令:相信都不陌生,mysql备份用的

  • qshell 工具: qshell 是七牛云官方利用七牛文档上公开的 API 实现的一个方便开发者测试和使用七牛 API 服务的命令行工具。详细参考.

  • 七牛云账号:其实就是用来储存的,谁便你用啥,有阿里的OSS,又拍云,七牛云,我这里选用的七牛云。七牛对个人提供10G的免费存储空间,可供我们个人使用。注册地址

存放私有数据的话创建一个私有的bucket就行,你要共有我也管不了对吧。

qshell安装配置

其实这些官方文档上都有,没办法啊,好人做到家。

  1. //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
    
  2. //解压
    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
    
  3. 然后你敲qshell是可以看到命令提示的,说明安装好了。

  4. 然后我们需要配置账户:qshell account ak sk name ak和sk为注册七牛云账号的key,name就为账号名称 随便叫啥都行

  5. qshell user ls:可以列举账户下所有的账户信息

  6. 安装开启命令自动补全: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的地鼠太萌了。