MySQL ข้อผิดพลาด 1,045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'บิล' @ 'localhost' (ใช้รหัสผ่าน: ใช่)


430

ก่อนอื่นให้ฉันพูดถึงว่าฉันได้ผ่านคำถามที่แนะนำมากมายและไม่พบคำตอบที่เกี่ยวข้อง นี่คือสิ่งที่ฉันทำ

ฉันเชื่อมต่อกับอินสแตนซ์ Amazon EC2 ของฉัน ฉันสามารถเข้าสู่ระบบด้วยรูท MySQL ด้วยคำสั่งนี้:

mysql -u root -p

จากนั้นฉันสร้างบิลผู้ใช้ใหม่ด้วยโฮสต์%

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

ได้รับสิทธิ์ทั้งหมดในการเรียกเก็บเงินผู้ใช้:

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

จากนั้นฉันออกจากผู้ใช้รูทและลองเข้าสู่ระบบด้วยบิล:

mysql -u bill -p

ป้อนรหัสผ่านที่ถูกต้องและได้รับข้อผิดพลาดนี้:

ข้อผิดพลาด 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'bill' @ 'localhost' (ใช้รหัสผ่าน: YES)


34
คุณไม่FLUSH PRIVILEGES?
eggyal

6
โอเคฉันพยายามทำสิ่งนี้โดยไม่ประสบความสำเร็จ ข้อเสนอแนะอื่น ๆ โปรด
อาลี

1
คุณใช้เซิร์ฟเวอร์เวอร์ชันใด ฉันเคยเห็น 5.1 มีพฤติกรรมแปลก ๆ เกี่ยวกับเรื่องนี้
Poodlehat

2
สิ่งนี้เกิดขึ้นกับฉันในขณะติดตั้ง Magento และฉันทำผิดพลาดมากขึ้น การใส่ 'mysql -u magento -p magento' ให้ฉันใส่รหัสผ่านและแทนที่เป็นรหัสผ่านเริ่มต้นฉันใส่รหัสผ่านรูท
AmirHd

2
@authentictech น่าเสียดายที่ไม่มีวิธีแก้ไขปัญหาที่แนะนำสำหรับฉันในขณะที่มีการโพสต์คำถามนี้ โปรดดูคำตอบของฉันเองที่ช่วยให้ฉันได้รับสถานการณ์นี้ นั่นคือเหตุผลที่ฉันไม่ได้ทำเครื่องหมายใด ๆ ของพวกเขาเป็นคำตอบ อาจเป็นเพราะฉันสามารถทำเครื่องหมายคำตอบที่มีอันดับสูงสุดว่าเป็นคำตอบ
Ali

คำตอบ:


441

คุณอาจจะมีผู้ใช้ที่ไม่ระบุชื่อหรือ''@'localhost'''@'127.0.0.1'

ตามคู่มือ :

เมื่อการแข่งขันหลายรายการเป็นไปได้เซิร์ฟเวอร์จะต้องกำหนดว่าจะใช้รายการใด จะช่วยแก้ไขปัญหานี้ดังนี้: (... )

  • เมื่อลูกค้าพยายามเชื่อมต่อเซิร์ฟเวอร์จะตรวจสอบแถว[ของตาราง mysql.user]ตามลำดับที่เรียง
  • เซิร์ฟเวอร์ใช้แถวแรกที่ตรงกับชื่อโฮสต์ไคลเอ็นต์และชื่อผู้ใช้

( ... ) รายงานการใช้เซิร์ฟเวอร์กฎการเรียงลำดับที่แถวสั่งซื้อที่มีค่ามากที่สุดโฮสต์เฉพาะครั้งแรก ชื่อโฮสต์ที่แท้จริง[เช่น 'localhost']และที่อยู่ IP เป็นชื่อเฉพาะที่สุด

ดังนั้นเช่นผู้ใช้ที่ไม่ระบุชื่อจะ "หน้ากาก" ผู้ใช้อื่น ๆ เช่นเมื่อเชื่อมต่อจาก'[any_username]'@'%'localhost

'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
    ยินดีต้อนรับสู่หน้าจอ MySQL (... )

    mysql> ผู้ใช้ SELECT, โฮสต์จาก mysql.user;
    + ------ + ----------- +
    | ผู้ใช้ | โฮสต์ |
    + ------ + ----------- +
    | ใบแจ้งหนี้ | % |
    | รูต | 127.0.0.1 |
    | รูต | :: 1 |
    | รูต | localhost |
    + ------ + ----------- +
    4 แถวในชุด (0.00 วินาที)

    mysql> เลือกผู้ใช้ (), CURRENT_USER ();
    + + ---------------- ---------------- +
    | USER () | CURRENT_USER () |
    + + ---------------- ---------------- +
    | bill @ localhost | เรียกเก็บเงิน @% |
    + + ---------------- ---------------- +
    1 แถวในชุด (0.02 วินาที)

    mysql> แสดงตัวแปรเช่น 'skip_networking';
    + ----------------- + ------- +
    | Variable_name | ค่า |
    + ----------------- + ------- +
    | skip_networking | ON |
    + ----------------- + ------- +
    1 แถวในชุด (0.00 วินาที)

แก้ไข 2

ตั้งค่าแบบเดียวกัน''@'localhost'ทุกประการยกเว้นฉันเปิดใช้งานเครือข่ายอีกครั้งและตอนนี้ฉันสร้างผู้ใช้ที่ไม่ระบุชื่อ

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    ยินดีต้อนรับสู่หน้าจอ MySQL (... )

    mysql> สร้างผู้ใช้ '' @ 'localhost' ระบุโดย 'Anotherpass';
    การค้นหาตกลง 0 แถวที่ได้รับผลกระทบ (0.00 วินาที)

    MySQL> ลาก่อน

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / MySQL-5.5.sock
    ข้อผิดพลาด 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'bill' @ 'localhost' (ใช้รหัสผ่าน: YES)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    ข้อผิดพลาด 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'bill' @ 'localhost' (ใช้รหัสผ่าน: YES)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    ข้อผิดพลาด 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'bill' @ 'localhost' (ใช้รหัสผ่าน: YES)

แก้ไข 3

สถานการณ์เดียวกับในการแก้ไข 2 ตอนนี้ให้รหัสผ่านของผู้ใช้ที่ไม่ระบุชื่อ

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    ยินดีต้อนรับสู่หน้าจอ MySQL (... )

    mysql> เลือกผู้ใช้ (), CURRENT_USER ();
    + + ---------------- ---------------- +
    | USER () | CURRENT_USER () |
    + + ---------------- ---------------- +
    | เรียกเก็บเงิน @ localhost | @localhost |
    + + ---------------- ---------------- +
    1 แถวในชุด (0.01 วินาที)

สรุป 1 จากการแก้ไข 1: หนึ่งสามารถตรวจสอบ'bill'@'%'ผ่านซ็อกเก็ต

สรุป 2 จากการแก้ไข 2: การเชื่อมต่อผ่าน TCP หรือซ็อกเก็ตไม่มีผลกระทบต่อกระบวนการรับรองความถูกต้อง (ยกเว้นว่าไม่สามารถเชื่อมต่อเป็นบุคคลอื่นได้ แต่'something'@'localhost'ผ่านซ็อกเก็ตอย่างเห็นได้ชัด)

สรุป 3 จากการแก้ไข 3: แม้ว่าฉันจะระบุไว้-ubillฉันได้รับสิทธิ์การเข้าถึงในฐานะผู้ใช้ที่ไม่ระบุชื่อ นี่เป็นเพราะ "กฎการเรียงลำดับ" ที่แนะนำข้างต้น โปรดสังเกตว่าในการติดตั้งเริ่มต้นส่วนใหญ่จะไม่มีรหัสผ่านผู้ใช้ที่ไม่ระบุตัวตนอยู่ (และควรจะปลอดภัย / ลบออก)


9
สำหรับใครที่อยากรู้ว่าทำไม 'bill' @ 'localhost' ตรงกับ '' @ 'localhost' อย่างที่ฉันเป็นสตริงว่างทำหน้าที่แทน wild card ในอัลกอริทึมการพิสูจน์ตัวตนของ MySQL อย่างมีประสิทธิภาพ
คณบดีหรือ

2
@Sanja ระมัดระวังเป็นพิเศษด้วยวิธีแก้ปัญหานี้ คุณอาจอนุญาตให้เข้าถึงฐานข้อมูลของคุณโดยไม่ระบุชื่อจากที่ใดก็ได้ ในกรณีที่มีข้อสงสัยฉันควรจะลบผู้ใช้
RandomSeed

7
@RandomSeed ขอบคุณสำหรับความคิดเห็นนี้! น่าจะเป็นฉันควรลบผู้ใช้ที่ไม่ระบุชื่อ PS I พบdev.mysql.com/doc/refman/5.1/en/default-privileges.htmlDROP USER ''@'localhost';ที่บอกว่าผู้ใช้เหล่านี้ก็จะถูกลบ: พวกเขาไม่จำเป็นสำหรับวัตถุประสงค์พิเศษบางอย่าง
อเล็กซ์

1
ฉันทิ้งผู้ใช้นิรนาม แต่สิ่งที่ยังใช้งานไม่ได้อยู่ จากนั้นฉันก็พบว่าฉันต้องออก "สิทธิในการล้างด้วย" มันจะเป็นประโยชน์ในการพูดถึงว่ายัง
Neeme Praks

2
นี่คือคำตอบ! ทำไมสิ่งนี้ถึงไม่มาในตัวพิมพ์ใหญ่หนาในคู่มือ mysql ทุกตัว ลบผู้ใช้ที่ไม่ระบุชื่อหรือจะฆ่าความพยายามทั้งหมดของคุณเพื่อเข้าสู่ระบบจากในท้องถิ่น!
Sergei

140

ลอง:

~$ mysql -u root -p
Enter Password:

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

10
สิ่งนี้ค่อนข้างอันตรายหากใครบางคนแฮ็คบัญชี bill @ localhost mysql ของเขาเขาจะสามารถเข้าถึงฐานข้อมูลทั้งหมดของเซิร์ฟเวอร์ mysql ได้ไม่ จำกัด
Adonis K. Kakoulidis

2
Whehey ฉันต้องใส่เครื่องหมายคำพูดรอบชื่อผู้ใช้ของฉัน 'myusername'@'myhost.static.myip.com' แล้วจึงใช้งานได้
bendecko

ใช้งานได้สำหรับฉัน แต่ฉันเกรงว่าฉันให้สิทธิพิเศษแก่ผู้ใช้มากเกินไป
Csaba Toth

1
@Csaba ทั้งที่คุณทำได้ลดสิทธิ์อีกครั้งจนกว่าผู้ใช้ของคุณจะมีสิ่งที่เขาต้องการและไม่มีอีกต่อไป
jwenting

... และคุณจะทำอย่างไรถ้าสิ่งนี้ให้ "การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'root' @ 'localhost' (โดยใช้รหัสผ่าน: ใช่)" แล้ว?
Grunion Shaftoe

75

เมื่อคุณวิ่ง

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;

หากคุณต้องการเชื่อมต่อจากระยะไกลคุณต้องระบุชื่อ DNS, IP สาธารณะหรือ 127.0.0.1 โดยใช้ TCP / IP:

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 จากตารางmysql.user อย่างไร

สิ่งนี้จะช่วยให้คุณมีมุมมองที่ดีขึ้นเกี่ยวกับวิธีการและเหตุผลที่คุณได้รับอนุญาตให้ลงชื่อเข้าใช้ 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>

การสั่งซื้อการรับรองความถูกต้องเข้มงวดมาก มันตรวจสอบจากที่เฉพาะเจาะจงไปที่น้อยที่สุด ผมเขียนเกี่ยวกับรูปแบบ authentiation นี้ใน DBA StackExchange

อย่าลืมโทร TCP อย่างชัดเจนเป็นโปรโตคอลสำหรับไคลเอนต์ mysql เมื่อจำเป็น


1
'bill'@'localhost'ควรตรงกับที่'bill@%'ควรหรือไม่
RandomSeed

@Yak ลำดับการจัดเรียงไม่ได้ขึ้นอยู่กับคอลัมน์ผู้ใช้ของ mysql.user เท่านั้น MySQL ไม่ได้ทำการจับคู่อักขระใด ๆ ฉันเขียนเกี่ยวกับโปรโตคอลการรับรองความถูกต้องของผู้ใช้ใน DBA StackExchange: dba.stackexchange.com/a/10897/877
RolandoMySQLDBA

@YaK SELECT USER(),CURRENT_USER();นี่คือเหตุผลที่ผมกล่าวถึงเฉพาะ คุณแทบไม่เคยเห็นผู้ใช้ที่ไม่ระบุชื่อปรากฏขึ้นจากฟังก์ชั่นทั้งสองนี้ยกเว้นในการตั้งค่าที่ไม่ดีจริงๆ
RolandoMySQLDBA

1
ฉันไม่เคยสันนิษฐานเรียงลำดับจะขึ้นอยู่แต่เพียงผู้เดียวmysql.userใน ในความเป็นจริงถ้าคุณอ่านคำตอบของฉันอีกครั้งคุณจะเห็นว่าฉันพูด (จริงๆแล้วคู่มือบอกว่า) ลำดับการจัดเรียงจะขึ้นอยู่กับhostคอลัมน์แรก คุณเขียนมากเกี่ยวกับวิธีตรวจสอบข้อมูลรับรองปัจจุบันของคุณ แต่ฉันเห็นข้อมูลเล็กน้อยว่าทำไม'bill'@'localhost'ไม่สามารถเข้าสู่ระบบได้'bill'@'%'ซึ่งเป็นคำถามของ AFAIK ในวันนี้ OP อาจมีการติดตั้งไม่ดีนี่คือสาเหตุที่เขาได้รับข้อผิดพลาดเหล่านี้
RandomSeed

2
--protocol=TCPเป็นกุญแจสำคัญ ขอบคุณมาก!
lfx

22

สุดสายไปนี้

ฉันลองคำตอบอื่น ๆ เหล่านี้ทั้งหมดแล้ววิ่งไปหลาย ๆ รุ่นmysql -u root -pแต่ก็ไม่เคยวิ่งเลย


mysql -u root -p

และเพียงแค่กด[ENTER]รหัสผ่าน


เมื่อฉันทำมันได้ผล หวังว่านี่จะช่วยใครซักคน


18

ปัญหาที่เกี่ยวข้องในกรณีของฉันพยายามเชื่อมต่อโดยใช้:

mysql -u mike -p mypass

เห็นได้ชัดว่ามีช่องว่างระหว่าง -u # uname # แต่ไม่ใช่ระหว่าง -p และ # password #

จึงจำเป็น:

mysql -u mike -pmypass

มิฉะนั้นจะมีช่องว่างระหว่าง -p mypass mysql ใช้ 'mypass' เป็นชื่อdb


1
หรือ: mysql -u usrname -p - สิ่งนี้จะป้องกันไม่ให้ใครก็ตามเห็นรหัสผ่านเนื่องจากมันจะดรอปบรรทัดใหม่และขอรหัสผ่านโดยไม่แสดง

คำตอบที่ดี @mstram
Arpit Solanki

1
วิธีการแก้ปัญหานี้สะดวกสบาย แต่ก็ไม่ปลอดภัยในการพิมพ์รหัสผ่านอย่างชัดเจน แต่ไม่จำเป็นต้องให้สิทธิ์พิมพ์และกำหนดสิ่งอื่น ๆ ดังนั้นหากคุณจอง Mac อย่างปลอดภัย - วิธีนี้สะดวกสบายมากยิ่งขึ้นฉันใช้มันเพื่อนำเข้าข้อมูลไปยัง AWS จากไดรเวอร์ mysql นักเทียบท่า
dimpiax

17

เมื่อคุณพิมพ์mysql -u root -pคุณกำลังเชื่อมต่อกับเซิร์ฟเวอร์ mysql ผ่านซ็อกเก็ตยูนิกซ์ท้องถิ่น

อย่างไรก็ตามการอนุญาตที่คุณให้นั้น'bill'@'%'ตรงกับการเชื่อมต่อ TCP / IP เท่านั้นอย่างสงสัย

หากคุณต้องการให้สิทธิ์การเข้าถึงซ็อกเก็ตยูนิกซ์ท้องถิ่นคุณจะต้องให้สิทธิ์กับ 'bill' @ 'localhost' ซึ่งอยากรู้อยากเห็นมากพอจะไม่เหมือนกับ 'bill'@'127.0.0.1'

คุณสามารถเชื่อมต่อโดยใช้ TCP / IP กับไคลเอนต์บรรทัดคำสั่ง mysql เพื่อให้ตรงกับสิทธิ์ที่คุณได้รับเช่นรันmysql -u root -p -h 192.168.1.123หรือที่อยู่ IP ท้องถิ่นของคุณ


"'bill' @ '%' ตรงกับการเชื่อมต่อ TCP / IP เท่านั้น" ผิดพลาด ลองใช้อินสแตนซ์ที่สะอาด (บริสุทธิ์ออกนอกกรอบ) ด้วยskip-networking
RandomSeed

@YaK ฉันไม่สามารถ 'user' @ '%' เพื่อทำงานในการตั้งค่าเช่นนี้คุณหมายถึงอะไรควรจะเกิดขึ้น?
nos

ฉันสามารถเชื่อมต่อเป็น 'bill' @ '%' บน v5.0 โดยไม่ต้องเชื่อมต่อเครือข่าย (ดังนั้นผ่านซ็อกเก็ต) คุณใช้เวอร์ชั่นอะไร ฉันจะลองใช้กับ v5.5
RandomSeed

โปรดดูคำตอบที่อัปเดตของฉัน ฉันสามารถเข้าสู่ระบบ'bill'@'%'ผ่านซ็อกเก็ตบน v5.5
RandomSeed

17

หากคุณลืมรหัสผ่านหรือต้องการแก้ไขรหัสผ่านคุณสามารถทำตามขั้นตอนเหล่านี้:

1: หยุด mysql ของคุณ

[root @ maomao ~] # บริการ mysqld หยุดการ
หยุด MySQL: [ตกลง]

2: ใช้“ --skip-grant-tables” เพื่อเริ่ม mysql ใหม่

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # เริ่มต้น mysqld daemon พร้อมฐานข้อมูลจาก / var / lib / mysql

3: เปิดหน้าต่างใหม่และป้อน mysql -u root

[root @ cy400 ~] # mysql -u root
ยินดีต้อนรับสู่จอภาพ MySQL คำสั่งลงท้ายด้วย; หรือ \ g.

4: เปลี่ยนฐานข้อมูลผู้ใช้

mysql> ใช้ mysql การ
อ่านข้อมูลตารางเพื่อความสมบูรณ์ของชื่อตารางและคอลัมน์คุณสามารถปิดคุณสมบัตินี้เพื่อการเริ่มต้นที่รวดเร็วยิ่งขึ้นด้วย - เปลี่ยนฐานข้อมูล

5: แก้ไขรหัสผ่านของคุณรหัสผ่านใหม่ของคุณควรใส่ใน "()"

mysql> อัปเดตผู้ใช้ตั้งรหัสผ่าน = รหัสผ่าน ('root123') โดยที่ user = 'root';
การค้นหาตกลง 3 แถวที่ได้รับผลกระทบ (0.00 วินาที)
แถวที่ตรงกัน: 3 เปลี่ยน: 3 คำเตือน: 0

6: เปี่ยม

mysql> สิทธิ์ล้าง;

7: เลิก

mysql> ออกจาก
Bye

8: รีสตาร์ท mysql

[root @ cy400 ~] # บริการ mysqld รีสตาร์ท
การหยุด MySQL: [ตกลง] การ
เริ่มต้น MySQL: [ตกลง]

บิงโก! คุณสามารถเชื่อมต่อฐานข้อมูลของคุณด้วยชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ:

[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

1
นี้ช่วยให้ฉัน แต่ใน mac หากคุณติดตั้งกับ homebrew mysql.server stopมัน ในกรณีของฉันฉันไม่สามารถอัปเดตคอลัมน์ผู้ใช้เพราะไม่มี ไม่สามารถสร้างได้เนื่องจากอยู่ในเซฟโหมด สำหรับสิ่งที่ฉันทำตอนนี้ฉันไม่สนใจ แต่ฉันขอขอบคุณคำตอบสำหรับรูปแบบนี้จริง ๆ ด้วยการแสดงอินพุตและเอาต์พุตที่แน่นอน ขอบคุณ!
szeitlin

ฉันขอโทษที่ฉันไม่เคยใช้ mac มาก่อนเลยฉันไม่สามารถช่วยคุณได้
Li Yingjun

15

ช่วยตัวเองด้วยอาการปวดหัว MAJOR ... ปัญหาของคุณอาจเป็นเพราะคุณไม่มีเครื่องหมายคำพูดล้อมรอบรหัสผ่าน อย่างน้อยนั่นก็เป็นกรณีของฉันที่อ้อมฉัน 3 ชั่วโมง

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

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

ค้นหา "นี่คือไฟล์ตัวเลือกผู้ใช้ทั่วไป:" และดูตัวอย่างที่ระบุไว้ในนั้น ขอให้โชคดีและฉันหวังว่าจะช่วยคนอื่นให้รอดเวลา


1
ขอบคุณสำหรับสิ่งนี้. ฉันเสียเวลาครึ่งวันในการทำเช่นนี้และคำพูดโง่ ๆ เกี่ยวกับรหัสผ่านก็เป็นเคล็ดลับ!
guyfromfl

ฮ่าฮ่า ฉันสูญเปล่าไปมากเหมือนกันเมื่อมันเกิดขึ้นกับฉัน ดีใจที่ได้รับความช่วยเหลือ
mimoralea

12

ทางออกคือการลบผู้ใช้นิรนาม (ใด ๆ )!

ฉันยังประสบปัญหาเดียวกันในการตั้งค่าเซิร์ฟเวอร์โดยคนอื่น ปกติฉันไม่ได้เลือกที่จะสร้างผู้ใช้ที่ไม่ระบุตัวตนเมื่อทำการติดตั้ง MySQL ดังนั้นจึงไม่สังเกตเห็นสิ่งนี้ เริ่มแรกฉันเข้าสู่ระบบในฐานะผู้ใช้ "root" และสร้างผู้ใช้ "ปกติ" สองคน (ผู้ใช้ที่มีสิทธิ์ใช้งาน dbs โดยใช้ชื่อผู้ใช้เป็นคำนำหน้าเท่านั้น) จากนั้นจึงออกจากระบบจากนั้นไปตรวจสอบผู้ใช้ปกติคนแรก ฉันไม่สามารถเข้าสู่ระบบทั้งผ่าน phpMyAdmin หรือผ่านทางเชลล์ ปรากฎว่าผู้กระทำความผิดนี้เป็นผู้ใช้ "ใด ๆ "


11

ฉันมีปัญหาที่ค่อนข้างคล้ายกัน - ในครั้งแรกที่ฉันพยายามเข้าใช้งาน MySQL เนื่องจากrootบอกว่าการเข้าถึงถูกปฏิเสธ ปรากฎว่าฉันลืมใช้sudo...

ดังนั้นหากคุณล้มเหลวในการrootพยายามครั้งแรกลอง:

sudo mysql -u root -p

จากนั้นป้อนรหัสผ่านของคุณสิ่งนี้ควรใช้งานได้


6

ทางออกที่ดีที่สุดที่ฉันพบสำหรับตัวเองคือ

ผู้ใช้ของฉันเป็นโซนาร์และเมื่อใดก็ตามที่ฉันพยายามเชื่อมต่อกับฐานข้อมูลของฉันจากเครื่องภายนอกหรือเครื่องอื่นฉันได้รับข้อผิดพลาดเป็น

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

ในขณะที่ฉันกำลังลองสิ่งนี้จากเครื่องอื่นและจากการทำงานของเจนกินส์ 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';

4

โอเคฉันไม่แน่ใจ แต่อาจเป็นไฟล์ my.cnf ภายในไดเรกทอรีการติดตั้ง mysql เป็นผู้ร้าย ใส่ความคิดเห็นในบรรทัดนี้และปัญหาอาจได้รับการแก้ไข

bind-address = 127.0.0.1

1
สำหรับรายละเอียดเพิ่มเติมคุณสามารถดูได้เช่นกันwiki.bitnami.org/Components/MySQL
Ali

1
ฉันค่อนข้างแน่ใจว่านี่ไม่ใช่ปัญหา ถ้าเป็นเช่นนั้น MySQL จะปฏิเสธการเชื่อมต่อจากโฮสต์อื่นที่ไม่ใช่ 127.0.0.1 และคุณจะไม่ได้รับข้อผิดพลาด SQL 'Access Denied'
Pellmeister

3

แค่อยากให้คุณรู้ว่าฉันได้รับข้อผิดพลาดเดียวกัน บางทีนี่อาจช่วยใครซักคนในอนาคต

ฉันพัฒนามุมมองพื้นฐานไม่กี่ครั้งสร้างขึ้นที่ไซต์พัฒนาและโอนไปยังไซต์งานผลิต หลังจากนั้นสัปดาห์ที่ฉันเปลี่ยนสคริปต์ PHP และข้อผิดพลาดฉับพลันทั้งหมดเกิดขึ้นว่าการเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'ผู้ใช้เว็บท้องถิ่น' @ 'localhost' วัตถุแหล่งข้อมูลไม่เปลี่ยนแปลงดังนั้นฉันจึงมุ่งเน้นไปที่ผู้ใช้ฐานข้อมูลใน MySQL กังวลในขณะที่มีคนแฮ็คเว็บไซต์ของฉัน โชคดีที่ส่วนที่เหลือของไซต์ดูไม่เป็นอันตราย

หลังจากนั้นก็เปิดออกว่ามุมมองที่เป็นผู้กระทำผิด การถ่ายโอนวัตถุของเราทำได้โดยใช้ผู้ใช้ (และระยะไกล: admin @ ip-address) มากกว่าผู้ใช้เว็บไซต์ท้องถิ่น ดังนั้นมุมมองที่ถูกสร้างขึ้นด้วย 'admin' @ 'ที่อยู่ ip' เป็นผู้กำหนด การสร้างมุมมองความปลอดภัยเริ่มต้นคือ

SQL SECURITY DEFINER

เมื่อผู้ใช้ภายในเว็บพยายามที่จะใช้มุมมองมันจะสะดุดกับสิทธิขาดของผู้กำหนดเพื่อใช้ตาราง เมื่อความปลอดภัยเปลี่ยนเป็น:

SQL SECURITY INVOKER

ปัญหาได้รับการแก้ไขแล้ว ปัญหาที่เกิดขึ้นจริงนั้นแตกต่างจากที่คาดไว้อย่างสมบูรณ์โดยขึ้นอยู่กับข้อความแสดงข้อผิดพลาด


1
สิ่งนี้กลายเป็นสาเหตุของปัญหาของฉันเช่นกัน - มุมมองที่มี "ผู้กำหนด" ที่หายไป วิธีหนึ่งที่รวดเร็วในการตรวจสอบว่านี่คือสิ่งที่เกิดขึ้นกับคุณหรือไม่ลองสืบค้นตารางหรือมุมมองเดียวกันกับรูท - หากคุณทำข้อความแสดงข้อผิดพลาดจะเปลี่ยนเป็นคำอธิบายที่ผิดพลาด "ERROR 1449 (HY000): ผู้ใช้ที่ระบุ ไม่มีตัวกำหนด "
Joshua Davies

3

มันเป็นความแตกต่างระหว่าง:

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' และ 'to' 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;

คำสั่งให้คืนข้อผิดพลาด ฉันต้องการระบุฐานข้อมูลเช่นนั้น: ให้สิทธิ์ทั้งหมดใน newdb. * ถึง ....
LeBird

3

สิ่งนี้จะเกิดขึ้นเมื่อรหัสผ่านของคุณมีอักขระพิเศษเช่น @, $, เป็นต้น เพื่อหลีกเลี่ยงสถานการณ์นี้คุณสามารถล้อมรหัสผ่านด้วยเครื่องหมายคำพูดเดี่ยว:

$ 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>

3
นี่อาจเป็นปัญหา (เหมือนเดิมสำหรับฉัน) ทั้งหมดรหัสผ่านของฉันสำหรับการใด ๆ pwgenของบัญชีของฉันถูกสร้างโดยใช้ วันนี้ฉันสร้างใหม่สำหรับฐานข้อมูล MySQL และผู้ใช้ น่าเสียดายที่รหัสผ่านมีเครื่องหมายแบ็กสแลช "\" ซึ่งฉันไม่ได้ระบุว่าเป็นข้อผิดพลาดที่มา (ฉันไม่ได้คิดอย่างนั้น) ดังนั้นฉันจึงค้นหาวิธีแก้ปัญหาหลายชั่วโมง หลังจากตั้งค่ารหัสผ่านเป็น "123" โดยสิ้นหวังการลงชื่อเข้าใช้จะใช้งานได้ในที่สุด ... ผู้ใช้ควรระวังว่าตัวอักษรพิเศษบางตัวอาจทำให้เกิดปัญหาเนื่องจาก MySQL ไม่แสดงคำเตือนเกี่ยวกับการใช้รหัสผ่านเช่น "daiy4ha4in7chooshuiphie \ Th * aew"
Arvid

1
กำลังจะโพสต์สิ่งนี้เป็นคำตอบหากยังไม่ปรากฏขึ้นมันเป็นเรื่องที่ไกลเกินกว่าที่ฉันจะสังเกตเห็นได้ (ดังนั้นฉันจึงชน +1)
Assimilater

3

สำหรับฉันปัญหานี้เกิดจากฟีเจอร์ใหม่ของ MySQL 5.7.2: userข้อมูลจะถูกละเว้นหากpluginฟิลด์นั้นว่างเปล่า

ตั้งค่าเป็นเช่นmysql_native_passwordเพื่อเปิดใช้งานอีกครั้ง:

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

ดูบันทึกประจำรุ่นสำหรับ MySQL 5.7.2ภายใต้«หมายเหตุการตรวจสอบสิทธิ์»

ด้วยเหตุผลบางอย่าง (อาจเป็นเพราะแฮชรหัสผ่านรุ่นก่อน 4.1 ของฉันถูกลบ) mysql_upgradeสคริปต์ไม่ได้ตั้งค่าปลั๊กอินเริ่มต้น

ฉันค้นพบโดยสังเกตเห็นข้อความเตือนต่อไปนี้ใน/var/log/mysql/error.log:

[คำเตือน] รายการผู้ใช้ 'foo' @ '%' มีค่าปลั๊กอินเปล่า ผู้ใช้จะถูกละเว้นและไม่มีใครสามารถเข้าสู่ระบบด้วยผู้ใช้รายนี้อีกต่อไป

ฉันโพสต์คำตอบนี้ที่นี่เพื่อช่วยคนจากการใช้เวลาไร้สาระเหมือนกันกับที่ฉันทำ


2

ไม่แน่ใจว่าใครจะเห็นว่ามีประโยชน์ แต่ฉันพบข้อผิดพลาดเดียวกันและค้นหาผู้ใช้ที่ไม่ระบุชื่อ ... และไม่มีผู้อื่น ปัญหาก็คือบัญชีผู้ใช้ถูกตั้งค่าเป็น "ต้องใช้ SSL" ซึ่งฉันพบใน PHPMyAdmin โดยไปที่บัญชีผู้ใช้และคลิกที่แก้ไขสิทธิ์สำหรับผู้ใช้ ทันทีที่ฉันยกเลิกการเลือกตัวเลือกนี้ทุกอย่างก็ทำงานตามที่คาดไว้!


2

สรุปการดีบัก

  • ตรวจสอบข้อผิดพลาดการพิมพ์: ชื่อผู้ใช้หรือรหัสผ่าน
  • ตรวจสอบชื่อโฮสต์และเปรียบเทียบกับชื่อโฮสต์ตาราง mysql.user
  • ตรวจสอบผู้ใช้งานอยู่หรือไม่
  • ตรวจสอบว่าโฮสต์มีที่อยู่ IP หรือชื่อโฮสต์

มีโอกาสที่ดีที่คุณอาจพบปัญหานี้หลายครั้งในการทำงานของคุณ ปัญหานี้เกิดขึ้นกับฉันเกือบทุกครั้งเนื่องจากการป้อนชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง แม้ว่านี่จะเป็นหนึ่งในเหตุผลที่มีโอกาสอื่น ๆ อีกมากมายที่คุณอาจได้รับปัญหานี้ บางครั้งมันก็ดูคล้ายกันมาก แต่เมื่อคุณขุดลึกลงไปคุณจะรู้ว่ามีหลายปัจจัยที่ทำให้เกิดข้อผิดพลาดนี้ โพสต์นี้จะอธิบายรายละเอียดเหตุผลทั่วไปส่วนใหญ่และแก้ไขเพื่อแก้ไขปัญหานี้

สาเหตุที่เป็นไปได้:

  • กรณีที่ 1: ข้อผิดพลาด Typo: ชื่อผู้ใช้หรือรหัสผ่าน

นี่คือสาเหตุที่พบบ่อยที่สุดสำหรับข้อผิดพลาดนี้ หากคุณป้อนชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้องแน่นอนคุณจะได้รับข้อผิดพลาดนี้

สารละลาย:

การแก้ไขข้อผิดพลาดประเภทนี้ง่ายมาก เพียงป้อนชื่อผู้ใช้และรหัสผ่านที่ถูกต้อง ข้อผิดพลาดนี้จะได้รับการแก้ไข ในกรณีที่คุณลืมรหัสผ่านคุณสามารถรีเซ็ตชื่อผู้ใช้ / รหัสผ่าน หากคุณลืมรหัสผ่านสำหรับบัญชีผู้ดูแลระบบ / รูทมีหลายวิธีในการรีเซ็ต / เรียกรหัสผ่านรูทอีกครั้ง ฉันจะเผยแพร่โพสต์อื่นเกี่ยวกับวิธีรีเซ็ตรหัสผ่านรูทในกรณีที่คุณลืมรหัสผ่านรูท

  • กรณีที่ 2: การเข้าถึงจากโฮสต์ที่ไม่ถูกต้อง

MySQL จัดเตรียมข้อ จำกัด ตามโฮสต์สำหรับการเข้าถึงของผู้ใช้เป็นคุณลักษณะด้านความปลอดภัย ในสภาพแวดล้อมการผลิตของเราเราใช้เพื่อ จำกัด คำขอการเข้าถึงเฉพาะกับเซิร์ฟเวอร์แอปพลิเคชัน คุณลักษณะนี้มีประโยชน์จริง ๆ ในสถานการณ์การผลิตจำนวนมาก

สารละลาย:

เมื่อคุณประสบปัญหาประเภทนี้ก่อนอื่นให้ตรวจสอบว่าโฮสต์ของคุณได้รับอนุญาตหรือไม่โดยตรวจสอบตาราง mysql.user หากไม่ได้กำหนดไว้คุณสามารถอัปเดตหรือแทรกบันทึกใหม่ไปยังตาราง mysql.user โดยทั่วไปการเข้าถึงในฐานะผู้ใช้รูทจากเครื่องระยะไกลถูกปิดใช้งานและไม่ใช่วิธีปฏิบัติที่ดีที่สุดเนื่องจากปัญหาด้านความปลอดภัย หากคุณมีข้อกำหนดในการเข้าถึงเซิร์ฟเวอร์ของคุณจากหลาย ๆ เครื่องให้สิทธิ์การเข้าถึงกับเครื่องเหล่านั้นเท่านั้น เป็นการดีกว่าที่จะไม่ใช้สัญลักษณ์แทน (%) และให้การเข้าถึงแบบสากล ให้ฉันอัปเดตตาราง mysql.user ตอนนี้ผู้ทำลายสามารถเข้าถึงเซิร์ฟเวอร์ MySQL จากโฮสต์ใด ๆ

  • กรณีที่ 3: ผู้ใช้ไม่มีอยู่บนเซิร์ฟเวอร์

ข้อผิดพลาดประเภทนี้เกิดขึ้นเมื่อผู้ใช้ที่คุณพยายามเข้าถึงไม่มีอยู่บนเซิร์ฟเวอร์ MySQL

Solutions:

เมื่อคุณประสบปัญหาประเภทนี้เพียงแค่ตรวจสอบว่าผู้ใช้นั้นมีอยู่ในตาราง mysql.user หรือไม่ หากไม่มีระเบียนผู้ใช้จะไม่สามารถเข้าถึงได้ หากมีข้อกำหนดสำหรับผู้ใช้ในการเข้าถึงให้สร้างผู้ใช้ใหม่ด้วยชื่อผู้ใช้นั้น

  • กรณีที่ 4: การรวมกันของโฮสต์และตัวเลขตามชื่อ

จุดสำคัญ

  • ไม่แนะนำให้ใช้สัญลักษณ์แทนขณะกำหนดโฮสต์ผู้ใช้ลองใช้ชื่อโฮสต์ที่แน่นอน

  • ปิดใช้งานการล็อกอินรูทจากเครื่องระยะไกล

  • ใช้แนวคิดผู้ใช้พร็อกซี

มีแนวคิดอื่นที่เกี่ยวข้องกับหัวข้อนี้เล็กน้อยและการทำความเข้าใจรายละเอียดของหัวข้อเหล่านั้นเป็นขอบเขตที่แตกต่างกันมากของบทความนี้ เราจะตรวจสอบหัวข้อที่เกี่ยวข้องดังต่อไปนี้ในบทความที่จะเกิดขึ้น

  • จะทำอย่างไรถ้าคุณลืมรหัสผ่านรูทในเซิร์ฟเวอร์ MySQL
  • ปัญหาการเข้าถึง MySQL และตารางที่เกี่ยวข้องกับผู้ใช้
  • คุณลักษณะด้านความปลอดภัยของ MySQL พร้อมแนวปฏิบัติที่ดีที่สุด

ฉันหวังว่าโพสต์นี้จะช่วยให้คุณแก้ไข MySQL Error Code 1045 Access ถูกปฏิเสธสำหรับผู้ใช้ใน MySQL


2

ฉันหวังว่าคุณจะไม่ได้รับความเสียหายมากขึ้นด้วยการลบผู้ใช้ debian-sys-maint ใน mysql

ให้ mysql daemon ของคุณทำงานตามปกติ เริ่มไคลเอนต์ mysql ของคุณตามที่แสดงด้านล่าง

mysql -u debian-sys-maint -p

ใน terminal อีกไฟล์cat /etc/mysql/debian.cnfไฟล์นั้นมีรหัสผ่าน วางรหัสผ่านนั้นเมื่อได้รับแจ้ง

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


2

ฉันค้นพบอีกกรณีหนึ่งที่ปรากฏบนพื้นผิวเพื่อเป็นกรณีขอบ ฉันสามารถส่งออกไปยังระบบไฟล์ผ่าน SELECT INTO .. ​​OUTFILE เป็น root แต่ไม่ใช่ผู้ใช้ทั่วไป แม้ว่านี่อาจเป็นเรื่องของการอนุญาต แต่ฉันได้ดูและไม่เห็นสิ่งใดที่ชัดเจนเป็นพิเศษ ทั้งหมดที่ฉันสามารถพูดได้คือการดำเนินการค้นหาในฐานะผู้ใช้ปกติที่มีสิทธิ์ทั้งหมดในฐานข้อมูลที่เป็นปัญหาจะส่งกลับข้อผิดพลาดการปฏิเสธการเข้าถึงที่นำฉันไปที่หัวข้อนี้ เมื่อฉันพบบันทึกการใช้ SELECT INTO ... OUTFILE ที่ประสบความสำเร็จในโครงการเก่าฉันสังเกตว่าฉันเข้าสู่ระบบในฐานะ root แน่นอนเมื่อฉันเข้าสู่ระบบในฐานะที่เป็นรากแบบสอบถามทำงานตามที่คาดไว้


1

ปรับปรุง:ใน 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';

0

เมื่อคุณเรียกใช้mysql -u bill -p, localhostได้รับการแก้ไขไป IP ของคุณเพราะมันเป็น 127.0.0.1 และของ/etc/hostsไฟล์เป็นค่าเริ่มต้น127.0.0.1 localhostที่มีอยู่ ดังนั้นตีความ MySQL คุณเป็นผู้ที่ไม่ได้รับอนุญาตด้วยbill@localhost bill@'%'นี่คือเหตุผลที่มี 2 เร็กคอร์ดที่แตกต่างกันสำหรับrootผู้ใช้ที่เป็นผลลัพธ์ของselect host, user from mysql.user;แบบสอบถาม

มีสองวิธีในการจัดการกับปัญหานี้

อันหนึ่งคือการระบุ IP ซึ่งไม่ได้รับการแก้ไขกลับโดย/etc/hostsไฟล์เมื่อคุณพยายามที่จะเข้าสู่ระบบ ยกตัวอย่างเช่น IP 10.0.0.2ของเซิร์ฟเวอร์คือ เมื่อคุณเรียกใช้คำสั่งmysql -u bill -p -h 10.0.0.2คุณจะสามารถเข้าสู่ระบบ ถ้าคุณพิมพ์คุณจะได้รับselect user(); bill@10.0.0.2แน่นอนว่าชื่อโดเมนใด ๆ ไม่ควรแก้ไขเป็น ip นี้ใน/etc/hostsไฟล์ของคุณ

ประการที่สองคุณต้องให้สิทธิ์การเข้าถึงสำหรับชื่อโดเมนนี้โดยเฉพาะ สำหรับคุณควรจะเรียกคำสั่งbill@localhost ในกรณีนี้คุณจะสามารถเข้าสู่ระบบด้วยคำสั่งgrant all privileges on *.* to bill@localhost identified by 'billpass'; mysql -u bill -pเมื่อ logined, คำสั่งส่งกลับselect user();bill@localhost

แต่นี่เป็นเพียงสิ่งที่คุณพยายามลงชื่อเข้าใช้เซิร์ฟเวอร์ mysql ในโฮสต์เดียวกัน จากโฮสต์ระยะไกล mysql จะทำงานอย่างที่คาดไว้ '%' จะอนุญาตให้คุณเข้าสู่ระบบ


0

ฉันแก้ไขสิ่งนี้ได้โดยการลบรายการ 'บิล' ของผู้ใช้บั๊กกี้เก่า (นี่เป็นส่วนสำคัญ: ทั้งจากmysql.userและmysql.db ) จากนั้นสร้างผู้ใช้คนเดียวกับที่เศร้ามาก่อน:

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

ทำงานได้ผู้ใช้กำลังเชื่อมต่อ ตอนนี้ฉันจะลบ previlegies ออกจากมัน :)


0

ฉันพบข้อผิดพลาดเดียวกัน การตั้งค่าที่ไม่ทำงานมีดังนี้:

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);

ความแตกต่างคือเครื่องหมายคำพูดคู่ ดูเหมือนว่าพวกเขาจะค่อนข้างสำคัญใน PHP เมื่อเทียบกับ Java และพวกเขามีผลกระทบเมื่อมันมาถึงการหลบหนีตัวอักษรการตั้งค่า URL และตอนนี้ผ่านพารามิเตอร์ไปยังฟังก์ชั่น พวกเขาน่ารักกว่า (ฉันรู้) แต่มักจะใช้คำพูดเดียวให้มากที่สุดเท่าที่จะทำได้ดังนั้นการพูดซ้ำสองครั้งสามารถซ้อนอยู่ภายในสิ่งเหล่านั้นหากจำเป็น

ข้อผิดพลาดนี้เกิดขึ้นเมื่อฉันทดสอบแอปพลิเคชันของฉันบนกล่อง Linux ซึ่งตรงข้ามกับสภาพแวดล้อม Windows


0

ฉันมีปัญหาที่คล้ายกันเนื่องจากรหัสผ่านของฉันมี ";" ถ่านรหัสผ่านของฉันเมื่อฉันสร้างมันในช่วงเวลาแรก ข้อควรระวังหากสามารถช่วยคุณได้


0

สิ่งนี้อาจนำไปใช้กับคนน้อยมาก แต่นี่จะไป อย่าใช้อัศเจรีย์!ในรหัสผ่านของคุณ

ฉันทำและได้รับข้อผิดพลาดข้างต้นโดยใช้ MariaDB เมื่อฉันทำให้มันง่ายขึ้นแค่ใช้ตัวอักษรและตัวเลข ตัวละครอื่น ๆ เช่น@และ$ทำงานได้ดี - ฉันใช้ตัวละครเหล่านั้นในผู้ใช้อื่นในอินสแตนซ์เดียวกัน

การตอบสนองที่ห้าตามที่อยู่นี้ทำให้ฉันได้รับการแก้ไข


0

บน Windows นี่คือวิธีแก้ไข:

ข้อผิดพลาด 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'root' @ 'localhost' (ใช้รหัสผ่าน: NO)

  1. ถอนการติดตั้ง mysql จากแผงควบคุม
  2. ลบโฟลเดอร์ MySql จากC:\Program Files,C:\Program Files (x86)และC:\ProgramData
  3. ติดตั้ง mysql

ลองคำตอบอื่น ๆ ทั้งหมดในที่สุดก็ตัดสินใจลองใช้งานได้ดีที่สุด!
jasonoriordan

0

สิ่งนี้อาจเกิดขึ้นได้หาก MySQL ทำงานบนระบบปฏิบัติการที่เล็กและใหญ่เช่น Windows

เช่นฉันพบว่าการพยายามเชื่อมต่อกับฐานข้อมูลโดยใช้ข้อมูลรับรองเหล่านี้ล้มเหลว:

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

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

ข้อผิดพลาด 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'specialuser'@'10.0.1.113' (ใช้รหัสผ่าน: YES)

แต่สิ่งนี้สำเร็จ:

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

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

ใส่รหัสผ่าน:


0

ถ้า dbname คุณชื่อผู้ใช้รหัสผ่าน ฯลฯ สตริงความยาวเกินกว่าค่าที่ระบุไว้ที่https://dev.mysql.com/doc/refman/5.7/en/grant-tables.html#grant-tables-scope-column-propertiesคุณ อาจล้มเหลวในการเข้าสู่ระบบเช่นนี้เป็นในกรณีของฉัน


0

ปัจจุบัน! ทางออกสำหรับ:

MySQL ข้อผิดพลาด 1,045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'ผู้ใช้' @ 'localhost' (ใช้รหัสผ่าน: ใช่);

Wampserver 3.2.0 การติดตั้งใหม่หรือการอัพเกรด

อาจxampใช้mariaDBเป็นค่าเริ่มต้นได้ดี

Wampเซิร์ฟเวอร์มาพร้อมกับmariaDBและ mysql และการขยายmariaDBเป็นค่าเริ่มต้นบนพอร์ต 3306 และ mysql บน 3307 บางครั้งพอร์ต 3308

เชื่อมต่อmysql!

เมื่อติดตั้งมันถามว่าจะใช้mariaDBหรือMySql, แต่ mariaDB ถูกตรวจสอบเป็นค่าเริ่มต้นและคุณไม่สามารถเปลี่ยนได้, ตรวจสอบmysqlตัวเลือกและติดตั้ง.

เมื่อติดตั้งเสร็จทั้งสองจะทำงานmariaDBในพอร์ตเริ่มต้น 3306 และmysqlในพอร์ตอื่น 3307 หรือ 3308

คลิกขวาที่wampserverไอคอนซึ่งการวิ่งนั้นควรจะอยู่ที่มุมล่างขวาเครื่องมือข้ามไปแล้วดูว่าถูกต้องหรือไม่mysqlพอร์ตการเรียกใช้ที่

และรวมไว้ในการเชื่อมต่อฐานข้อมูลของคุณเช่นเดียวกับ folowng:

$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/


โปรดอย่าใช้ backticks เพื่อการเน้น ควรใช้รหัสนี้เท่านั้น คำเช่น MySQL หรือ Wampserver ไม่ใช่รหัส
Dharman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.