MySQL의 계정에 권한을 부여하기 위해 GRANT 명령을 사용합니다. GRANT 명령은 MYSQL 5.x와 MYSQL 8.x 버전 간에 약간의 차이가 있습니다. 작성된 내용은 버전 8을 기준으로 작성되었으며, 버전 5와의 차이점도 함께 살펴보도록 하겠습니다.
승인하다
기본 구문
GRANT privilege_type ON database_name.table_name TO 'username'@'host';
각 위치에서 이 명령이 의미하는 바를 이해하고 작성해야 합니다. 그렇게 하면 너무 많은 권한을 부여하는 것을 경계할 수 있습니다.
- 권한 유형 : 사용자에게 부여할 권한 유형입니다. 이 위치는 SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALL 등이 될 수 있습니다.
- 데이터베이스_이름.테이블_이름 : 권한을 부여할 데이터베이스와 테이블을 나타냅니다. 예를 들어 TESTDB라는 데이터베이스에 TEST_TABLE이라는 테이블을 지정하면 TESTDB.TEST_TABLE 을 작성할 수 있습니다.
- 사용자 이름, 호스트 : 권한을 부여할 사용자와 호스트를 나타냅니다.
예)
GRANT ALL PRIVILEGES ON mydb.* TO 'john'@'%';
- 모든 권한 : SELECT, INSERT, UPDATE, DELETE, CREATE, DROP 등 모든 권한을 부여합니다.
- mydb.* : 테이블 이름 대신 *를 사용하면 모든 테이블에 대한 권한을 부여한다는 의미입니다.
- ‘남자’ : john이라는 사용자에게 권한을 부여합니다.
- @ : 구분 기호입니다.
- ‘%’ : 이는 모든 클라이언트 호스트에서 계정에 액세스할 수 있음을 의미합니다. 사용자 john은 로컬 및 원격 컴퓨터 모두에서 mydb 데이터베이스에 액세스할 수 있습니다. 클라이언트 호스트 대신 ‘localhost’ 또는 ‘127.0.0.1’이 표시되는 경우 로컬 호스트에서만 접속이 가능하거나 ‘192.168.1.100’과 같이 특정 IP에서만 접속되도록 설정할 수 있습니다.
권한 부여를 사용하는 mysql 버전 5와 버전 8의 차이점
MySQL 5에서는 사용자 생성과 권한 부여를 동시에 수행할 수 있습니다.
GRANT privilege_type ON database_name.table_name TO 'user'@'host' IDENTIFIED BY 'password';
반면 MySQL 8에서는 사용자 생성과 권한 부여가 별도로 이루어져야 한다. 먼저 CREATE USER 문을 사용하여 사용자를 생성한 다음 GRANT 문을 사용하여 권한을 부여합니다.
1. 먼저 사용자를 생성합니다.
CREATE USER 'user'@'host' IDENTIFIED BY 'password';
2. 권한을 부여합니다.
GRANT privilege_type ON database_name.table_name TO 'user'@'host';
오류) root 계정에 권한 부여 권한이 없는 경우
권한 부여를 시도하더라도 아래와 같이 권한이 없다는 오류가 발생할 수 있습니다.
mysql> grant all on *.* to 'root'@'%';
ERROR 1410 (42000): You are not allowed to create a user with GRANT
이 경우 루트 계정을 다시 생성하고 그랜트 옵션을 부여합니다.
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root123!@#';
Query OK, 0 rows affected (0.04 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
FLUSH PRIVILEGES를 실행해야 합니까?
FLUSH PRIVILEGES 명령은 MySQL 서버에서 캐시된 자격 증명을 다시 로드하고 업데이트된 자격 증명을 적용하는 데 사용됩니다. 따라서 권한 정보를 변경하면 FLUSH PRIVILEGES 명령을 실행하게 됩니다.
하지만 MYSQL 5.7부터는 새로운 권한 정보가 바로 적용되기 때문에 이전 버전처럼 FLUSH PRIVILEGES 명령어를 실행할 필요가 없다. 그러나 FLUSH PRIVILEGES를 명시적으로 실행하는 것이 여전히 권장됩니다.
