ข้อผิดพลาดของ MySQL:: 'การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้' รูท '@' localhost '


263

$ ./mysqladmin -u root -p ' redacted '
ป้อนรหัสผ่าน:

mysqladmin: เชื่อมต่อกับเซิร์ฟเวอร์ที่ 'localhost' ล้มเหลวข้อผิดพลาด:
'การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้' รูท '@' localhost '(ใช้รหัสผ่าน: YES)'

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



1
@clearlight ไม่ใช่คำถามเดียวกันโพสต์นี้มีปัญหากับ mysqladmin รับสิทธิพิเศษสุดใน mysql โพสต์อื่น ๆ มีปัญหากับการเชื่อมต่อที่เรียบง่ายจากซ็อกเก็ต
e-info128

ลองลบหากมี~/.my.cnfไฟล์อยู่
e-info128

11
ฉันรู้ว่านี่เก่า แต่ต้องการพูดเรื่องนี้กับผู้เยี่ยมชมในอนาคต อย่าป้อนรหัสผ่าน mysql ของคุณโดยเฉพาะอย่างยิ่งสำหรับรูทในคำสั่งของตัวเองไม่เช่นนั้นจะถูกเก็บไว้ในประวัติเชลล์ของคุณ เพียงแค่ปล่อยให้-pตัวเลือกนี้ถูกต้องและ mysql จะถามรหัสผ่าน
Scotty C.

คำตอบ:


356
  1. เปิด & แก้ไข/etc/my.cnfหรือ/etc/mysql/my.cnfขึ้นอยู่กับ distro ของคุณ
  2. เพิ่มskip-grant-tablesภายใต้[mysqld]
  3. รีสตาร์ท Mysql
  4. คุณควรจะสามารถเข้าสู่ mysql ได้โดยใช้คำสั่งด้านล่าง mysql -u root -p
  5. วิ่ง mysql> flush privileges;
  6. ตั้งรหัสผ่านใหม่โดย ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. กลับไปที่ /etc/my.cnf และลบ / แสดงความคิดเห็น skip-grant-tables
  8. รีสตาร์ท Mysql
  9. ตอนนี้คุณจะสามารถเข้าสู่ระบบด้วยรหัสผ่านใหม่ mysql -u root -p

6
สวัสดีฉันมีปัญหาเดียวกัน ฉันทำตามข้างบนแล้วและแก้ปัญหาได้ แต่ทุกครั้งที่ฉันรีบูต CentOS ฉันต้องทำตามขั้นตอนทั้งหมดอีกครั้ง (ฉันได้รับข้อความ: การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'root' @ 'localhost' (ใช้รหัสผ่าน: ไม่) - เมื่อเรียกใช้คำสั่ง mysql (หรือคำสั่ง SQL ใด ๆ ) และฉันจะทำอีกครั้งและอีกครั้งทั่วทุกมุมดังกล่าวข้างต้นในแต่ละรีบูต.
ตัน

19
น่าเสียดายที่นี่ใช้ไม่ได้กับ MariaDB:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Philipp Ludwig

11
ฉันพบสิ่งนี้เพื่อทำงาน @PhilippLudwig set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');ฉันทำสิ่งนี้หลังจากขั้นตอนที่ 5 นี่คือลักษณะที่พรอมต์คำสั่งของฉันดู:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow

3
สำหรับการรีสตาร์ทขั้นตอนที่ 3 MariaDB: ฉันพบงานต่อไปนี้:sudo systemctl restart mariadb
therobyouknow

7
บางคนอาจพบไฟล์ใน /etc/mysql/my.cnf
DSinghvi

589

วิธีแก้ปัญหาทั้งหมดที่ฉันพบมีความซับซ้อนเกินความจำเป็นและไม่มีวิธีใดที่เหมาะกับฉัน นี่คือทางออกที่แก้ไขปัญหาของฉัน ไม่จำเป็นต้องรีสตาร์ท mysqld หรือเริ่มด้วยสิทธิ์พิเศษ

sudo mysql

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

ด้วยการค้นหาเพียงครั้งเดียวเรากำลังเปลี่ยนauth_pluginเป็นmysql_native_passwordและตั้งค่ารหัสผ่านรูทเป็นรูท ( อย่าลังเลที่จะเปลี่ยนมันในเคียวรี)

ตอนนี้คุณควรจะสามารถเข้าสู่ระบบด้วยรูท ข้อมูลเพิ่มเติมสามารถพบได้ในเอกสารประกอบของ mysql

(ออกจากคอนโซล mysql ด้วยCtrl + Dหรือโดยพิมพ์exit )


41
ฉันไม่สามารถทำเช่นนี้ ... "คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณตรวจสอบคู่มือที่สอดคล้องกับรุ่นเซิร์ฟเวอร์ MariaDB ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้ ... "
TCB13

2
คำตอบนี้ใช้ได้ผลฉันเพิ่มโดยไม่ได้ตั้งใจลงคะแนนคำตอบที่เป็นประโยชน์ขอโทษนะ!
taher

25
ทำงานได้ดีมากบน Ubuntu 18.04
Almino Melo

2
@ TCB13 และใครก็ตามที่ประสบปัญหานี้ "ฉันไม่สามารถทำเช่นนี้ ... " คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ; ตรวจสอบคู่มือที่สอดคล้องกับรุ่นเซิร์ฟเวอร์ MariaDB ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้ ... ". ใช้สิทธิ์ล้างก่อนที่จะดำเนินการคำสั่งแก้ไข
coder

3
คุณประหยัดวันของฉัน :)
xger86x

50

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

ขั้นตอนที่ 1: ระบุเวอร์ชันของฐานข้อมูล

$ mysql --version

คุณจะเห็นผลลัพธ์เช่นนี้ด้วย MySQL:

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

หรือผลลัพธ์เช่นนี้สำหรับ MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

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

ขั้นตอนที่ 2: การหยุดเซิร์ฟเวอร์ฐานข้อมูล

ในการเปลี่ยนรหัสผ่านรูทคุณจะต้องปิดเซิร์ฟเวอร์ฐานข้อมูลไว้ก่อน

คุณสามารถทำสิ่งนั้นกับ MySQL ด้วย:

$ sudo systemctl stop mysql

และสำหรับ MariaDB ด้วย:

$ sudo systemctl stop mariadb

ขั้นตอนที่ 3: การรีสตาร์ทเซิร์ฟเวอร์ฐานข้อมูลโดยไม่ตรวจสอบสิทธิ์

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

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

เริ่มฐานข้อมูลโดยไม่โหลดตารางการให้สิทธิ์หรือเปิดใช้งานเครือข่าย:

$ sudo mysqld_safe --skip-grant-tables --skip-networking &

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

ตอนนี้คุณสามารถเชื่อมต่อกับฐานข้อมูลในฐานะผู้ใช้รูทซึ่งไม่ควรถามรหัสผ่าน

$ mysql -u root

คุณจะเห็นพรอมต์เชลล์ฐานข้อมูลทันที

พรอมต์ MySQL

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

mysql>

พรอมต์ MariaDB

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

MariaDB [(none)]>

ตอนนี้คุณสามารถเข้าถึงรูทได้แล้วคุณสามารถเปลี่ยนรหัสผ่านรูทได้

ขั้นตอนที่ 4: การเปลี่ยนรหัสผ่านรูท

mysql> FLUSH PRIVILEGES;

ตอนนี้เราสามารถเปลี่ยนรหัสผ่านรูทได้จริง

สำหรับMySQL 5.7.6 และใหม่กว่าและMariaDB 10.1.20 และใหม่กว่าให้ใช้คำสั่งต่อไปนี้:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

สำหรับMySQL 5.7.5 และรุ่นเก่ากว่ารวมถึงMariaDB 10.1.20 ขึ้นไปให้ใช้:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

ตรวจสอบให้แน่ใจว่าได้แทนที่new_passwordด้วยรหัสผ่านใหม่ที่คุณเลือก

หมายเหตุ:หากALTER USERคำสั่งไม่ทำงานมักจะบ่งบอกถึงปัญหาที่ใหญ่กว่า อย่างไรก็ตามคุณสามารถลองUPDATE ... SETรีเซ็ตรหัสผ่านรูทแทน

[สำคัญ] นี่คือบรรทัดเฉพาะที่แก้ไขปัญหาเฉพาะของฉัน:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

อย่าลืมโหลดตารางการให้สิทธิ์หลังจากนี้

ไม่ว่าในกรณีใดคุณควรเห็นการยืนยันว่าคำสั่งนั้นได้ดำเนินการเสร็จเรียบร้อยแล้ว

Query OK, 0 rows affected (0.00 sec)

รหัสผ่านมีการเปลี่ยนแปลงดังนั้นตอนนี้คุณสามารถหยุดอินสแตนซ์ด้วยตนเองของเซิร์ฟเวอร์ฐานข้อมูลและรีสตาร์ทเหมือนเดิม

ขั้นตอนที่ 5: รีสตาร์ทเซิร์ฟเวอร์ฐานข้อมูลตามปกติ

บทช่วยสอนจะดำเนินการในขั้นตอนต่อไปเพื่อรีสตาร์ทฐานข้อมูล แต่สิ่งเดียวที่ฉันใช้คือ:

สำหรับ MySQL ให้ใช้: $ sudo systemctl start mysql

สำหรับ MariaDB ให้ใช้:

$ sudo systemctl start mariadb

ตอนนี้คุณสามารถยืนยันได้ว่ามีการใช้รหัสผ่านใหม่อย่างถูกต้องโดยการเรียกใช้:

$ mysql -u root -p

ตอนนี้คำสั่งควรพร้อมท์ให้ใส่รหัสผ่านที่ได้รับมอบหมายใหม่ ป้อนมันและคุณควรเข้าถึงพรอมต์ฐานข้อมูลตามที่คาดไว้

ข้อสรุป

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


1
คำสั่ง ALTER USER ถูกนำมาใช้ใน MariaDB 10.2.0
Benoit Desrosiers

2
ว้าว ! บรรทัดmysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';นี้เป็นตัวช่วยชีวิตสำหรับฉัน!
lucyjosef

35

คำตอบข้างต้นไม่ช่วยฉันด้วยปัญหานี้ดังนั้นนี่คือทางออกที่ฉันพบที่นี่เป็นวิธีที่ผมพบ

ส่วนที่เกี่ยวข้อง:

ในระบบ Ubuntu ที่ใช้ MySQL 5.7 (และรุ่นที่ใหม่กว่า) ผู้ใช้รูท MySQL ถูกตั้งค่าให้ตรวจสอบความถูกต้องโดยใช้ปลั๊กอิน auth_socket โดยค่าเริ่มต้นแทนที่จะใช้รหัสผ่าน วิธีนี้ช่วยให้มีความปลอดภัยและการใช้งานที่ดีขึ้นในหลาย ๆ กรณี แต่ยังสามารถทำให้สิ่งต่าง ๆ ซับซ้อนเมื่อคุณต้องการอนุญาตให้โปรแกรมภายนอก (เช่น phpMyAdmin) เข้าถึงผู้ใช้

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

sudo mysql

ถัดไปตรวจสอบวิธีการรับรองความถูกต้องของบัญชีผู้ใช้ MySQL แต่ละบัญชีที่ใช้กับคำสั่งต่อไปนี้:

SELECT user,authentication_string,plugin,host FROM mysql.user;

เอาท์พุต

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

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

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

จากนั้นให้รัน FLUSH PRIVILEGES ซึ่งบอกให้เซิร์ฟเวอร์โหลดตารางการให้สิทธิ์ใหม่และทำให้การเปลี่ยนแปลงใหม่ของคุณมีผล:

FLUSH PRIVILEGES;

ตรวจสอบวิธีการรับรองความถูกต้องที่ใช้โดยผู้ใช้ของคุณอีกครั้งเพื่อยืนยันว่ารูทไม่รับรองความถูกต้องอีกต่อไปโดยใช้ปลั๊กอิน auth_socket:

SELECT user,authentication_string,plugin,host FROM mysql.user;

เอาท์พุต

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

คุณสามารถดูในตัวอย่างนี้ผลลัพธ์ที่ผู้ใช้รูท MySQL ตอนนี้รับรองความถูกต้องโดยใช้รหัสผ่าน เมื่อคุณยืนยันสิ่งนี้บนเซิร์ฟเวอร์ของคุณเองคุณสามารถออกจากเปลือก MySQL:

exit


27

สำหรับผู้ใช้ Ubuntu / Debian

( อาจทำงานกับ distros อื่น ๆ โดยเฉพาะอย่างยิ่ง debian ตาม)

เรียกใช้สิ่งต่อไปนี้เพื่อเชื่อมต่อเป็นroot(โดยไม่มีรหัสผ่านใด ๆ )

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

หากคุณไม่ต้องการเพิ่ม--defaults-fileในแต่ละครั้งที่คุณต้องการเชื่อมต่อrootคุณสามารถคัดลอก/etc/mysql/debian.cnfลงในโฮมไดเร็กตอรี่ของคุณ:

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

แล้ว:

sudo mysql

2
นี่คือทั้งหมดที่ใช้ 'root' ไม่ใช่ 'root' บน Ubuntu ตามค่าเริ่มต้น
Chaim Eliyah

21

หลังจากลองคำตอบของคนอื่น ๆ ทั้งหมดนี่คือสิ่งที่ได้ผลในที่สุดสำหรับฉัน

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

ฉันพบคำตอบในโพสต์นี้: https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06


1
สายปลั๊กอินนี้มีประโยชน์จริงๆ ฉันพยายามรวบรวมเป็นจำนวนมาก แต่นี่เป็นงานเดียวสำหรับ Ver 14.14 Distrib 5.7.27 สำหรับ Linux (x86_64)
AlexNikonov

2
สิ่งนี้ช่วยฉันด้วย mysql 5.7 เช่นกัน ใช้งานได้ไม่เพียง แต่สำหรับมาเรียบ์
podarok

ฉันเพิ่งใช้สิ่งนี้กับ MySQL 8 Ubuntu 20.04 และใช้งานได้ คำตอบอื่น ๆ ที่ใช้skip-grant-table(my.conf หรือในmysqlคำสั่ง) ไม่ทำงาน ฉันสามารถใช้บัญชีบริการ ( askubuntu.com/a/120769/169836 ) ได้ แต่UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';ไม่ทำงาน เฉพาะเมื่อใช้ส่วนที่ปลั๊กอินทำงานได้เท่านั้น ขอบคุณ ~
hamx0r

16

สำหรับผู้ใช้ linux ใหม่สิ่งนี้อาจเป็นงานที่น่ากลัว ให้ฉันอัปเดตสิ่งนี้ด้วย mysql 8 (เวอร์ชั่นล่าสุดที่มีในขณะนี้คือ 8.0.12 ในวันที่ 12-Sep-2018)

  1. เปิดไฟล์คอนฟิกูเรชัน "mysqld.cnf" ที่ "/etc/mysql/mysql.conf.d/"
  2. เพิ่มskip-grant-tablesไปยังบรรทัดถัดไปของข้อความ [mysql] และบันทึก
  3. เริ่มบริการ mysql ใหม่เป็น "sudo service mysql restart" ตอนนี้ mysql ของคุณไม่มีการรับรองความถูกต้องใด ๆ
  4. เชื่อมต่อกับ MySQL ลูกค้า (หรือเรียกว่า MySQL เปลือก) เป็นข้อมูล mysql -u -p ไม่มีรหัสผ่านที่จะป้อนในตอนนี้
  5. เรียกใช้สิทธิ์ล้างคำสั่ง sql ;
  6. รีเซ็ตรหัสผ่านทันทีในฐานะผู้ใช้ALTER 'รูท' @ 'localhost' ที่ระบุโดย 'MyNewPassword';
  7. ทีนี้กลับไปสู่สภาวะปกติ ลบบรรทัดนั้น "skip-grant-tables" จาก "mysqld.cnf" และเริ่มบริการใหม่

แค่นั้นแหละ.


5

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


4

ฉันทำสิ่งนี้เพื่อตั้งค่ารหัสผ่านรูทของฉันในการตั้งค่าเริ่มต้นของ MySQL ใน OSx เปิดเทอร์มินัล

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

ปิดเครื่องและเปิดเครื่องใหม่ และสิ่งต่อไปนี้ทำงานใน Linux เพื่อตั้งค่ารหัสผ่านรูท

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables: นี่ไม่ได้ผลสำหรับฉันในครั้งแรก แต่การลองครั้งที่สองออกมาก็ประสบความสำเร็จ)

จากนั้นเข้าสู่ระบบ MySQL

mysql -u root

FLUSH PRIVILEGES;

ตอนนี้เปลี่ยนรหัสผ่าน:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

รีสตาร์ท MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start

3

ในกรณีของฉันภายใต้ Debian 10 ข้อผิดพลาด

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

ได้รับการแก้ไขโดย (GOOD WAY)

sudo mysql -u root -p mysql

วิธีที่ไม่ดี:

mysql -u root -p mysql

3

ฮึ - ไม่มีอะไรทำงานให้ฉัน! ฉันมี CentOS 7.4 เครื่องที่ใช้ mariadb 5.5.64

สิ่งที่ฉันต้องทำคือสิ่งนี้หลังจากติดตั้ง mariadb จาก yum;

# systemctl restart mariadb
# mysql_secure_installation

mysql_secure_installationจะนำคุณผ่านหลายขั้นตอนรวมทั้ง "ตั้งรหัสผ่าน root [Y / N]" เพียงแค่พูดว่า "y" และให้รหัสผ่าน ตอบคำถามอื่น ๆ ตามที่คุณต้องการ

จากนั้นคุณสามารถใช้รหัสผ่านโดยใช้

# mysql -u root -p

มันจะอยู่รอด

# systemctl restart mariadb

ที่สำคัญ

จากนั้นฉันตรวจสอบ/bin/mysql_secure_installationซอร์สโค้ดเพื่อค้นหาว่ามันสามารถเปลี่ยนรหัสผ่านรูทอย่างน่าอัศจรรย์ได้อย่างไรและไม่มีคำตอบอื่นใดที่นี่ทำได้ บิตนำเข้าคือ:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

... มันบอกว่าไม่SET Password=... SET authentication_string = PASSWORD...ดังนั้นขั้นตอนที่เหมาะสมสำหรับรุ่นนี้ (5.5.64) คือ:

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

จากพรอมต์ mysql>:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

ฆ่า mysqld_safe ที่กำลังรันอยู่ รีสตาร์ท mariadb mysql -u -pเข้าสู่ระบบเป็นราก: ใช้รหัสผ่านใหม่ของคุณ

หากคุณต้องการคุณสามารถตั้งค่ารหัสผ่านรูททั้งหมดได้ในครั้งเดียว ฉันคิดว่านี่ฉลาด

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

จะทำการอัปเดตรหัสผ่านรูททั้งหมด: เช่นสำหรับ "localhost", "127.0.0.1" และ ":: 1"

ในอนาคตเมื่อฉันไปที่ RHEL8 หรือคุณมีอะไรฉันจะพยายามอย่าลืมตรวจสอบ / bin / mysql_secure_installation และดูว่าพวกเขาทำได้อย่างไรใครคือคนที่กำหนดค่า mariadb สำหรับระบบปฏิบัติการนี้


2

หากคุณเป็นเหมือนฉันและคำแนะนำข้างต้นทั้งหมดล้มเหลวให้ดำเนินการถอนการติดตั้ง mysql ทั้งหมดในเครื่องของคุณค้นหาไฟล์ mysql ที่เหลือทั้งหมดโดยใช้คำสั่งนี้sudo find / -name "mysql"และrm -rfทุกไฟล์หรือไดเรกทอรีที่มีชื่อ mysql แนบอยู่ (คุณควรข้ามไฟล์ที่เกี่ยวข้อง ไปยังไลบรารีภาษาโปรแกรม) ตอนนี้ติดตั้ง MySQL เวอร์ชันใหม่แล้วสนุกไปกับมัน หมายเหตุ: คุณจะหลวมข้อมูลทั้งหมดของคุณดังนั้นชั่งน้ำหนักตัวเลือกของคุณก่อน



1

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

ในกรณีที่ช่วยให้ทราบการตั้งค่าของฉันฉันใช้ Sequel Pro และพยายามเชื่อมต่อกับ Node โดยใช้แพ็คเกจ NPM, mysql ฉันไม่คิดว่าฉันต้องเชื่อมต่อจริง ๆ (นอกเหนือจาก Run Sequel Pro) เพราะฉันทำสิ่งนั้นจากแอพของฉันอยู่แล้ว

ป้อนคำอธิบายรูปภาพที่นี่


0

ทางออก: ยอมแพ้!

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

จากความอดทนที่ทำให้มันใช้งานได้ผมส่งคำสั่งให้ติดตั้ง SQLite เพียงใช้ 450KB เท่านั้นและมันทำงานได้อย่างสมบูรณ์แบบจากคำว่า go

หากคุณไม่มีความอดทนต่อนักบุญไปกับ SQLite และช่วยตัวเองให้รอดพ้นจากความพยายามความเจ็บปวดและพื้นที่เก็บข้อมูล .. !

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