ฉันจะกู้คืนสิทธิ์เต็มของผู้ใช้รูทของ MySQL ได้อย่างไร


108

ฉันลบสิทธิ์บางอย่างออกจากผู้ใช้รูท MySQL โดยไม่ได้ตั้งใจรวมถึงความสามารถในการแก้ไขตาราง มีวิธีใดบ้างที่ฉันสามารถกู้คืนผู้ใช้รายนี้กลับสู่สถานะเดิม (พร้อมสิทธิ์ทั้งหมด)

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'

1
ข้อผิดพลาดที่สองดูเหมือนปัญหารหัสผ่าน อาจเป็นความผิดของฉันที่สมมติว่าคุณมีบัญชี 'root' @ 'localhost' อยู่แล้ว re-run mysqld กับ --skip-ทุนตารางและ "DROP USER 'ราก' @ 'localhost'; ให้สิทธิ์ทั้งหมดบน.เป็น 'ราก' @ '%';" แทน? วิธีที่ดีที่สุดในการค้นหาว่าบัญชีใดที่คุณควรให้สิทธิ์การเข้าถึงคือการเรียกใช้ "SELECT User, Host FROM mysql.user WHERE User = 'root';" ... ซึ่งจะให้ชื่อโฮสต์ที่ควรใช้หลังเครื่องหมาย @ สัญลักษณ์ในคำสั่ง GRANT
DMI

1
เป็นรูปแบบที่ไม่ดีสำหรับ mods ในการทำเครื่องหมายหัวข้อเป็นนอกหัวข้อเมื่อไม่ได้อยู่นอกหัวข้อยกเว้นว่าอาจมีไซต์ Stack Exchange อื่นที่เหมาะสมกว่าสำหรับหัวข้อซึ่งในกรณีนี้ควรระบุ (อัปยศกับ mods) นี่คือสิ่งที่อาจไป: dba.stackexchange.com
Jon Davis

^ ตกลงฉันโหวตให้เปิดอีกครั้ง ถ้ามันถูกปิดเนื่องจากการมีอยู่ของไซต์ DBA อย่างน้อยก็ควรได้รับการกล่าวถึงและ OP นำไปที่นั่น (หรืออาจปิดเนื่องจากซ้ำกับคำถามอื่นที่นี่)
แบ่งแยกไม่ได้

คำตอบ:


148

หากGRANT ALLไม่ได้ผลให้ลอง:

  1. หยุดmysqldและเริ่มต้นใหม่ด้วย--skip-grant-tablesตัวเลือก
  2. เชื่อมต่อกับmysqldเซิร์ฟเวอร์ด้วยเพียง: mysql(กล่าวคือไม่มี-pตัวเลือกและอาจไม่จำเป็นต้องใช้ชื่อผู้ใช้)
  3. ออกคำสั่งต่อไปนี้ในไคลเอนต์ mysql:

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

หลังจากนั้นคุณควรจะสามารถเรียกใช้GRANT ALL ON *.* TO 'root'@'localhost';และใช้งานได้


7
1. วิธีเชื่อมต่อกับเซิร์ฟเวอร์ mysqld ด้วย just: mysql 2. เมื่อฉันออก UPDATE mysql.user SET Grant_priv = '1' WHERE User = 'root'; สิทธิพิเศษในการล้าง ฉันได้รับ Query ok 0 แถวที่ได้รับผลกระทบ (0.00 วินาที) แถวที่ตรงกัน: 2 เปลี่ยน: 0 คำเตือน: 0 Query ok, 0 แถวที่ได้รับผลกระทบ (0.00 วินาที) เมื่อฉันลงชื่อเข้าใช้ phpMyAdmin ในฐานะผู้ใช้รูทฉันยังคงเห็น "ไม่มีสิทธิ์"
Steven

ขออภัยหลังจากทำตามขั้นตอนข้างต้นแล้วคุณจะสามารถเรียกใช้คำสั่ง GRANT ALL ได้ ในการเชื่อมต่อกับ mysqld ฉันหมายความว่าคุณไม่จำเป็นต้องใช้รหัสผ่าน - ฉันจำไม่ได้ว่าชื่อผู้ใช้ใดจะใช้ได้หรือไม่หรือต้องเป็น "รูท"
DMI

2
สิ่งนี้ใช้ไม่ได้ ดังที่สตีเวนกล่าวว่าการอัปเดตตารางผู้ใช้เอฟเฟกต์0 เรกคอร์ด ผู้ใช้รูทยังคงไม่สามารถให้สิทธิ์ได้
Cerin

1
ใช่มันได้ผล และหากคุณใช้ windows ให้เพิ่มskip-grant-tablesใน[mysqld]ส่วนของไฟล์การกำหนดค่า mysql ชั่วคราวเพื่อเข้าถึง mysql บนบรรทัดคำสั่งโดยไม่ต้องใช้รหัสผ่าน
markus

1
ฉันติดอยู่ที่ส่วน Grant (ซึ่งไม่ได้ผล) นานกว่า 9 ชั่วโมงและคำตอบของคุณช่วยฉันได้ ... คุณเป็นผู้ช่วยชีวิตขอบคุณมาก
Ali SH

91

หากคุณลบrootผู้ใช้โดยไม่ได้ตั้งใจคุณสามารถดำเนินการได้อย่างหนึ่ง:

  1. หยุดบริการ MySQL
  2. วิ่ง mysqld_safe --skip-grant-tables &
  3. พิมพ์mysql -u root -pและกด Enter
  4. ป้อนรหัสผ่านของคุณ
  5. ที่บรรทัดคำสั่ง mysql ให้ป้อน: use mysql;

จากนั้นดำเนินการค้นหานี้:

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

จากนั้นรีสตาร์ท mysqld

แก้ไข: 6 ตุลาคม 2561

ในกรณีที่ใครก็ตามต้องการคำตอบนี้ฉันได้ลองใช้วันนี้โดยใช้innodb_version 5.6.36-82.0และ10.1.24-MariaDBและจะใช้งานได้ถ้าคุณลบ BACKTICKS (ไม่มีเครื่องหมายคำพูดเดียวเพียงแค่ลบออก):

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

1
@Bipin แปลกมีเพียงmysqld.exeในโฟลเดอร์ไม่bin mysqld_safe.exe"mysqld_safe" หมายความว่าอย่างไร
Pacerier

4
สำหรับ MySQL 5.5 คุณต้องมี privs เพิ่มอีกสองตัวคือ Event_priv และ Trigger_priv
Greg Bell

ฉันนึกภาพนี้แตกใน 5.6.5
Otheus

1
@Pacerier - ตามโพสต์นี้คุณไม่ต้องการจริงๆmysqld_safeเพียงแค่เรียกใช้ไบนารี mysqld ปกติ:mysqld.exe --skip-grant-tables
bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber

24

ฉันยังลบสิทธิ์ของรูทและฐานข้อมูลที่ไม่แสดงในคอนโซล mysql เมื่อฉันเป็นผู้ใช้รูทดังนั้นจึงเปลี่ยนผู้ใช้ mysql>mysql -u 'userName' -p;และรหัสผ่าน

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

หลังจากคำสั่งนี้ทุกอย่างจะแสดงฐานข้อมูลในรูท

ขอบคุณ


1
ฉันต้องทำหลายอย่างรวมกัน ฉันจะต้องหยุดให้บริการ mysqld แล้วเรียก mysqld_safe --skip-crant ตารางและแล้วคำสั่ง UPDATE ข้างต้นแล้ว MySQL เริ่มต้นทำงานแล้ว GRANT ALL ON ถึง 'user' @ 'localhost';
Nick Woodhams

5

ฉันปฏิเสธสิทธิ์การแทรกและโหลดซ้ำเพื่อรูท ดังนั้นหลังจากอัปเดตสิทธิ์แล้ว FLUSH PRIVILEGES ไม่ทำงาน (เนื่องจากไม่มีสิทธิ์ในการโหลดซ้ำ) ดังนั้นฉันจึงใช้ผู้ใช้ debian-sys-maint บน Ubuntu 16.04 เพื่อกู้คืนสิทธิ์ของ user.root คุณสามารถค้นหารหัสผ่านของ user.debian-sys-maint จากไฟล์นี้

sudo cat /etc/mysql/debian.cnf

คุณช่วยฉัน! GRANT ไม่ทำงานทั้งในโหมด --skip-grant-tables ดังนั้นการเข้าสู่ระบบ ubuntu ทำให้ฉันสามารถสร้างผู้ใช้รูทของฉันได้อีกครั้งและกว่าที่ฉันจะอัปเดตสิทธิ์ทั้งหมดได้
lunix15

4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

เพียงเข้าสู่ระบบจากรูทโดยใช้รหัสผ่านที่เกี่ยวข้องหากมีและเรียกใช้คำสั่งด้านบนกับสิ่งที่ผู้ใช้เป็น

ตัวอย่างเช่น:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
แต่ถ้าผู้ใช้ 'root' สูญเสียสิทธิส่วนบุคคลแล้วจะทำงานได้อย่างไรผู้ใช้ root ไม่จำเป็นต้องมีสิทธิ์ระดับสูงในการทำสิ่งนี้หรือไม่? สิ่งนี้ไม่ได้ผลสำหรับฉัน
Terungwa


2

หากคุณใช้ WAMP บนคอมพิวเตอร์ในระบบของคุณ (mysql เวอร์ชัน 5.7.14) ขั้นตอนที่ 1: เปิดไฟล์ my.ini ขั้นตอนที่ 2: ยกเลิกการแสดงความคิดเห็นในบรรทัดนี้ 'ข้ามการให้สิทธิ์ตาราง' โดยการลบเซมิโคลอนขั้นตอนที่ 3: รีสตาร์ท mysql เซิร์ฟเวอร์ขั้นตอนที่ 4: เปิดคอนโซล mySQL ขั้นตอนที่ 5:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

ขั้นตอนที่ 6: แก้ไขปัญหา !!!!

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