강좌
클라우드/리눅스에 관한 강좌입니다.
데이터베이스 분류

MYSQL 패스워드 복구실무

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

MYSQL 패스워드 복구실무

 

 

 

 

필자와 같은 서버관리자는 간혹 경험해 보았겠지만 MYSQL데이터베이스를 관리하다보면 MYSQL root패스워드 잊어버리는 경우가 종종 발생한다.

 

 

 

 

  특히 여러대의 서버를 혼자서 관리하는 경우라면 흔하지 않게 경험해 보았을 것이다.

 

 

 

 

  만약 여러분들이라면 이런 경우 어떻게 MYSQL root패스워드를 복구하는가?

 

이런 경우에 유일하게 MYSQL root패스워드를 복구할 수 있는 방법이 있다.

 

 

 

 

 이를 위하여 먼저 MYSQL 사용자 인증과정없이 실행하는 의미에 대해서알아야 한다.

 

 

 

 

 

 

 

1. MYSQL 실행시 사용자인증과정없이 실행하기

 

 

 

 

 

MYSQL을 실행할 때에 table grant권한을 생략하고 실행을 할 수 있다.

 

 

 

 

  즉 패스워드가 설정되어있는 모든 사용자들이 패스워드없이 MYSQL에 바로 접속을 할 수 있기 때문에 주로 MYSQL root계정의 비밀번호를 잊어버렸을 경우에 table grant권한을 생략하여 MYSQL을 실행시킨 다음 MYSQL root사용자의 비밀번호를 변경하는 용도로 많이 사용된다.

 

 

 

 

 

 

또한 사용자인증과정을 생략하여 MYSQL을 실행하면 MYSQL root사용자뿐아니라 일반사용자들도 패스워드없이 MYSQL로 바로 접속할 수 있다.

 

 

 

 

 

 

table grant권한없이 시작하려면 mysqld_safe명령어로 MYSQL시작시에 다음과 같이 --skip-grant-table옵션을 사용하면 된다.

 

 

 

 

 

 

[root@sulinux ~]#/usr/local/mysql/bin/mysqld_safe --skip-grant-table &

[1] 2517

[root@sulinux ~]#090428 23:26:53 mysqld_safe Logging to '/usr/local/mysql/data/sulinux.net.err'.

090428 23:26:53 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

 

[root@sulinux ~]#

 

 

위와같이 mysqld_safe명령어로 MYSQL을 시작할 때에 --skip-grant-table옵션을 사용하여 실행하면 MYSQL접속시에 패스워드없이 바로 접속할 수 있다.

 

 

 

 

 

 

다음은 위와같이 실행된 후에 ps명령어로 MYSQL 프로세스를 확인한 것이다.

 

 

 

 

 보는바와같이 --skip-grant-table이라는 옵션이 적용되어 실행되었다는 것을 확인할 수 있다.

 

 

 

 

 

 

[root@sulinux ~]#ps -ef | grep mysqld

root      2517  2390  1 23:26 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --skip-grant-table

mysql     2613  2517  1 23:26 pts/0    00:00:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --skip-grant-table --log-error=/usr/local/mysql/data/sulinux.net.err --pid-file=/usr/local/mysql/data/sulinux.net.pid --socket=/tmp/mysql.sock --port=3306

root      2617  2390  0 23:26 pts/0    00:00:00 grep --colour=auto mysqld

[root@sulinux ~]#

 

이렇게 실행된 후에는 다음과 같이 MYSQL에 접속할 때에 패스워드없이 바로 접속할 수 있다.

 

 

 

 

  다음은 MYSQL root사용자가 패스워드없이 바로 접속한 예이다.

 

 

 

 

 

 

[root@sulinux ~]#/usr/local/mysql/bin/mysql -u root mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.1.32 Source distribution

 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

mysql>

mysql> exit

Bye

[root@sulinux ~]#

 

다음은 MYSQL의 일반사용자인 tempuser라는 사용자가 패스워드없이 바로 접속한 예이다.

 

 

 

 

 

 

[root@sulinux ~]#/usr/local/mysql/bin/mysql -u tempuser temp_db2

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.1.32 Source distribution

 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

mysql>

mysql> exit

Bye

[root@sulinux ~]#

 

 

 

 

이를 이용하여 우리는 MYSQL root패스워드를 잊어버렸을 때에 재설정하기 위한 방법으로 사용할 수 있다.

 

 

 

 

 

 

2. MYSQL root패스워드를 잊어버렸을 때 복구하는 방법

 

 

 

 

앞에서 설명한 바와같이 mysqld_safe으로 MYSQL을 시작할 때에 --skip-grant-table옵션을 사용하여 MYSQL의 사용자인증과정을 생략하여 실행한 후에 MYSQLroot계정으로 패스워드없이 접속하여 원하는 패스워드로 변경하는 방법이다.

 

 

 

 

 

 

MYSQL root계정 패스워드를 잊어버렸을 경우의 복구절차는 다음과 같다.

 

 

 

 

 

 

1 단계 : 실행중인 MYSQL을 종료한다.

 

 

 

 


2
단계 : “./mysqld_safe --skip-grant-table &” 을 실행하여 MYSQL을 실행한다.

 

 

 

 


3
단계 : 패스워드없이 MYSQL root계정으로 MYSQL에 접속한다.

 

 

 

 

 
4
단계 : update문으로 MYSQL root사용자의 패스워드를 변경한다.

 

 

 

 

 
5
단계 : “flush privileges”명령어로 변경된 MYSQL 권한테이블(db, user테이블들)들에  변경된 권한설정들을 적용한다.

 

 

 

 

 
6
단계 : MYSQL을 빠져나와서 실행했던 MYSQL을 종료한다.

 

 

 

 

 
7
단계 : 일반적인 방법으로 MYSQL을 실행한다.

 

 

 

 

 
8
단계 : 정상적인 방법으로 패스워드를 사용하여 MYSQL root계정으로 접속하여 확인한다.

 

 

 

 

 

 

위의 단계별로 직접 MYSQL root패스워드를 복구해보도록 하겠다.

 

 

 

 

 

 

1단계 : 실행중인 MYSQL을 종료한다.

 

 

 

 

 

 

현재 실행되어있는 MYSQL root패스워드를 잊어버렸기 때문에 실행된 실행중인 MYSQL을 종료해야 한다.

 

 

 

 

 root패스워드를 잊어버리지 않은 정상적인 경우라면 mysqladmin을 이용해서 MYSQL을 종료할 수 있지만 현재상태에서는 MYSQL root패스워드를 모르는 상황이므로  killall명령어를 이용하여 종료할 수 밖에 없다.

 

 

 

 

 

 

[root@sulinux bin]#ps -ef| grep mysqld

root      2681  2390  0 23:31 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe

mysql     2771  2681  0 23:31 pts/0    00:00:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --log-error=/usr/local/mysql/data/sulinux.net.err --pid-file=/usr/local/mysql/data/sulinux.net.pid --socket=/tmp/mysql.sock --port=3306

root      2777  2390  0 23:31 pts/0    00:00:00 grep --colour=auto mysqld

[root@sulinux bin]#

[root@sulinux bin]#killall mysqld

[root@sulinux bin]#090428 23:31:45 mysqld_safe mysqld from pid file /usr/local/mysql/data/sulinux.net.pid ended

 

[1]+  Done                    /usr/local/mysql/bin/mysqld_safe

[root@sulinux bin]#

 

실행중인 MYSQL을 종료하는 정상적인 방법은 “mysqladmin -u root -p shutdown”을 이용하는 것이다.

 

 

 

 

 하지만 이 방법은 MYSQL root패스워드를 알아야만 가능한 방법이기 때문에 MYSQL root패스워드를 알지 못하는 현재 상황에서는 부득이하게 killall을 이용하여 MYSQL을 종료한다.

 

 

 

 

 

 

2 단계 : table grant권한없이 MYSQL을 실행한다.

 

 

 

 



앞의 예에서 배웠던 대로 table grant권한없이 MYSQL을 다음과 같이 실행한다.

 

 

 

 

 --skip-grant-table 옵션을 줘서 MYSQL을 다음과 같이 실행하면 패스워드없이 MYSQL 로 바로 접속이 가능하다.

 

 

 

 

 이 옵션으로 실행하면 심지어 다음과 같은 작업들이 가능하다.

 

 

 

 

 

 

        . 패스워드를 지정하는 -p옵션없이 접속할 수 있다.

 

 

 

 

 

        . 어떤 패스워드를 입력하더라도 조건없이 바로 접속된다.

 

 

 

 

 

. -p옵션을 지정해도 되고 지정하지 않아도 된다.

 

 

 

 

 

 

이제 다음과 같이 MYSQL을 실행해본다.

 

 

 

 

 

 

[root@sulinux bin]#/usr/local/mysql/bin/mysqld_safe --skip-grant-table &

[1] 2781

[root@sulinux bin]#090428 23:39:54 mysqld_safe Logging to '/usr/local/mysql/data/sulinux.net.err'.

090428 23:39:54 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

 

[root@sulinux bin]#

[root@sulinux bin]#ps -ef | grep mysqld

root      2781  2390  0 23:39 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --skip-grant-table

mysql     2877  2781  1 23:39 pts/0    00:00:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --skip-grant-table --log-error=/usr/local/mysql/data/sulinux.net.err --pid-file=/usr/local/mysql/data/sulinux.net.pid --socket=/tmp/mysql.sock --port=3306

root      2881  2390  0 23:39 pts/0    00:00:00 grep --colour=auto mysqld

[root@sulinux bin]#

 

 

 

 

 

 

3 단계 : 패스워드없이 MYSQL root계정으로 MYSQL에 접속한다.

 

 

 

 

 

아래 예와 같이 패스워드없이 MYSQL root계정으로 MYSQL에 접속하였다.

 

 

 

 

 

 

[root@sulinux bin]#/usr/local/mysql/bin/mysql -u root mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 5

Server version: 5.1.32 Source distribution

 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

mysql>

 

 

 

 

4 단계 : update문으로 MYSQL root사용자의 패스워드를 변경한다.

 

 

 

 

 

아래와 같이 MYSQL root계정 패스워드를 update 문을 이용하여  ‘11111111’로 변경하였다.

 

 

 

 

 

 

mysql> update user set password=password('11111111') where user='root';

Query OK, 0 rows affected (0.01 sec)

Rows matched: 3  Changed: 0  Warnings: 0

 

mysql>

 

 

 

 

5 단계 : “flush privileges”으로 MYSQL데이터들을 동기화한다.

 

 

 

 

 

다음과 같이 “flush privileges”명령어로 MYSQL의 데이터들을 동기화시킨다.

 

 

 

 

 이 의미는 방금 변경된 MYSQL root패스워드가 mysql데이터베이스내에 있는 권한테이블들(db, user테이블들)에 적용되도록하기 위한 것이다.

 

 

 

 

 

 

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

 

mysql>

 

 

 

 

 

6 단계 : MYSQL을 빠져나와서 실행했던 MYSQL을 종료한다.

 

 

 

 

 

이제 아래와 같이 MYSQL을 빠져나온 후에 table grant권한없이 실행하였던 MYSQL을 종료한다.

 

 

 

 

 

 

mysql> exit

Bye

[root@sulinux bin]#

[root@sulinux bin]#killall mysqld

[root@sulinux bin]#090428 23:58:37 mysqld_safe mysqld from pid file /usr/local/mysql/data/sulinux.net.pid ended

 

[1]+  Done                    /usr/local/mysql/bin/mysqld_safe --skip-grant-table

[root@sulinux bin]#

 

이로써 MYSQL root패스워드가 ‘11111111’로 변경되었다.

 

 

 

 

 이제 변경된 패스워드로 접속하여 확인해보도록 하겠다.

 

 

 

 

 

 

7 단계 : 일반적인 방법으로 MYSQL을 실행한다.

 

 

 

 

 

이제 MYSQL root패스워드가 ‘11111111’로 변경 되었으므로 일반적인 방법으로 MYSQL을 다음과 같이 실행하였다.

 

 

 

 

 

 

[root@sulinux bin]#/usr/local/mysql/bin/mysqld_safe &

[1] 2904

[root@sulinux bin]#090428 23:59:51 mysqld_safe Logging to '/usr/local/mysql/data/sulinux.net.err'.

090428 23:59:51 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

 

[root@sulinux bin]#

 

 

 

 

 

8 단계 : 패스워드를 사용하여 MYSQL root계정으로 접속하여 확인한다.

 

 

 

 

 

 

이제 변경된 MYSQL root패스워드(‘11111111’)를 사용하여 MYSQL로 접속하였다.

 

 

 

 

  이로써 MYSQL root패스워드가 ‘11111111’로 변경되었음을 확인하였다.

 

 

 

 

 

 

[root@sulinux bin]#/usr/local/mysql/bin/mysql -u root -p mysql

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.1.32 Source distribution

 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

mysql>

mysql> exit

Bye

[root@sulinux bin]#

 

 

 

 

이렇게 MYSQL root패스워드를 잊어버렸을 경우에는 복구(변경)가 가능하다.

 

 

 

 

  참고로 일반사용자의 MYSQL패스워드를 잊어버렸다면 MYSQL root계정으로 MYSQL에 접속한 다음 update문으로 변경해주면 된다.

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,035 명
  • 현재 강좌수 :  35,801 개
  • 현재 접속자 :  178 명