在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."
