dockr安装mysql之后,发现该数据库对大小写敏感,各种修改配置、重启都不生效。
mysql表名是否区分大小写是通过lower_case_table_names参数来设置,登录mysql后可通过
show Variables like '%table_names'
来查看默认的值
不同系统,该参数的默认值是不同的。
参数值 | 参数说明 |
lower_case_table_names=1 | 表名存储在磁盘是小写的,但是比较的时候是不区分大小写 |
lower_case_table_names=0 | 表名存储为给定的大小和比较是区分大小写的 |
lower_case_table_names=2 | 表名存储为给定的大小写但是比较的时候是小写的 |
windows环境默认 1 ,linux环境默认0 ,macos环境默认2
docker一般都是linux安装,linux系统的lower_case_table_names默认为0。如果在docker中/etc/mysql/my.cnf添加了 lower_case_table_names = 1 则会导致mysql无法启动。
2021-07-13T01:13:42.850794Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0'). 2021-07-13T01:13:42.851104Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2021-07-13T01:13:42.851430Z 0 [ERROR] [MY-010119] [Server] Aborting
官方给出的回答,mysql8如果想修改这个属性,必须在初始化数据库的时候就要指定该参数
加上 lower_case_table_names=1则在数据库会忽略大小写。
docker run -p 3306:33066 --name mysql -v /home/docker/mysql/conf:/home/docker/mysql/conf.d -v /home/docker/mysql/logs:/home/docker/mysql/logs -v /home/docker/mysql/data:/home/docker/mysql/data -e MYSQL_ROOT_PASSWORD=123456 -d mysql --lower_case_table_names=1
无法启动docker镜像时修改配置
当修改了my.cnf导致mysl无法启动时,这时候mysql是没有启动的,无法通过docker exec -it xx bin/bash
进入mysql内部,这个时候要修改配置可以通过以下两种办法
方法一 复制到主机修改
把docker容器中的配置文件复制到主机中,然后在主机中修改,修改完成后再复制到docker容器中
1复制docker容器的文件到主机中 //docker cp [容器id]:docker容器中配置文件路径 主机路径 docker cp mysql:/etc/mysql/my.cnf /home/my.cnf 2 修改配置文件中出错的部分 3. 复制配置文件到docker容器中 //docker cp 主机文件路径 容器id:docker容器中配置文件路径 docker cp /home/my.cnf mysql:/etc/mysql/my.cnf 4. 重启docker
方法二 直接修改
docker inspect [containerId]
,可以找到如下的内容
进入这个文件夹,它和我们容器里的目录结构是一样的,所以我们直接修改这里面相应的配置也可以
修改docker中my.cnf配置
# docker中安装vim apt-get update # 访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑 apt-get install vim cd /etc/mysql/ vi my.cnf # 在 mysqld下添加 lower_case_table_names=1 # 重新初始化数据库 /usr/sbin/mysqld --user=mysql --lower-case-table-names=1 --initialize-insecure # 等待一段时间,初始化完成后会有日志打印,默认的root密码为空
重启docker
查看是否生效
mysql -h localhost -u root -p Enter password: 直接回车 mysql> show variables like '%table_names'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | lower_case_file_system | OFF | | lower_case_table_names | 1 | +------------------------+-------+ 2 rows in set (0.00 sec)
lower_case_table_names参数已经变为1