背景

由于个人项目预算有限,把mysql和应用程序都跑在同一台阿里云ECS机器上面,就在昨天(2023年12月21日) ,服务器突然出现问题 进程全部挂掉了,服务器也无法重启,找工程师排查后发现是系统磁盘挂载出现了问题,好在恢复后数据都还在,数据没有丢失真是万幸。如果数据丢了那就game over了。想着把数据定时备份到百度云盘中。做一下记录。

安装bypy

Linux系统数据同步百度云盘使用的是一个python写的sdk包 bypy 看起来不算是官方开发的。

这里使用python3的pip3来安装。python2貌似不行 没有整成功。

安装bypy

pip3 install bypy

执行完命令输出如下字样 表示成功,如果不成功可能是python版本问题,具体问题需要具体搜索一下。

Installing collected packages: dill, multiprocess, requests-toolbelt, bypy
Successfully installed bypy-1.8.2 dill-0.3.4 multiprocess-0.70.12.2 requests-toolbelt-1.0.0

安装 requests

pip3 install requests

输入bypy -V命令能输出版本号表示安装成功

bypy -V
bypy v1.8.2

使用bypy工具命令

bypy info 空间使用信息

首次使用bypy info命令的时候 会引导做一个oauth2的授权操作。效果如下 把命令行中的地址复制过浏览器中进行一个授权操作,允许授权后浏览器中会显示授权码,把授权码输入到命令行中,回车等返回空间信息就行了。

bypy info
Please visit:
https://openapi.baidu.com/oauth/2.0/authorize?client_id=q8WE4EpCsau1oS0MplgMKNBn&response_type=code&redirect_uri=oob&scope=basic+netdisk
And authorize this app
Paste the Authorization Code here within 10 minutes.
Press [Enter] when you are done
e205719ee8deed8c36e4ebddd8ed8a23 ---授权码在这里输入
Authorizing, please be patient, it may take upto 300 seconds...
Quota: 5.000GB
Used: 2.506GB
bypy upload 上传文件

上传test.sh到云盘

bypy upload test.sh
bypy list 查看文件列表
bypy list
/apps/bypy ($t $f $s $m $d):
F 2023-12-22-13-07.tar.gz 248551123 2023-12-22, 13:24:46 333fb9f30ld355584a294075f98f38a6
F test.sh 8 2023-12-22, 13:14:00 a234d619bj4ceb0cb2296e045c913720
bypy downfile 下载文件到Linix磁盘
 rm -rf test.sh  #先删除
bypy downfile test.sh . #在重新下载 该目录下依然有test.sh文件
<I> [14:12:49] ./test.sh <- /apps/bypy/test.sh
[====================] 100% (8.0B/8.0B) ETA: (12B/s, gone)
bypy compare 对比本地和云盘的文件
bypy compare  test.sh

定时备份

linux里面定时任务主要还是基于crontab。编写一个备份脚本 定时执行就行了。

如下演示一个从docker容器中的mysql中备份数据 并压缩数据 然后推送到百度云盘示例

vim /opt/mysqlbak.sh

#!/bin/bash
export NOW="$(date +"%Y-%m-%d-%H-%M")"
export DATA_DIR=/opt/datahub/mysqlbak
echo "$NOW 开始备份mysql数据"
docker exec mysql /bin/bash -c "mysqldump -uroot -proot --set-gtid-purged=OFF -B cheruan_prod > $DATA_DIR/mysql_data_cc_prod_$NOW.sql"
echo "正在压缩文件...."
tar -czvf $NOW.tar.gz $DATA_DIR/mysql_data_cc_prod_$NOW.sql
echo "压缩文件完成 $NOW.tar.gz"
#速度稍慢点 tar -cjvf $NOW.tar.bz2 $DATA_DIR/mysql_data_cc_prod_$NOW.sql
#速度巨慢 压缩率最大 tar -cJvf $NOW.tar.xz $DATA_DIR/mysql_data_cc_prod_$NOW.sql
echo "正在删除历史文件+7"
find -mtime +7 -name "*.tar.gz" -exec rm {} \;
echo "删除历史文件完成 "
echo "正在删除SQL文件"
rm -rf $DATA_DIR/mysql_data_cc_prod_$NOW.sql
echo "SQL文件删除完成"
echo "正在推送压缩包至网络云盘"
bypy upload /opt/datahub/mysqlbak/$NOW.tar.gz
echo "推送压缩包至网络云盘已完成"

然后配置定时任务 crontab -e

30 1 * sh /opt/mysqlbak.sh >> /var/log/mysql_dumps.log 2>&1