0x01 前言

服务器无论大小,数据都是异常重要和珍贵的。定时备份是一个好习惯,我也为我每个客户和我自己的每一台服务器都使用上shell 脚本进行定时备份,下面我来解释下我的小脚本。

0x02 定义变量

#sql 服务器地址,请根据实际情况进行修改
sql_host_addr=127.0.0.1

#数据库用户名,请根据需要进行修改
mysql_username=root

#数据库密码,请根据需要进行修改
mysql_passwd=mysql_password

#ftp 服务器域名或ip,请根据需要进行修改
ftp_addr=foo.com or 222.222.222.222

#ftp 用户名,请根据需要进行修改
ftp_username=your_ftp_username

#ftp密码,请根据需要进行修改
ftp_passwd=your_ftp_password

#ftp 目录路径,请根据需要进行修改
ftp_folder=/

#网站数据目录,请根据需要进行修改
web_file_folder=/usr/local/html

#zip 文件的压缩密码,请根据需要进行修改
zip_passwd=your_zip_passwd
 
#zip 文件名,请勿更改!!!!
backup_file_name=$(date +%Y%m%d).zip

#备份文件存放位置,请根据需要进行修改
backup_file_addr=/usr/local/backup

0x03 新建与删除

新建当天的备份文件夹,文件夹以当天的日期命名。删除3天前的数据,仅保留昨天和前天的。

#新建文件夹,我的备份文件存放在$backup_file_addr 目录中,请根据需要自行更改
mkdir -p $backup_file_addr/$(date +%Y%m%d)/mysql_dump

#删除本地3天前的数据
rm -rf $backup_file_addr/$(date -d -3day +"%Y%m%d").zip

0x04 备份数据库

数据库是这个脚本里最复杂的地方了,首先进入当天的备份文件夹的mysql_dump 目录,通过SHOW DATABASES 获得所有库名称,再通过for 历遍使用mysqldump 导出所有数据库。每导出一个数据库即将其通过 | 管道传递给gzip 压缩。

#进入mysql_dump 文件夹
cd $backup_file_addr/$(date +%Y%m%d)/mysql_dump

#导出数据库,通过历遍数据库,将各个数据库分别压缩
##-B 不使用历史文件,禁止交互动作
##-N 不输出列名称,因为列名称不是一个数据库
##-e 执行命令并退出
##将mysql 输出的内容通过管道 | 传递给xargs ,xargs 将所有换行替换为空格,以便历遍
##通过mysqldump 对xargs 修改过后的数据库进行dump 并使用gzip 压缩
for db in `/usr/bin/mysql -h 127.0.0.1 -u$mysql_username -p$mysql_passwd -B -N -e 'SHOW DATABASES' | xargs`; do
    (/usr/bin/mysqldump -u$mysql_username -p$mysql_passwd ${db} | gzip -9 - > ${db}.sql.gz)
done

#进入文件夹$backup_file_addr/$(date +%Y%m%d)
cd ..

0x05 复制网站数据

#将网站数据复制到$backup_file_addr/$(date +%Y%m%d)/web_file
cp -r $web_file_folder ./web_file

#进入文件夹$backup_file_addr/$(date +%Y%m%d)
cd ..

0x06 压缩

#使用zip 压缩文件夹
zip -r -9 -P $zip_passwd $backup_file_addr/$backup_file_name $(date +%Y%m%d)

#删除临时文件夹,仅保留压缩文件
rm -rf $(date +%Y%m%d)

0x07 上传到备份空间

我这里使用了lftp ,请通过以下命令安装:

yum install lftp -y

推荐备份到百度云,关于bypy 的教程请通过以下链接查看:

利用百度盘定时备份网站数据

#上传到FTP空间
lftp -u $ftp_username,$ftp_passwd $ftp_addr << END
put $backup_file_name
bye
END

#或上传到百度盘
/usr/bin/python /usr/local/shell/bypy/bypy.py syncup $backup_file_addr/ test_addr/

0x10 定时任务

将脚本通过crontab 定时执行:

#每天3点30分定时以root 身份执行backup.sh
30 3 * * * root /usr/local/shell/backup.sh

0x09 结语

如果你的数据库服务器包含有重要数据或者数据量特别巨大,上面的方法可能不适用于你。但上面的方法对我们这种小站点确实有帮助,我这服务器上运行着不止一个网站,但网站都是我的。即时如此,也不应该对数据的安全性掉以轻心。

完整的shell 脚本请点击下面链接到Github 浏览:

web_site_backup.sh