[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/。若實際安裝路徑與默認不符,或使用非標準目錄,必須顯式指定。
find /usr/local/mysql -name "errmsg.sys"
# 輸出示例:/usr/local/mysql-5.7.37/share/english/errmsg.sys
# /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
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 移除了 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