linux重新初始化mysql 并修改大小写铭感_macOS 下使用 Docker 运行 MySQL 服务遇到的问题说明...

ccff4a3ae42f7887ac43a79293fc6be2.png

在之前的使用 Docker 运行 MySQL 服务的这篇文章中,有个问题没有描述清楚,这里我纠正下当时的说法,并且详细解释下缘由。

当时我做的测试是在 macOS 系统下完成的,当时使用 Docker 启动服务的时候报错了,报错信息如下:

9e75b93a74d415adc5180026446b0dd8.png

当时我没太在意为什么会出现这种情况,我以为是跟我的目录包含大写字母的目录有关系,就直接去查了下解决办法,当时找到的解决方法是就是加上 mysqld --lower_case_table_names=0 这一串参数。

但其实不是这样的,首先先说明跟我指定的数据存储的目录包含大写路径无关。出现这个错误的原因其实错误信息里面已经提示了,"lower_case_table_names" 设置不一致,server 上该参数的值是 2,数据目录是 0。

首先我们先明白 lower_case_table_names 这个参数的作用,它的值可能有三种: 0,1,2.

  • 0: 表名和数据库名使用 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母大小写存储在磁盘上,名称比较区分大小写

  • 1: 表名以小写形式存储在磁盘上,名称比较不区分大小写,MySQL 在存储和查找时将所有表名转换为小写,此行为也适用于数据库名称和表别名。

  • 2: 表名和数据库名使用 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母大小写存储在磁盘上,但 MySQL 在查找时将它们转换为小写,名称比较不区分大小写,仅适用于不区分大小写的文件系统。

上面是设置不同值下的作用,那么默认值是多少呢?这取决于我们运行 MySQL 所在的系统,在 Unix 上,lower_case_table_names 的默认值为 0。在 Windows 上,默认值为 1。在 macOS 上,默认值为 2。

而且还有值得注意的一点是: 仅在初始化服务器时才能配置 lower_case_table_names,禁止在服务器初始化后更改 lower_case_table_names 设置。

好了,在介绍完 lower_case_table_names 参数的作用以及注意事项之后,我们再回到之前的启动报错问题,这个就是 MySQL 初始化的时候数据目录挂在 macOS 下,该值的默认值是 2,而数据库启动的时候在 docker 容器中,容器中系统是 Unix,默认值是 0,这就是尝试在服务器初始化后更改 lower_case_table_names 设置,这是被禁止的,启动的时候和初始化时不一致所以报错了。

知道原因之后,那我们就尝试在初始化的时候就指定,加上 mysqld --lower_case_table_names=0 这一串参数来指定 lower_case_table_names 的值为 0,所以我们启动成功了。

但是我们一般都希望数据库名称或表名称在比较时不区分大小写,而且官方也有说明: "如果您在具有不区分大小写的文件名(例如 Windows 或 macOS)的系统上运行 MySQL,则不应将此变量设置为 0。如果在不区分大小写的文件系统上使用 --lower-case-table-names = 0 将此变量强制为 0,并使用不同的字母大小写访问 MyISAM 表名,则可能导致索引损坏"。

所以我们还是将 lower_case_table_names 的值设置成 1。同时我们在创建数据库名或表名的时候也尽量不要大小写混用,这也是为了避免出现意外情况。其实在阿里的 Java 开发手册中是强制约束表名、字段名必须使用小写字母,也是为了避免节外生枝。

20754ccdc3b03f779002dc1a0eb650a3.png

好了,如果我们想要将 lower_case_table_names 的值设置成 1 该怎么做呢。是不是直接将参数改成 1 就可以了呢,我们可以试下,看看效果。试之前记得将挂载的数据库数据目录删除再做测试,不然会影响测试效果,或者重新挂载另一个目录也行,做完测试删掉就好了。

我们执行下面命令:

1d run -d -p 3307:3307 -v /Users/rookiedev/docker/mysql/data1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql8.0-test mysql/mysql-server:8.0 mysqld --lower_case_table_names=1

这里要注意,不同的数据库版本测试效果不一样的,这里我测试的效果是启动成功了,也验证确实将 lower_case_table_names 参数设置为 1 了,我通过以下命令进入连接 mysql 服务并且查看该参数的值确实是 1。

1docker exec -it a9 mysql -uroot -p

07f83fb894af43542b8a50474e288a5e.png

但有的版本是会失败的,我遇到过,但我没找出其中失败的规律,如果刚好你也碰到了,感兴趣的话可以研究看看,但我觉得大概率是不同版本的 mysql 启动配置文件可能不一样导致的,接下来我们就来介绍一下通过配置文件的方式来指定该参数值的方式。

之前我们只是通过 -v 参数挂载了数据目录,我们也可以通过 -v 参数来挂载 mysql 的配置文件, -v /Users/rookiedev/docker/mysql/conf:/etc/mysql,完整启动命令如下:

1d run -d -p 3307:3307 -v /Users/rookiedev/docker/mysql/data1:/var/lib/mysql -v /Users/rookiedev/docker/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql8.0-test mysql/mysql-server:8.0

/Users/rookiedev/docker/mysql/conf 目录下包含一个 my.cnf 配置文件,文件内容是:

1[mysqld]

上面的命令如果启动还是失败的话,可以加上 --restart=always 参数看看,参数的意思就是容器启动失败时会自动重启容器,同时 docker 重启时容器也会自动重启。同样启动成功之后可以进入容器连接 mysql 后看看是否设置成功了。

总的来说,我说的通过 mysqld 参数指定还是通过配置文件的方式指定,可能不一定适合你,具体问题具体分析吧。但我觉得这里我们需要知道的是 lower_case_table_names 这个参数的含义,在我们遇到数据库名字或表名是大写的或大小写混合时,我们可能会碰到一些问题,这时注意下当前数据库 lower_case_table_names 的值,还是有利于排查问题的。

推荐阅读

使用 Docker 运行 MySQL 服务

917a39e9a0fd26e4ebea56d4b6c466f1.png

长按上图,识别图中二维码即可关注

觉得有点用,给个赞吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值