分卷导出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.sql、dump_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_00、dump_01没问题;但dump_0、dump_10就会错序 - 如果用了非零填充命名(如
dump_1.sql、dump_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 中用cat或zcat(如果是 gzip 压缩后 split)合并后重定向导入 - 如果原始 SQL 含
USE mydb;,确保合并后的首条语句之前没有其他数据库切换操作,否则可能误写到别的库
分卷切割本身很简单,真正耗时间的是验证——切完得立刻用 head -n 20 和 tail -n 20 检查首尾是否语法完整,再挑一个分卷用 mysql -u root -p -e "SELECT 1;" && echo ok 快速确认连接和权限没崩。没人帮你盯这个,漏了就只能重导。