본문 바로가기

도구의발견

[MySQL] root 패스워드 분실 시 리셋 방법

만일 여러분이 한번도 MySQL root 계정의 패스워드를 설정한적이 없다면 root로 접속 할 때 패스워드를 묻지 않습니다. 패스워드를 설정하지 않으면 매번 접속 할 때 마다 귀찮게 패스워드를 묻지도 않아고, 패스워드를 기억 할 필요가 없어서 편리합니다.
하지만...

저는 설정 했나봅니다(ಥ _ ಥ)
!!NOTE!! - 설마 귀찮다고 패스워드를 설정하지 않는 분은 없겠죠? 잠깐의 귀찮음과 당신의 보안을 맞바꿔서는 안되요!!
처럼 패스워드를 설정해놓고 잊어 버리는 사람들을 위해 MySQL 공식 사이트에서는 MySQL - How to Reset the Root Password 섹션에서 다음과 같이 가이드하고 있습니다.
윈도우 환경, 유닉스 or 리눅스 환경, 운영체제 상관 없지만 MySQL 서버가 설치된 로컬 머신에서만 직접 할 수 있는 방법. 이렇게 세가지를 소개 합니다.

윈도우에서 패스워드 리셋

1. 관리자 계정으로 로그온 하십시오
2. 만일 MySQL 서버가 구동 중이라면 구동을 멈추세요.
만일 윈도우 서비스 모드로 서버가 구동 중이라면 윈도우 버튼을 누르고 서비스 or service 로 검색해서 서비스 관리자를 실행한 후, 서비스 관리자에서 MySQL을 찾아 '중지' 시킵니다.

만일 서비스로 구동 중이 아니라면 TaskManager에서 MySQL 프로세스를 찾아 죽여 줍니다.
3. 아래와 같은 한줄 짜리 텍스트 파일을 만듭니다. 'MyNewPass'라는 텍스트는 여러분이 원하는 패스워드로 변경하면 됩니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

4. 파일을 저장합니다. 이 예제에서는 여러분의 파일이 C:\mysql-init.txt 라고 가정합니다.
5. 콘솔윈도우를 엽니다(윈도우키 + r 해서 실행창을 띄운 후 'cmd'라고 실행하면 콘솔 윈도우가 뜹니다)
6. MySQL 서버를 init_file 시스템 변수와 함께 실행 시켜 줍니다

C:\> cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
C:\> mysqld --init-file=C:\\mysql-init.txt

NOTE - '--init-file'의 옵션 값에서 백슬래쉬가 두개 사용 되었습니다.
만일 다른 디렉토리에 MySQL을 인스톨 하셨다면 cd 명령어를 해당 디렉토리로 변경하시면 됩니다.
MySQL 서버는 구동 시 --init-file에 지정되어 있는 파일에 적힌 내용을 실행 합니다.
만일, MySQL 서버가 MySQL Installation Wizard로 설치 되었다면 '--default-file' 옵션도 추가로 필요합니다.

C:\> mysqld
--defaults-file="\\ProgramData\\MySQL\\MySQL Server 8.0\\my.ini"
--init-file=C:\\mysql-init.txt"

이렇게 서버를 실행 시키고 MySQL 클라이언트를 이용해 다시 접속하시면 변경된 패스워드로 접속 가능합니다.

로그인 완료

7. mysql-init.txt 파일을 삭제하세요.

유닉스(Unix) 또는 리눅스(Linux)에서 패스워드 리셋

1. 관리자 계정으로 로그인 하세요.
2. MySQL 서버를 중지 시키세요.

shell> kill `cat /mysql-data-directory/host_name.pid'

3. 아래와 같은 한줄 짜리 텍스트 파일을 만듭니다. 'MyNewPass'라는 텍스트는 여러분이 원하는 패스워드로 변경하면 됩니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';


4. 파일을 저장합니다. 이 예제에서는 여러분의 파일이 /home/me/mysql-init 이라고 가정합니다.
5. MySQL 서버를 init_file 시스템 변수와 함께 실행 시켜 줍니다

shell> mysqld --init-file=/home/me/mysql-init &

6. 서버가 정상적으로 실행 되고 root 계정으로 접속이 성공한 후에는 mysql-init 파일을 삭제 합니다.

운영체제 관계 없이 패스워드 리셋하기

이전 섹션에서는 각 운영체제 별로 어떻게 패스워드를 리셋하는지 알아 보았습니다. 이번 섹션에서는 mysql 클라이언트를 이용해 운영체제와 상관 없이 패스워드를 리셋하는 방벙을 알아 보겠습니다.
1. MySQL 서버를 --skip-grant-tables 옵션과 함께 재시작 합니다.이 옵션이 활성화 되면 아무나 패스워드 없이 접속하여 모든 권한을 획득 할 수 있습니다. 반면에 ALTER USER, SET PASSWORD 같은 계정 관리 관련 기능을 꺼버립니다. 이런 보안적 취약성을 보완하기 위해 --sikp-grant-tables 옵션이 활성화 되면 원격 네트워크 접속이 차단 됩니다.
2. mysql 클라이언트를 이용하여 로컬에서 접속합니다. 패스워드는 필요 없습니다.

shell> mysql

3. mysql 클라이언트로 접속 후, grant 테이블을 다시 로드해서 계정 관리 기능을 재활성화 시킵니다.

mysql> FLUSH PRIVILEGES;

'root'@'local' 계정의 패스워드를 변경 합니다. 'MyNewPass'는 여러분이 원하는 패스워드로 변경하면 됩니다.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

이제 부터 새로운 패스워드를 이용해 root 계정 로그인을 할 수 있습니다. 서버를 --skip-grant-tables 옵션 없이 재시작 하십시오.

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!