mysql迁移指定表历史数据的多种方案
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">方案一:使用mysqldump导出导入</a></li><li><a href="#_label1">方案二:ETL工具同步</a></li><li><a href="#_label2">方案三:程序分批迁移</a></li><li><a href="#_label3">方案四:主从复制过滤</a></li><li><a href="#_label4">方案五:表空间传输</a></li><li><a href="#_label5">注意事项</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>方案一:使用mysqldump导出导入</h2><p>通过MySQL自带的<code>mysqldump</code>工具导出指定表的历史数据,再导入到目标数据库。适合数据量中等且允许停机迁移的场景。</p>
<div class="jb51code"><pre class="brush: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</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>方案二:ETL工具同步</h2>
<p>使用Kettle、Talend等ETL工具建立数据管道,可实现定时增量同步。适合需要持续同步历史数据的场景。</p>
<ul><li>配置源数据库和目标数据库连接</li><li>编写转换流程:添加输入表(带时间条件筛选)、字段映射、输出表</li><li>设置定时任务或立即执行</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>方案三:程序分批迁移</h2>
<p>编写脚本分批次查询和插入数据,避免大事务导致数据库负载过高。适合大数据量迁移。</p>
<div class="jb51code"><pre class="brush:sql;">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()</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>方案四:主从复制过滤</h2>
<p>配置MySQL主从复制时设置复制过滤器,仅同步特定表的历史数据。适合实时性要求高的场景。</p>
<div class="jb51code"><pre class="brush:sql;"># 在my.cnf中配置
replicate-wild-do-table=dbname.tablename_2020%
replicate-wild-do-table=dbname.tablename_2021%
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>方案五:表空间传输</h2>
<p>对于InnoDB引擎,可直接导出表空间文件快速迁移。要求MySQL版本5.6+且目标表结构已存在。</p>
<div class="jb51code"><pre class="brush:sql;">-- 源库执行
FLUSH TABLES tablename FOR EXPORT;
-- 拷贝.ibd和.cfg文件到目标服务器
-- 目标库执行
ALTER TABLE tablename IMPORT TABLESPACE;
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>注意事项</h2>
<ul><li>大表迁移建议在低峰期进行</li><li>迁移前后校验数据量和关键字段一致性</li><li>考虑建立临时索引加速历史数据查询</li><li>对于频繁更新的表,迁移期间建议锁定写入</li></ul>
頁:
[1]