生產環境常需從應用服務器、BI 工具、開發機遠程訪問 MySQL。配置前先確認服務端口監聽狀態:
netstat -an | grep LISTEN
# 預期看到 0.0.0.0:3306 或 :::3306
若僅綁定 127.0.0.1,需修改 my.cnf 的 bind-address = 0.0.0.0 並重啟服務。
mysql -u root -p
推薦:按最小權限原則,僅授權所需庫/表
-- 僅允許 192.168.88.234 訪問所有庫所有表的增刪改查
CREATE USER 'xuys'@'192.168.88.234' IDENTIFIED BY 'xuys1234';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'xuys'@'192.168.88.234';
-- 開發/測試環境可放寬為任意主機(%),生產嚴禁
CREATE USER 'xuys'@'%' IDENTIFIED BY 'xuys1234';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'xuys'@'%';
USE mysql;
SELECT Host, User, authentication_string FROM user WHERE User = 'xuys';
FLUSH PRIVILEGES;
-- 或命令行:mysqladmin -u root -p reload
# 從遠程機器測試
mysql -h -u xuys -p
# 輸入密碼 xuys1234
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| ERROR 1130 (HY000): Host not allowed | 用戶 Host 欄位不匹配 | 檢查 user.Host,改為具體 IP 或 %,再 FLUSH PRIVILEGES |
| Connection refused / timeout | 防火牆攔截、bind-address 未綁 0.0.0.0 | 開放 3306 端口;修改 my.cnf 綁定 0.0.0.0 並重啟 |
| ERROR 1045: Access denied | 密碼錯誤、插件不匹配(caching_sha2_password vs mysql_native_password) | 確認密碼;舊客戶端需 ALTER USER 'xuys'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; |
| SSL connection required | 服務端強制 SSL,客戶端未配置 | 客戶端加 --ssl-mode=REQUIRED 或服務端放寬 require_secure_transport=OFF |
MySQL 5.0 之前權限系統較簡陋,部分遷移文檔提及直接操作 mysql.db 表。現代版本(5.7+)強烈不建議直接操作權限表,應統一使用 GRANT/REVOKE。若確需兼容極舊應用,參考:
-- 僅作歷史參考,勿用於新系統
INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Create_tmp_table_priv, Lock_tables_priv)
VALUES ('192.168.88.234', '%', 'xuys', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
FLUSH PRIVILEGES;
*.* 全庫授權'%',精確到應用服務器 IP 段validate_password 插件,強制長度、複雜度、過期輪換audit_log 記錄所有連接與 DML 操作MySQL 遠程連接核心三步:創建用戶指定 Host → 精確授權 → 刷新權限。配合網絡層防火牆、傳輸加密、審計日誌,構建纵深防御體系。避免直接操作權限表、避免通配符 Host、避免弱密碼,是生產環境穩定運行的基石。