簡體   English   中英

MySQL 錯誤 1045 (28000):用戶 'bill'@'localhost' 的訪問被拒絕(使用密碼:YES)

[英]MySQL ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

首先讓我提一下,我已經經歷了很多建議的問題,但沒有找到相關的答案。 這就是我在做什么。

我已連接到我的 Amazon EC2 實例。 我可以使用以下命令使用 MySQL root 登錄:

mysql -u root -p

然后我用主機 % 創建了一個新的用戶賬單

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

授予用戶 bill 所有權限:

grant all privileges on *.* to 'bill'@'%' with grant option;

然后我退出 root 用戶並嘗試使用 bill 登錄:

mysql -u bill -p

輸入正確的密碼並出現此錯誤:

錯誤 1045 (28000):用戶 'bill'@'localhost' 的訪問被拒絕(使用密碼:YES)

您可能有一個匿名用戶''@'localhost'''@'127.0.0.1'

根據 手冊

當可能有多個匹配時,服務器必須確定使用哪一個。 它解決了這個問題如下:(...)

  • 當客戶端嘗試連接時,服務器會按排序順序查看[表 mysql.user]的行。
  • 服務器使用與客戶端主機名和用戶名匹配的第一行。

(...) 服務器使用排序規則,首先對具有最具體 Host 值的行進行排序。 文字主機名[例如 'localhost']和 IP 地址是最具體的。

因此,當從localhost連接時,這樣的匿名用戶會“屏蔽”任何其他用戶,例如'[any_username]'@'%'

'bill'@'localhost'確實匹配'bill'@'%' ,但會事先匹配(例如) ''@'localhost'

推薦的解決方案是刪除這個匿名用戶(這通常是一件好事)。


下面的編輯大多與主要問題無關。 這些只是為了回答該線程中其他評論中提出的一些問題。

編輯 1

通過套接字驗證為'bill'@'%'

root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock
    Welcome to the MySQL monitor (...)

    mysql> SELECT user, host FROM mysql.user;
    +------+-----------+
    | user | host      |
    +------+-----------+
    | bill | %         |
    | root | 127.0.0.1 |
    | root | ::1       |
    | root | localhost |
    +------+-----------+
    4 rows in set (0.00 sec)

    mysql> SELECT USER(), CURRENT_USER();
    +----------------+----------------+
    | USER()         | CURRENT_USER() |
    +----------------+----------------+
    | bill@localhost | bill@%         |
    +----------------+----------------+
    1 row in set (0.02 sec)

    mysql> SHOW VARIABLES LIKE 'skip_networking';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | skip_networking | ON    |
    +-----------------+-------+
    1 row in set (0.00 sec)

編輯 2

完全相同的設置,除了我重新激活了網絡,我現在創建了一個匿名用戶''@'localhost'

root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Welcome to the MySQL monitor (...)

    mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
    Query OK, 0 rows affected (0.00 sec)

    mysql> Bye

    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket=/tmp/mysql-5.5.sock
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol=TCP
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol=TCP
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

編輯 3

與編輯 2 中的情況相同,現在提供匿名用戶的密碼。

root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Welcome to the MySQL monitor (...)

    mysql> SELECT USER(), CURRENT_USER();
    +----------------+----------------+
    | USER()         | CURRENT_USER() |
    +----------------+----------------+
    | bill@localhost | @localhost     |
    +----------------+----------------+
    1 row in set (0.01 sec)

結論 1,來自編輯 1:可以通過套接字驗證為'bill'@'%'

結論 2,來自編輯 2:一個人是通過 TCP 連接還是通過套接字連接對身份驗證過程沒有影響(除非一個人不能像其他任何人一樣連接,而是通過套接字'something'@'localhost' ,顯然)。

結論 3,來自編輯 3:雖然我指定-ubill ,但我已被授予匿名用戶訪問權限。 這是因為上面建議的“排序規則”。 請注意,在大多數默認安裝中, 存在一個無密碼的匿名用戶(並且應該保護/刪除)。

嘗試:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

當你跑

mysql -u bill -p

並得到了這個錯誤

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

mysqld 期待您以bill@localhost身份連接

嘗試創建bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

如果要遠程連接,則必須使用 TCP/IP 指定 DNS 名稱、公共 IP 或 127.0.0.1:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

登錄后,請運行此

SELECT USER(),CURRENT_USER();

USER()報告您如何嘗試在 MySQL 中進行身份驗證

CURRENT_USER()報告您是如何被允許從mysql.user表在 MySQL 中進行身份驗證的

這將使您更好地了解允許您登錄 mysql 的方式和原因。 為什么知道這個觀點很重要? 它與用戶身份驗證排序協議有關。

這是一個示例:我將在我的桌面 MySQL 上創建一個匿名用戶

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

好的,看我以匿名用戶身份登錄:

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

身份驗證順序非常嚴格。 它從最具體到最少進行檢查。 我在 DBA StackExchange 中寫過關於這種身份驗證風格的文章

必要時不要忘記顯式調用 TCP 作為 mysql 客戶端的協議。

超級遲到

我嘗試了所有這些其他答案並運行了許多不同版本的mysql -u root -p但從未運行過


mysql -u root -p

只需按[ENTER]即可輸入密碼。


一旦我這樣做了,它就起作用了。 希望這可以幫助某人。

當您鍵入mysql -u root -p時,您將通過本地 unix 套接字連接到 mysql 服務器。

然而,你給予的授權, 'bill'@'%'只是奇怪地匹配 TCP/IP 連接。

如果要授予對本地 unix 套接字的訪問權限,則需要授予 'bill'@'localhost' 權限,奇怪的是,這與 'bill'@'127.0.0.1' 不同

您還可以使用 TCP/IP 與 mysql 命令行客戶端進行連接,以匹配您已經授予的權限,例如運行mysql -u root -p -h 192.168.1.123或您的機器具有的任何本地 IP 地址。

在我的案例中,一個相關的問題是嘗試使用以下方式進行連接:

mysql -u mike -p mypass

-u #uname# 之間顯然允許使用空格,但 -p 和 #password# 之間不允許使用空格

因此需要:

mysql -u mike -pmypass

否則 -p mypass mysql 之間的空格將 'mypass' 作為數據庫名稱

我遇到了一個類似的問題——在我第一次嘗試以root身份進入 MySQL 時,它告訴我訪問被拒絕。 原來我忘了使用sudo ...

因此,如果您在第一次嘗試root時失敗,請嘗試:

sudo mysql -u root -p

然后輸入您的密碼,這應該可以。

如果您忘記密碼或想修改密碼。您可以按照以下步驟操作:

1:停止你的mysql

[root@maomao ~]# service mysqld stop
停止 MySQL:[確定]

2:使用“--skip-grant-tables”重啟mysql

[root@mcy400 ~]# mysqld_safe --skip-grant-tables
[root@cy400 ~]# 使用 /var/lib/mysql 中的數據庫啟動 mysqld 守護進程

3:打開一個新窗口並輸入mysql -u root

[root@cy400 ~]# mysql -u root
歡迎使用 MySQL 監視器。 命令以 ; 結尾或\g。

4:更改用戶數據庫

mysql> 使用 mysql
讀取表信息以完成表名和列名您可以關閉此功能以獲得更快的啟動 -A 數據庫已更改

5:修改您的密碼您的新密碼應輸入“()”

mysql>更新用戶設置密碼=密碼('root123')其中用戶='root';
查詢正常,3 行受影響(0.00 秒)
匹配行:3 更改:3 警告:0

6:沖洗

mysql> 刷新權限;

7:退出

mysql>退出
再見

8:重啟mysql

[root@cy400 ~]#服務mysqld重啟;
停止 MySQL:[確定]
啟動 MySQL:[確定]

Bingo!您可以使用您的用戶名和新密碼連接您的數據庫:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye

避免讓自己頭疼……您的問題可能是您缺少密碼周圍的引號。 至少那是我繞道了 3 個小時的情況。

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

搜索“這是一個典型的用戶選項文件:”並查看他們在其中陳述的示例。 祝你好運,我希望能節省一些時間。

解決方法是刪除匿名(Any)用戶!

我在其他人設置的服務器上也遇到了同樣的問題。 我通常不會在安裝 MySQL 時選擇創建匿名用戶,所以沒有注意到這一點。 最初,我以“root”用戶身份登錄並創建了幾個“普通”用戶(也就是僅在 dbs 上具有權限的用戶,其用戶名作為前綴),然后注銷,然后繼續驗證第一個普通用戶。 我無法登錄。既不是通過phpMyAdmin,也不是通過shell。 原來,罪魁禍首是這個“任何”用戶。

我為自己找到的最佳解決方案是。

我的用戶是聲納,每當我嘗試從外部或其他機器連接到我的數據庫時,我都會收到錯誤消息

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

此外,當我從另一台機器上嘗試這個並通過 Jenkins 工作時,我的訪問 URL 是

alm-lt-test.xyz.com

如果你想遠程連接,你可以用不同的方式指定它,如下所示:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

要使用 URL 訪問它,您只需執行以下查詢。

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';

這是以下之間的區別:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

核實:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

命令

mysql -u bill -p

隱式訪問 'bill'@'localhost' 而不是 'bill'@'%'。

'bill'@'localhost' 沒有權限

你得到錯誤:

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

解決問題:

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;

好的,我不確定,但可能這是 mysql 安裝目錄中的 my.cnf 文件是罪魁禍首。 注釋掉這一行,問題可能就解決了。

bind-address = 127.0.0.1

不確定其他人是否會覺得這很有幫助,但我遇到了同樣的錯誤,並到處搜索任何匿名用戶……但沒有。 問題最終是用戶帳戶設置為“需要 SSL” - 我在 PHPMyAdmin 中通過轉到用戶帳戶並單擊用戶的編輯權限來找到它。 一旦我取消選中此選項,一切都按預期工作!

當您的密碼包含一些特殊字符(如@、$ 等)時也會發生這種情況。 為避免這種情況,您可以將密碼用單引號括起來:

$ mysql -usomeuser -p's0mep@$$w0Rd'

或者在輸入時不要使用密碼。 將其留空,然后在終端詢問時鍵入。 這是推薦的方式。

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

更新:在 v8.0.15(可能是這個版本)上, PASSWORD()函數不起作用。

你必須:

  1. 確保您首先停止了 MySQL。
  2. 以繞過特權的安全模式運行服務器: sudo mysqld_safe --skip-grant-tables
  3. 登錄: mysql -u root
  4. mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> exit;
  7. 再次登錄: mysql -u root
  8. mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

只是想讓你知道一個不尋常的情況,我收到了同樣的錯誤。 也許這對將來的某人有所幫助。

我開發了一些基本視圖,在開發站點創建並將它們轉移到生產站點。 那周晚些時候,我更改了一個 PHP 腳本,突然出現錯誤,用戶'local-web-user'@'localhost'的訪問被拒絕。 數據源對象沒有改變,所以我專注於 MySQL 中的數據庫用戶,同時擔心有人入侵了我的網站。 幸運的是,該網站的其余部分似乎安然無恙。

后來事實證明,這些觀點是罪魁禍首。 我們的對象傳輸是使用另一個(和遠程:admin@ip-address)用戶而不是本地網站用戶完成的。 因此,視圖是使用 'admin'@'ip-address' 作為定義者創建的。 視圖創建 SECURITY 默認為

SQL SECURITY DEFINER

當 local-web-user 嘗試使用視圖時,它偶然發現定義者缺乏使用表的權限。 一旦安全性更改為:

SQL SECURITY INVOKER

問題已解決。 實際問題與基於錯誤消息的預期完全不同。

對我來說,這個問題是由 MySQL 5.7.2 的一個新特性引起的:如果他們的plugin字段為空, user條目將被忽略

將其設置為例如mysql_native_password以重新啟用它們:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

請參閱 «Authentication Notes» 下MySQL 5.7.2 的發行說明

出於某種原因(可能是因為我的 4.1 之前的密碼哈希被刪除了), mysql_upgrade腳本沒有設置默認插件值。

我通過在/var/log/mysql/error.log中注意到以下警告消息發現:

[警告] 用戶條目 'foo'@'%' 的插件值為空。 該用戶將被忽略,並且沒有人可以再使用該用戶登錄。

我在這里發布這個答案可能是為了避免有人像我一樣使用同樣荒謬的時間。

調試總結

  • 檢查拼寫錯誤:用戶名或密碼。
  • 檢查主機名並將其與 mysql.user 表主機名進行比較。
  • 檢查用戶是否存在。
  • 檢查主機是否包含IP地址或主機名。

您很有可能在工作中多次遇到此問題。 由於輸入錯誤的用戶名或密碼,我經常遇到此問題。 盡管這是原因之一,但您還有其他很多機會可能會遇到此問題。 有時,它看起來非常相似,但是當您深入挖掘時,您會意識到導致此錯誤的多種因素。 這篇文章將詳細解釋大多數常見原因以及解決此問題的方法。

可能的原因:

  • 案例 1:輸入錯誤:用戶名或密碼。

這是此錯誤的最常見原因。 如果您輸入的用戶名或密碼錯誤,您肯定會收到此錯誤。

解決方案:

此類錯誤的解決方案非常簡單。 只需輸入正確的用戶名和密碼。 此錯誤將得到解決。 如果您忘記了密碼,您可以重置用戶名/密碼。 如果您忘記了 admin / root 帳戶的密碼,有很多方法可以重置 / 重新獲取 root 密碼。 如果您忘記了 root 密碼,我將發布另一篇關於如何重置 root 密碼的帖子。

  • 案例2:從錯誤的主機訪問。

MySQL 為用戶訪問提供基於主機的限制作為安全功能。 在我們的生產環境中,我們曾經將訪問請求限制在應用程序服務器上。 此功能在許多生產場景中確實很有幫助。

解決方案:

當您遇到此類問題時,首先通過檢查 mysql.user 表來檢查您的主機是否被允許。 如果未定義,您可以更新或插入新記錄到 mysql.user 表。 通常,出於安全考慮,從遠程計算機以 root 用戶身份訪問是禁用的,這不是最佳實踐。 如果您需要從多台機器訪問您的服務器,請僅授予對這些機器的訪問權限。 最好不要使用通配符 (%) 並提供通用訪問。 讓我更新 mysql.user 表,現在演示用戶可以從任何主機訪問 MySQL 服務器。

  • 情況3:服務器上不存在用戶。

當您嘗試訪問的用戶在 MySQL 服務器上不存在時,會發生此類錯誤。

解決方案:

當您遇到此類問題時,只需檢查用戶是否存在於 mysql.user 表中。 如果記錄不存在,用戶將無法訪問。 如果該用戶需要訪問,請使用該用戶名創建一個新用戶。

  • 案例 4:基於數字和名稱的主機的混合。

要點

  • 定義用戶主機時不建議使用通配符,盡量使用准確的主機名。

  • 禁用從遠程計算機的 root 登錄。

  • 使用代理用戶概念。

與此主題相關的其他概念很少,並且深入了解這些主題的細節與本文的范圍非常不同。 我們將在接下來的文章中研究以下相關主題。

  • 如果您忘記了 MySQL 服務器的 root 密碼,該怎么辦。
  • MySQL 訪問權限問題和用戶相關表。
  • 具有最佳實踐的 MySQL 安全功能。

我希望這篇文章能幫助您修復 MySQL 錯誤代碼 1045 Access denied for user in MySQL。

我發現了另一種表面上看起來是邊緣情況的情況。 我可以通過 SELECT INTO .. OUTFILE 以 root 身份導出到文件系統,但不能以普通用戶身份導出。 雖然這可能是權限問題,但我已經看過了,並沒有看到特別明顯的東西。 我只能說,以對相關數據庫擁有所有權限的普通用戶身份執行查詢會返回導致我進入該主題的拒絕訪問錯誤。 當我在一個舊項目中找到成功使用 SELECT INTO ... OUTFILE 的記錄時,我注意到我是以 root 身份登錄的。 果然,當我以 root 身份登錄時,查詢按預期運行。

我希望您還沒有因為刪除 mysql 中的 debian-sys-maint 用戶而造成更大的損失

讓您的 mysql 守護程序以正常方式運行。 如下圖所示啟動你的mysql客戶端

mysql -u debian-sys-maint -p

在另一個終端中, cat文件/etc/mysql/debian.cnf 該文件包含密碼; 提示輸入該密碼時粘貼該密碼。

http://ubuntuforums.org/showthread.php?t=1836919

這可能適用於極少數人,但這里有。 不要使用感嘆號! 在您的密碼中。

我使用 MariaDB 並得到了上述錯誤。 當我將它簡化為數字和字母時,它起作用了。 @$等其他字符可以正常工作 - 我在同一實例的不同用戶中使用了這些字符。

這個地址的第五個回復讓我找到了解決辦法。

我有類似的問題,因為我的密碼包含“;” char 在我第一次創建密碼時破壞了我的密碼。 如果可以幫助您,請謹慎行事。

如今! 解決方案:

MySQL ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES);

Wampserver 3.2.0 新安裝或升級

可能使用xamp作為默認值的mariaDB很好。

Wamp服務器帶有mariaDB和 mysql,並且默認在 3306 端口上安裝mariaDB ,在 3307 上安裝 mysql,有時是 3308 端口。

連接到mysql

在安裝時它要求使用mariaDBMySql ,但 mariaDB 被選中為默認值,您無法更改它,檢查mysql選項並安裝。

安裝完成后,兩者都將在默認端口 3306 上運行mariaDB ,在另一個端口 3307 或 3308 上運行mysql

右鍵單擊wampserver圖標,其運行應位於右下角,轉到工具並查看正確的mysql運行端口。

並將其包含在與以下相同的數據庫連接中:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note :我正在使用 pdo。

有關更多信息,請參見此處: https ://sourceforge.net/projects/wampserver/

對我來說,root 有一個默認密碼

我使用ALTER USER 'root'@'localhost' IDENTIFIED BY 'new Password'; 它奏效了

在 Windows 上,解決方法如下:

錯誤 1045 (28000): 用戶 'root'@'localhost' 的訪問被拒絕(使用密碼:否)

  1. 從控制面板卸載mysql
  2. C:\Program Files,C:\Program Files (x86)C:\ProgramData中刪除 MySql 文件夾
  3. 安裝mysql
sudo -i 
mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

無需登錄即可訪問mysql服務(可以在shell mysql>中看到beacue)

當您運行mysql -u bill -p時, localhost被解析為您的 ip,因為它是 127.0.0.1 並且在您的/etc/hosts文件中,默認127.0.0.1 localhost存在。 因此,mysql 將您解釋為bill@localhost未授予bill@'%' 這就是為什么在選擇主機的結果中root用戶有2條不同的記錄select host, user from mysql.user; 詢問。

有兩種方法可以處理這個問題。

一種是指定一個在您嘗試登錄時不會被/etc/hosts文件反向解析的 ip。 例如,服務器的 ip 是10.0.0.2 當您運行命令mysql -u bill -p -h 10.0.0.2時,您將能夠登錄。 如果您鍵入select user(); ,你會得到bill@10.0.0.2 當然,任何域名都不應該在你的/etc/hosts文件中解析到這個ip。

其次,您需要為此特定域名授予訪問權限。 對於bill@localhost ,您應該調用命令grant all privileges on *.* to bill@localhost identified by 'billpass'; . 在這種情況下,您將能夠使用命令mysql -u bill -p登錄。 登錄后, select user(); 命令返回bill@localhost

但這僅適用於您嘗試在同一主機上登錄 mysql 服務器。 在遠程主機上,mysql 的行為符合預期,'%' 將授予您登錄權限。

我通過刪除舊的錯誤用戶'bill'條目解決了這個問題(這是重要的部分:來自mysql.usermysql.db ),然后創建了與之前一樣的用戶:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

工作,用戶正在連接。 現在我將從中刪除一些previlegies :)

操作系統:windows

我的錯誤信息是:

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

我的原因是我沒有以管理員權限打開cmd。

所以我的解決方案是以管理員身份打開cmd,然后就可以了。

如果 MySQL 在不區分大小寫的操作系統(例如 Windows)上運行,也可能發生這種情況。

例如,我發現嘗試使用這些憑據連接到數據庫失敗:

mysql> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

ERROR 1045 (28000): Access denied for user 'specialuser'@'10.0.1.113' (使用密碼: YES)

但是,這成功了:

mysql> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

輸入密碼:

如果您的 dbname、用戶名、密碼等字符串長度超過https://dev.mysql.com/doc/refman/5.7/en/grant-tables.html#grant-tables-scope-column-properties中列出的值,您也可能無法登錄,就像我的情況一樣。

對我來說,進入mysql時沒有指定-p參數。

mysql -p

我沒有問題,但是沒有密碼調用mysql是錯誤的。

所以對我來說,這個問題與我正在映射的端口有關。

3306 => 3306 不起作用(因為我有一個本地 mysql 正在運行)

3307 => 3306 有效!

這是在建立 ssh 隧道的上下文中:

ssh -N -L 3307:rdsDns:3306 ec2User@ec2Dns -i key.pem -v

3307是本地端口,3306是遠程端口。

在我的例子中,托管我的代碼的服務器在嘗試登錄 MySQL 時在用戶名的 ed 處發送“@blablabla.amazonaws.com”。所以我必須將 %.amazonws.com 添加到我的托管用戶配置(dreamhost)中,並且它經歷了

這個問題的解決方案可以很簡單!

  1. 在我的例子中,我已經將我的數據庫 (mysqldump) 導出到一個轉儲文件中。

  2. 然后我將文件復制到目標服務器。

  3. 在此目標服務器上,我創建了目標數據庫

  4. 然后我運行命令將復制的轉儲文件導入目標服務器上的新目標數據庫。

==> 錯誤! 在這一點上,我剛剛得到了你也遇到的錯誤!

現在,想一想,您使用的用戶是什么? 他在源數據庫上有什么GRANT?

他對新目標數據庫有什么授權? 我想,你已經看到了問題和解決方案!

==>解決方案!

  1. 所以我進入我的源數據庫並導出我使用的用戶的所有授權。

  2. 之后我去了我的目標數據庫並導入了導出的 GRANT。

瞧! 之后將目標服務器上的源數據庫導入到新的目標數據庫中,沒有任何問題!

文字很多,抱歉:但也許它會幫助某人解決問題:-)

MySQL賬戶名由用戶名和主機名組成,主機名中的名稱'localhost'表示本地主機,也可以在主機名或IP地址值中使用通配符“%”和“_”。 這些與使用 LIKE 運算符執行的模式匹配操作具有相同的含義。 例如,主機值 '%' 匹配任何主機名,而值 '%.mysql.com' 匹配 mysql.com 域中的任何主機。 '192.168.1.%' 匹配 192.168.1 C 類網絡中的任何主機。

以上只是介紹:

實際上,用戶'bill'@'localhost''bill'@'%'是不同的 MySQL 帳戶,因此兩者都應該使用自己的身份驗證詳細信息,例如密碼。

有關更多信息,請參閱http://dev.mysql.com/doc/refman//5.5/en/account-names.html

確保沒有其他正在使用 localhost 帖子的 SQL 實例正在運行。 在我們的例子中,另一個實例在與登錄沖突的 localhost 上運行。 關閉它解決了這個問題。

如果您使用舊版本的 MySQL UI(如 SQLYoug)生成帶有錯誤哈希的密碼,也會出現問題。

使用 SQL 腳本創建用戶將解決此問題。

我有同樣的問題,但在我的情況下,解決方案是由 eggyal 的評論解決的。 我也有一個匿名用戶,但刪除它並沒有解決問題。 'FLUSH PRIVILEGES' 命令雖然有效。

令我驚訝的是,我使用 MySQL Workbench 創建了用戶,並且我希望它能夠執行所有必要的功能來完成任務。

對於 Mac 用戶,如果他們仍然有問題(就像我的情況一樣),我發現這個解決方案對我有用: MySQL 命令行 '-bash command not found'

要在 macbook 終端上使用命令,即mysql ,您需要使用以下命令導出路徑:

export PATH=$PATH:/usr/local/mysql/bin/

考慮到默認安裝,使用以下命令以 root 用戶身份獲取 mysql 提示符:

mysql -u root

否則你使用了錯誤的root密碼。

參考:在 OSX 上設置 MySQL root 用戶密碼

百分號表示所有 ip,所以 localhost 是多余的......不需要 localhost 的第二條記錄。

實際上,'localhost' 在 mysql 中是特殊的,它意味着通過 unix 套接字(或我相信 Windows 上的命名管道)的連接,而不是 TCP/IP 套接字。 使用 % 作為主機不包括 'localhost'

MySQL 用戶帳戶有兩個組成部分:用戶名和主機名。 用戶名標識用戶,主機名指定用戶可以連接的主機。 將用戶名和主機名組合起來創建一個用戶帳戶:

'<user_name>'@'<host_name>'您可以為主機名指定特定的 IP 地址或地址范圍,或使用百分比字符 ("%") 使該用戶能夠從任何主機登錄。

請注意,用戶帳戶由用戶名和主機名定義。 例如, 'root'@'%'是與'root'@'localhost'不同的用戶帳戶。

我遇到了同樣的錯誤。 不起作用的設置如下:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

下面的編輯設置是讓它工作的設置。 注意到區別了嗎?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

區別在於雙引號。 與 Java 相比,它們在 PHP 中似乎非常重要,並且它們在轉義字符、設置 URL 以及現在將參數傳遞給函數方面都有影響。 它們更漂亮(我知道),但總是盡可能多地使用單引號,然后可以在必要時將雙引號嵌套在其中。

當我在 Linux 機器上而不是在 Windows 環境上測試我的應用程序時,出現了這個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM