MYSQL建立使用者後本地無法登入的原因
在安裝完成後,我們通常新增擁有相應許可權的普通使用者用來訪問資料庫。在使用使用者本地登入資料庫的時候,經常會出現怎麼登入也無法登入的情況,但是從其他的mysql客戶端卻可以登入。
[root@mysql01 ~]# mysql -userver -p123456 本地登入失敗;
[root@mysql02 ~]# mysql -h192.168.47.166 -userver -p123456
遠端登入成功; |
一、登入後檢視mysql.user表的情況
可以看到,我的資料庫中有server使用者和匿名使用者localhost;
- server使用者的密碼是'server'
- 匿名使用者的密碼為空
二、在本機用server使用者登入,發現不用密碼可以登入;
[root@mysql01 ~]# mysql -userver -p Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SELECT USER(), CURRENT_USER(); |
登入成功了,使用USER()和CURRENT_USER()兩個函式檢視所使用的使用者。
- USER()函式返回你在客戶端登陸時指定的使用者名稱和主機名。
- CURRENT_USER()函式返回的是MySQL使用授權表中的哪個使用者來認證你的登入請求。
這裡發現,我使用這個賬戶登入資料庫(因為在本地登陸時沒指定主機,預設是以localhost登入),但是資料庫使用的是''@'localhost'這個賬戶來進行登入認證,而''@'localhost'這個匿名使用者是沒有密碼的,因此我輸入空密碼登入成功了。但是登入後,所對應的使用者的匿名使用者。
一般在MySQL在安裝完畢後,我們使用mysql_install_db這個指令碼生成授權表,會預設建立這個匿名使用者。正是因為這個匿名使用者,影響了其他使用者從本地登入的認證。
那麼MySQL是如何進行使用者身份認證呢?
一、當使用者從客戶端請求登陸時,MySQL將授權表中的條目與客戶端所提供的條目進行比較,包括使用者的使用者名稱,密碼和主機。授權表中的Host欄位是可以使用萬用字元作為模式進行匹配的,如test.example.com, %.example.com, %.com和%都可以匹配test.example.com這個主機。授權表中的User欄位不允許使用模式匹配,但是可以有一個空字元的使用者名稱代表匿名使用者,並且空字串可以匹配所有的使用者名稱,就像萬用字元一樣。 當user表中的Host和User有多個值可以匹配客戶端提供的主機和使用者名稱時,MySQL將user表讀入記憶體,並且按照一定規則排序,按照排序規則讀取到的第一個匹配客戶端使用者名稱和主機名的條目對客戶端進行身份驗證。
二、排序規則:對於Host欄位,按照匹配的精確程度進行排序,越精確的排序越前,例如當匹配test.example.com這個主機時, %.example.com比%.com更精確,而test.example.com比%.example.com更精確。對於User欄位,非空的字串使用者名稱比空字串匹配的使用者名稱排序更靠前。 User和Host欄位都有多個匹配值,MySQL使用主機名排序最前的條目,在主機名欄位相同時再選取使用者名稱排序更前的條目。因此,如果User和Host欄位都有多個匹配值,主機名最精確匹配的條目被使用者對使用者進行認證。
瞭解了這個認證流程,就知道為什麼server登入失敗了。
使用GaMe在本機登入資料時,不指定-h引數預設為localhost主機登入,而在MySQL中有兩個匹配的條目: 和
匿名使用者能夠匹配的原因上面說過,空字串可以匹配所有的使用者名稱,就像萬用字元一樣。
根據MySQL認證時的排序規則,第一個條目的使用者名稱排序更前,第二個條目的主機名更精確,排序更前。
而MySQL會優先使用主機名排序第一的條目進行身份認證,因此被使用者對客戶端進行認證。因此,只有使用匿名使用者的空密碼才能登入進資料庫。就會出現下面的情況了。
解決的方法:刪除匿名使用者(僅僅為了安全也有這個必要)
為什麼root使用者不會受影響,而只有普通使用者不能從本地登入?
因為mysql_install_db指令碼會在授權表中生成'root'@'localhost'這個賬戶。同樣的,使用root登入MySQL 時,'root'@'localhost'和''@'localhost'都能匹配登入的賬戶,但是根據排序規則,主機名相同,而使用者名稱非空字串優先,因此這個條目的排序更靠前。使用root本地登入是不會被匿名使用者遮蓋。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
以上方法參考Google的搜尋結果,並經過實際的測試和驗證;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12679300/viewspace-1453490/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 本地無法連線Mysql的原因MySql
- oracle安裝後無法登入Oracle
- rabbitmq 重啟之後無法登入MQ
- 解決mysql無法遠端登入的方法MySql
- mysql使用者本地登入localhost和127.0.0.1區別MySqllocalhost127.0.0.1
- 使用者登入前臺之後,無法退出如何解決?謝謝
- VSFTPD 本地使用者登入。FTP
- 主機安裝zblog 無法登陸:錯誤原因:登入失敗
- vsftpd 本地使用者無法登陸 530 Login incorrectFTP
- SYS使用者可以登入,其他使用者無法登陸的問題處理
- rabbitmq的web管理介面無法使用guest使用者登入MQWeb
- vsftp本地使用者不能登入FTP
- solaris預設無法遠端root使用者登入
- 帝國CMS系統開啟https後,無法登陸後臺的原因和解決方法HTTP
- [提問交流]本地正常 上傳到伺服器後無法登陸伺服器
- Ucenter後臺登陸驗證碼CCCC的解決方法無法登入解決辦法
- Vue的動態選單無法登入(無法載入選單)Vue
- windows 安裝 企業QQ後,個人qq無法登入Windows
- 新浪UC無法登入的解決辦法
- MySql事務無法回滾的原因有哪些MySql
- linux 本地賬號密碼無法登陸(shell可以登入),一直返回 登陸的login介面Linux密碼
- OpenSSH普通使用者無法登入的幾種情況的解決方法
- oracle本地登入Oracle
- 再次崩潰,伺服器端安裝好程式後,匯入本地的資料檔案,又無法登陸了伺服器
- onethinkphp新建模組後,無法使用普通使用者登入問題,麻煩幫忙看下。PHP
- 誰幹的mysql無密碼登入?薦MySql密碼
- 建立Location後無法儲存問題
- Windows server 2012R2系統安裝遠端桌面服務後無法多使用者同時登入是什麼原因?WindowsServer
- 織夢dedecms無法登入後臺,提示使用者名稱或密碼錯誤怎麼辦密碼
- 無法開啟登入所請求的資料庫,登入失敗資料庫
- 解決網易考拉無法登入
- 遠端無法登入管理頁面
- GitHub Windows客戶端無法登入GithubWindows客戶端
- PHP無法載入MYSQL模組PHPMySql
- [BUG反饋]會員“最後登入IP”資料無法獲取
- 解決ZBLOG PHP 程式無法登入後臺賬戶問題PHP
- python無法匯入包是什麼原因Python
- phpMyAdmin出現”#2002 無法登入 MySQL 伺服器”PHPMySql伺服器