历经两次重装系统,终于把这个新的脚本写好了。之前的那个脚本会把明文密码放在bash命令中,这样不是很安全,于是让bing ai帮我优化了下代码,结果它给的代码有些目录不全,导致把系统删了,所以这次仔仔细细的检查了所有代码,并且拿其他机器测试十几次没问题后,才正式放到生产环境里。

这次脚本为上一篇《利用rclone对lnmp环境下的网站备份》的升级版,前面rclone挂载的步骤按照上一篇文章就好了,如果已经挂载,就不用管,直接看这篇文章就行。

代码特色

  • 纯bash脚本,函数安全
  • 兼容各个操作系统,且与使用博客系统无关
  • 利用mysql本身工具命令实现数据库打包

准备事项

创建文件夹

在系统根目录创建backup文件夹,记得是系统根目录,不是root根目录,要注意区分。然后再到backup目录里创建websqllog这三个文件夹,再到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目录里能正常看到websqllog这三个文件夹,并且里面有网站数据,那就说明操作成功。

设置定时任务执行脚本

#输入
crontab -e
#选择vim或者nano编辑器都行

#在最后一行加入如下内容
0 2 * * * /root/backup.sh
#该参数表示每天2点的时候自动执行这个脚本,也可以改其他时间