虽然意识到数据的重要性,但是到现在依然没有做VPS的数据文件备份工作。 昨天遭遇《有人搞事 今天遭遇DDoS攻击》后,夜里突发奇想,开始做起来了。
我的想法是
因为现在这台主机的带宽只有1M,但我发现下载七牛的文件突发能达到10多M,所以干脆直接备份到七牛云存储好了。
- 需要备份网站根目录下的所有文件
- 需要备份所有的数据库文件
- 最好数据库能独立备份成一个文件,方便还原
- 频率一天一次
有了这个初步想法于是就开始做了!
做
- 数据导出以及文件打包
在/srv/backup
下创建备份脚本backup.sh
,并编辑如下:
vim /srv/backup/backup.sh
#!/bin/bash
find /srv/backup/2016 -type f -mtime +7 -exec rm {} \;
tar zcvf /srv/backup/2016/Files_$(date +%F).tar.gz /srv/www/html
tar zcvf /srv/backup/2016/Config_$(date +%F).tar.gz /etc/nginx/nginx.conf /etc/nginx/sites-available /etc/php5/fpm/php.ini
mysqldump -uNAME -pPASSWORD --events --ignore-table=mysql.events --all-databases > /srv/backup/2016/Data_All_$(date +%F).sql
mysqldump -uNAME -pPASSWORD qq> /srv/backup/2016/Data_qq_$(date +%F).sql
mysqldump -uNAME -pPASSWORD typecho> /srv/backup/2016/Data_typecho_$(date +%F).sql
mysqldump -uNAME -pPASSWORD shudong> /srv/backup/2016/Data_shudong_$(date +%F).sql
mysqldump -uNAME -pPASSWORD shudongipa> /srv/backup/2016/Data_shudongipa_$(date +%F).sql
mysqldump -uNAME -pPASSWORD yiyan> /srv/backup/2016/Data_yiyan_$(date +%F).sql
nohup ./qrsboxcli sync >/dev/null 2>&1 &
实现:
- 删除/srv/backup/2016下超过7天的文件
- 按Files_+日期为文件名备份网站目录/srv/www/html
- 按Date_All_+日期为文件名导出所有数据库
- 按Date_库名_+日期为文件名导出各个数据库
- 数据备份同步到七牛云(见下文)
相关参数: -type f 查找文件 -type d 查找目录
-mtime -7 修改时间在7天内 -mtime +7 修改时间在7天前
-exec rm {} ; 将找到的文件 (假定找到文件的名字为 a.txt), 执行 rm a.txt 命令
数据备份传输
使用到的是七牛的开发者工具qrsbox
简介 qrsbox 是七牛云存储提供的同步上传客户端工具,支持 Linux、Mac OS X、Windows 等操作系统。使用 qrsbox,可将用户本地某个目录的所有文件同步上传到七牛云存储中,同时监控目录变化,将目录中新增的文件也上传至七牛云存储。
配合操作系统已有的强大文件管理功能(分级存放、按指定项目排序、查找匹配指定条件的文件等),即可轻松优雅地完成繁复的文件管理事务。
注意:qrsbox 不会同步文件的删除操作。也就是说,如果受监控的目录中有文件被删除,已上传至七牛云存储的文件副本仍旧保留。如果用户确实需要删除该文件,可以到七牛开发者平台中删除。这一设计的目的是为了防止误删文件造成数据丢失。同时还可以收获另一个好处,就是同步上传完一个文件后,本地可以马上删除该文件以释放磁盘空间。
功能特性
- 支持配置文件
- 支持大文件上传
- 支持增量部分同步更新
- 支持在后台运行监控
下载
cd /srv/backup
wget http://devtools.qiniu.com/linux/386/qrsboxcli
我这里使用的是32位的,根据实际情况自己选择。
然后,执行以下命令进行初始化:
./qrsboxcli init <AccessKey> <SecretKey> <SyncDir> <Bucket> [<KeyPrefix>]
如: ./qrsboxcli init KnSkyJ8rIiG3UXXqOGcbK58VdK2FlILofbrZbVKA Rzg8EjYGCLBNkXXH75h3zgPgNZod1zmXU0pKWF26 /srv/backup/2016 backup
参数名称以及说明 SyncDir 本地的同步目录,该目录下的文件会随时同步上传至七牛云存储 Bucket 保存同步文件的资源空间名 KeyPrefix 文件前缀,可选。如果设置了该参数,那么上传的文件名前都会加上前缀。这个前缀主要用于在空间中区分不同上传来源的文件 最后,可以使用以下命令开始文件同步:
./qrsboxcli sync &
这里使用了 & 符号,让同步客户端进程运行在后台。如果退出终端后程序中断,请使用以下命令代替:
nohup ./qrsboxcli sync >/dev/null 2>&1 &
用户可以通过以下命令查看同步过程:
./qrsboxcli log
如果需要停止后台运行的 qrsboxcli,可以使用如下命令:
./qrsboxcli stop
如果希望改变同步目录、bucket 等运行参数,需要先用 stop 命令停止 qrsboxcli 的后台程序,重新用新的参数运行初始化命令,然后再次启动同步程序,qrsboxcli 会立刻按新的配置将新目录的文件同步至七牛云存储。
crontab定时执行任务 最后我们通过计划任务,定时运行备份脚本:
21 3 * * * sh /srv/backup/backup.sh
每日凌晨3点21分开始计划任务。
更新:
通过以上的操作,虽然实现了网站的数据文件的备份工作,但是七牛的存储空间会呈现爆炸式的增长。要自己手动去清理。
于是想出了一个优化方案。
在上面的方案中,即使昨日和今日的文件没有产生变化,依旧会产生一个备份文件,且名字和昨日不一但是文件大小等内容均一致。造成七牛云和服务器每天都要传输一遍这些内容。
进一步优化实现:
- 删除/srv/backup/2017下超过7天的文件避免服务器上文件堆积爆炸
- 备份网站目录/srv/www/html 不按Files_+日期为文件名
- 导出所有数据库 不按Date_All_+日期为文件名
- 不导出各个数据库了 且不按Date_库名_+日期为文件名
- 数据备份同步到七牛云(见下文)
- php配置文件路径更新
在/srv/backup
下创建备份脚本backup.sh
,并编辑如下:
#! /bin/bash
find /srv/backup/2017 -type f -mtime +7 -exec rm {} \;
tar zcvf /srv/backup/2017/Files.tar.gz --exclude=/srv/www/html/phpmyadmin /srv/www/html
tar zcvf /srv/backup/2017/Config.tar.gz /etc/nginx/nginx.conf /etc/nginx/sites-available /etc/php/7.0/fpm/php.ini /etc/php/7.0/fpm/pool.d/www.conf
mysqldump -uNAME -pPASSWORD --events --ignore-table=mysql.events --all-databases > /srv/backup/2017/Data_All_$(date +%F).sql
mysqldump -uNAME -pPASSWORD typecho> /srv/backup/2017/Data_typecho.sql
mysqldump -uNAME -pPASSWORD shudong> /srv/backup/2017/Data_shudong.sql
nohup ./qrsboxcli sync >/dev/null 2>&1 &
64位的qrsbox下载
cd /srv/backup
wget http://devtools.qiniu.com/linux/amd64/qrsboxcli
chmod u+x qrsboxcli
后续步骤参照上面即可!
P.s.:数据库恢复
|
|