mysqlbinlog
명령을 사용한다.
위 명령어가 Not found 오류가 나오는데
mysql docker image 8.0.23 버전부터 포함된다고 하던데 안나온다.
-debian
버전을 사용하니 잘 나온다.
바이너리 파일이 날라간 경우 복구 불가.
일정 주기마다 삭제됨.
SHOW BINARY LOGS;
서버가 쓰고있는 로그 파일을 닫았다가 다시 엽니다. 바이너리 로깅이 활성화된 경우 바이너리 로그 파일의 시퀀스 번호는 이전 파일과 비교하여 1씩 증가합니다. 릴레이 로깅이 활성화되면 릴레이 로그 파일의 시퀀스 번호가 이전 파일에 비해 1씩 증가합니다.
기본 디렉토리는 /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/