mysql วิธีแก้ไขการเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'root' @ 'localhost'


123

ก่อนที่ฉันจะพลาดอะไรบางอย่างเมื่อฉันลงชื่อเข้าใช้โดยใช้$ mysql -u root -pและแสดงฐานข้อมูล:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

จากนั้นฉันพยายามที่จะสร้างผู้ใช้ใหม่และสังเกตว่ามีบางอย่างผิดปกติกับสิทธิพิเศษ

ดังนั้นฉันจึงลบผู้ใช้ใหม่และฉันเดาว่าฉันลบ 'root' และ 'ผู้ดูแลระบบ' ออกโดยไม่ได้ตั้งใจ

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

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

ถ้าฉันเข้าสู่ MySQL อีกครั้งโดยใช้$ mysql -u root -pและแสดงฐานข้อมูล

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

ฐานข้อมูลอื่น ๆ ทั้งหมดหายไป

ฉันจะแก้ไข MySQL ได้อย่างไร

ฉันไม่พบฐานข้อมูล 'mysql' ไม่สามารถสร้างฐานข้อมูลสร้างผู้ใช้สิ่งที่ฉันพยายามทำจะได้รับข้อผิดพลาด

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

ฉันควรติดตั้ง MySQL ใหม่โดยใช้ MacPort หรือไม่ หากติดตั้งใหม่ฉันจะสูญเสียฐานข้อมูลgame_dataใช่ไหม


ลองใช้เซิร์ฟเวอร์กับ 'root'@'127.0.0.1' ซึ่งแตกต่างจาก 'root' @ 'localhost' จากนั้นออกคำสั่งเพื่อสร้าง 'root' @ 'localhost' ของผู้ใช้และให้สิทธิ์ทั้งหมดแก่มัน
Gimmy

ดูเพิ่มเติมวิธีการให้ MySQL ให้สิทธิ์ผู้ใช้รูทได้อย่างไร เกี่ยวกับ Super User มันพยายามหลีกเลี่ยงการรีเซ็ตรหัสผ่าน
jww

ฉันเพิ่งมีช่องว่างระหว่าง-pและรหัสผ่าน ฉันรู้ว่ามันโง่ แต่อาจช่วยใครบางคน
Vinay Wadhwa

คำตอบ:


132

ทำตามขั้นตอนด้านล่าง

  1. เริ่มต้นอินสแตนซ์ของเซิร์ฟเวอร์ MySQL หรือ daemon ด้วย--skip-grant-tablesตัวเลือก (การตั้งค่าความปลอดภัย)

    $ mysqld --skip-grant-tables
    
  2. ดำเนินการข้อความเหล่านี้

    $ mysql -u root mysql
    $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
    $mysql> FLUSH PRIVILEGES;
    

หากคุณพบข้อผิดพลาดรหัสผ่านฟิลด์ที่ไม่รู้จักใช้ข้างต้น:

update user set authentication_string=password('my_password') where user='root';
  1. ในที่สุดรีสตาร์ทอินสแตนซ์ / daemon โดยไม่มี--skip-grant-tablesตัวเลือก

    $ /etc/init.d/mysql restart
    

ตอนนี้คุณควรจะสามารถเชื่อมต่อกับรหัสผ่านใหม่ของคุณได้แล้ว

$ mysql -u root -p

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

แก้ไขข้อผิดพลาด MySQL“ ไม่สามารถล็อค ibdata1”

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart

1
"$ mysqld --skip-grant-tables" และ "InnoDB: ไม่สามารถล็อค. / ibdata1, ข้อผิดพลาด: 35 InnoDB: ตรวจสอบว่าคุณยังไม่มีกระบวนการ mysqld อื่น InnoDB: โดยใช้ข้อมูลหรือไฟล์บันทึก InnoDB เดียวกัน"?

ดูการปรับปรุงของฉันด้านบน
Yogus

ฉันพบว่าการหยุด mysql ก่อนที่จะออกคำสั่งที่ 1 หยุดข้อผิดพลาดการล็อคเกิดขึ้น - หยุดการบริการ mysql
Frank Tzanabetis

7
เห็นได้ชัดว่าไม่มีคอลัมน์ 'รหัสผ่าน' อีกต่อไป ... ถูกแทนที่ด้วย 'authentication_string' ดังนั้นสตริงการอัพเดตรหัสผ่านอยู่ในขณะนี้: ผู้ใช้ UPDATE SET authentication_string = PASSWORD ('my_password') โดยที่ USER = 'root';
jdmcnair

1
ขอขอบคุณ! และตอนนี้ฉันอยากรู้อยากเห็น: สิ่งที่อาจทำให้เกิดสิ่งนี้ บน Windows?
Ilia Andrienko

64

ไม่มีการข้างต้นมีประโยชน์สำหรับฉัน ฉันพบว่าฉันต้องการล้างวิธีปลั๊กอิน ใน 5.6 ฉันทำได้:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;

ใน 5.7 ฉันพบว่าฉันต้องการ:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='mysql_native_password' where User='root';
[mysql] flush privileges;

ตามเอกสารที่มีการตั้งค่าปลั๊กอินเป็นสตริงที่ว่างเปล่ามันควรจะเริ่มต้นได้อย่างมีประสิทธิภาพเพื่อ mysql_native_password แต่อาจจะสับสนโดยแฮชรหัสผ่านที่ว่างเปล่า สำหรับความแตกต่างกันนิดหน่อยคุณสามารถอ่านเอกสารได้ที่นี่: https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html


5
วิธีนี้แก้ไขได้สำหรับฉัน เมื่อฉันดูสถานะของ mysql daemon ฉันเห็นคำเตือนนี้: "[คำเตือน] 'ผู้ใช้' รายการ 'root @ localhost' มีทั้งรหัสผ่านและปลั๊กอินการระบุตัวตนที่ระบุรหัสผ่านจะถูกละเว้น" การตั้งค่าปลั๊กอินเป็น '' ทำให้ฉันสามารถเข้าสู่ระบบได้อีกครั้ง ขอบคุณ @Mario Flores
SpacePope

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

2
set plugin='mysql_native_password'ทำเพื่อฉันขอบคุณ! สำหรับการอ้างอิง: dev.mysql.com/doc/refman/5.7/en/…
Koen

ทำไมนี่ยังเป็นปัญหาสำหรับการติดตั้งแพคเกจกราวด์ขึ้นสู่ปี 2018?
mckenzm

1
Ubuntu 18 และใช้งานได้
Rahal Kanishka

8

นอกจากนี้ตรวจสอบให้แน่ใจว่าระเบียนที่ต้องการในตารางuserมีpluginฟิลด์ว่าง(เช่นมี"unix_socket")

ตั้งแต่รุ่น 5.5.7 mysql มีปลั๊กอินการรับรองความถูกต้องที่หลากหลาย https://dev.mysql.com/doc/refman/5.6/th/authentication-plugins.html

ดังนั้นหากคุณมีpluginฟิลด์ที่ไม่ว่างเปล่ารหัสผ่านจะถูกละเว้นและจะมีคำเตือนที่บันทึกข้อผิดพลาด mysql (สำหรับฉันแล้ว/var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.


1
สำหรับคนอื่นที่ทำงานข้ามสิ่งนี้เมื่อใช้เซิร์ฟเวอร์ mysql 5.7.15 สิ่งนี้จะล็อคผู้ใช้ของคุณหากคุณไม่ได้ให้ปลั๊กอิน อาจเป็นสิ่งที่คุณกำลังมองหาเป็นของplugin mysql_native_password
Jonathan Cantrell

8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

คุณอาจเห็นบางสิ่งเช่นนี้

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log
2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu
2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql
2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws
2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV
2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S
2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t
[root@SERVER ~]# mysql_secure_installation

การรักษาความปลอดภัยการปรับใช้เซิร์ฟเวอร์ MySQL

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password:

ถ้าคุณเห็นมันบอกว่า

... Failed! Error: Your password does not satisfy the current policy requirements
That means your password needs to have a character such as ! . # - etc...
mix characters well, upper case, lower case, ! . , # etc...

New password: 

Re-enter new password: 
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 
[root@SERVER ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.10 MySQL Community Server (GPL)

ดูวิดีโอ 10 นาทีสุดท้ายมันสอนวิธีที่คุณทำ


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

นี่เป็นกรณีการใช้งานที่ฉันเห็นฉันกำลังติดตั้ง mysql บน RHEL7 ใน AWS ด้วย Ansible และฉันได้รับพฤติกรรมเดียวกันหลังจากการกำหนดค่าใหม่และรีสตาร์ทฐานข้อมูล คุณรู้ไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้นตั้งแต่แรกกำลังบล็อก Ansible ไม่ให้เข้าถึง mysqld ในพื้นที่และกำหนดค่า นี่เป็นเพียงเพื่อการทดสอบ
einarc

เห็นได้ชัดว่ามันขึ้นอยู่กับวิธีที่คุณเริ่มต้นเซิร์ฟเวอร์ดูขั้นตอนที่ 4 ที่นี่: dev.mysql.com/doc/refman/5.7/en/…
einarc

3

ลองมัน:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;

6
คุณสามารถอธิบายว่า--no-defaults --forceสวิตช์ทำงานอย่างไร มิฉะนั้นจะเป็นคำตอบที่ยอมรับได้ของ VLQ
ลุคชาวแคนาดา

@CanadianLuke ไม่มีค่าเริ่มต้นข้ามไฟล์การกำหนดค่าใด ๆ ที่แสดงว่ามิฉะนั้นจะรวมถึงบังคับให้ดำเนินการต่อไปแม้ว่าคำสั่ง SQL ใด ๆ ที่ออกใช้จะล้มเหลว เมื่อสงสัยให้ตรวจสอบคู่มือ
deucalion

3
จะต้องมีการแก้ไขคำตอบ
Canadian Luke

2
ฉันได้รับERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jonathan


3

ในกรณีของฉันฉันมีความเสียหายฐานข้อมูลหลังจากรีสตาร์ท mysql บน Debian การเข้าสู่ระบบรากโดยไม่มีรหัสผ่าน ทางออกคือ:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';

บางคำตอบอื่น ๆ ยังได้กล่าวถึง native_password plugin แต่นี่เป็นวิธีที่คุณสามารถทำได้โดยไม่ต้องเล่นซอซับซ้อน นั่นคือวิธีที่จะเปลี่ยนแปลง

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