用于数据库备份的 Linux shell 脚本

新手上路,请多包涵

我尝试了许多用于数据库备份的脚本,但我做不到。我想每小时备份一次我的数据库。

我将文件添加到“/etc/cron.hourly/”文件夹,将其 chmod 更改为 755,但它没有运行。至少我写了我的伪代码。

如果您能为此操作编写一个脚本并告诉我应该多做些什么,我会很高兴?将此脚本文件添加到 /etc/cron.hourly/ 文件夹后。

  • 获取当前日期并创建一个变量, date=date(d_m_y_H_M_S)
  • 为文件名创建一个变量, filename="$date".gz
  • 像这样获取我的数据库的转储 mysqldump --user=my_user --password=my_pass --default-character-set=utf8 my_database | gzip > "/var/www/vhosts/system/example.com/httpdocs/backups/$("filename")
  • 删除文件夹 /var/www/vhosts/system/example.com/httpdocs/backups/ 中所有超过8天的文件
  • 到文件 "/var/www/vhosts/system/example.com/httpdocs/backup_log.txt" ,这个文本将被写入: Backup is created at $("date")
  • 将文件所有者 (chown) 从 root 更改为“my_user”。因为我想从“my_user”FTP 帐户打开备份和日志文件。
  • 我不想在每个 cron 之后收到一封电子邮件。 >/dev/null 2>&1 将被添加。

原文由 trante 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 574
2 个回答

经过数小时的工作,我创建了一个如下所示的解决方案。我为其他可以受益的人复制粘贴。

首先创建一个脚本文件并赋予该文件可执行权限。

 # cd /etc/cron.daily/
# touch /etc/cron.daily/dbbackup-daily.sh
# chmod 755 /etc/cron.daily/dbbackup-daily.sh
# vi /etc/cron.daily/dbbackup-daily.sh

然后使用 Shift+Ins 将以下行复制到文件中

#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder="/var/www/vhosts/example.com/httpdocs/backups"
fullpathbackupfile="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --user=mydbuser --password=mypass --default-character-set=utf8 mydatabase | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
chown myuser "$fullpathbackupfile"
chown myuser "$logfile"
echo "file permission changed" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

编辑:

如果你使用 InnoDB 并且备份花费太多时间,你可以添加“ single-transaction ”参数来防止锁定。所以 mysqldump 行将是这样的:

 mysqldump --user=mydbuser --password=mypass --default-character-set=utf8
          --single-transaction mydatabase | gzip > "$fullpathbackupfile"

原文由 trante 发布,翻译遵循 CC BY-SA 3.0 许可协议

创建一个类似这样的脚本:

 #!/bin/sh -e

location=~/`date +%Y%m%d_%H%M%S`.db

mysqldump -u root --password=<your password> database_name > $location

gzip $location

然后您可以编辑脚本将要运行的用户的 crontab

 $> crontab -e

并附加条目

01 * * * * ~/script_path.sh

这将使它在每天每小时的第一分钟运行。

然后你只需要添加你的卷和其他功能就可以了。

原文由 Peter Party Bus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题