[转](3条消息) docker安装Mysql8.0的坑之lower(转载请删除括号里的内容)

(转载请删除括号里的内容)

docker安装Mysql8.0的坑之lower_case_table_names

有一只柴犬 2020-09-02 17:32:07  229  收藏

分类专栏: mysql

版权

目录

0、环境:

1、修改my.cnf(无效):

2、docker指定--lower-case-table-names=1(特定情况无效):

3、解决方案


0、环境:

centos7、docker 17.12.1-ce、mysql 8.0.21

docker安装mysql命令:

 
  1. docker run --name mysql --restart=always \

  2. -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \

  3. -v /home/mysql/data:/var/lib/mysql \

  4. -p 3317:3306 \

  5. -e MYSQL_ROOT_PASSWORD="root" \

  6. -e TZ=Asia/Shanghai \

  7. -d mysql:8.0

 
  1. [root@shamee shamee]# docker run --name mysql --restart=always -e MYSQL_ROOT_PASSWORD="root" -d mysql:8.0

  2. 222f3969bdb4a3c58da50707a73866c48cfd26f4c7b2feed32b56ae7de09b036

  3. [root@shamee shamee]# docker ps

  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  5. 222f3969bdb4 mysql:8.0 "docker-entrypoint.s…" 2 seconds ago Up 1 second 3306/tcp, 33060/tcp mysql

  6. [root@shamee shamee]# docker exec -it mysql bash

  7. root@222f3969bdb4:/# mysql -uroot -proot

  8. mysql: [Warning] Using a password on the command line interface can be insecure.

  9. Welcome to the MySQL monitor. Commands end with ; or \g.

  10. Your MySQL connection id is 8

  11. Server version: 8.0.21 MySQL Community Server - GPL

  12. Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

  13. Oracle is a registered trademark of Oracle Corporation and/or its

  14. affiliates. Other names may be trademarks of their respective

  15. owners.

  16. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

  17. mysql> show variables like '%case%';

  18. +------------------------+-------+

  19. | Variable_name | Value |

  20. +------------------------+-------+

  21. | lower_case_file_system | OFF |

  22. | lower_case_table_names | 0 |

  23. +------------------------+-------+

  24. 2 rows in set (0.01 sec)

  25. mysql>

看到mysql启动成功,同时也能正常连接。(这里是本地虚拟机测试,所以docker run没有外挂宿主目录,显然这是个不好的习惯)。用navicat试一下,

Nice,docker安装mysql8.0一分钟搞定。那不是有一个下午的时间玩游戏?那就打一把吃鸡压压惊吧。

可是到了第二天,服务器报错了:

Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'biz.XXL_JOB_QRTZ' doesn't exist

很显然,表名不存在,是因为表名是大写的问题。 于是乎,立马查看mysql的大小写敏感配置:

 
  1. mysql> show variables like '%case%';

  2. +------------------------+-------+

  3. | Variable_name | Value |

  4. +------------------------+-------+

  5. | lower_case_file_system | OFF |

  6. | lower_case_table_names | 0 |

  7. +------------------------+-------+

  8. 2 rows in set (0.01 sec)

  9. mysql>

果然,区别大小写。于是修改my.cnf:

 
  1. [mysqld]

  2. pid-file = /var/run/mysqld/mysqld.pid

  3. socket = /var/run/mysqld/mysqld.sock

  4. datadir = /var/lib/mysql

  5. secure-file-priv= NULL

  6. lower_case_table_names=1

  7. # Custom config should go here

  8. !includedir /etc/mysql/conf.d/

重启mysql,发现mysql不仅没有启动成功,反而不断的在重启。查看log:

 
  1. [root@iZuf68t6hada0ayijajs45Z ~]# docker logs -f -t --tail 100f mysql

  2. 2020-09-02T08:47:27.840720958Z 2020-09-02 16:47:27+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.

  3. 2020-09-02T08:47:27.897290758Z 2020-09-02 16:47:27+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'

  4. 2020-09-02T08:47:27.901725465Z 2020-09-02 16:47:27+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.

  5. 2020-09-02T08:47:27.960172822Z mysqld: [Warning] Skipping '!includedir /etc/mysql/conf.d/' directive as maximum include recursion level was reached in file /etc/mysql/conf.d/my.cnf at line 30.

  6. 2020-09-02T08:47:28.197969455Z 2020-09-02T08:47:28.190817Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.21) starting as process 1

  7. 2020-09-02T08:47:28.199468695Z 2020-09-02T08:47:28.199360Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.

  8. 2020-09-02T08:47:28.432824695Z 2020-09-02T08:47:28.429540Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.

  9. 2020-09-02T08:47:28.434242966Z 2020-09-02T08:47:28.434080Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').

  10. 2020-09-02T08:47:28.434477428Z 2020-09-02T08:47:28.434339Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.

  11. 2020-09-02T08:47:28.434584287Z 2020-09-02T08:47:28.434551Z 0 [ERROR] [MY-010119] [Server] Aborting

  12. 2020-09-02T08:47:28.954820885Z 2020-09-02T08:47:28.949232Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.21) MySQL Community Server - GPL.

显然,报错的第8行提示,设置的lower_case_table_names=1与默认的字典值0不一致,接着就拒绝了我的设置。

翻看Mysql官网,MySQL :: MySQL 8.0 Reference Manual :: 5.1.8 Server System Variables有这个一段说明:

在大多数情况下,这需要在第一次启动MySQL服务器之前在MySQL选项文件中配置lower_case_table_names。

1、修改my.cnf(无效):

按照官网的说法,Mysql8.0一旦你在初始化的时候没有给与相应的值,则默认lower_case_table_names=0。后续如果你想要在my.cnf中修改此项,Mysql8.0是不允许两者不一致的情况发生(5.7的版本是可以的,所以5.7的版本依然可以直接修改my.cnf)。所以事后修改这个配置是不允许的。

2、docker指定--lower-case-table-names=1(特定情况无效):

docker启动mysql修改配置:

 
  1. docker run --name mysql --restart=always \

  2. -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \

  3. -v /home/mysql/data:/var/lib/mysql \

  4. -p 3317:3306 \

  5. -e MYSQL_ROOT_PASSWORD="root" \

  6. -e TZ=Asia/Shanghai \

  7. -d mysql:8.0 --lower-case-table-names=1

网上很多说法都是在docker启动mysql的时候配置--lower-case-table-names。但是我这边尝试了很多遍都无效,原因是因为我的mysql初始化过了,/var/lib/mysql不是默认的初始化数据库,有人为修改的痕迹。

3、解决方案

重新启动mysql,如果是第一次安装,那么docker后面直接加--lower-case-table-names=1是可以的。

如果不是第一次装,需要卸载掉原有的mysql,-v /home/mysql/data:/var/lib/mysql 这里指定一个新的,干净的数据仓库。然后再--lower-case-table-names=1即可。

如:

 
  1. 原有:

  2. docker run --name mysql --restart=always \

  3. -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \

  4. -v /home/mysql/data:/var/lib/mysql \

  5. -p 3317:3306 \

  6. -e MYSQL_ROOT_PASSWORD="root" \

  7. -e TZ=Asia/Shanghai \

  8. -d mysql:8.0

  9. 修改:

  10. docker run --name mysql --restart=always \

  11. -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \

  12. -v /home/mysql/data2:/var/lib/mysql \

  13. -p 3317:3306 \

  14. -e MYSQL_ROOT_PASSWORD="root" \

  15. -e TZ=Asia/Shanghai \

  16. -d mysql:8.0 --lower-case-table-names=1

其中/home/mysql/data2为新建的目录即可, 但是这种做法,最好数据要备份,防止丢失。


---------------------
作者:白云v城主
来源:CSDN
原文:https://blog.csdn.net/sinat_36765345/article/details/108769802
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件