萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 啟動報錯 Can't find messagefile '/usr/share/mysql/errmsg.sys' 解決:language 參數配置指南

錯誤現象

[ERROR] Can't find messagefile '/usr/share/mysql/errmsg.sys'
The server quit without updating PID file ... failed!

MySQL 啟動時無法找到錯誤消息文件,導致無法輸出後續錯誤信息,直接退出。

根因分析

MySQL 通過 language 參數定位錯誤消息文件目錄(包含 errmsg.sys 和多語言錯誤消息)。二進制包安裝時,默認查找路徑為 $basedir/share/english/。若實際安裝路徑與默認不符,或使用非標準目錄,必須顯式指定。

解決方案:配置 language 參數

1. 確定實際文件位置

find /usr/local/mysql -name "errmsg.sys"
# 輸出示例:/usr/local/mysql-5.7.37/share/english/errmsg.sys

2. 修改配置文件

# /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql-5.7.37
datadir = /data/mysql/3306/data
# 關鍵:指定語言文件目錄(以 english 為例)
language = /usr/local/mysql-5.7.37/share/english

# 其他必要參數
port = 3306
socket = /data/mysql/3306/mysql.sock
pid-file = /data/mysql/3306/mysql.pid
log-error = /data/mysql/3306/logs/error.log

3. 重啟驗證

systemctl restart mysqld
# 或
/etc/init.d/mysqld start

# 檢查錯誤日志確認啟動成功
tail -f /data/mysql/3306/logs/error.log

多實例場景配置模板

# 實例 3306
[mysqld]
basedir = /usr/local/mysql
datadir = /data/3306/data
language = /usr/local/mysql/share/english
port = 3306
socket = /data/3306/mysql.sock
pid-file = /data/3306/mysql.pid
log-error = /data/3306/logs/error.log
server-id = 1

# 實例 3307
[mysqld]
basedir = /usr/local/mysql
datadir = /data/3307/data
language = /usr/local/mysql/share/english
port = 3307
socket = /data/3307/mysql.sock
pid-file = /data/3307/mysql.pid
log-error = /data/3307/logs/error.log
server-id = 2

語言文件目錄結構說明

/usr/local/mysql/share/
├── english/
│   ├── errmsg.sys          # 核心錯誤消息文件
│   └── errmsg-utf8.txt     # UTF-8 編碼消息
├── chinese/
│   └── errmsg.sys
├── german/
└── ...

可指定其他語言:language = /usr/local/mysql/share/chinese(需確保目標語言文件存在)。

常見誤區與避坑

誤區正確做法
指向具體文件 language = /path/errmsg.sys指向目錄 language = /path/share/english
使用相對路徑使用絕對路徑
多實例共用不同版本 basedir 但未分別指定 language每實例根據各自 basedir 指定對應 language 路徑
編譯安裝未安裝 share 目錄make install 會自動安裝,檢查 CMAKE_INSTALL_PREFIX

MySQL 8.0 變化

MySQL 8.0 移除了 language 參數,改用 lc_messages_dir 和 lc_messages:

[mysqld]
lc_messages_dir = /usr/local/mysql/share/
lc_messages = en_US  # 或 zh_CN 等

錯誤消息文件仍在 $lc_messages_dir/$lc_messages/ 下。

驗證腳本

#!/bin/bash
# check_errmsg.sh
MYSQL_BASE="/usr/local/mysql"
ERRMSG_PATH="$MYSQL_BASE/share/english/errmsg.sys"

if [ -f "$ERRMSG_PATH" ]; then
  echo "✅ errmsg.sys 存在: $ERRMSG_PATH"
  echo "建議配置: language = $MYSQL_BASE/share/english"
else
  echo "❌ errmsg.sys 不存在,請檢查安裝完整性"
  find $MYSQL_BASE -name "errmsg.sys" 2>/dev/null
fi
copyright © 萬盛學電腦網 all rights reserved