xampp自帶mysql命令深刻分析MySQL ERROR 1045 (28000)

在命令行輸入mysql -u root –p,輸入密碼,或經過工具鏈接數據庫時,常常出現下面的錯誤信息,詳細該錯誤信息不少人在使用MySQL時都遇到過。php

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 
  • 1

**mysql

一般從網上都能找到解決方案:

**linux

1.中止服務:中止MySQL服務;sql

# windows net stop mysql # linux service mysqld stop
  • 1
  • 2
  • 3
  • 4

2.跳過驗證:修改MySQL安裝目錄下的my.ini配置文件,使登陸時跳過權限檢查;數據庫

#到mysql根目錄找到mysql配置文件 vim my.ini #在my.ini,[mysqld]下添加一行,使其登陸時跳過權限檢查 skip_grant_tables
  • 1
  • 2
  • 3
  • 4

3.修改密碼:啓動MySQL服務,登陸MySQL,此時提示輸入密碼,輸入任意密碼回車便可進入MySQL。vim

#登陸mysql mysql -u root -p
  • 1
  • 2

而後經過SQL語句修改root用戶的密碼;windows

#將數據庫切換至mysql庫 mysql> USE mysql; #修改密碼 mysql> UPDATE user SET password=PASSWORD(‘newpasswd’)WHERE user=’root’; #刷新MySQL權限相關的表 mysql> flush privileges; mysql> exit;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.重啓服務:將my.ini文件中加入的跳過權限語句刪除或加#號註釋。重啓服務,使用修改後的密碼登陸便可。服務器

**oracle

緣由分析:

** 
使用root用戶登陸MySQL,查看user表中的用戶信息以下,能夠發現host的字段分別爲%和localhost。工具

mysql>select host,user,password from user;
  • 1

這裏寫圖片描述

在MySQL中%表示能夠在任何主機上登陸MySQL數據庫,那爲何還須要明確建立登陸主機爲localhost的用戶呢? 
這涉及到MySQL安裝時的初始化用戶,匿名用戶以及鏈接驗證策略等,下面進行深刻的分析。

在安裝MySQL時,會默認初始化一些用戶,好比root用戶,以及host字段爲localhost,user字段爲空的用戶。User字段爲空的用戶即爲匿名用戶,該用戶的密碼也爲空,任何人均可以使用匿名用戶登陸MySQL數據庫,但能夠作的事情倒是有限的,好比在命令行直接輸入mysql登陸,能夠查看匿名用戶對哪些數據庫有權限:

mysql>select current_user;
  • 1

這裏寫圖片描述

mysql>show databases;
  • 1

這裏寫圖片描述

經過上面的圖片能夠發現,匿名用戶僅對information_schema和test數據庫有權限。 
而匿名用戶又是如何影響其餘用戶登陸,進而出現28000錯誤的呢? 
當試圖鏈接MySQL數據庫時,數據庫根據提供的身份和密碼決定是否接受鏈接請求,身份由兩部分組成:用戶名和客戶端主機(即輸入mysql命令的主機)。 
因爲host字段中的%匹配任何主機或者host字段包含通配符,就可能出現多個匹配行,服務器必須決定匹配哪個,解決方案以下:

服務器將user表中的數據讀入內存中,按照host和user字段對行進行排序。

mysql>select host,user,password from user order by host desc,user desc;
  • 1

這裏寫圖片描述

當客戶端試圖鏈接時,服務器查找已排序的行並使用第一個匹配客戶端主機和用戶名的行,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
  • 2
  • 3

這裏寫圖片描述


轉載出處: 
1.深刻分析MySQL ERROR 1045 (28000) 
http://www.linuxidc.com/Linux/2014-07/104244.htm

相關文章
相關標籤/搜索