標籤:img database inf linu 方案 圖片 get http grant
在命令列輸入mysql -u root –p,輸入密碼,或通過工具串連資料庫時,經常出現下面的錯誤資訊,詳細該錯誤資訊很多人在使用MySQL時都遇到過。
ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
**
通常從網上都能找到解決方案:
**
1.停止服務:停止MySQL服務;
# windows net stop mysql # linux service mysqld stop
2.跳過驗證:修改MySQL安裝目錄下的my.ini設定檔,使登入時跳過許可權檢查;
#到mysql根目錄找到mysql設定檔 vim my.ini #在my.ini,[mysqld]下添加一行,使其登入時跳過許可權檢查 skip_grant_tables
3.修改密碼:啟動MySQL服務,登入MySQL,此時提示輸入密碼,輸入任意密碼斷行符號即可進入MySQL。
#登入mysqlmysql -u root -p
然後通過SQL語句修改root使用者的密碼;
#將資料庫切換至mysql庫mysql> USE mysql;#修改密碼mysql> UPDATE user SET password=PASSWORD(‘newpasswd’)WHERE user=’root’; #重新整理MySQL許可權相關的表mysql> flush privileges;mysql> exit;
4.重啟服務:將my.ini檔案中加入的跳過許可權語句刪除或加#號注釋。重啟服務,使用修改後的密碼登入即可。
**
原因分析:
**
使用root使用者登入MySQL,查看user表中的使用者資訊如下,可以發現host的欄位分別為%和localhost。
mysql>select host,user,password from user;
在MySQL中%表示可以在任何主機上登入MySQL資料庫,那為什麼還需要明確建立登入主機為localhost的使用者呢?
這涉及到MySQL安裝時的初始化使用者,匿名使用者以及串連驗證策略等,下面進行深入的分析。
在安裝MySQL時,會預設初始化一些使用者,比如root使用者,以及host欄位為localhost,user欄位為空白的使用者。User欄位為空白的使用者即為匿名使用者,該使用者的密碼也為空白,任何人都可以使用匿名使用者登入MySQL資料庫,但可以做的事情卻是有限的,比如在命令列直接輸入mysql登入,可以查看匿名使用者對哪些資料庫有許可權:
mysql>select current_user;
mysql>show databases;
通過上面的圖片可以發現,匿名使用者僅對information_schema和test資料庫有許可權。
而匿名使用者又是如何影響其他使用者登入,進而出現28000錯誤的呢?
當試圖串連MySQL資料庫時,資料庫根據提供的身份和密碼決定是否接受串連請求,身份由兩部分組成:使用者名稱和用戶端主機(即輸入mysql命令的主機)。
由於host欄位中的%匹配任何主機或者host欄位包含萬用字元,就可能出現多個匹配行,伺服器必須決定匹配哪一個,解決方案如下:
伺服器將user表中的資料讀入記憶體中,按照host和user欄位對行進行排序。
mysql>select host,user,password from user order by host desc,user desc;
當用戶端試圖串連時,伺服器尋找已排序的行並使用第一個匹配用戶端主機和使用者名稱的行,user欄位為空白表示可以匹配任何使用者。
找到匹配行後,在驗證密碼是否一致,如果一致則登入成功。
此處主要關注第四行,user為空白,即任意使用者,不使用密碼登入localhost時,匿名使用者僅對information_schema和test資料庫有許可權,使用其他資料庫時,導致失敗。
SO 解決辦法
mysql> select host,user,password from user order by host desc,user desc;mysql> update user set host = ‘%‘ where host = ‘oracle‘ and user = ‘root‘;mysql> flush privileges;
轉載出處:
1.深入分析MySQL ERROR 1045 (28000)
http://www.linuxidc.com/Linux/2014-07/104244.htm
xampp內建mysql命令深入分析MySQL ERROR 1045 (28000)