MySQL 8.0.27 my.cnf中transaction-isolation配置不生效求助
在Ubuntu 20.04上运行MySQL 8.0.27时,发现my.cnf中的transaction-isolation配置被忽略——服务启动后事务隔离级别仍保持默认的REPEATABLE-READ,但运行时可以正常修改该级别。
已完成的排查操作
- 确认系统仅存在一个
my.cnf文件,且文件中除transaction-isolation外的其他配置项,重启服务后均能正常生效; - 将
log_error_verbosity设为3后查看错误日志,未找到任何与事务隔离级别相关的报错或提示信息; - 将相同的
my.cnf文件部署到另一台同版本MySQL和Ubuntu系统的服务器,重启服务后transaction_isolation值可正常更新; - 当前使用默认
sql_mode。
解决思路
1. 检查配置项的拼写与格式
确认my.cnf中配置项的写法完全符合规范:MySQL 8.0配置文件中需用短横线分隔的transaction-isolation,对应值需用全大写+短横线格式(如READ-COMMITTED、SERIALIZABLE),示例:
transaction-isolation = READ-COMMITTED
避免将运行时变量名transaction_isolation(下划线分隔)直接写到配置文件中。
2. 排查配置文件加载优先级
MySQL可能会加载多个路径下的配置文件,即使你认为只有一个my.cnf。执行以下命令查看实际加载的配置文件列表:
mysqld --help --verbose | grep -A 10 "Default options"
检查输出中的文件路径,确认是否有其他配置文件(如/etc/mysql/mysql.conf.d/mysqld.cnf、~/.my.cnf)覆盖了transaction-isolation的设置。
3. 检查启动命令行参数
查看MySQL服务的启动参数,命令行参数优先级高于配置文件。执行以下命令查看启动命令:
systemctl status mysql
在ExecStart行中检查是否存在--transaction-isolation参数,若有则删除该参数,重启服务后配置文件的设置会生效。
4. 手动指定配置文件启动测试
尝试手动指定my.cnf路径启动MySQL,验证是否是服务启动时加载路径错误:
sudo systemctl stop mysql sudo mysqld --defaults-file=/etc/my.cnf --user=mysql &
启动后查询transaction_isolation,若生效则检查systemd服务文件(通常是/lib/systemd/system/mysql.service)中的ExecStart配置,确认是否指定了正确的defaults-file路径。
5. 检查文件权限与安全策略
确认my.cnf的权限允许MySQL进程读取:
ls -l /etc/my.cnf
正常权限应为644,所有者为root:root。若系统开启了SELinux(Ubuntu默认关闭,但需确认),可临时关闭测试:
sudo setenforce 0
重启MySQL后若配置生效,需调整SELinux策略以允许MySQL读取配置文件。
6. 检查持久化变量表
极少数情况下,mysql.persisted_variables表中的记录会覆盖配置文件设置。执行SQL查询:
SELECT * FROM mysql.persisted_variables WHERE VARIABLE_NAME = 'transaction_isolation';
若存在该记录,删除后重启MySQL:
DELETE FROM mysql.persisted_variables WHERE VARIABLE_NAME = 'transaction_isolation';
操作前建议备份该表。
内容的提问来源于stack exchange,提问作者Sanjay

