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]
,可以找到如下的内容
进入这个文件夹你会惊奇的发现,它和我们容器里的目录结构是一样的,所以我们直接修改这里面相应的配置也可以
修改完配置后可以直接启动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
...
重启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;
完美解决
注意:本文归作者所有,未经作者允许,不得转载