docker安装mysql8忽略大小写

mysql配置

之前文章中记录了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镜像中的lower_case_table_names

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如果想修改这个属性,必须在初始化数据库的时候就要指定该参数。

启动mysql命令

加上 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

当你已经启动了mysql容器,又想修改大小写不敏感时,可以进行如下操作

无法启动docker镜像时修改配置

当修改了my.cnf导致mysl无法启动时,这时候mysql是没有启动的,无法通过docker exec -it xx bin/bash进入mysql内部,这个时候要修改配置可以通过以下两种办法

1.复制到主机修改

把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

2直接修改

docker inspect [containerId] ,可以找到如下的内容

微信图片编辑_20210713104803.jpg

进入这个文件夹你会惊奇的发现,它和我们容器里的目录结构是一样的,所以我们直接修改这里面相应的配置也可以

微信截图_20210713104932.png

修改完配置后可以直接启动mysql了

修改docker中my.cnf配置

docker中可能没有相关vim工具,需要自己安装

docker中安装vim

apt-get update   //访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑
apt-get install vim 

修改mysql配置文件

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密码为空。

...
2021-07-13T01:59:31.962974Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-07-13T01:59:32.710846Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-07-13T01:59:34.303328Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2021-07-13 01:59:37+00:00 [Note] [Entrypoint]: Database files initialized
2021-07-13 01:59:37+00:00 [Note] [Entrypoint]: Starting temporary server
...

3d6c1594f91783c2fc008aa519a1d350.png

重启docker

这个时候已经是大小写不敏感了,可以进入mysql镜像中验证下

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

新增用户和修改密码

mysql> CREATE USER 'admin'@'%' IDENTIFIED BY '密码';
mysql> GRANT ALL ON *.* TO admin@'%'  WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

完美解决


已有 0 条评论

    我有话说: