前言
这是最近碰到的一个问题
同样的一个 环境的问题, 在正常的 mysql 环境会返回 具体的错误信息, 然后 在我的另外一个环境里面 只能返回一些 unknown error 之类的 十分抽象的环境
然后 我们这里 来看一下 具体的情况 我们这里从 错误的环境 往前推导
来查看 并解决这个问题
错误信息的调试
这里构造的问题是一个 Table space already exists 的问题, 在重命名表名的时候, 将表名更新为 另外一个存在 ibd 的表名, 这时候 就会抛出如下异常
根据错误码 查询错误信息的方式如下, 将两个 section flatmap 到 errmsgs 的错误信息序列, 然后计算偏移 获取错误信息模板, 比如 我们这里的 1025 获取到的错误信息为 “”
然后 下面直接响应的 “Unknown error $errorCode”
获取到错误信息的时候, 根据 错误码以及错误信息模板 以及上下文 格式化完整的错误信息的地方如下, 这里没有获取到错误信息模板, 直接响应的是 “Unknown error $errorCode”
然后 客户端拿到的信息如下
这里两个 section 标记的是 错误码 的两个分区
第一个 section 是 [1000 – 1887], 第二个 section 是 [3000 – 3230]
错误信息 errmsg.sys 的初始化
错误信息的初始化如下, 默认是在 “/usr/local/mysql/share/errmsg.sys” 的地方查询错误信息模板, 然后 在这里没有
然后 从如上代码可以看到 错误信息 的根目录是在 lc_message_dir 的配置中
然后解决方式可以通过 复制 errmsg.sys 到指定的默认位置, 或者更新 lc_message_dir 的配置, 配置到 mysql 代码中错误信息的目录, 我们这里通过配置解决问题
配置 lc_messages_dir 如下
现在能够 正确读取到错误信息了
错误信息国际化配置
通过 lc_messages_dir 和 lc_messages 来进行配置, 后者配置指定的是 语言
也可以通过 launage 来执行完整的路径, 但是 不推荐
路径中的 Japanese 是通过 locale 进行关联的, 这部分内容参见 sql_locale.cc
国际化之后 错误信息如下
在配置不正确的情况下, 启动 mysql 会有如下日志, 提示的就是 没有找到错误信息的相关配置
完