phpMyAdmin 顯示「嘗試連接到 MySQL 伺服器,但伺服器拒絕連接」是開發環境配置中最常見的問題之一。本文系統梳理從配置檢查、服務狀態、權限設定到網路層面的完整排查流程,並針對 Windows (WAMP/XAMPP)、Linux、Docker 等環境提供針對性解決方案。
phpMyAdmin 嘗試連接到 MySQL 伺服器,但伺服器拒絕連接。
您應該檢查 config.inc.php 中的主機、用戶名和密碼,
並且確定這些信息與 MySQL 服務器的管理員所給出的信息一致。
這是通用錯誤訊息,實際原因可能包含:
# Linux systemd
systemctl status mysqld
# 或
systemctl status mysql
# Windows 服務
net start mysql
# 或服務管理器 services.msc 查找 MySQL
# Docker
docker ps | grep mysql
docker logs # 查看啟動日誌
關鍵日誌特徵:正常啟動會出現 ready for connections;若出現 InnoDB: Starting shutdown、Shutdown complete 則服務已停止。
<?php
// phpMyAdmin 設定檔典型位置
// /etc/phpmyadmin/config.inc.php (Linux)
// C:\wamp64\apps\phpmyadminX.X.X\config.inc.php (Windows)
$cfg['Servers'][$i]['host'] = '127.0.0.1'; // 建議用 IP 而非 localhost
$cfg['Servers'][$i]['port'] = '3306'; // 確認埠號
$cfg['Servers'][$i]['socket'] = ''; // Linux 若用 Socket 需指定正確路徑
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'your_password';
$cfg['Servers'][$i]['auth_type'] = 'cookie'; // 或 config/http
?>
關鍵差異:localhost 在 PHP 中預設使用 Unix Socket 連線;127.0.0.1 強制使用 TCP/IP。Windows 環境下兩者皆走 TCP,但 Linux 下若 Socket 路徑錯誤,localhost 會失敗而 127.0.0.1 可能成功。
# 基本連線測試
mysql -h 127.0.0.1 -P 3306 -u root -p
# 指定 Socket (Linux)
mysql -S /var/run/mysqld/mysqld.sock -u root -p
# 免密碼測試 (僅限本地 root 無密碼)
mysql -u root
若命令列能連線,問題在 phpMyAdmin 設定;若命令列也失敗,問題在 MySQL 服務/權限/網路。
-- 登入 MySQL 後執行
SELECT User, Host, plugin, authentication_string FROM mysql.user;
-- 常見問題:root 只允許 localhost 連線
-- 解決:建立允許 127.0.0.1 或 % 的使用者
CREATE USER 'admin'@'127.0.0.1' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
-- MySQL 8.0+ 需指定驗證插件
CREATE USER 'admin'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'strong_password';
# /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf
[mysqld]
# 預設只監聽 127.0.0.1,若需外部連線改為 0.0.0.0
bind-address = 127.0.0.1
# 或
bind-address = 0.0.0.0
# 修改後必須重啟
systemctl restart mysqld
# firewalld
firewall-cmd --permanent --add-service=mysql
firewall-cmd --reload
# iptables
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# SELinux 允許 httpd 連線資料庫
setsebool -P httpd_can_network_connect_db 1
my.ini 中 port=3307,同步更新 phpMyAdmin 設定start mysql -l localhost -u root -p 參數錯誤,正確為 mysql -h localhost -u root -p(無 -l 參數)# docker-compose.yml 關鍵設定
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: mysql # 服務名稱而非 localhost
PMA_PORT: 3306
PMA_USER: root
PMA_PASSWORD: rootpass
ports:
- "8080:80"
depends_on:
- mysql
關鍵點:容器間通訊使用服務名稱 mysql,而非 localhost。
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過權限表啟動
mysqld_safe --skip-grant-tables --skip-networking &
# 3. 免密登入並修改
mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
# MySQL 5.7 或較舊版本
UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
# 4. 正常重啟
pkill mysqld
systemctl start mysqld
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/general.log
log_output = FILE
觀察 phpMyAdmin 實際發送的連線請求與錯誤碼。
<?php
// 臨時測試腳本 test_conn.php
$mysqli = new mysqli('127.0.0.1', 'root', 'password', '', 3306);
if ($mysqli->connect_errno) {
echo "連線失敗: " . $mysqli->connect_error;
echo "錯誤碼: " . $mysqli->connect_errno;
} else {
echo "連線成功";
$mysqli->close();
}
?>
| 錯誤碼 | 常數 | 說明 | 解決方向 |
|---|---|---|---|
| 1045 | ER_ACCESS_DENIED_ERROR | 帳號/密碼錯誤 | 檢查密碼、權限、plugin |
| 2003 | CR_CONN_HOST_ERROR | 無法連線主機 | 服務未啟動、防火牆、bind-address |
| 2002 | CR_CONNECTION_ERROR | Socket 連線失敗 | Socket 路徑錯誤、服務未啟動 |
| 1698 | ER_ACCESS_DENIED_NO_PASSWORD_ERROR | root 使用 auth_socket 外掛 | 改用 mysql_native_password 或建立新使用者 |
config.inc.php 參數是否正確(特別是 host 用 127.0.0.1)?按順序排查,90% 以上案例可在前三步解決。記住:先驗證 MySQL 本身,再檢查 phpMyAdmin 設定,避免在應用層浪費時間。