팀 프로젝트에서 MySQL을 사용할 때 평소에 사용하지 않는 비밀번호를 사용해서 이를 변경하려 했다. 간단히 구글에 검색해서 변경하려고 했는데 생각지도 못한 오류들이 너무 많았다. 버전도 경로도 나와 같은 환경을 찾지 못해서 여러 검색 결과를 조합하여 삽질 끝에 변경할 수 있었다.

사용자 환경

먼저 지금 내가 사용하고 있는 환경은 다음과 같다.

  • OS: MAC OS 10.14
  • MySQL 버전: 8.0.17 Homebrew
  • MySQL 경로: /usr/local/opt/mysql/bin

처음에는 경로를 찾는게 문제였다. Homebrew로 설치해서 그런지 MySQL에 접속하면 버전에 위와 같이 Homebrew가 표시되어 있었다. 구글 검색을 하면 대부분 /usr/local/mysql/bin 에서 하는 것을 알 수 있지만 나는 전혀 다른 곳에 있었다. MySQL이 검색한 경로에 없다고 당황하지 말고 자기가 설치한 방법으로 검색해보거나 직접 찾아보자.

비밀번호 변경

비밀번호를 알고 있는 상황에서 MySQL에 접속한 후 변경하는 방법은 간단하다.

mysql-password1.png

위 그림처럼 MySQL에 접속했다면 아래의 명령어를 입력하여 비밀번호를 변경하자.

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '[변경할 비밀번호]';
  • 예시
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '1234';

비밀번호 초기화

이제는 root 사용자 비밀번호를 모를 때 초기화한 후 비밀번호를 재설정하는 방법을 살펴보자. 먼저 구글 검색하여 알아본 방법으로 왜 안되었는지 말해보고 싶다. 검색을 하면 대부분 비밀번호를 재설정하는 명령어는 다음과 같을 것이다.

// MySQL 버전 5.7 이하
UPDATE mysql.user SET Password=PASSWORD('[변경할 비밀번호]') WHERE User='root';

// MySQL 버전 5.7 이상
UPDATE mysql.user SET authentication_string=PASSWORD("[변경할 비밀번호]") WHERE User='root';

// MySQL 버전 8.0.15 이상
UPDATE mysql.user SET authentication_string='[변경할 비밀번호]' WHERE User='root';

내 MySQL 버전은 8.0.17이므로 마지막 명령어를 사용하였다.

mysql-password2.png

위 그림을 보면 첫 번째 명령어를 통해 비밀번호를 재설정한 후 FLUSH PRIVILEGES 명령어를 통해 권한 적용을 하고 MySQL을 나간다. 다시 해당 비밀번호를 접속하면 다음과 같은 오류가 뜬다.

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

비밀번호가 틀렸다고 예상할 수 있다. 주어진 명령어를 그대로 사용했는데 왜 비밀번호가 틀렸을까? 그 이유를 찾아보기 위해 비밀번호를 설정하고 그 테이블을 확인해 보았다.

mysql-password3.png

그림을 보면 내가 설정한 비밀번호가 해쉬화 되지않고 그대로 저장되어 있는 모습을 볼 수 있다. 내 예상으로는 해쉬화가 되지 않아서 비밀번호가 틀렸다고 생각되었다. 위에서 살펴본 세 가지 명령어 중 그 전 버전에서는 정상적으로 해쉬화 되는지는 모르겠지만 가장 최근 버전의 명령어는 해쉬화가 되지 않은 체 저장이 되어 오류가 발생했다.

그러면 내가 해결했던 방법을 통해 비밀번호를 변경하는 과정을 살펴보자.

비밀번호 초기화 해결방법

경로는 각자 환경마다 다를 수 있으므로 필요하다면 변경해서 해보자.

  1. MySQL 서버를 멈춘다.
/usr/local/opt/mysql/bin/mysql.server stop
  1. MySQL 서버를 승인을 생략하는 옵션을 추가하여 시작한다.

승인을 생략하는 이유는 비밀번호 없이 MySQL에 접속하기 위해서이다.

/usr/local/opt/mysql/bin/mysql.server start --skip-grant-tables
  1. root 유저로 MySQL에 접속한다.
mysql -u root
  1. mysql 데이터베이스를 사용한다.

비밀번호를 설정하는 데이터베이스는 mysql 이므로 이 데이터베이스로 이동한다.

USE mysql;
  1. root 유저 비밀번호를 NULL로 변경한다.

비밀번호를 NULL로 변경하는 이유는 MySQL 서버를 정상적으로 다시 실행했을 때(승인 생략 옵션 없이) 비밀번호 없이 바로 접속하기 위함이다. 비밀번호를 설정하면 위에서 살펴본 것처럼 해쉬화를 하지 않으므로 오류가 뜬다. --skip-grant-tables와 같이 승인 생략 옵션을 통해 MySQL을 실행하면 ALTER 명령어를 사용할 수 없는 명령어라는 오류로 인해 비밀번호를 변경할 수 없다.

UPDATE user SET authentication_string=null WHERE User='root';
  1. 변경된 권한을 설정한다.
FLUSH PRIVILEGES;
  1. MySQL을 나간다.
EXIT
  1. MySQL에 다시 접속한다.

비밀번호가 설정되어 있지 않으므로 둘 중 아무거나 상관없이 접속할 수 있다.

mysql -u root
mysql -u root -p
  1. 비밀번호를 변경한다.
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '1234';

비밀번호를 변경하고 다시 비밀번호 테이블을 조회하면 아래와 같이 정상적으로 해쉬화해서 저장된 모습을 볼 수 있다.

mysql-password4.png

위 과정을 통해 비밀번호가 정상적으로 변경되었다. MySQL을 나간 후 변경된 비밀번호로 접속할 수 있는지 확인해보자.

참고 자료