Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

กู้คืนสิทธิ์ Root User ใน MySQL (Full Privileges)

เมื่อ Root User หายสิทธิ์ (มักจาก REVOKE ผิด หรือ Upgrade Version) ให้ทำตามขั้นตอน Skip Grant Tables

ขั้นตอนการกู้คืนสิทธิ์ Root

1. หยุด MySQL Service

# Linux
sudo systemctl stop mysqld

# Windows (Admin)
net stop mysql80

2. Start MySQL ด้วย --skip-grant-tables

# Linux (Background)
sudo mysqld_safe --skip-grant-tables --skip-networking &

# Windows
mysqld --skip-grant-tables --skip-networking

--skip-networking ป้องกัน Remote Connection ระหว่าง Recovery

3. เข้า MySQL ไม่ต้อง Password

mysql -u root

4. Flush Privileges ก่อน (จำเป็นในบาง Version)

FLUSH PRIVILEGES;

5. กู้คืนสิทธิ์ Root

USE mysql;

-- MySQL 8.0+
UPDATE user SET 
    Grant_priv = 'Y',
    Super_priv = 'Y',
    Select_priv = 'Y',
    Insert_priv = 'Y',
    Update_priv = 'Y',
    Delete_priv = 'Y',
    Create_priv = 'Y',
    Drop_priv = 'Y',
    Reload_priv = 'Y',
    Shutdown_priv = 'Y',
    Process_priv = 'Y',
    File_priv = 'Y',
    References_priv = 'Y',
    Index_priv = 'Y',
    Alter_priv = 'Y',
    Show_db_priv = 'Y',
    Create_tmp_table_priv = 'Y',
    Lock_tables_priv = 'Y',
    Execute_priv = 'Y',
    Repl_slave_priv = 'Y',
    Repl_client_priv = 'Y',
    Create_view_priv = 'Y',
    Show_view_priv = 'Y',
    Create_routine_priv = 'Y',
    Alter_routine_priv = 'Y',
    Create_user_priv = 'Y',
    Event_priv = 'Y',
    Trigger_priv = 'Y',
    Create_tablespace_priv = 'Y',
    Create_role_priv = 'Y',
    Drop_role_priv = 'Y',
    Password_reuse_history = 0,
    Password_reuse_time = 0,
    Account_locked = 'N'
WHERE User = 'root' AND Host = 'localhost';

-- MySQL 5.7 (Columns น้อยกว่า)
UPDATE user SET 
    Grant_priv = 'Y', Super_priv = 'Y', 
    Select_priv = 'Y', Insert_priv = 'Y', Update_priv = 'Y', Delete_priv = 'Y',
    Create_priv = 'Y', Drop_priv = 'Y', Reload_priv = 'Y', Shutdown_priv = 'Y',
    Process_priv = 'Y', File_priv = 'Y', References_priv = 'Y', Index_priv = 'Y',
    Alter_priv = 'Y', Show_db_priv = 'Y', Create_tmp_table_priv = 'Y',
    Lock_tables_priv = 'Y', Execute_priv = 'Y', Repl_slave_priv = 'Y',
    Repl_client_priv = 'Y', Create_view_priv = 'Y', Show_view_priv = 'Y',
    Create_routine_priv = 'Y', Alter_routine_priv = 'Y', Create_user_priv = 'Y',
    Event_priv = 'Y', Trigger_priv = 'Y'
WHERE User = 'root' AND Host = 'localhost';

FLUSH PRIVILEGES;

6. Restart MySQL ปกติ

# Linux
sudo systemctl restart mysqld

# Windows
net stop mysql80 && net start mysql80

วิธีที่ง่ายกว่า (MySQL 8.0+): ใช้ GRANT

ถ้าเข้าได้ด้วย User ที่มี SUPER:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Dynamic Privileges (MySQL 8.0+) - ใช้แทน SUPER

GRANT 
    SYSTEM_VARIABLES_ADMIN,
    SESSION_VARIABLES_ADMIN,
    CONNECTION_ADMIN,
    REPLICATION_SLAVE_ADMIN,
    REPLICATION_CLIENT_ADMIN,
    BACKUP_ADMIN,
    CLONE_ADMIN,
    GROUP_REPLICATION_ADMIN,
    RESOURCE_GROUP_ADMIN,
    RESOURCE_GROUP_USER,
    ROLE_ADMIN,
    SERVICE_CONNECTION_ADMIN,
    SET_USER_ID,
    VERSION_TOKEN_ADMIN,
    XA_RECOVER_ADMIN
ON *.* TO 'root'@'localhost' WITH GRANT OPTION;

ตรวจสอบสิทธิ์

SHOW GRANTS FOR 'root'@'localhost';
-- ควรเห็น GRANT ALL PRIVILEGES ... WITH GRANT OPTION

⚠️ ป้องกันไม่ให้เกิดซ้ำ

  • อย่า REVOKE Root Privileges
  • สร้าง Admin User แยกสำหรับ Daily Operations
  • Backup mysql Database เป็นประจำ
  • Document การเปลี่ยนแปลง Privileges