MySQL ERROR 1698 (28000): 에러 해결


WSL 2를 설치하고 우분투 20 에 MySQL 을 깔았는데 root 계정으로는 MySQL root 로 연결이 가능한데 일반 사용자로는 다음 에러를 내며 연결이 되지 않았습니다.

ERROR 1698 (28000): Access denied for user 'root'@'localhost'


구글링해보니 MySQL root 는 인증 방식을 Local 에 있는 Unix Domain socket 으로 하기때문에 root 권한이 있어야만 연결이 가능하다고 합니다.


운영 서버는 저런 정책을 갖는게 맞겠지만 로컬이나 개발용은 불편하니 다음 방법으로 인증 방식을 변경하면 됩니다.


  1. root 사용자로 mysql 에 연결합니다.

    sudo mysql -u root -p mysql
  2. 사용자별 Auth plugin 을 조회합니다. 

    인증 플러그인 조회
    SELECT User, Host, plugin FROM mysql.user;
    +------------------+-----------+-----------------------+
    | User             | Host      | plugin                |
    +------------------+-----------+-----------------------+
    | debian-sys-maint | localhost | caching_sha2_password |
    | mysql.infoschema | localhost | caching_sha2_password |
    | mysql.session    | localhost | caching_sha2_password |
    | mysql.sys        | localhost | caching_sha2_password |
    | root             | localhost | auth_socket           |
    +------------------+-----------+-----------------------+
  3. root 사용자는 auth_socket 인증 방식을 사용하는 것을 볼 수 있습니다. 이것을 caching_sha2_password 방식으로 변경합니다.

    UPDATE user SET plugin='caching_sha2_password' WHERE User='root';

    예전 버전은 auth plugin 이 mysql_native_password 방식일 수 있으며 그럴 경우 아래 쿼리와 같이 mysql_native_password 로  설정하세요. 잘못 설정할 경우 root 로도 로그인이 불가능합니다.

    UPDATE user SET plugin='mysql_native_password' WHERE User='root';
  4. root 암호가 설정되지 않았다면 설정해 줍니다.

     SET PASSWORD FOR 'root'@'localhost' = 'qwert123';
  5. 변경된 정책을 반영해 줍니다.

    FLUSH PRIVILEGES;
  6. 정책 변경이므로 MySQL 을 재구동합니다.

    sudo systemctl restart mysqld
  7. 이제 일반 사용자로 MySQL root 권한으로 연결되는지 확인합니다.

     mysql -u root -p mysql

같이 보기

Ref