MySQL 관리자 암호를 잃어버려서 root 로 로그인 할 수가 없을때 암호 초기화 하는 방법에 대해서 정리

Linux & Un*x 

--init-file 옵션 사용

  1. mysqld 를 구동할 수 있는 계정(ex:  mysql or root) 으로 login 한다.
  2. MySQL 서버를 중지한다. 
    1. Linux

      service mysql stop
      BASH
    2. Unix
      1. mysqld 종료 스크립트가 있다면 실행해서 종료한다.
      2. 없으면 mysql의 pid 파일을 찾은후에 kill (kill -9 로 종료하면 안 됨!. - 참고 자료) 종료한다. (kill 뒤에 옵션을 안 주면 TERMinate signal 이 전송된다)

        kill `cat /var/lib/mysql/host_name.pid`
        CODE
  3. 에디터에서 루트 암호를 초기화하는 SQL 파일을 만들고 /var/lib/mysql/mysql-pwd-init.sql 으로 저장한다. 

    MySQL 5.7 이상

    UPDATE mysql.user 
    	set authentication_string=PASSWORD("MyNewPass"), 
    	password_expired='N', 
    	plugin='mysql_native_password' 
    where User='root';
    
    flush privileges;
    SQL

    5.7 부터는 auth plugin 이 도입되어 auth_socket 일 경우 암호를 설정해서 로그인에 실패함

    MySQL 5.7 미만

    UPDATE mysql.user 
    	SET Password=PASSWORD('MyNewPass') 
    WHERE User='root';
    FLUSH PRIVILEGES;
    SQL
  4. mysqld 를 --init-file 옵션과 함께 구동한다.

    a. Linux

    SELinux note

    SELinux 를 사용할 경우 --init-file에 지정한 초기화 파일은 SELinux rule 에 어긋나면 mysql 프로세스가 못 읽을수 있다..

    mysql 이 읽으려면 mysqld_etc_t 레이블이 부여되야 하므로 다음 명령어로 SELinux context 를 지정해 줘야 한다.

    chcon -t mysqld_etc_t /var/lib/mysql/mysql-pwd-init.sql 

    보안 컨텍스트 확인

    $ semanage fcontext -l |grep mysqld_etc_t

    /etc/my\.cnf regular file system_u:object_r:mysqld_etc_t:s0
    /etc/mysql(/.*)? all files system_u:object_r:mysqld_etc_t:s0

    mysqld_safe --init-file=/var/lib/mysql/mysql-pwd-init.sql 
    BASH


    b. Unix

    mysqld_safe --init-file=/var/lib/mysql/mysql-pwd-init.sql  &
    BASH
  5. 잘 반영되었는지 확인하기 위해 mysql cient 로  login 해 보고 제대로 로그인 되면 /var/lib/mysql/mysql-pwd-init.sql  는 삭제한다.
  6. mysql 서비스를 재구동한다.

    service mysqld restart
    CODE

--skip-grant-tables 사용

privilege 를 확인하지 않는 옵션인 --skip-grant-tables 옵션을 통해 mysql 구동한후 암호를 변경한다.

에러 처리

아래와 같은 에러가 날 경우 my.cnf 에 user = mysql 을 설정한다.

Please read "Security" section of the manual to find out how to run mysqld as root!


  1. mysql 구동
    1. Linux

      service mysql start --skip-grant-tables
      CODE
    2. Unix

      mysqld_safe --skip-grant-tables
      CODE
  2. mysql 콘솔로 연결한다.


    mysql -u root mysql
    CODE
  3. "--init-file 옵션 사용" 항목의 3번 루트 암호를 초기화하는 SQL을 수행한다.

  4. mysql 재구동

    service mysql restart
    CODE

Windows

  1. 시작 -> cmd 에서 services.msc 입력하거나 제어판 -> 관리도구 -> 서비스
  2. MySQL server 중지
  3. 에디터에 Case1항의 3번 암호를 초기화하는 SQL 을 입력하고 c:\init.sql 로 저장

  4. 시작 -> 실행에서 다음 명령어 입력 (MySQL 설치경로 따라 다를수 있음)

    "C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld.exe"
    --defaults-file="C:\\Program Files\\MySQL\\MySQL Server 5.5\\my.ini"
    --init-file=c:\\init.sql
    CODE
  5. 잘 반영되었는지 확인하기 위해 mysql cient 로  login 해 보고 제대로 로그인 되면 c:\init.sql는 삭제한다.


Ref