CakePHP迁移大数据库报2006 MySQL server has gone away错误
问题根因
两个报错均为环境配置限制导致,和迁移脚本逻辑无关:
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away是迁移执行过程中PHP与MySQL的连接被中断,常见触发原因包括单条SQL体积超过MySQL最大允许包大小、长连接超时、MySQL处理大请求时内存不足被系统终止。- phpMyAdmin的文件过大提示,是PHP上传/请求体积限制、phpMyAdmin导入阈值拦截导致。
可落地解决方案
优先修复命令行迁移问题,比手动导入SQL效率更高、出错概率更低。
1. 调整MySQL配置,修复连接断开问题
找到本地MySQL配置文件my.ini(Windows环境下如果用XAMPP/WAMP等集成环境,直接在集成环境的MySQL配置目录查找即可),修改或新增以下配置项:
; 最大允许数据包大小,按大库实际需求设置,最低建议128M,大体积单表场景可直接设为1G max_allowed_packet = 1G ; 延长连接超时时间,避免长迁移任务中途被断开 wait_timeout = 28800 interactive_timeout = 28800 ; 调大InnoDB日志文件大小,避免大表DDL/DML写入时日志写满触发服务重启 innodb_log_file_size = 256M
修改完成后重启MySQL服务,可在MySQL命令行执行SHOW VARIABLES LIKE 'max_allowed_packet';确认参数是否生效。
2. 调整PHP CLI配置,避免迁移进程崩溃
命令行执行PHP脚本使用的是独立于Web服务的CLI版本配置文件,先执行php --ini找到Loaded Configuration File对应的php.ini路径,修改以下参数:
; 脚本最大执行时间设为0即无限制 max_execution_time = 0 ; 调大PHP进程可用内存,大库迁移建议设置为1G以上 memory_limit = 2G
配置保存后即时生效,无需额外重启服务。
3. 断点续跑迁移任务
你已经完成99张表的创建,重新执行迁移前可以先查看数据库内默认的迁移日志表phinxlog,确认已经执行完成的迁移版本,避免重复执行已完成的迁移段报错,确认后直接执行原迁移命令即可:./bin/cake migration migrate
如果需要继续使用phpMyAdmin手动导入,按以下步骤调整配置:
- 找到Web环境对应的php.ini文件(可通过phpMyAdmin首页的phpinfo信息找到对应路径,和CLI版本的php.ini不是同一个文件),修改以下参数:
upload_max_filesize = 1G post_max_size = 1G max_execution_time = 300 memory_limit = 1G
- 重启Apache/Nginx等Web服务后再尝试导入,如果SQL文件体积仍然超过上限,可将SQL文件按表拆分为多个小于上传阈值的分卷文件逐个导入。
内容的提问来源于stack exchange,提问作者Yasmine Daly
相关产品推荐
相关产品推荐

