前言

这是最近碰到的一个问题 

同样的一个 环境的问题, 在正常的 mysql 环境会返回 具体的错误信息, 然后 在我的另外一个环境里面 只能返回一些 unknown error 之类的 十分抽象的环境

然后 我们这里 来看一下 具体的情况 我们这里从 错误的环境 往前推导

来查看 并解决这个问题

 

 

错误信息的调试

这里构造的问题是一个 Table space already exists 的问题, 在重命名表名的时候, 将表名更新为 另外一个存在 ibd 的表名, 这时候 就会抛出如下异常

 

根据错误码 查询错误信息的方式如下, 将两个 section flatmap 到 errmsgs 的错误信息序列, 然后计算偏移 获取错误信息模板, 比如 我们这里的 1025 获取到的错误信息为 “”

然后 下面直接响应的 “Unknown error $errorCode”

46 mysql 客户端拿不到具体的错误信息_mysql

 

获取到错误信息的时候, 根据 错误码以及错误信息模板 以及上下文 格式化完整的错误信息的地方如下, 这里没有获取到错误信息模板, 直接响应的是 “Unknown error $errorCode”

46 mysql 客户端拿不到具体的错误信息_mysql_02

 

然后 客户端拿到的信息如下

46 mysql 客户端拿不到具体的错误信息_错误信息_03

 

 

这里两个 section 标记的是 错误码 的两个分区

第一个 section 是 [1000 – 1887], 第二个 section 是 [3000 – 3230]

46 mysql 客户端拿不到具体的错误信息_错误码_04

 

 

错误信息 errmsg.sys 的初始化  

错误信息的初始化如下, 默认是在 “/usr/local/mysql/share/errmsg.sys” 的地方查询错误信息模板, 然后 在这里没有 

然后 从如上代码可以看到 错误信息 的根目录是在 lc_message_dir 的配置中

然后解决方式可以通过 复制 errmsg.sys 到指定的默认位置, 或者更新 lc_message_dir 的配置, 配置到 mysql 代码中错误信息的目录, 我们这里通过配置解决问题 

46 mysql 客户端拿不到具体的错误信息_locale_05

 

配置 lc_messages_dir 如下 

46 mysql 客户端拿不到具体的错误信息_错误信息_06

 

 

现在能够 正确读取到错误信息了 

46 mysql 客户端拿不到具体的错误信息_mysql_07

 

 

错误信息国际化配置 

通过 lc_messages_dir 和 lc_messages 来进行配置, 后者配置指定的是 语言

也可以通过 launage 来执行完整的路径, 但是 不推荐

46 mysql 客户端拿不到具体的错误信息_错误码_08

 

路径中的 Japanese 是通过 locale 进行关联的, 这部分内容参见 sql_locale.cc

46 mysql 客户端拿不到具体的错误信息_错误码_09

 

国际化之后 错误信息如下

46 mysql 客户端拿不到具体的错误信息_locale_10

 

在配置不正确的情况下, 启动 mysql 会有如下日志, 提示的就是 没有找到错误信息的相关配置

46 mysql 客户端拿不到具体的错误信息_错误信息_11