在Ubuntu中使用Docker启动MySQL8的天坑

写在前面

简介: lower_case_table_names是mysql设置大小写是否敏感的一个参数。

1.参数说明:

lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的

lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区分大小写

lower_case_table_names=2 表名存储为给定的大小写但是比较的时候是小写的
unix,linux下lower_case_table_names默认值为 0 .Windows下默认值是 1 .Mac OS X下默认值是 2

lower_case_table_names最奇葩的地方就在于不同系统下的默认值是不一样的。不同的默认值设定就可能会导致同一个.sql文件中建表SQL语句在不同系统中失效,从而在数据库中(例如在Ubuntu系统下)出现单词相同但分别是大写和小写的两张数据表,更可怕的是,可能出现同名的外键从而产生错误。

2.查看方法:

bash 复制代码
# 进入mysql命令行 执行以下任一语句查看:
show variables like 'lower_case_table_names';
select @@lower_case_table_names;

在Ubuntu下用DOCKER启动MySQL8,如果表格的大小写确实很重要的话,必须在第一次运行docker run时,添加上--lower_case_table_names=1 这个配置项

bash 复制代码
docker run -it -d --name mysql --net=host  -v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/config:/etc/mysql/conf.d  \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql \
--lower_case_table_names=1

如果MYSQL启动起来了,数据库中内容改变了,并且容器与Ubuntu中有映射的话,等出现大小写问题是,就没有办法再修改 --lower_case_table_names的值了。

采用停止并删除原有容器,用docker run创建新容器,添加上 --lower_case_table_names,但只要你的映射(-v)与之前的容器是一样的(这样做是希望新容器中仍然能有原容器中创建的数据库与数据表),那新容器会在启动后(可以生成ID)几秒钟发生错并退出,如果你在docker run中还添加了 --restart=always,那就会看到容器一直在不停从重启。

采用网上给出的修改my.conf文件的方式添加 --lower_case_table_names=1,再新建容器的方式只适合DOCKER MySQL5.7,对DOCKER MySQL8的容器会依然是无效的。

bash 复制代码
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
lower_case_table_names=1

最后的结论就是,如果在Ubuntu或Linux环境中,启用DOCKER MySQL8,就务必记得在第一次启动,也就是MySQL8数据库最"干净"时候,添加上**--lower_case_table_names=1**

相关推荐
W.Buffer15 分钟前
通用:MySQL-深入理解MySQL中的MVCC:原理、实现与实战价值
数据库·mysql
心态特好1 小时前
详解redis,MySQL,mongodb以及各自使用场景
redis·mysql·mongodb
一只小bit1 小时前
MySQL 库的操作:从创建配置到备份恢复
服务器·数据库·mysql·oracle
程序新视界6 小时前
MySQL中,IS NULL和IS NOT NULL不会走索引?错!
数据库·mysql·dba
简色7 小时前
题库批量(文件)导入的全链路优化实践
java·数据库·mysql·mybatis·java-rabbitmq
CS Beginner8 小时前
【Linux】Mysql的基本文件组成和配置
linux·运维·mysql
一水鉴天9 小时前
整体设计 逻辑系统程序 之18 Source 容器(Docker)承载 C/P/D 三式的完整设计与双闭环验证 之2
docker·架构·认知科学·公共逻辑
飞快的蜗牛11 小时前
利用linux系统自带的cron 定时备份数据库,不需要写代码了
java·docker
火星MARK11 小时前
k8s面试题
容器·面试·kubernetes
香吧香12 小时前
Docker Registry 使用总结
docker