快速迁移表数据(几万到上百万不等)的4种方案

4种方案如下:

方案一、 使用mysqldump命令 导出 A 表数据为 xx.sql 文件,再通过 mysql -e source xx.sql 导入

优点:

  • mysqldump 是 MySQL 自带工具,使用方便。
  • mysqldump支持使用 --where 过滤数据
  • 对于小规模数据(如几千条),操作简单且快速。
  • 可以导出表结构、索引、约束和数据。

缺点:

  • 不支持导出部分字段
  • 对于大数据量(50万到100万),导出和导入速度较慢。
  • SQL 文件通常比原始数据占用更多磁盘空间。
  • 导出和导入过程中,A 表的数据可能会发生变化。

适用场景:

  • 数据量较小(几千到几万条)。
  • 需要迁移表结构和数据。
  • 跨版本或跨服务器迁移。

方案二、导出 A 表数据为 CSV 文件,再使用 LOAD DATA INFILE 或者 LOAD DATA LOCAL INFILE导入 CSV 文件

优点:

  • 性能极高:LOAD DATA INFILE 是 MySQL 中最快的批量数据导入方式。
  • 节省磁盘空间:CSV 文件比 SQL 文件更紧凑。
  • 灵活性强:导出CSV文件时可筛选表字段,可自定义字段分隔符、行分隔符等。
  • 适合大数据量:对于 50万到100万条数据,性能优势明显。

缺点:

  • 需要文件权限:LOAD DATA INFILE 需要文件存储在数据库服务器上,且 MySQL 用户需要有文件读取权限。LOAD DATA LOCAL INFILE需要文件存储在数据库客户端上

  • 不支持表结构:只能迁移数据,表结构和索引需要单独处理。

  • 数据格式要求严格:CSV 文件必须与目标表字段严格匹配,否则可能导致导入失败。

  • 不适合跨服务器迁移:如果 A 表和 B 表不在同一服务器,需要额外步骤传输文件。

适用场景:

  • 大数据量(几十万到数百万条)。
  • A 表和 B 表在同一服务器,或可以轻松传输文件。
  • 只需要迁移数据,表结构已提前创建。
  • 两表结构不一致,只是部分数据一致。

方案三、INSERT INTO ... SELECT 从 A 表读取数据插入到 B 表

优点:

  • 一条 SQL 语句即可完成数据迁移。
  • 完全在 MySQL 内部完成,不需要导出文件或使用外部工具。
  • 可以在事务中执行,确保数据一致性。
  • 可以在 SELECT 语句中对数据进行转换或过滤。

缺点:

  • 性能较差:对于大数据量,插入速度较慢,尤其是目标表有索引或约束时。
  • 锁表风险:如果 A 表和 B 表都较大,可能会锁表,影响其他操作。
  • 不适合跨服务器迁移:A 表和 B 表必须在同一 MySQL 实例中。

适用场景:

  • 数据量中等(几万到几十万条)。
  • A 表和 B 表在同一 MySQL 实例。
  • 需要对数据进行简单转换或过滤。

方案四、使用物理拷贝文件的方式,使用mysql5.6引入的 可传输表空间功能 把 A 表的数据给到 B 表

优点:

  • 性能极高:直接复制表空间文件,速度非常快。
  • 适合大数据量:对于 50万到100万条数据,性能优势明显。
  • 减少锁表时间:操作过程中锁表时间较短。

缺点:

  • 复杂性高:需要手动操作表空间文件,步骤较多,容易出错。
  • 限制较多:
    • A 表和 B 表必须使用 InnoDB 引擎。
    • A 表和 B 表的表结构必须完全一致
    • 需要 MySQL 服务器有文件系统访问权限。
  • 不适合跨服务器迁移:如果 A 表和 B 表不在同一服务器,操作更复杂。

适用场景:

  • 大数据量(几十万到数百万条)。
  • A 表和 B 表在同一服务器,且表结构完全一致。
  • 对性能要求极高,且操作人员熟悉表空间管理。

综合对比

方案 性能 复杂性 适用数据量 是否需要额外工具 是否支持跨服务器 是否支持数据转换
mysqldump + source 小规模
INSERT INTO ... SELECT 中等规模
导出 CSV + LOAD DATA INFILE 大规模 是(需传输文件)
可传输表空间 极高 大规模

推荐方案

  1. 如果 A 表和 B 表在同一服务器,且数据量较大(50万到100万)
    • 优先选择 导出 CSV + LOAD DATA INFILE,性能最佳。
    • 如果表结构完全一致,且对性能要求极高,可以选择 可传输表空间
  2. 如果 A 表和 B 表在同一服务器,且数据量中等(几万到几十万)
    • 使用 INSERT INTO ... SELECT,操作简单且灵活。
  3. 如果 A 表和 B 表在不同服务器,或需要跨版本迁移
    • 使用 mysqldump + source,兼容性最好。
本作品采用《CC 协议》,转载必须注明作者和本文链接
学过的东西能说出来那是最妙的,能复盘写下来那也不错
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

感觉还是用DataX好,高效方便。

2天前 评论

用navicat,它独有的有个工具很好用 :grin:

2天前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!