DDEV在Drupal9+与MySQL5.7环境下无法设置事务隔离级别
解决DDEV中事务隔离级别重置及快照恢复的MySQL连接问题
一、持久化事务隔离级别(避免重启/快照恢复后被覆盖)
通过SET GLOBAL TRANSACTION ISOLATION LEVEL设置的隔离级别是临时生效的,MySQL服务重启(包括DDEV容器重启、快照恢复)后会自动回到默认的REPEATABLE-READ。要永久保留配置,需添加自定义MySQL配置文件:
- 在项目的
.ddev/mysql目录下创建custom.cnf文件(无该目录则手动新建) - 在文件中写入以下配置:
[mysqld] transaction-isolation = READ-COMMITTED
- 执行
ddev restart使配置生效,之后无论重启容器还是恢复快照,事务隔离级别都会保持为READ COMMITTED。
二、解决快照恢复时的MySQL套接字连接错误
从报错日志来看,问题出在快照恢复过程中,MySQL容器刚启动就执行了连接命令,此时服务可能未完全就绪,或者套接字路径配置存在偏差。可通过以下方案解决:
1. 强制使用TCP连接替代套接字
跳过套接字依赖,直接用TCP连接MySQL。可以在.ddev/config.yaml中添加钩子,调整快照恢复后的命令执行方式:
hooks: post-snapshot-restore: - exec: mysql -uroot -proot -h 127.0.0.1 -e "SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;"
不过如果已经通过custom.cnf持久化了隔离级别,这个钩子可以省略;若有其他需要执行的MySQL命令,用TCP连接能彻底规避套接字问题。
2. 延长容器启动超时时间
若MySQL启动较慢导致连接超时,可调整DDEV的容器超时配置:
default_container_timeout: 180
也可以在启动钩子中添加等待逻辑,确保MySQL完全就绪后再执行命令:
hooks: post-start: - exec: | until mysql -uroot -proot -h 127.0.0.1 -e "SELECT 1"; do sleep 2 done
3. 修正MySQL套接字路径配置
DDEV默认的MySQL容器中,套接字路径通常是/var/run/mysqld/mysqld.sock,而非报错中的/var/tmp/mysql.sock。如果自定义过套接字路径,需在custom.cnf中统一配置:
[mysqld] socket = /var/tmp/mysql.sock [mysql] socket = /var/tmp/mysql.sock
容器内的路径权限DDEV会自动处理,无需手动修改。
总结
优先通过custom.cnf持久化事务隔离级别解决重置问题;再通过强制TCP连接、延长启动等待时间或修正套接字配置,解决快照恢复时的连接报错。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

