最近遇到一個問題,連接MySQL的時候主機名用localhost可以,用127.0.0.1則不行。於是乎google了一番,總結下,以做備忘吧。
一. MySQL啟動的配置
首先MySQL啟動時會加載配置文件,即my.cnf文件。在這個文件中我們可以設置連接數據庫的IP限制, 如下圖
二. MySQL驗證連接的過程。
我們知道MySQL服務器是通過權限表來控制用戶訪問的,權限表放置在mysql數據庫中,由mysql_install_db腳本初始化。這些MySQL權限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結構和內容:
user權限表
: 記錄允許連接到服務器的用戶帳號信息,里面的權限是全局級的。
db權限表: 記錄各個帳號在各個數據庫上的操作權限。
table_priv權限表: 記錄數據表級的操作權限。
columns_priv權限表:記錄數據列級的操作權限。
host權限表: 配合db權限表對給定主機上數據庫級操作權限作更細致的控制。這個權限表不受GRANT和REVOKE語句的影響。
那連接數據庫的存取過程是怎樣的呢:
1. 先從user表中的host、 user、 password這3個字段中判斷連接的主機名、用戶名、密碼是否存在表中,存在則通過身份驗證;
2. 第一步通過后才會進行數據庫、表、列等權限的查詢和分配。
三. 分析
那127.0.0.1連接不上數據庫就可能是以下三種原因:
1. my.cnf 文件中做了IP限制,一般會報這樣的錯誤
SQLSTATE[HY000] [2002] Connection refused
2. user 權限表127的主機名不存在,一般拋錯是
SQLSTATE[HY000] [1130] Host ‘xx.xx.xx.xx’ is not allowed to connect to this MySQL server
3. 用戶名密碼填寫錯誤,一般拋錯是
ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)
四. 雜項
1. 主機名為localhost 是通過 UNIX socket 連接數據庫的, 主機名為IP則是通過TCP/IP連接的。直接上圖

