如何在导出时分卷切割SQL文件_规避单文件大小限制

分卷导出MySQL大库需用mysqldump --skip-extended-insert配合split -b按字节切分并加.sql后缀,确保每片以完整INSERT结尾;导入时须按序拼接执行,不可单独运行各分卷文件。

用 mysqldump + split 分卷导出大 SQL 文件

单次导出超 2gb 的 mysql 数据库时,很多备份系统或传输工具会失败——不是报 oserror: [errno 27] file too large,就是上传中途断连。直接靠 mysqldump 本身不支持分卷,得靠 shell 管道接力 split

关键不是“能不能切”,而是切完还能不能原样导入。必须保证每一片都以完整 SQL 语句结尾,否则 mysql 执行时报错 ERROR 1064 (42000) 是最常见的翻车点。

  • 先用 --skip-extended-insert 导出(每行一条 INSERT),避免单条语句跨 split 边界

  • split -b 500M -d --additional-suffix=.sql 切,-d 用数字后缀更易排序,--additional-suffix 避免文件名无扩展名

  • 别用 split -l 行数切——SQL 文件里注释、空行、多行语句会让行数切法彻底失效

  • 导出命令示例:

    mysqldump -u root -p --skip-extended-insert mydb | split -b 500M -d --additional-suffix=.sql - dump_

    生成 dump_00.sqldump_01.sql……

导入分卷 SQL 时必须按序拼接执行

分卷文件不是独立可运行的 SQL 脚本,dump_00.sql 结尾大概率是半截 INSERT 或事务中间状态。直接一个个 mysql -u root -p mydb 会卡在 <code>ERROR 2013 (HY000): Lost connection to MySQL server during query

正确做法是把所有分卷按字典序合并后再喂给 mysql,而不是逐个执行。

  • Linux/macOS 下用 cat dump_*.sql | mysql -u root -p mydb ——注意通配符 * 默认按 ASCII 排序,dump_00dump_01 没问题;但 dump_0dump_10 就会错序
  • 如果用了非零填充命名(如 dump_1.sqldump_10.sql),改用 printf '%s\n' dump_*.sql | sort -V | xargs cat | mysql -u root -p mydb
  • Windows 用户别用资源管理器双击打开 .sql 文件——那是用文本编辑器看,不是导入。必须进命令行,用 type dump_00.sql dump_01.sql | mysql -u root -p mydb

mysqldump 分卷前务必禁用 --single-transaction 和 --lock-tables 组合

这两个参数一起用,在大表导出时容易触发锁等待超时,导致 mysqldump 进程卡死或中断,最终 split 出来的文件末尾缺终止符(比如没 UNLOCK TABLES;COMMIT;),后续导入直接失败。

  • 线上读写频繁的库,优先用 --single-transaction(依赖 InnoDB MVCC,不锁表),关掉 --lock-tables
  • MyISAM 表必须用 --lock-tables,但此时绝对不要加 --single-transaction,否则 mysqldump 会静默忽略前者并报 warning
  • 导出前加 --verbose 看实际生效的选项,避免配置被覆盖
  • 如果导出中看到 Warning: Using a password on the command line interface can be insecure.,这不是错误,但密码泄露风险高,建议改用 ~/.my.cnf 配置文件

split 后的 SQL 文件无法直接用 source 命令导入

omegafw.sepis.com.cn
rolexfw.sepis.com.cn
patekfw.sepis.com.cn
omega1.gmcwatch.cn
rolex1.gmcwatch.cn
patek1.gmcwatch.cn
omega1.swatchsh.com
rolex1.swatchsh.com
patek1.swatchsh.com
omegawx.paydyj.com
rolexwx.paydyj.com
patekwx.paydyj.com
omegawx.watchku.com
rolexwx.watchku.com
patekwx.watchku.com
MySQL 客户端的 source 命令只接受单个文件路径,且不支持管道或通配符。试图在 mysql> source dump_00.sql; 后再 source dump_01.sql;,第二条会因连接已断开或上下文丢失而失败。

  • source 本质是客户端本地读取并逐行发送,它不知道前后文件逻辑连续,也不会自动续上事务或变量状态
  • 唯一安全的交互式导入方式:先退出 mysql,在 shell 中用 catzcat(如果是 gzip 压缩后 split)合并后重定向导入
  • 如果原始 SQL 含 USE mydb;,确保合并后的首条语句之前没有其他数据库切换操作,否则可能误写到别的库

分卷切割本身很简单,真正耗时间的是验证——切完得立刻用 head -n 20tail -n 20 检查首尾是否语法完整,再挑一个分卷用 mysql -u root -p -e "SELECT 1;" && echo ok 快速确认连接和权限没崩。没人帮你盯这个,漏了就只能重导。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容