เมื่อ 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
mysqlDatabase เป็นประจำ - Document การเปลี่ยนแปลง Privileges