导出时必须勾选“添加事务”和“使用延迟插入”,并选择SQL格式、包含建表语句、禁用ZIP压缩;大表需分片或调高超时限制;导入前应手动关闭外键和唯一性检查。
导出时必须勾选“添加事务”和“添加延迟插入”
默认导出的 sql 文件没有 begin transaction 和 commit 包裹,恢复时每条 insert 都单独提交,速度极慢。关键不是“有没有事务”,而是 phpmyadmin 导出界面里两个隐藏关联选项:添加事务(add drop table / view / procedure / function / event / trigger statement)实际控制是否加 set autocommit = 0 和 commit;而使用延迟插入(use delayed inserts)会让 insert 变成 insert delayed(仅 myisam 有效,但能减少锁竞争)。
-
添加事务必须开启——否则导出文件里只有零散INSERT,无任何事务包裹 -
使用延迟插入对 InnoDB 无效,但开启后 phpMyAdmin 会自动改用INSERT IGNORE或批量INSERT ... VALUES (...), (...)形式,间接提升导入吞吐 - 如果目标库是 MySQL 8.0+,记得取消勾选
兼容性模式→MYSQL40,否则会禁用INSERT ... VALUES (), ()多值语法
导出格式选 “SQL” 而非 “CSV” 或 “JSON”
看似 CSV 更轻量,但恢复时必须走 LOAD DATA INFILE 或中间脚本转换,反而丢失事务控制权;JSON 导出根本不会生成可执行 SQL。只有原生 SQL 格式才能保留 SET FOREIGN_KEY_CHECKS=0、SET SQL_MODE 等上下文控制语句,且 phpMyAdmin 在该模式下才真正启用事务封装逻辑。
- 选
自定义导出方式→ 格式选SQL,别碰CSV、JSON、XML - 勾选
包含创建表语句(否则恢复时表不存在,直接报错Table 'xxx' doesn't exist) - 取消
以 ZIP 压缩—— 压缩包解压后仍需手动拆包再导入,破坏自动化流程
大表导出前手动分片或调高超时限制
phpMyAdmin 默认用 PHP 脚本读取全表生成 SQL,单表超 50MB 时极易触发 max_execution_time 超时或内存溢出,错误信息通常是 Maximum execution time of 300 seconds exceeded 或空白响应。这不是导出内容问题,是执行环境瓶颈。
- 在导出页面 URL 后追加
&pos=0&limit=50000手动分页导出(需配合WHERE条件拼接,适合有自增主键的表) - 临时修改 phpMyAdmin 配置:编辑
config.inc.php,增加$cfg['ExecTimeLimit'] = 0;(禁用超时)和$cfg['MemoryLimit'] = '-1';(不限内存) - 更稳的方式:跳过 phpMyAdmin,直接用命令行
mysqldump --single-transaction --routines --triggers db_name table_name > dump.sql,它天然支持事务快照且不依赖 PHP
导入时关闭外键检查和唯一校验
即使导出文件带事务,导入过程仍可能因外键约束或重复唯一键中断,比如先导入子表再导入父表,或存在历史残留数据。此时事务会回滚整批,而非跳过单条失败记录。
- 导入前在 SQL 窗口手动执行:
SET FOREIGN_KEY_CHECKS = 0;和SET UNIQUE_CHECKS = 0; - 确认导入完成后再执行:
SET FOREIGN_KEY_CHECKS = 1;和SET UNIQUE_CHECKS = 1; - 不要依赖导出文件自带的
SET FOREIGN_KEY_CHECKS=0—— 它只在文件开头生效,若导入中途断开重试,后续执行不再受控
INSERT 的处理机制。phpMyAdmin 的导出界面里那几个不起眼的复选框,背后对应着完全不同的 SQL 生成策略,漏掉任何一个,都可能导致恢复耗时从秒级变成小时级。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











