第13期 MySQL如何定期把一个表数据备份到另一个表

来源:这里教程网 时间:2026-03-01 18:25:43 作者:

在MySQL中,‌定期将一个表的数据备份到另一个表,‌可以通过创建一个定期执行的事件(‌Event)‌来实现。‌首先,‌确保你的MySQL服务器已经开启了事件调度器。‌然后,‌你可以创建一个事件,‌定期将源表的数据插入到备份表中。‌例如,‌如果你想每天凌晨备份 source_table backup_table 以下是创建定时事件的基本步骤和示例代码: 创建目标备份表,结构与原表相同。 创建定时事件,编写SQL语句以复制数据。 启动事件,使其按计划执行。 示例代码: -- 假设原表名为 `source_table`,备份表名为 `backup_table`   -- 1. 创建备份表(如果尚不存在) CREATE TABLE IF NOT EXISTS backup_table LIKE source_table;   -- 2. 创建事件来定期备份数据 CREATE EVENT IF NOT EXISTS event_backup_table   -- 设置事件执行的时间(每天凌晨1点执行) ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE + 1, '01:00:00')   -- 设置事件的持续时间(如果需要,可以设置结束时间) -- ON COMPLETION NOT PRESERVE   -- 设置事件执行的时区(如果需要) -- ON COMPLETION PRESERVE ENABLE   -- 执行备份操作的SQL语句 DO INSERT INTO backup_table SELECT * FROM source_table; -- 3. 启动事件 ALTER EVENT event_backup_table ON COMPLETION PRESERVE ENABLE; 第二种方案,思路是一样的,我们可以是shell脚本来实现。具体的脚步如下:

vi backup_table.sh
#!/bin/bash  
# 数据库连接参数  
DB_HOST="数据库ip"
DB_USER="用户名"
DB_PASSWORD="密码"
DB_NAME="数据库"
BACKUP_TABLE="备份表"
SOURCE_TABLE="源表"
DAYS_TO_KEEP=7
# 检查备份表是否存在,不存在则创建
mysql -u$DB_USER -p$DB_PASSWORD -h$DB_HOST -D$DB_NAME -e "CREATE TABLE IF NOT EXISTS $BACKUP_TABLE LIKE $SOURCE_TABLE;"
# 检查备份前记录数
count_before=`cat count.txt`
# 增量备份前一天数据
YESTERDAY=$(date -d "yesterday" +"%Y-%m-%d")
mysql -u$DB_USER -p$DB_PASSWORD -h$DB_HOST -D$DB_NAME -e "
    INSERT INTO $BACKUP_TABLE
    SELECT * FROM $SOURCE_TABLE
    WHERE DATE(create_time) = '$YESTERDAY';
"
# 清理原表中七天前的数据
mysql -u$DB_USER -p$DB_PASSWORD -h$DB_HOST -D$DB_NAME -e "
    DELETE FROM $SOURCE_TABLE
    WHERE create_time < DATE_SUB(NOW(), INTERVAL $DAYS_TO_KEEP DAY);"
# 检查备份后记录数
count_after=$(mysql -u$DB_USER -p$DB_PASSWORD -h$DB_HOST -D$DB_NAME -e "select count(*) from speech_synthesis_copy;"|grep -o '[0-9]\+')
if [ $count_before -ne $count_after ];then
    echo "The summary records is changed,backup valid."
    echo "Incremental backup and cleanup executed for $DB_NAME.$SOURCE_TABLE"
    exit 0
else
    echo "The summary records is not changed,backup maybe invalid."
    exit 1
fi

添加定时任务:crontab –e30 0 * * * /app/data_backup/backup_table.sh >> /app/data_backup/mysql_backup.log echo "$(date +'%Y-%m-%d') Incremental backup and cleanup executed on $DB_NAME.$SOURCE_TABLE successfully."

相关推荐