| 現象 | 可能原因 | 排查命令/動作 |
|---|---|---|
| 命令列閃退/無反應 | 配置檔 `my.ini` 缺失或路徑錯誤 | 檢查安裝目錄是否有 `my.ini`;無則從 `my-small.ini`/`my-default.ini` 複製並重命名 |
| 服務啟動失敗「服務無法啟動」 | 服務未安裝、datadir 路徑錯誤、權限不足、端口衝突 | `sc query mysql` 檢查服務狀態;`mysqld --console` 前台啟動看錯誤輸出 |
| 連線報 "Can't connect to MySQL server" | 服務未運行、socket/port 不匹配、防火牆攔截 | `netstat -an | findstr 3306`;`mysql -u root -p -h 127.0.0.1` 強制 TCP |
| 建表報 "Can't create table" / 外鍵不生效 | 表引擎非 InnoDB(MyISAM 不支援外鍵) | `SHOW CREATE TABLE t;` 確認 `ENGINE=InnoDB`;建表時顯式指定 |
| 遠程連線 "Host 'x.x.x.x' is not allowed" | 用戶 Host 欄位不匹配、未授權遠程、防火牆 | `SELECT User,Host FROM mysql.user;`;`GRANT ... TO 'user'@'%'; FLUSH PRIVILEGES;` |
| 中文亂碼 | 字符集不一致(庫/表/欄位/連線) | 統一 `utf8mb4`:`ALTER DATABASE ... CHARSET=utf8mb4;` 連線加 `characterEncoding=utf8` |
# Windows
sc query mysql
net start mysql
# Linux systemd
systemctl status mysqld
systemctl start mysqld
# Linux SysV
service mysqld status
service mysqld start
# 以 mysql 用戶執行,直接輸出錯誤到終端
mysqld --console --user=mysql
# 或指定配置檔
mysqld --defaults-file=/etc/my.cnf --console --user=mysql
前台啟動能看到完整啟動日誌、InnoDB 恢復過程、錯誤堆疊,是解決「服務啟動即退出」的核心手段。
# Linux 預設位置
/var/log/mysqld.log
/var/log/mysql/error.log
# Windows 預設位置(data 目錄下)
\.err
# 配置檔中指定
log_error = /var/log/mysql/error.log
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'port';"
MySQL Windows 安裝包有時不自動生成 `my.ini`。解決:
# 移除舊服務
mysqld --remove
# 或指定服務名
mysqld --remove MySQL57
# 重新安裝
mysqld --install MySQL57 --defaults-file="C:\Program Files\MySQL\MySQL Server 5.7\my.ini"
# 檢查狀態
getenforce
sestatus
# 臨時放行(驗證用)
setenforce 0
# 永久修正:恢復標籤
restorecon -Rv /var/lib/mysql
# 或自定義 datadir
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
restorecon -Rv /data/mysql
大資料量 InnoDB 恢復可能超過 `TimeoutStartSec`(預設 90s)。
# 編輯 systemd 服務檔
systemctl edit mysqld
# 加入:
[Service]
TimeoutStartSec=300
TimeoutStopSec=300
-- 錯誤建表示例(MyISAM 不支援外鍵,語法雖通過但不生效)
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=MyISAM;
-- 正確:必須指定 InnoDB
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=InnoDB;
-- 建立業務專用帳號,僅授必要權限
CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED BY 'StrongP@ssw0rd';
GRANT SELECT, INSERT, UPDATE, DELETE ON `biz_db`.* TO 'app_user'@'10.0.0.%';
FLUSH PRIVILEGES;
MySQL 安裝後「不能用」 90% 歸因於:配置檔缺失/路徑錯、服務未正確安裝、字符集不一致、權限/防火牆未放行。掌握「前台啟動看日誌、檢查錯誤日誌、驗證變數生效」三板斧,可解決絕大多數上線初期問題。