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
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值