mysql 복구와 백업

00_8_3·2022년 12월 29일
0

복구

mysqlbinlog 명령을 사용한다.
위 명령어가 Not found 오류가 나오는데
mysql docker image 8.0.23 버전부터 포함된다고 하던데 안나온다.
-debian 버전을 사용하니 잘 나온다.

바이너리 파일이 날라간 경우 복구 불가.
일정 주기마다 삭제됨.

바이너리 로그 확인

SHOW BINARY LOGS;

Flush logs

서버가 쓰고있는 로그 파일을 닫았다가 다시 엽니다. 바이너리 로깅이 활성화된 경우 바이너리 로그 파일의 시퀀스 번호는 이전 파일과 비교하여 1씩 증가합니다. 릴레이 로깅이 활성화되면 릴레이 로그 파일의 시퀀스 번호가 이전 파일에 비해 1씩 증가합니다.

binlog -> sql

기본 디렉토리는 /var/lib/mysql

  • 단일 파일
    mysqlbinlog /var/lib/mysql/binlog.000001 > /var/lib/mysql/binlog.000001.sql

  • 와일드카드
    mysqlbinlog /var/lib/mysql/binlog.0* > /var/lib/mysql/binlog.sql

  • 여러 파일
    mysqlbinlog /var/lib/mysql/binlog.000001 /var/lib/mysql/binlog.000002 > /var/lib/mysql/binlogs.sql

복구하기

복구할 바이너리 파일에 직접 접근하여
TRUNCATE 와 같은 치명적인 쿼리를 주석처리 또는 삭제하고 저장한다.
그 후 sql문을 실행.
mysql -u 유저이름 -p -f < binlogs.sql

백업

위 의 바이너리 로그를 이용한 복구가 잘 되었다면 좋겠지만
일정 주기에 따라 해당 로그는 자동 삭제가 된다.

이러한 대참사를 막기위해 틈틈히 백업을 해야한다.

백업하기

mysqldump -u로그인유저 -p 스키마(DB명) > backup.sql

복원하기

mysql -u로그인유저 -p dev_db < backup.sql

스키마가 생성되어 있어야 복원이 된다.

프로덕션에서

--skip-lock-tables 를 같이 사용하면 프로세스를 덤프하는 과정 중 테이블이 lock 되는것을 방지 할 수 있다.
보통 InnoDB 테이블을 덤핑할 때 권장한다.

mysqldump -u root -pmypassword my_database --skip-lock-tables > my_database.sql

참고

복구
https://hudi.blog/mysql-pit-recover/
백업
https://ponyozzang.tistory.com/657

https://simplebackups.com/blog/the-complete-mysqldump-guide-with-examples/

0개의 댓글