docker安装mysql8之lower_case_table_names参数
- 前言
- 发现问题
- 找到问题
- 解决方案
- 不挂载外部文件
- 挂载外部文件
前言
既然使用docker安装mysql,看重的就是一键拉取和一键启动,然后在安装mysql容器的过程中,出现了新问题,关于lower_case_table_names
的深坑。
发现问题
部署前使用的是本地服务器的mysql数据库,而上线的是一台全新的服务器,因此需要笔者重新配置运行环境,安装mysql并将本地库导入服务器上的数据库后,问题就在这里出现了。
出现明明数据表存在,然后springboot启动后,却显示查询不到数据表的问题。
找到问题
毫无疑问,这里就是lower_case_table_names
参数的问题。
show variables like '%lower_case%';
lower_case_table_names
是mysql设置大小写是否敏感的一个参数。
lower_case_table_names=0
表名存储为给定的大小和比较是区分大小写的
lower_case_table_names = 1
表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=2
表名存储为给定的大小写但是比较的时候是小写的
由于本地库 lower_case_table_names = 1
,所以数据表查询不区分大小写,而Docker拉取的mysql镜像默认lower_case_table_names=0
,因此会出现以上 数据表找不到的情况 Table xxx.xxx doesn't exit
。
解决方案
在线上创建数据库时,需要与本地数据库的参数一致,因此在创建容器是设置参数:lower_case_table_names = 1
。创建容器命令如下:
不挂载外部文件
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456\
-p 3306:3306 mysql --lower-case-table-names=1
挂载外部文件
docker run --name mysql \
-v /docker/mysql/log:/var/log/mysql \
-v /docker/mysql/data:/var/lib/mysql \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 \
-d mysql --lower-case-table-names=1
注意最后的 --lower-case-table-names=1
很重要别遗漏了。