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 浏览: