오류 1396(HY000)이 발생하는 이유
MySQL에서 ERROR 1396 (HY000): Operation DROP USER failed 오류는 사용자 계정을 생성할 때 호스트를 '%'(모든 호스트 허용)로 지정했는데, 삭제할 때는 'localhost'로 지정하는 경우 발생합니다.
MySQL은 사용자를 '사용자 이름 + 호스트' 조합으로 식별하기 때문에, 'Jack'@'%'으로 생성된 계정과 'Jack'@'localhost'는 서로 다른 별개의 계정으로 취급됩니다. 따라서 존재하지 않는 계정을 삭제하려고 하면 위와 같은 오류가 나타나는 것입니다.
오류 재현: '%'로 사용자 생성 후 localhost로 삭제 시도
1단계. '%' 호스트로 사용자 생성하기
먼저 아래 문법을 사용하여 호스트가 '%'인 사용자를 생성해 보겠습니다.
CREATE USER 'yourUserName'@'%' IDENTIFIED BY 'yourPassword';
위 문법을 실제로 적용한 쿼리는 다음과 같습니다.
mysql> CREATE USER 'Jack'@'%' IDENTIFIED BY '1234'; Query OK, 0 rows affected (0.26 sec)
2단계. 사용자 생성 여부 확인하기
사용자가 정상적으로 생성되었는지 확인하려면 아래 쿼리를 실행합니다.
mysql> select user,host from MySQL.user;
실행 결과는 다음과 같습니다.
+------------------+-----------+ | user | host | +------------------+-----------+ | Jack | % | | Manish | % | | User2 | % | | mysql.infoschema | % | | mysql.session | % | | mysql.sys | % | | root | % | | Adam Smith | localhost | | User1 | localhost | | am | localhost | +------------------+-----------+ 10 rows in set (0.00 sec)
출력 결과를 보면 사용자 이름이 'Jack'이고 호스트가 '%'인 계정이 생성된 것을 확인할 수 있습니다.
3단계. localhost로 삭제 시도 시 오류 발생
이 상태에서 호스트를 'localhost'로 지정하여 해당 사용자를 삭제하려고 하면 다음과 같은 오류가 발생합니다.
mysql> DROP USER 'Jack'@'localhost'; ERROR 1396 (HY000): Operation DROP USER failed for 'Jack'@'localhost'
이는 'Jack'@'localhost'라는 계정이 애초에 존재하지 않기 때문입니다. 실제로 존재하는 계정은 'Jack'@'%'입니다.
올바른 해결 방법: 정확한 호스트 값으로 삭제하기
오류를 해결하려면 사용자를 생성할 때 지정했던 호스트 값('%')을 그대로 사용하여 삭제해야 합니다.
mysql> DROP USER 'Jack'@'%'; Query OK, 0 rows affected (0.19 sec)
삭제 결과 확인하기
사용자가 MySQL.user 테이블에서 실제로 제거되었는지 다시 한번 확인해 보겠습니다.
mysql> select user,host from MySQL.user;
아래 출력 결과에서 사용자 Jack이 성공적으로 삭제된 것을 확인할 수 있습니다.
+------------------+-----------+ | user | host | +------------------+-----------+ | Manish | % | | User2 | % | | mysql.infoschema | % | | mysql.session | % | | mysql.sys | % | | root | % | | Adam Smith | localhost | | User1 | localhost | | am | localhost | +------------------+-----------+ 9 rows in set (0.00 sec)
핵심 정리 및 추가 팁
- 원인: MySQL에서 사용자 계정은 '사용자 이름@호스트' 조합으로 구분됩니다.
'%'로 생성한 계정을'localhost'로 삭제하면 존재하지 않는 계정을 삭제하는 것이 되어 오류 1396이 발생합니다. - 해결:
DROP USER실행 시 계정을 생성할 때 사용한 것과 동일한 호스트 값을 지정해야 합니다. - 확인 방법: 삭제 전에
SELECT user, host FROM mysql.user;쿼리로 실제 등록된 계정의 호스트 값을 먼저 확인하는 것이 좋습니다. - 참고: 만약 두 호스트 모두에 동일한 이름의 계정이 존재한다면, 각각 별도로 삭제해야 하며, 필요하다면
DROP USER 'Jack'@'%', 'Jack'@'localhost';처럼 한 번에 여러 계정을 삭제할 수도 있습니다.