mysqldump导出千万行大表报错2013,如何安全备份且不损坏原表
MySQL大表导出故障解决方案
故障原因
你遇到的mysqld进程崩溃问题属于MariaDB 10.1.10的已知版本bug,该版本是2015年发布的旧版本,早已停止维护,处理1000万行以上大表的连续扫描请求时容易触发内存异常,进而导致进程退出,触发2013连接丢失报错。
不影响原表的临时导出方案
分块导出法(兼容性最高,失败不影响整体进度)
- 先单独导出表结构:
mysqldump -u root -p rent_scaff gv_faktur_header_history --no-data > D:\dobol\gv_faktur_header_history_struct.sql
- 查表主键的取值范围:
执行SQLSELECT MIN(id) AS min_id, MAX(id) AS max_id FROM gv_faktur_header_history;获取主键的最小、最大值。 - 按主键区间分批次导出数据,每次导出10万行,示例命令:
mysqldump -u root -p rent_scaff gv_faktur_header_history --where="id >= 1 AND id <= 100000" --no-create-info --skip-triggers >> D:\dobol\gv_faktur_header_history_data.sql
逐次调整id区间,直到覆盖全表所有数据即可。该方法就算某一批次导出触发进程崩溃,已经导出的数据不会丢失,重启MySQL后继续导出剩余区间即可,全程不会损坏原表数据。
一致性快照导出法(操作最简单)
使用InnoDB的一致性快照特性导出,全程不锁表,导出失败也不会影响原表正常使用:
mysqldump -u root -p --single-transaction --quick --max-allowed-packet=2G rent_scaff gv_faktur_header_history > D:\dobol\gv_faktur_header_history_full.sql
注意:不要加--skip-extended-insert参数,该参数会大幅降低导出效率、增加导出文件体积,反而更容易触发内存异常。
永久修复方案
- 升级数据库版本:将XAMPP升级到最新版本,或单独把MariaDB升级到10.6及以上的长期支持版本,从根本上解决版本bug导致的进程崩溃问题。
- 调整my.ini配置优化大表处理能力:
[mysqld] # 8G内存可将缓冲池设为4G,提升大表查询性能 innodb_buffer_pool_size = 4G # 延长连接超时时间,避免大查询被主动断开 wait_timeout = 1800 interactive_timeout = 1800 net_read_timeout = 1800 net_write_timeout = 1800
修改后重启MySQL服务即可生效。
原表可用性保证
只要导出过程中不执行ALTER、DROP这类DDL操作,InnoDB的事务机制会保证即使MySQL进程崩溃,重启后会自动回滚未完成的操作,原表不会损坏,可正常读写。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

