mysql迁移指定表历史数据方案

方案一:使用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;

注意事项

  • 大表迁移建议在低峰期进行
  • 迁移前后校验数据量和关键字段一致性
  • 考虑建立临时索引加速历史数据查询
  • 对于频繁更新的表,迁移期间建议锁定写入
相关推荐
_日拱一卒1 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
TheRouter2 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
唐青枫2 小时前
MySQL EXISTS 详解:存在性判断、NOT EXISTS 与实战示例
sql·mysql
JAVA面经实录9173 小时前
Hibernate面试题库
数据库·oracle·hibernate
2401_868534783 小时前
【无标题】
数据结构·r语言
Mr. zhihao4 小时前
Redis五大高级数据结构:原理-场景-底层-横向对比
数据结构·redis
QiLinkOS4 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
如此这般英俊4 小时前
手撕Claude Code—第一章 agent-loop
数据结构·人工智能·语言模型·自然语言处理
过期动态6 小时前
【LeetCode 热题 100】接雨水
java·数据结构·算法·leetcode·职场和发展