网站数据全自动备份脚本升级版
历经两次重装系统,终于把这个新的脚本写好了。之前的那个脚本会把明文密码放在bash命令中,这样不是很安全,于是让bing ai帮我优化了下代码,结果它给的代码有些目录不全,导致把系统删了,所以这次仔仔细细的检查了所有代码,并且拿其他机器测试十几次没问题后,才正式放到生产环境里。
这次脚本为上一篇《利用rclone对lnmp环境下的网站备份》的升级版,前面rclone挂载的步骤按照上一篇文章就好了,如果已经挂载,就不用管,直接看这篇文章就行。
代码特色
- 纯bash脚本,函数安全
- 兼容各个操作系统,且与使用博客系统无关
- 利用mysql本身工具命令实现数据库打包
准备事项
创建文件夹
在系统根目录创建backup文件夹,记得是系统根目录,不是root根目录,要注意区分。然后再到backup目录里创建web、sql、log这三个文件夹,再到log目录里创建backup.log文件,web指存放网站备份文件的地方,sql为存放数据库备份文件的地方,log为存放备份日志的目录,backup.log就是备份日志文件。
开启mysqldump功能
#打开文件
nano /etc/mt.cnf
#编辑文件
[client]
user =root
password = 你的数据库root密码
port = 3306
socket = /tmp/mysql.sock
我们只需要把前面几行改成这样就可以了,然后按ctrl+x保存,输入y确认,回车保存文件。
自动备份代码
完成上面操作后,到root根目录将如下代码放到backup.sh里,因为没有这个文件,我们需要手动创建。
#创建backup.sh文件
nano /root/backup.sh
将如下代码粘贴到这个文件里,并且保存
#!/bin/bash -e
# 设置变量
web_dir=/home/wwwroot/yunlogs.com #请将yunlogs.com改为你的网站目录
database=vliang #请将vliang改为你的数据库名
backup_dir=/backup
log_file=/backup/log/backup.log
date=$(date +"%Y%m%d%H%M%S")
random=$(shuf -i 10000-99999 -n 1)
zip_cmd="zip -q -r" # 压缩命令
rclone_cmd="rclone sync" # 同步命令
# 定义函数
# 备份网站文件并压缩
backup_web() {
# 拼接压缩包的名字
zipname=web_${date}_${random}.zip
# 进入网站目录
cd $web_dir
# 压缩当前目录下的所有文件
$zip_cmd $zipname *
# 移动压缩包到/backup/web目录并删除多余的备份文件
mv $zipname $backup_dir/web/
find $backup_dir/web/ -maxdepth 1 -name "web_*.zip" -type f -printf "%T@ %p\n" | sort -n | head -n -5 | cut -d' ' -f2 | xargs rm -f
}
# 备份数据库并压缩
backup_db() {
# 拼接压缩包的名字
filename=db_${date}_${random}.gz
# 备份数据库并压缩
mysqldump --defaults-file=/etc/my.cnf -C --single-transaction $database | gzip > $filename 2>>$log_file
# 移动压缩包到/backup/sql目录并删除多余的备份文件
mv $filename $backup_dir/sql/
find $backup_dir/sql/ -name "db_*.gz" -type f -printf "%T@ %p\n" | sort -n | head -n -5 | cut -d' ' -f2 | xargs rm -f
}
# 同步最新的备份文件到OneDrive,并删除多余的文件
sync_onedrive() {
$rclone_cmd $backup_dir cysui:/test/ #请将cysui改为你在rclone挂载时创建的名字,/test/改为你在onedrive的目录
}
# 执行函数并写入日志
echo "**********开始备份网站文件**********" >> $log_file
cd $web_dir && backup_web && echo "备份成功 $(date)" >> $log_file || echo "备份失败 $(date)" >> $log_file
echo "**********结束备份网站文件**********" >> $log_file
echo "" >> $log_file
echo "**********开始备份数据库**********" >> $log_file
cd $backup_dir && backup_db && echo "备份成功 $(date)" >> $log_file || echo "备份失败 $(date)" >> $log_file
echo "**********结束备份数据库**********" >> $log_file
echo "" >> $log_file
echo "**********开始同步到OneDrive**********" >> $log_file
sync_onedrive && echo "同步成功 $(date)" >> $log_file || echo "同步失败 $(date)" >> $log_file
echo "**********结束同步到OneDrive**********" >> $log_file
echo "" >> $log_file
给这个文件赋予可执行权限
chmod +x backup.sh
然后手动执行一次代码,需要等个十几二十秒就能上传到onedrive,到onedrive里看看是否存在。
/root/backup.sh
如果onedrive目录里能正常看到web、sql、log这三个文件夹,并且里面有网站数据,那就说明操作成功。
设置定时任务执行脚本
#输入
crontab -e
#选择vim或者nano编辑器都行
#在最后一行加入如下内容
0 2 * * * /root/backup.sh
#该参数表示每天2点的时候自动执行这个脚本,也可以改其他时间
其实吧,直接……导出,打包,然后开一个站点,访问地址只允许自动备份的那个服务器IP下载,然后,定时下载……
我是这样干的。233
那和自动上传也没差,都可以,哪个方便哪个来
虚拟机表示羡慕,我的都是用插件,定期备份数据库发到邮箱里。
哈哈哈,你也可以考虑换个主机,好玩的很多
其实我用宝塔的自动备份也很好,本地、第三方存储。
我已经没用宝塔了,用的lnmp,所以得另找自动备份的方法
这个脚本不错啊,lnmp.org原本带的备份脚本太简单了一些,只有本地和FTP
对,自己优化了下,后面优化到让ai写了个哈哈哈,然后搭配群晖的sync自动下载到本地,就很安全了