方案一:使用mysqldump导出导入
通过MySQL自带的mysqldump工具导出指定表的历史数据,再导入到目标数据库。适合数据量中等且允许停机迁移的场景。
sql
# 导出指定表结构和数据(按条件筛选历史数据)
mysqldump -u username -p dbname tablename --where="create_time<'2023-01-01'" > history_data.sql
# 导入到目标数据库
mysql -u username -p target_db < history_data.sql
方案二:ETL工具同步
使用Kettle、Talend等ETL工具建立数据管道,可实现定时增量同步。适合需要持续同步历史数据的场景。
- 配置源数据库和目标数据库连接
- 编写转换流程:添加输入表(带时间条件筛选)、字段映射、输出表
- 设置定时任务或立即执行
方案三:程序分批迁移
编写脚本分批次查询和插入数据,避免大事务导致数据库负载过高。适合大数据量迁移。
python
import pymysql
batch_size = 5000
src_conn = pymysql.connect(source_db_config)
dst_conn = pymysql.connect(target_db_config)
while True:
with src_conn.cursor() as cursor:
cursor.execute(f"SELECT * FROM orders WHERE order_date<'2022-01-01' LIMIT {batch_size}")
batch = cursor.fetchall()
if not batch: break
with dst_conn.cursor() as cursor:
cursor.executemany("INSERT INTO orders_archive VALUES(%s,%s,...)", batch)
dst_conn.commit()
方案四:主从复制过滤
配置MySQL主从复制时设置复制过滤器,仅同步特定表的历史数据。适合实时性要求高的场景。
sql
# 在my.cnf中配置
replicate-wild-do-table=dbname.tablename_2020%
replicate-wild-do-table=dbname.tablename_2021%
方案五:表空间传输
对于InnoDB引擎,可直接导出表空间文件快速迁移。要求MySQL版本5.6+且目标表结构已存在。
sql
-- 源库执行
FLUSH TABLES tablename FOR EXPORT;
-- 拷贝.ibd和.cfg文件到目标服务器
-- 目标库执行
ALTER TABLE tablename IMPORT TABLESPACE;
注意事项
- 大表迁移建议在低峰期进行
- 迁移前后校验数据量和关键字段一致性
- 考虑建立临时索引加速历史数据查询
- 对于频繁更新的表,迁移期间建议锁定写入