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