본문 바로가기

DB & Storage & Stream/Mysql, MariaDB

[Database/MySQL, MariaDB] 사용자 권한 부여(grant), ERROR 1045 (28000): Access denied for user 해결법

MySQL을 처음 설치하고나서 MySQL 서버에 연결하면 다음과 같은 오류가 발생합니다. 

$ mysql -u [사용자] -p
Enter password: 
> ERROR 1045 (28000): Access denied for user '사용자'@'호스트' (using password: YES)

사용자 계정 또는 비밀번호를 잘못 입력했을 때 발생할 수 있는 오류이지만, 다시 입력해봐도 똑같은 오류가 반복됩니다. MySQL을 처음 접하는 사용자가 유저 권한에 대한 이해가 바탕이 되어있지 않을 때 마주칠 수 밖에 없는 오류입니다.

사용자 권한

MySQL은 각 사용자 계정에 대해서 데이터베이스 및 테이블에 대한 접근 권한을 부여합니다. 또한 Select, Insert, Update, Delete, Create 등에 대한 쿼리 권한도 지정할 수 있습니다. 사용자 계정은 mysql 데이터베이스에서 user 테이블에 저장 및 관리됩니다.

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> desc user;
+------------------------+---------------------+------+-----+----------+-------+
| Field                  | Type                | Null | Key | Default  | Extra |
+------------------------+---------------------+------+-----+----------+-------+
| Host                   | char(255)           | NO   |     |          |       |
| User                   | char(128)           | NO   |     |          |       |
| Password               | longtext            | YES  |     | NULL     |       |
| Select_priv            | varchar(1)          | YES  |     | NULL     |       |
| Insert_priv            | varchar(1)          | YES  |     | NULL     |       |
| Update_priv            | varchar(1)          | YES  |     | NULL     |       |
| Delete_priv            | varchar(1)          | YES  |     | NULL     |       |
| Create_priv            | varchar(1)          | YES  |     | NULL     |       |
(... 중략 ...)
+------------------------+---------------------+------+-----+----------+-------+

사용자 권한 부여

서비스 환경에 따라서 다양한 권한을 부여할 수 있지만 이번 포스트에서는 "ERROR 1045 (28000): Access denied for user" 오류를 해결하기 위한 방법을 제시합니다.

우선 MySQL이 설치된 로컬 호스트에서 MySQL 서버에 연결합니다. 이때 연결할 수 있는 계정은 루트 사용자(root)입니다.

$ mysql -u root

설치 과정에서 MySQL 환경 설정에서 루트 사용자의 비밀번호를 수정하였다면 다음과 같이 연결합니다.

$ mysql -u root -p

MySQL 서버에 연결되면 mysql 데이터베이스를 선택합니다.

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

그다음 원하는 사용자 계정에게 모든 권한을 부여합니다.

MariaDB [mysql]> grant all privileges on *.* to '사용자'@'호스트' identified by '비밀번호';
Query OK, 0 rows affected (0.028 sec)

로컬 호스트에 대한 접속을 허용하려면 호스트에 루프백 주소를 입력해야 합니다.

  • localhost
  • 127.0.0.1

만약 모든 로컬 및 원격 주소를 통해 접속을 허용하려면 호스트에 다음(%)과 같이 입력합니다.

MariaDB [mysql]> grant all privileges on *.* to '사용자'@'%' identified by '비밀번호';
Query OK, 0 rows affected (0.028 sec)

사용자 권한을 수정했다면 반드시 flush privileges;를 실행하여 변경 사항을 적용합니다.

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.001 sec)