MySQL에서 특정 사용자에게 SUPER 권한을 부여하려면 권한 시스템 테이블의 구조를 먼저 이해하는 것이 좋습니다. 이 글에서는 DESC 명령어로 권한 테이블을 확인하고, UPDATE 문과 GRANT 문을 사용해 슈퍼 권한을 추가하는 방법을 단계별로 살펴보겠습니다.
1단계: mysql.db 테이블 구조 확인하기
먼저 DESC 명령어를 사용하여 MySQL 데이터베이스의 권한 관련 테이블 구조를 확인합니다.
mysql>DESC mysql.db;
실행 결과는 다음과 같습니다.
+-----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
+-----------------------+---------------+------+-----+---------+-------+
22 rows in set (0.06 sec)
2단계: UPDATE 문으로 SUPER 권한 설정하기
이제 UPDATE 쿼리를 사용하여 특정 사용자에게 슈퍼 권한을 직접 부여할 수 있습니다. 아래 예시는 'Manish' 사용자에게 Super_Priv 값을 'Y'로 변경하는 쿼리입니다.
mysql> UPDATE mysql.user SET Super_Priv='Y' WHERE user='Manish' AND host='%'; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0
3단계: mysql.user 테이블 구조 확인하기
DESC 명령어로 mysql.user 테이블의 전체 구조를 조회하면 다양한 권한 컬럼들을 확인할 수 있습니다.
mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | NO | | caching_sha2_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint(5) unsigned | YES | | NULL | |
| account_locked | enum('N','Y') | NO | | N | |
| Create_role_priv | enum('N','Y') | NO | | N | |
| Drop_role_priv | enum('N','Y') | NO | | N | |
| Password_reuse_history | smallint(5) unsigned | YES | | NULL | |
| Password_reuse_time | smallint(5) unsigned | YES | | NULL | |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
49 rows in set (0.01 sec)
위 테이블에서 Super_priv 컬럼을 통해 부여된 권한을 쉽게 확인할 수 있습니다.
4단계: GRANT 문으로 SUPER 권한 부여하기
MySQL 데이터베이스에 슈퍼 권한을 추가하는 공식적인 방법은 GRANT 문을 사용하는 것입니다. 기본 문법은 다음과 같습니다.
mysql> GRANT SUPER ON *.* TO user@'localhost' IDENTIFIED BY 'passwordName';
*.*는 모든 데이터베이스와 모든 테이블에 대한 권한을 의미하며, SUPER 권한은 전역(global) 권한이므로 반드시 *.*와 함께 사용해야 합니다.
5단계: 권한 새로고침하기
위 쿼리를 실행한 후에는 반드시 아래 명령어로 권한 테이블을 다시 로드해야 변경 사항이 즉시 적용됩니다.
FLUSH PRIVILEGES;
이 명령어는 메모리에 캐시된 권한 정보를 갱신하여, 새로 부여된 SUPER 권한이 바로 적용되도록 합니다. 이로써 MySQL에서 사용자에게 슈퍼 권한을 추가하는 과정이 완료되었습니다.