MySQL에서 특정 사용자가 지정된 스키마(데이터베이스)에 접근하지 못하도록 하려면 mysql.db 권한 테이블에서 해당 권한 행을 삭제하면 됩니다. 이때 DELETE 명령어를 사용합니다.
기본 문법
특정 스키마에 대한 사용자 접근을 차단하는 기본 문법은 다음과 같습니다.
DELETE FROM mysql.db WHERE Db IN("스키마명", "스키마명\_%")
AND User = "사용자명" AND Host = "호스트명";여기서 "스키마명\_%" 조건은 해당 이름으로 시작하는 모든 데이터베이스까지 함께 차단하기 위해 포함됩니다.
실전 예제
먼저 mysql.user 테이블을 조회하여 현재 등록된 사용자와 호스트 목록을 확인해 보겠습니다.
mysql> SELECT user, host FROM mysql.user;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------------------+-----------+
| user | host |
+------------------+-----------+
| Bob | % |
| User2 | % |
| mysql.infoschema | % |
| mysql.session | % |
| mysql.sys | % |
| root | % |
| @UserName@ | localhost |
| Adam Smith | localhost |
| Chris | localhost |
| David | localhost |
| James | localhost |
| John | localhost |
| John Doe | localhost |
| User1 | localhost |
| am | localhost |
| hbstudent | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
+------------------+-----------+
18 rows in set (0.00 sec)
사용자 'Chris'의 'sample' 스키마 접근 차단하기
이제 호스트가 localhost인 사용자 'Chris'가 sample이라는 이름의 스키마에 접근하지 못하도록 설정해 보겠습니다.
mysql> DELETE FROM mysql.db WHERE Db IN("sample","sample\_%") AND User="Chris" AND Host="localhost";
Query OK, 0 rows affected (0.00 sec)권한 변경 사항 적용하기
쿼리 실행 후에는 반드시 FLUSH PRIVILEGES 명령을 실행하여 변경된 권한 정보를 즉시 메모리에 반영해야 합니다.
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.06 sec)
참고: REVOKE 문 활용하기
mysql.db 테이블을 직접 수정하는 방식 외에도, MySQL에서 공식적으로 권장하는 방법은 REVOKE 문을 사용하는 것입니다.
mysql> REVOKE ALL PRIVILEGES ON sample.* FROM 'Chris'@'localhost';
mysql> FLUSH PRIVILEGES;
REVOKE 방식은 권한 시스템 테이블을 안전하게 갱신해 주므로, 실무 환경에서는 이 방법을 우선적으로 고려하는 것이 좋습니다. 다만 두 방법 모두 실행 후에는 FLUSH PRIVILEGES로 변경 사항을 적용해야 한다는 점을 잊지 마세요.