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


35

วันนี้ฉันต้องการสร้างฐานข้อมูลใน PMA มันกล่าวว่า: "ไม่สามารถเข้าสู่เซิร์ฟเวอร์ MySQL" ฉันลองผ่านเทอร์มินัลปัญหาเดียวกันและเป็นเพราะรหัสผ่านของฉันผิด และฉันไม่เข้าใจว่าทำไม

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

ดูว่า:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

คำตอบ:


56

ฉันได้พบวิธีแก้ไขปัญหาที่แปลกเหมือนปัญหาตัวเอง

รีบูต MySQL / MariaDB โดยใช้--skip-grant-tables(ค้นหาบทเรียนบนเว็บ) (ไม่จำเป็นเลยอ่านการแก้ไขของฉันตอนท้ายโพสต์)

ดูpluginข้อมูลในmysql.userตาราง:

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

ฉันต้องรีเซ็ตฟิลด์ปลั๊กอินของแต่ละรายการเป็นสตริงว่าง

UPDATE user SET plugin="";   // without WHERE clause

นอกจากนี้ตรวจสอบให้แน่ใจว่ามีการกำหนดรหัสผ่านเพราะบางครั้งดูเหมือนว่าจะถูกลบ (เลือกในuser, passwordฟิลด์) หากไม่อัปเดตด้วย:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

ต้องบันทึกพารามิเตอร์ของสิทธิ์อย่างชัดเจน:

FLUSH PRIVILEGES;

จากนั้นรีสตาร์ท MySQL ในโหมดปกติและคุณควรจะสามารถเชื่อมต่อกับบัญชีรูทได้

สิ่งนี้จะไม่จำเป็นต้องปิดการเชื่อมต่อผ่านซ็อกเก็ต Unix หลังจาก MySQL va ของฉันได้รับการซ่อมแซมใน PMA ฉันจะเห็นว่าการเชื่อมต่อนั้นถูกสร้างขึ้นผ่านซ็อกเก็ต Unix

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

นี่เป็นผลข้างเคียงที่ดีที่เมื่อเกิดขึ้นคุณสามารถเข้าสู่เซิร์ฟเวอร์ SQL โดยไม่ต้องรีสตาร์ท MariaDB ด้วย--skip-grant-tables: เพียงลงชื่อเข้าใช้บัญชีรูทของระบบจากนั้นเชื่อมต่อmysql -u rootโดยไม่ใช้รหัสผ่านจากนั้นรีเซ็ตฟิลด์ปลั๊กอินใน วิธีที่อธิบายไว้ข้างต้น

แก้ไข 2:ยืนยันว่ามันเกิดขึ้นกับการอัพเกรด MariaDB แต่ละครั้งบน Ubuntu


1
สิ่งนี้จะแบ่งงาน cron การบำรุงรักษาบน Ubuntu 16.04 (อย่างน้อย) เนื่องจากสคริปต์นั้นคาดว่าจะเข้าสู่ระบบโดยไม่ต้องใช้รหัสผ่านโดยใช้ปลั๊กอินซ็อกเก็ต ดูsuperuser.com/questions/957708/…สำหรับรายละเอียด
colan

โอเคน่าสนใจ แต่สิ่งนี้ไม่ได้เกิดขึ้นอีกต่อไป (การตั้งค่ารหัสผ่านแบบดั้งเดิมของฉันไม่ได้ทำลายแบบสุ่ม) บางทีปลั๊กอินซ็อกเก็ต Unix อาจถูกตั้งค่าไว้ที่ผู้ใช้รูทเท่านั้น ไม่สามารถตรวจสอบได้ในขณะนี้ แต่ฉันไม่ชอบความคิดที่ว่าระบบปฏิบัติการตัดสินใจให้ฉันตั้งค่าการตรวจสอบสิทธิ์ที่จะใช้
Morgan Touverey Quilling

ปัญหานี้แย่มากมันเกิดขึ้นใน Debian 9 ไม่มีการถามรหัสผ่านรูทเมื่อฉันติดตั้ง MariaDB และฉันไม่สามารถรีเซ็ตได้ ฉันหวังว่ามันจะไม่เกิดขึ้นอีกหลังจากอัพเกรด เราควรแทนที่ MariaDB ด้วย MySQL เพื่อหลีกเลี่ยงปัญหาดังกล่าวหรือไม่?
baptx

ไม่แน่ใจว่ามันยังคงเกิดขึ้นมันอาจได้รับการแก้ไขแล้ว (ฉันสามารถแก้ไขโพสต์ได้ถ้าใครรู้) อาจเกิดขึ้นเฉพาะในการติดตั้งซึ่งจะเป็นการตั้งค่าเริ่มต้นที่ดี
Morgan Touverey Quilling

1
ผมเพิ่งสังเกตเห็นว่าถ้าเราไม่ได้ใช้ซ็อกเก็ตยูนิกซ์ปลั๊กอินสำหรับผู้ใช้รากมันจะล้มเหลวในการติดตั้งแพคเกจ phpMyAdmin ล่าสุด ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)Debian: ดังนั้นทางออกที่ดีที่สุดคือการใช้การพิสูจน์ตัวตนซ็อกเก็ตยูนิกซ์เริ่มต้นพร้อมกับคำสั่งsudo mysql -u rootซึ่งฉันคิดว่ามันปลอดภัยและมีประสิทธิภาพมากกว่า
baptx

5

จากคำตอบนี้http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227

Mysql พยายามตรวจสอบสิทธิ์ root โดยใช้ปลั๊กอินไม่ใช่รหัสผ่าน คุณต้องปิดการใช้งานปลั๊กอินสำหรับรูท

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
นั่นคือสิ่งที่ฉันโพสต์เป็นคำตอบ
Morgan Touverey Quilling

1
เป็นการสรุปที่สั้นกว่าเล็กน้อยเมื่อใช้การอัปเดตของคุณ
ม้า

ฉันไม่สามารถรับกระสุน mysql ได้ดังนั้นนี่จะไม่ทำงานในกรณีของฉันแม้ว่าฉันจะเห็นCould not open mysql.plugin table.ในบันทึกข้อผิดพลาด
Dave Everitt

0

เชื่อมต่อตามที่อธิบายไว้ก่อนหน้า:

mysqld_safe --skip-grant-tables

ไฟล์บันทึกจะแสดง:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

ค้นหาบันทึกการแสดงรายการ (ในกรณีนี้: /usr/local/mysql/data/ab123456.domain.com.err) สำหรับซ็อกเก็ตที่เหมาะสม:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

และใช้ในการเชื่อมต่อ mysql:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server

ฉันเพิ่งได้รับ$ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/varแต่ฉันเพิ่งถูกโยนกลับไปที่พรอมต์ทุบตี
Dave Everitt

0

โดยค่าเริ่มต้น marriadb ใช้ปลั๊กอินการรับรองความถูกต้อง "unix_socket" เพื่อตั้งรหัสผ่านนี้ควรเป็น "mysql_native_password" ดังนั้น

สลับฐานข้อมูล ..

use mydatabase;

ครั้งแรกที่เห็นการตั้งค่าปลั๊กอินแม่มด ..

SELECT user, plugin FROM user;

ตั้งค่าเป็น "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

ตั้งรหัสผ่านใหม่ ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.