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


23

ฉันทำงานกับ Xubuntu 15.04 ฉันติดตั้ง MariaDB-Server ไว้แล้วในระบบต่าง ๆ และมักจะถามรหัสผ่านรูทระหว่างการติดตั้ง อย่างไรก็ตามในครั้งนี้ฉันจำไม่ได้ว่าถูกขอรหัสผ่าน เมื่อฉันพยายามเข้าสู่ระบบโดยไม่มีรหัสผ่าน (หรือรหัสผ่านว่างเปล่า) ฉันได้รับAccess denied for user 'root'@'localhost'ข้อผิดพลาด ฉันพยายามถอนการติดตั้งแพคเกจอย่างสมบูรณ์โดย

sudo apt-get remove mariadb-server
sudo apt-get purge mariadb-server

เมื่อฉันติดตั้งใหม่ฉันยังไม่ได้รับรหัสผ่านรูท

ฉันพยายามmysqld --skip-grant-tablesวิธีการจาก MySQL วิธีการแก้ไขปัญหาการเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'ราก' @ 'localhost' ฉันสามารถแก้ไขรหัสผ่านสำหรับผู้ใช้รูทในฐานข้อมูล mysql - อย่างน้อยการเปลี่ยนแปลงค่าแฮช - แต่ฉันยังไม่สามารถเข้าสู่ระบบด้วยรหัสผ่านใหม่หลังจากรีสตาร์ทเซิร์ฟเวอร์ mysql ฉันยังคงได้รับข้อผิดพลาดเดียวกัน

ไม่มีผู้ใช้ debian-sys-maint ดังนั้นฉันไม่สามารถใช้เพื่อแก้ไขอะไรได้

ความคิดใดที่ฉันลองได้อีก?


เธรดที่มีประโยชน์พร้อมคำถามเดียวกันใน StackOverflow: stackoverflow.com/questions/39281594/…
Kevin - Reinstate Monica

คำตอบ:


36

คุณต้องรีเซ็ตรหัสผ่าน ดังนั้นสำหรับที่

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

9
"เวทมนต์" ที่ไม่ชัดเจนสำหรับวิธีนี้คือผู้ใช้ระบบปฏิบัติการรูทสามารถล็อกอินเข้าสู่ฐานข้อมูลได้โดยไม่ต้องระบุรหัสผ่านเพราะplugin: auth_socketเปิดใช้งานตามค่าเริ่มต้น กล่าวอีกนัยหนึ่งไม่จำเป็นต้องใช้--skip-grant-tablesเหมือนที่เคยเป็นมาในรุ่น MySQL ก่อนหน้านี้ (ในทางเทคนิคแล้วการวัดนี้ไม่ได้ "รีเซ็ตรหัสผ่าน" แต่เป็นการปิดการใช้งานปลั๊กอิน)
Ben Johnson

1
+1, คุณช่วยอธิบายเหตุผลได้ไหม
A1Gard

4
วิธีการนี้จะทำให้เกิดปัญหาในภายหลัง หากคุณปิดใช้งานปลั๊กอินงาน cron รายวันจะไม่ทำงานเนื่องจากสมมติว่าสามารถเข้าสู่ระบบด้วยปลั๊กอินนั้นได้ ดูคำตอบของฉันสำหรับรายละเอียด
colan

11

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

สิ่งที่เกี่ยวข้องเป็นพิเศษคือเนื้อหาของ/usr/share/doc/mariadb-server-10.0/README.Debian.gzบน Ubuntu 16.04:

ในการติดตั้งใหม่ไม่มีการตั้งรหัสผ่านรูทและไม่มีการสร้างผู้ใช้ debian-sys-maint อีกต่อไป แต่บัญชีรูทของ MariaDB จะถูกตั้งค่าให้มีการรับรองความถูกต้องโดยใช้ซ็อกเก็ต unix เช่นการเรียกใช้ mysqld ด้วย root หรือผ่าน sudo จะทำให้ผู้ใช้เห็นพรอมต์ mysqld

คุณอาจไม่เคยลบ "root" ของผู้ใช้ mysql แม้ว่าจะไม่มีการตั้งรหัสผ่านปลั๊กอิน unix_auth ให้แน่ใจว่าสามารถเรียกใช้ในเครื่องในฐานะผู้ใช้รูทเท่านั้น

หนังสือรับรองใน /etc/mysql/debian.cnf ระบุผู้ใช้ที่สคริปต์เริ่มต้นใช้เพื่อหยุดเซิร์ฟเวอร์และดำเนินการล็อก สิ่งนี้เคยเป็นผู้ใช้ debian-sys-maint ซึ่งไม่ได้ใช้อีกต่อไปเนื่องจากรูทสามารถรันได้โดยตรง

ดังนั้นหากคุณปิดใช้งานปลั๊กอินนั้นสำหรับรูทและตั้งรหัสผ่านงาน cron รายวันจะแตกสลายเนื่องจากสมมติว่ามันจะล็อกอินเป็นรูทโดยไม่ต้องใช้รหัสผ่าน แต่ใช้ปลั๊กอิน

หลังจากนั้นมันก็บอกว่า:

สคริปต์ควรทำงานในฐานะผู้ใช้ที่มีสิทธิ์ที่จำเป็นและมีการระบุผ่าน unix_socket

ดังนั้นดูเหมือนว่าแอปพลิเคชันไม่ควรใช้รหัสผ่านอีกต่อไป


1
ฉันเพิ่งพบปัญหามากที่คุณอธิบาย: "So if you disable that plug-in for root and set a password, the daily cron job will break as it's assuming it will log in as root without a password..."ความหมายที่ไม่ชัดเจนของ UNIX_SOCKET Authentication Plugin กำลังถูกเปิดใช้งาน (ซึ่งตอนนี้เป็นค่าเริ่มต้น) คือความสามารถในการพิสูจน์ตัวตนในฐานะผู้ใช้ฐานข้อมูลรูทด้วยรหัสผ่านถูกปิดใช้งาน ไม่มีที่ไหนในmariadb.com/kb/en/mariadb/unix_socket-authentication-pluginนี่เป็นข้อ จำกัด ที่สำคัญ ดังนั้นจึงเป็นไปไม่ได้ที่จะเข้าสู่ระบบในฐานะ root เช่นผ่าน SSH
เบ็นจอห์นสัน

2

ฉันแก้ไขปัญหาตามคำตอบจากโพสต์นี้:

ไม่สามารถรีเซ็ตรหัสผ่าน root ของ MySQL (MariaDB)

หนึ่งจะต้องเปลี่ยนฟิลด์ปลั๊กอินของ mysql.user สำหรับทุกรูตเป็นสตริงว่าง


ปัญหานี้มีการอธิบายไว้ที่นี่: percona.com/blog/2016/03/16/…
antonu17

3
วิธีการนี้จะทำให้เกิดปัญหาในภายหลัง หากคุณปิดใช้งานปลั๊กอินงาน cron รายวันจะไม่ทำงานเนื่องจากสมมติว่าสามารถเข้าสู่ระบบด้วยปลั๊กอินนั้นได้ ดูคำตอบของฉันสำหรับรายละเอียด
colan

1

ฉันทำได้โดยใช้คำสั่งนี้ทันทีหลังการติดตั้ง:

$ sudo mysql_secure_installation

ในขั้นตอนแรกรหัสผ่านจะว่างเปล่าดังนั้นเพียงกด Enter


1
มันไม่ว่างเปล่าถ้าตั้งไว้แล้วซึ่ง pw ที่ฉันลืมคือ…ดังนั้นยังไม่สามารถเข้าสู่ระบบได้
Dave Everitt

0

ฉันมีปัญหาเดียวกันกับ raapberry pi พร้อมยืด โซลูชันของฉันคือการสร้างผู้ใช้ใหม่ด้วยสิทธิ์ทั้งหมดโดยทำสิ่งต่อไปนี้:

sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root

MariaDB [(none)]> use mysql
MariaDB [mysql]> FLUSH PRIVILEGES;
GRANT ALL privileges ON mysql.* TO 'admin'@'localhost' with grant option;

ตอนนี้ฉันสามารถเข้าสู่ระบบและให้เราผู้ใช้ "admin" เป็น superuser

ฉันหวังว่านี่จะช่วยใครซักคน


0

แค่ใช้sudo mysql -u root- แค่นั้นแหละ


รายละเอียด: รุ่นที่ใหม่กว่ารับรองความถูกต้องกับ mysql โดยใช้การตรวจสอบระบบ ดังนั้นถ้าคุณสามารถ sudo ไปยัง OS มันจะถือว่าคุณเป็น db db ด้วยเช่นกัน sudo mysql -u root -e "USE mysql; SELECT User, Host, plugin FROM mysql.user;"คุณสามารถยืนยันนี้โดยการออก คุณควรเห็นบางสิ่งเช่นนี้ (อาจเป็นauth_socketใน distros อื่น ๆ )

+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+

ฉันเข้าสู่ระบบในฐานะ root แต่สำหรับฉันคำสั่งนี้ยังต้องการรหัสผ่านรูทของ MariaDB …ซึ่งฉันลืม :-(
Dave Everitt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.