如何为GitHub Workflow配置MySQL服务器并解决连接报错?
修复GitHub Actions中MySQL连接丢失的问题
针对你遇到的ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 2错误,给你几个具体的修复方案:
1. 等待MySQL容器完全启动
Docker启动MySQL容器后,服务不会立刻就绪,直接执行连接命令会因为服务未启动完成导致连接失败。你可以在连接步骤前加一个等待逻辑:
- name: Wait for MySQL to be ready run: | until mysqladmin ping -h localhost -P 33306 -uroot -ppassword --silent; do echo "Waiting for MySQL..." sleep 2 done
如果环境没有mysqladmin,也可以用nc命令检查端口:
- name: Wait for MySQL port to be open run: | until nc -z localhost 33306; do echo "Waiting for MySQL port..." sleep 2 done
2. 修正SQL文件读取与连接命令
你的连接命令里用find -wholename ./sql/init.sql可能存在路径不确定性,GitHub Actions的工作目录是仓库根目录,直接指定路径更可靠。同时,简化SQL文件的执行方式:
mysql --protocol=tcp -h localhost --port 33306 -uroot -ppassword < ./sql/init.sql
这种方式比嵌套$(cat ...)更稳定,避免了命令行转义可能带来的问题。
3. 调整MySQL容器的启动配置
MySQL 8默认root用户只允许容器内本地连接,你需要在启动容器时放开远程连接权限:
- name: Start MySQL container run: | docker run -d \ -p 33306:3306 \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_ROOT_HOST=% \ mysql:8
这里的MYSQL_ROOT_HOST=%允许root用户从任何地址连接,解决权限限制导致的连接失败。
另外,MySQL 8默认的caching_sha2_password认证插件可能和部分客户端不兼容,如果后续遇到认证错误,可以启动容器时指定旧插件:
- name: Start MySQL container with legacy auth run: | docker run -d \ -p 33306:3306 \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_ROOT_HOST=% \ mysql:8 --default-authentication-plugin=mysql_native_password
4. 确认端口映射与网络访问
确保Docker容器的端口映射正确,若仍有问题,尝试用127.0.0.1代替localhost连接:
mysql --protocol=tcp -h 127.0.0.1 --port 33306 -uroot -ppassword < ./sql/init.sql
内容的提问来源于stack exchange,提问作者AceKiron
相关产品推荐
相关产品推荐

