You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:47:42