先看现象。把 Linux 上的 MySQL 5.7 迁到另一台机器并改了 lower_case_table_names=1,启动后报 Table 'db1.Orders' doesn't exist,代码里的驼峰表名全部失效。
排查方向其实有限,先把可能性排一排。建库时是按大小写敏感初始化的,数据字典里存的是原始表名,改参数不会把元数据一起改。还有一种是这个参数只能在初始化实例时设定,运行期改了直接启动失败。
少数情况下是迁移时用 mysqldump 导出,导入端把表名统一转成了小写。
不容易想到的是,文件系统本身大小写敏感,表名映射到文件名上就出现了两份。
上来先确认实例初始化时的参数
mysql -e "show variables like 'lower_case%'"
接着把库里的真实表名列出来
mysql -e "select table_name from information_schema.tables where table_schema='db1'"
然后导出时用小写表名并同步改代码
mysqldump --databases db1 | sed 's/`Orders`/`orders`/g' > db1.sql
等前面都确认过,再按目标参数重新初始化一个实例再导入
mysqld --initialize --lower_case_table_names=1 --datadir=/data/mysql_new
改完先别撤,确认这几项。新实例里 show variables 显示 lower_case_table_names=1,代码用小写表名能查到数据,information_schema 里不再出现两份同名表。
容易忽略的是,这个参数是初始化级别的,线上改不了;迁移前先统一表名风格,比事后改参数省事得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。
