본문 바로가기

리눅스

MySQL 프로세스를 강제 종료하지 않고 정상 종료하는 방법

반응형

MySQL 프로세스를 강제 종료하지 않고 정상 종료하는 방법

MySQL root 패스워드를 분실했을 경우 --skip-grant-tables 옵션으로 인증을 우회하여 패스워드를 재설정할 수 있다.

이때 kill -9 같은 강제 종료 방식 대신 mysqladmin shutdown 명령을 사용하면 안전하게 MySQL을 종료할 수 있다.

1. 로그 디렉토리 생성

MySQL 에러 로그 디렉토리가 없는 경우 생성한다.

 

로그 디렉토리 및 파일 생성

sudo mkdir -p /usr/local/mysql/log

sudo touch /usr/local/mysql/log/error.log

소유권 및 권한 설정

sudo chown -R mysql:mysql /usr/local/mysql/log

sudo chmod 755 /usr/local/mysql/log
sudo chmod 644 /usr/local/mysql/log/error.log

2. MySQL 인증 우회 모드로 기동

--skip-grant-tables 옵션으로 권한 검사를 비활성화하여 MySQL을 실행한다.

/usr/local/mysql/bin/mysqld_safe \
  --defaults-file=/usr/local/mysql/my.cnf \
  --skip-grant-tables \
  --skip-networking &

옵션 설명

  • --skip-grant-tables 사용자 인증 비활성화
  • --skip-networking TCP 네트워크 접속 차단 (보안 강화)
  • mysqld_safe 장애 발생 시 자동 재시작 지원

3. MySQL 접속

/usr/local/mysql/bin/mysql \
  -uroot \
  --socket=/tmp/mysql-3306.sock

4. root 패스워드 재설정

MySQL 8.x 기준

FLUSH PRIVILEGES;

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

FLUSH PRIVILEGES;

mysql_native_password 방식 사용 시

  • 일부 구버전 애플리케이션 또는 PHP 연동 환경에서는 mysql_native_password 플러그인이 필요할 수 있다.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPassword';
728x90

5. MySQL 정상 종료 (중요)

기존에는 아래와 같이 PID 기반 kill 명령으로 종료하는 경우가 많다.

sudo kill `cat /usr/local/mysql/data/mysqld.pid`

하지만 이 방식은 비정상 종료로 이어질 수 있으며 InnoDB Recovery가 발생할 가능성이 있다.

 

따라서 아래와 같이 mysqladmin shutdown 명령으로 정상 종료하는 것을 권장한다.

  • 권장 방법
/usr/local/mysql/bin/mysqladmin \
  -uroot \
  --socket=/tmp/mysql-3306.sock \
  shutdown

장점

  • InnoDB Flush 정상 처리
  • Binary Log 안전 종료
  • 데이터 손상 위험 감소
  • Crash Recovery 방지

6. MySQL 정상 모드로 재기동

/usr/local/mysql/bin/mysqld \
  --defaults-file=/usr/local/mysql/my.cnf \
  --user=mysql &

7. 변경된 패스워드로 접속 확인

/usr/local/mysql/bin/mysql \
  -uroot -p \
  --socket=/tmp/mysql-3306.sock

현재 인증 플러그인 확인

SELECT user, host, plugin FROM mysql.user;
  • unix_socket이면 → 비밀번호 없이 OS 로그인으로 인증됨
  • mysql_native_password면 → 비밀번호 인증

DB가 응답 없을 때 (단계적 접근)

1단계: 정상 종료 시도 (30초 정도 기다림)

sudo kill `cat /var/run/mysqld/mysqld.pid`

2단계: 그래도 안 되면 (1-2분 후)

sudo kill -15 `cat /var/run/mysqld/mysqld.pid`

3단계: 진짜 최후의 수단 (수 분 후에도 반응 없을 때)

sudo kill -9 `cat /var/run/mysqld/mysqld.pid`

kill -9 사용 후 반드시 해야 할 일

1. 잔여 파일 정리

sudo rm -f /var/run/mysqld/mysqld.pid

sudo rm -f /var/lib/mysql/mysql.sock

2. 테이블 검사/복구

/usr/local/mysql/bin/mysqld \
  --defaults-file=/usr/local/mysql/my.cnf \
  --user=mysql &

mysqlcheck --all-databases --auto-repair

3. 로그 확인

sudo tail -f /var/log/mysql/error.log

 

728x90
반응형