vlambda博客
学习文章列表

再看MySQL8中大小些敏感、MySQL server through socket等问题

1、概述

大家好,我是欧阳方超。
之前写过一篇文章介绍MySQL8安装——,这两天在参照这篇文章时发现一个问题,就是在配置文件中添加low_case_table_names=1后,导致MySQL无法启动了,难道是跟之前的版本有关吗,这次是在CentOS7.7+arm64安装的。还有一些其他的小问题,下面看下是如何解决的吧。

2、问题解决

2.1、perl failed的问题

安装mysql解压后的rpm时首先遇到的问题是:

Error: failed dependencies /usr/bin/perl is needed

如果你不想安装perl,可以通过在rpm -ivh后加–nodeps命令解决,如下:

rpm -ivh --nodeps  xxx.rpm xxx.rpm

2.2、添加low_case_table_names=1无法启动

贴下日志

2022-04-07T14:16:23.423389Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2022-04-07T14:16:23.544609Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2022-04-07T14:16:23.548905Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').
2022-04-07T14:16:23.549232Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2022-04-07T14:16:23.549554Z 0 [ERROR] [MY-010119] [Server] Aborting
2022-04-07T14:16:24.062467Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20) MySQL Community Server - GPL.

官网有言曰:

After initialization, it is not allowed to change this setting.So “lower_case_table_names” needs to be set together with --initialize.

看来直接执行system start mysqld命令时其内部包括了“初始化”,然后紧接着发现配置文件中的low_case_table_names=1,这才符合“After initialization, it is not allowed to change this setting.”的说法。那我们就先执行一遍初始化同时指定low_case_table_names=1,然后在启动。
初始化时需要将数据目录下的内容删除掉,否则无法初始化,注意如果默认路径(/var/lib/mysql)下已经有数据了,一定要备份,毕竟数据无价!!!
带参数lower_case_table_names=1的初始化:

 /usr/bin/mysqld --user=mysql --lower-case-table-names=1 --initialize-insecure --datadir=/var/lib/mysql

然后systemctl start mysqld启动MySQL即可成功启动。

注意初始化时与–initialize-insecure类似的还有一个命令为–initialize,区别是后者会为mysql的root用户生成一个随机密码,而前者不会——即所谓insecure(非安全)。

2.3、cannot connect local MySQL server through socket

我们通常会为MySQL更改数据存储目录,这个错误就发生在这种场景下:

ERROR 2002 (HY000):Can't connect to local MySQL Server throgh socket '/var/lib/mysql/mysql.sock'(2)

排查这个问题,可以从下面几个方面入手。
第一,首先看MySQL是否已经启动。
即将MySQL启动后再试。
第二,连接127.0.0.1而不是localhost
如果使用localhost进行连接则使用的是socket连接器,如果使用127.0.0.1则使用的是TCP/IP连接器,所有当socket连接器不工作时尝试连接127.0.0.1。简单说就是在命令行进行连接时带上-h 127.0.0.1,至于这种情况下程序能否连接数据库暂时未尝试,敬请大神们留言讨论。
第三,再my.conf中追加[mysql]、[client]选项
[mysqld]选项应该是有的,[mysql]、[client]哪个没有就增加哪个吧,在[mysql]、[client]选项中添加一对键值socket=xxx,socket的值视自己的情况而定,我下面这样是因为已经把MySQL数据存储目录迁移到/datacenter/mysqldata/mysql/了,

[mysql]
socket=/datacenter/mysqldata/mysql/mysql.sock

[client]
socket=/datacenter/mysqldata/mysql/mysql.sock

追加后,在my.cnf中[mysqld]、[mysql]、[client]三个选项应该都有了,而且他们三个中socket的值需要是一样的。
第四,创建符号连接

ln -s /data/mysql_datadir/mysql.sock /var/lib/mysql/mysql.sock

3、总结

本文总结了MySQL8修改大小写敏感问题时遇到的问题以及解决办法,出现“cannot connect local MySQL server through socket”时出现的问题以及解决办法。在此记录一下希望能帮到以后的自己。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。