lower_case_table_names必须在首次初始化前通过配置文件设置,否则无法修改;Linux默认为0(区分大小写),需清空datadir后,在my.cnf的[mysqld]段中写入lower_case_table_names=1并执行mysqld --initialize。

lower_case_table_names 必须在首次初始化前设置,否则后续无法修改。Linux 下默认是 0(区分大小写),想开启不敏感,只能在 mysqld --initialize 之前完成配置。
必须在初始化前写入 my.cnf,不能靠启动参数临时覆盖
MySQL 8.0 初始化阶段几乎不读命令行参数里的 --lower-case-table-names=1,只认配置文件。哪怕你用 docker run ... mysql:8.0 --lower-case-table-names=1,只要数据目录没清空、已初始化过,这个参数就完全无效。
正确做法是:
- 确认
/var/lib/mysql/(或你的datadir)下没有任何文件,包括ibdata1、mysql.ibd、sys/等 - 编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,确保有且仅有:
[mysqld] lower_case_table_names = 1
注意:lower_case_table_names 中是下划线,不是短横线;值不能加引号;必须放在 [mysqld] 段内
初始化命令必须显式指定 --datadir 且不带 --lower-case-table-names 参数
初始化时不要传 --lower-case-table-names —— 这个参数在 8.0 初始化流程中已被忽略,只认配置文件。错误示范:mysqld --initialize --lower-case-table-names=1 --datadir=/var/lib/mysql,它会静默忽略该参数,仍按默认 0 初始化。
正确命令是:
mysqld --user=mysql --initialize --datadir=/var/lib/mysql --basedir=/usr- 运行前确保
my.cnf已存在且被加载(可用mysqld --help --verbose | grep "Default options"确认路径) - 初始化成功后,立即检查:
mysqld --verbose --help | grep "lower_case_table_names"应显示1,或启动后执行SHOW VARIABLES LIKE 'lower_case_table_names';
启动失败常见报错及对应原因
如果启动时报 [ERROR] [MY-011087] Different lower_case_table_names settings for server ('1') and data dictionary ('0'),说明数据字典里存的是 0,但配置文件写了 1 —— 这意味着你没清空 datadir 就重试了。
其他典型现象:
- 服务卡在
starting状态,systemctl status mysqld显示激活失败 -
/var/log/mysqld.log里出现Data Dictionary initialization failed或Cannot start server with a different lower_case_table_names value -
SHOW VARIABLES LIKE 'lower_case_table_names';返回0,但你确定改了配置 → 配置文件没被读取,或路径不对,或语法错误(比如写成lower-case-table-names)
Docker 环境下特别注意挂载顺序和参数位置
Docker 启动 MySQL 8.0 时,--lower-case-table-names=1 必须放在镜像名之后、作为 mysqld 的参数,不能混在 -e 或 -v 前面。但更稳妥的做法是:把配置写进挂载的 conf 文件里,而不是依赖命令行参数。
正确示例:
docker run -d \ --name mysql8 \ -v $(pwd)/conf:/etc/mysql/conf.d \ -v $(pwd)/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci
其中 $(pwd)/conf/my.cnf 内容为:
[mysqld] lower_case_table_names = 1
关键点:$(pwd)/data 目录必须为空,否则容器启动时会跳过初始化,直接复用旧数据字典,导致配置失效。


















