現象:service mysql start 失敗,無明顯錯誤輸出。查看 /var/log/mysql/error.log 發現:
[ERROR] /usr/sbin/mysqld: unknown variable 'default-character-set=utf8'
MySQL 5.5+ 已廢棄 default-character-set,改為 character-set-server。舊配置文件遷移或教程複製導致參數殘留。
# 1. 編輯配置文件
vim /etc/mysql/my.cnf
# 找到 [mysqld] 區段
# default-character-set=utf8 <-- 註釋或刪除
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 2. 同步修改 [client] 和 [mysql] 區段(客戶端默認字符集)
# [client]
default-character-set = utf8mb4
# [mysql]
default-character-set = utf8mb4
# 3. 重啟驗證
service mysql restart
# 或 systemctl restart mysql
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_%'; SHOW VARIABLES LIKE 'collation_%';"
預期輸出關鍵行:
character_set_server utf8mb4
collation_server utf8mb4_unicode_ci
character_set_database utf8mb4
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_results utf8mb4
| 錯誤日誌關鍵字 | 原因 | 解決 |
|---|---|---|
unknown variable 'xxx' | 參數名舊版/拼寫錯誤 | 查閱對應版本官方手冊修正參數名 |
Can't create/write to file '/tmp/...' | tmpdir 權限/磁盤滿 | chmod 1777 /tmp、清理空間或改 tmpdir |
InnoDB: Unable to lock ./ibdata1 | 已有進程佔用/殘留鎖文件 | pkill mysqld; rm -f /var/lib/mysql/ib_logfile* |
Plugin 'InnoDB' registration as a STORAGE ENGINE failed | 配置參數錯誤(如 innodb_log_file_size 過大超過磁盤) | 縮小參數、刪除舊日誌文件重啟 |
Access denied for user 'root'@'localhost' | 權限表損壞/密碼錯誤 | --skip-grant-tables 重置密碼 |
/etc/mysql/my.cnf 納入 Git/Ansible 管理,避免手工改動漂移。mysqld --help --verbose 2>&1 | head -20 可見解析到的參數;mysqld --validate-config(8.0+)直接驗證配置合法性。tail -f /var/log/mysql/error.log 比 service status 更直觀。「報錯 unknown variable → 查手冊改參數名 → 重啟」是 Ubuntu/MySQL 遷移升級最常見的啟動阻斷,記住 character-set-server 替代 default-character-set,一分鐘搞定。