[RHEL, MariaDB] Access denied for user ‘root’@’localhost’ 해결하기
카테고리: Linux(RHEL, Ubuntu)
문제 상황
기존에 있던 시스템에 MariaDB를 세팅하여 제작해두었던 프로젝트를 실행하려고 하니 아래와 같은 오류를 출력하였다.
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
문제 확인
MariaDB는 복잡한 시스템이라, 해결하기 이전에 문제가 정확히 무엇인지 확인하는 과정이 중요하다.
Root 권한으로 접속해보기
처음해야할 것은 Root 권한으로 터미널에서 접속해보는 것이다.
mysql -uroot -p
여기서 접속조차 안된다면 무언가 단단히 잘못된 것이다. 재설치하는 것이 정신에 이롭다.
MariaDB 계정 확인하기
MariaDB에 등록된 계정을 확인하는 방법은 간단하다. 아래의 SQL문을 실행하면 된다.
use mysql;
select host, user, password, plugin from user;
Plugin 문제
외부에서 접속하려면 plugin 부분이 mysql_native_password
로 되어있어야 한다. 설치과정에서 Switch to unix_socket authentication
옵션에 Y를 선택한 경우 plugin이 auth_socket
이나, unix_socket
이 되어 외부에서 접속하지 못한다.
이를 해결하기 위해서는 해당 부분을 mysql_native_password
로 바꾸어야 하는데, 아래의 SQL문을 사용하여 변경한다.
alter user 'root'@'localhost' identified via mysql_native_password using password("root");
flush privileges;
비밀번호 문제
일부 프로젝트에서 MariaDB에 접속할 때 Root 비밀번호를 없애야 하는 경우가 있다. 비밀번호를 없애는 방법은 아래의 SQL문과 같다.
alter user 'root'@'localhost' identified by '';
flush privileges;
MariaDB 계정 권한 확인하기
MariaDB에 등록된 계정의 권한을 확인하는 방법은 간단하다. 아래의 SQL문을 실행하면 된다.
show grants for 'root'@'localhost';
보통 ‘root’@’localhost’ 계정의 경우에는 아래와 같은 권한을 가지게 되는데, 모종의 이유로 권한이 사라지거나 이상할 수 있다.
GRANT ALL PRIVILEGES ON . TO ‘root’@’localhost’ WITH GRANT OPTION
GRANT PROXY ON ‘’@’%’ TO ‘root’@’localhost’ WITH GRANT OPTION
권한이 위와 다르다면 재설치하는 것이 정신 건강에 이롭다.
MariaDB 재설치하기
패키지 삭제
yum remove mariadb mariadb-server mariadb-libs
로컬 데이터 삭제
로컬 데이터를 삭제하지 않으면 MariaDB를 재설치했을 때 이전의 계정 데이터나 테이블이 남아있어 문제가 해결되지 않는다.
rm -rf /var/lib/mysql
rm /etc/my.cnf
패키지 재설치
yum install mariadb-server
mariadb-secure-installation
Enter current password for root (enter for none): → 엔터
Switch to unix_socket authentication [Y/n] → n
Set root password? [Y/n] → Y 이후 사용할 암호 입력
Remove anonymous users? [Y/n] → Y
Disallow root login remotely? [Y/n] → n
Remove test database and access to it? [Y/n] → Y
Reload privilege tables now? [Y/n] → Y
접속 테스트
mysql -uroot -p