如何使用 Shell 脚本和 Cron 自动执行 MySQL 数据库备份

备份对于保证数据安全至关重要,自动化备份过程可以节省您的时间和精力。如果您的数据库丢失或损坏,最近的备份可以成为救星。

定期备份对于任何使用MySQL数据库。自动化此过程可确保定期进行备份,而无需记住手动执行备份。

在本指南中,我们将向您展示如何创建一个简单的 Bash 脚本来自动执行 MySQL 数据库备份。那么,我们将在计划的时间自动运行此备份脚本,确保您的数据库得到备份而不会失败。

首先,让我们创建一个简单的 Bash 脚本来处理备份过程。

nano backup_mysql.sh

将以下脚本复制并粘贴到backup_mysql.sh文件:

#!/bin/bash

# MySQL Credentials
MYSQL_USER="your_mysql_username"
MYSQL_PASS="your_mysql_password"
MYSQL_HOST="localhost"

# Backup Directory (ensure this directory exists)
BACKUP_DIR="/path/to/your/backup/directory"

# Email settings
EMAIL_TO=""
EMAIL_SUBJECT="MySQL Backup Report - $(date +"%Y-%m-%d %H:%M:%S")"
EMAIL_BODY=""

# Get current date to append to backup filename
DATE=$(date +"%Y-%m-%d_%H-%M-%S")

# Databases to back up (list the names of the databases you want to back up)
DATABASES=("db1" "db2" "db3")

# Loop through each database and back it up
for DB in "${DATABASES[@]}"; do
    BACKUP_FILE="$BACKUP_DIR/$DB_$DATE.sql"
    
    echo "Backing up database $DB to $BACKUP_FILE..."
    
    # Perform the backup using mysqldump
    mysqldump -u $MYSQL_USER -p$MYSQL_PASS -h $MYSQL_HOST $DB > $BACKUP_FILE
    
    # Check if the backup was successful
    if [ $? -eq 0 ]; then
        echo "Backup of $DB completed successfully!"
    else
        echo "Backup of $DB failed!"
    fi
done

# Clean up backups older than 30 days (optional)
find $BACKUP_DIR -type f -name "*.sql" -mtime +30 -exec rm -f {} \;

# Send email alert
echo -e "$EMAIL_BODY" | mail -s "$EMAIL_SUBJECT" "$EMAIL_TO"

这个脚本有什么作用?

  • MySQL 凭证:您需要提供 MySQL 用户名、密码和主机(通常是 localhost)。
  • 备份目录:这是存储备份的位置。确保您的系统上存在该目录。
  • 带时间戳的备份:该脚本创建带有时间戳的备份(例如,2025-04-28_12-30-00.sql)以避免覆盖旧备份。
  • 要备份的数据库: 在DATABASESarray,列出要备份的数据库的名称。您可以根据需要添加或删除数据库。
  • 备份命令: 脚本使用mysql转储创建数据库的备份。
  • 旧备份清理:该脚本还会删除超过 30 天的备份(您可以根据需要调整此时间)。
  • 电子邮件提醒:运行备份后,脚本会发送一封包含结果的电子邮件 - 无论每个数据库备份成功还是失败。

将备份同步到远程服务器(可选但推荐)

创建本地备份后,明智的做法是将其同步到远程服务器以提高安全性,这样即使主服务器崩溃,也可以确保备份继续存在。

这是您可以添加到备份脚本的末尾:

# Sync backup to remote server (optional but recommended)

SSH_KEY="/path/to/your/private/key.pem"           # Path to your SSH private key
REMOTE_USER="your_remote_user"                    # Remote server username
REMOTE_HOST="your.remote.server.com"              # Remote server address
REMOTE_DIR="/path/on/remote/server"               # Target directory on remote server

rsync -avz \
  -e "ssh -i $SSH_KEY -o StrictHostKeyChecking=no" \
  --delete-after \
  "$BACKUP_DIR/" \
  "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"

确保远程服务器可访问,并且目标目录存在并具有适当的写入权限。

保存脚本后,通过运行使其可执行chmod命令:

chmod +x backup_mysql.sh

第2步:测试MySQL备份脚本

在设置 Cron 作业之前,最好手动测试脚本以确保一切按预期工作。

./backup_mysql.sh

检查您的备份目录以确保备份已成功创建。如果一切看起来都不错,请继续下一步。

第 3 步:使用 Cron 作业自动执行 MySQL 备份

现在我们有了备份脚本,下一步是使用 Cron(一种按计划时间运行命令的工具)将其自动化。

crontab -e

添加 Cron 作业以自动运行备份脚本。例如,要每天凌晨 2 点运行该脚本,请添加以下行:

0 2 * * * /bin/bash /path/to/your/backup_mysql.sh

以下是 Cron 计划的工作原理:

  • 0:分钟(第 0 分钟)。
  • 2:小时(凌晨 2 点)。
  • *: 每个月的每一天。
  • *: 每个月。
  • *: 一周中的每一天。

要验证您的 Cron 作业是否正在运行,您可以检查系统日志或临时将脚本设置为在更近的时间运行以查看其是否有效。

grep CRON /var/log/syslog

其他注意事项

  • 安全:在脚本中存储 MySQL 密码很方便,但不安全。为了更好的安全性,您可以将您的凭据存储在.my.cnf文件放在您的主目录中,并配置脚本以从那里读取。
  • 备份位置:确保备份目录有足够的空间用于备份。如果您正在运行多个备份,最好设置一个单独的存储位置(例如外部硬盘驱动器或云存储)。
  • 备份频率:根据数据更改的频率,您可能需要调整 Cron 作业计划。例如,您可以每小时、每周或仅在特定日期运行备份。
结论

通过使用简单的 Bash 脚本和 Cron 作业自动执行 MySQL 备份,您可以确保定期安全地备份数据库,而无需记住手动执行此操作。只需几行代码,您就可以设置一个按您喜欢的时间间隔运行的自动备份系统。