MySQL:关于unknown error一例

2023年 8月 15日 57.0k 0

作者简介:高鹏,笔名八怪。《深入理解MySQL主从原理》图书作者,同时运营个人公众号“MySQL学习”,持续分享遇到的有趣case以及代码解析!

一、问题展示

MySQL:关于unknown error一例-1

大概就是这么一个报错,这里出现了 ERROR 1045(28000)但是错误描述却是Unknown error。

二、关于错误号和错误描述

实际上这里的ERROR 1045是一个标号对应

  • ER_ACCESS_DENIED_ERROR 28000

实际上这就是密码错误的报错,而冒号以后的是错误的描述,在我们的安装目录下有一个share目录,里面包含了各种语言关于错误描述的文件。那么我们这里应该可以定位是错误描述的文件没有读取到,遇到了问题。也就是说这里错误标号没有问题,有问题的是错误描述无法显示。

三、代码报错部分

MySQL:关于unknown error一例-2

nr为我们的错误标号,如果通过错误标号没有找到对应的错误描述那么就会报出Unkown error并且最后带上错误标号,也就是我们看到最后的1045。

而对于查找的错误描述来自于初始化的时候读取的文件:

MySQL:关于unknown error一例-3

这里可以大概看出来是通过语言进行匹配,然后找到lc_messages_dir所在的目录下寻找。我们注意到如果读取文件失败那么将会有报错信息。翻看问题数据库的日志确实存在一行这样的报错:

MySQL:关于unknown error一例-1

其实如果读取这个文件失效那么大部分错误都会报unknown error,比如:

MySQL:关于unknown error一例-5

官方文档的描述:

MySQL:关于unknown error一例-6

四、为什么会去读不到错误描述文件

找到出问题的原因是没有读取到错误描述文件,那么为什么读取不到呢?测试发现默认的情况下lc_messages_dir会设置为my.cnf目录basedir/share(我们通常也不会设置这个目录),我们这里的问题实际上由于my.cnf中basedir目录设置错误。但是为什么basedir目录设置错误,又能够启动数据库呢?这是因为通过mysqld_safe去拉取mysqld的时候会通过mysqld_safe的目录反向推测mysqld所在的目录,并不完全依赖basedir,但是lc_messages_dir却是basedir/share 所以虽然数据能够启动但是错误描述文件却找不到。

下面模拟一下:

  • 我们在my.cnf中加入一个错误目录

MySQL:关于unknown error一例-7

  • 使用mysqld_safe拉取mysqld /bin/sh /opt/mysql/mysql3306/install/bin/mysqld_safe --datadir=/opt/mysql/mysql3306/data/ --pid-file=/opt/mysql/mysql3306/data/mgr2.pid
  • 查看lc_message_dir目录

MySQL:关于unknown error一例-8

  • 验证错误

MySQL:关于unknown error一例-9

错误得以重现,当然如果用mysql.server去拉取因为mysql.server会解析my.cnf中的basedir获取mysqld_safe所在的目录,显然是不行的报错如下:

MySQL:关于unknown error一例-10

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论