DB를 날렸다

Yi Kanghoon·2023년 2월 19일
0

개요

내가 관여하고 있는 모 웹서비스에서 관리자 권한을 가지고 있는 담당자의 휴먼 에러로 중요한 특정 테이블이 증발해버리는 일이 있었음. 물론 의도된 기능으로 구현했지만 그 상황에 사용하기를 의도한 것은 아니었고, DB를 복구해야하는 상황이 발생.

복구?

MySQL 데이터 베이스의 복구를 시도하기 위해 chatGPT에(...) 일단 물어 보았다. chatGPT가 제시한 해결 방법은 4가지였는데,
1. 최근의 백업을 확인해라 -> 데이터 베이스 백업을 해두지 않았다...(백업에 대해서는 후술하겠다.)
2. 최근의 트랜젝션을 확인해라 -> 해볼만 하다는 생각이 들어 접근 방법으로 생각해 두었다.
3. 파일 시스템으로부터 복구를 시도해라 -> 최후..직전의 수단이 들어 최대한 피하고 싶었다.
4. 데이터 복구 전문가에게 연락해라 -> 복구 비용이 DB 증발로 인한 손해보다 크다고 생각되어 고려하지 않았다.

결론적으로 나온 방법은 2가지로, 트랜젝션 로그를 확인하는 것과 파일 시스템으로 부터의 복구였다.

(아래의 방법 서술은 그저 시도해 보았거나 다른 몇가지 글을 통해 확인한 것일뿐 따라 하지는 말자... 그냥 백업을 자주 하자)

트랜젝션 로그

트랜젝션 로그가 있는지 확인해보기 위해 첫번째로

SHOW VARIABLES LIKE 'log_bin';

을 실행했다.

어?

log_bin의 변수 값이 OFF였다......
따라서 이 방법을 사용할 수 없게 되었지만 만약 켜져 있었다면 어떻게 해야 하는지 정리해보겠다.

트랜젝션 로그 파일의 위치를 확인하기 위해

SHOW BINARY LOGS;

를 실행하고, 로그 파일들을 확인한뒤에

SHOW VARIABLES LIKE 'datadir';

를 실행하여 로그파일들의 위치를 찾는다.

이후에는 mysqlbinlog를 사용하여 해당 로그파일을 읽어볼 수 있는데,

mysqlbinlog /var/lib/mysql/mysql-bin.000001

와 같이 사용할 수 있다.

해당 로그 파일의 구조를 정확히 알지는 못하는 관계로 이후 대처는 정확히 정리하기는 힘들겠지만, 로그의 트랜젝션 중 포함하지 않고자 하는 것을 지우고 SQL script를 작성하여

mysql -u root -p < recovery.sql

를 실행하여 복구가 가능하다고 한다. 단순히 이렇게 원본 DB를 복구하는 것은 위험한 방법이라고 생각되고, DB를 fork한 뒤에 해당 DB에서 시도해 보고, 데이터만 확인하는 것이 바람직하지 않을까 싶다.

파일 시스템에서 복구

mysql이 실제로 저장한 파일을 복구하는 방법이다. 위의 방법이 시작부터 막힌 관계로 한번 뛰어들어 보기나 하자는 생각으로 접근했는데, 매우매우매우...매우매우 복잡했다.
우선 mysql이 실제로 저장하는 디렉토리에 가서
.ibd 파일과 .frm 파일을 복사해왔다. 다음으로 해당 파일을 이전버전으로 돌릴 수 있는지 확인했는데, timeshift와 같은 유틸을 사용해볼 수 있었다.

어?

timeshift를 사용하기 위해 설치를 시도했는데, 다른 문제인지 설치가 안되는 문제가 있었다.

다른 .ibd 파일을 아무리 찾아도 어떤 테이블의 파일인지 구분할 수 없었고, 해당 테이블이 우리가 찾고자 하는 테이블이 아니라고 판단되어 더 이상 시도하지는 않았다.

실패

그렇다. 복구 못했다. 담당자 측에서 적절히 대처하는 것으로 하고, 우리는 더 이상 무언가를 시도해 보지는 않았다. 그러니까

백업하자 백업

백업

MySQL에서 백업을 하고 해당 백업을 이용해 복구하는 방법을 간단히 확인하고 글을 마치겠다.

mysqldump 사용

  1. mysqldump커맨드를 사용해 백업을 위한 .sql파일을 만들어둔다.
  2. 새로운 데이터베이스를 생성하고, 위에서 트랜젝션 로그를 활용하듯이
mysql -u username -p new_dbname < backup.sql

와 같은 명령어를 사용하여 백업파일을 통해 데이터베이스를 복원할 수 있다.

별로 어렵진 않은데 안 해두면 유사시에 어려운 상황이 생긴다....

정리

데이터베이스는 특정 주기로 백업되도록 해두자. 물론 스토리지 공간의 문제가 있겠지만 날아가서 백업없이 복구해야하는 상황이 생기는 것보단 미리 돈을 좀 쓰고 스토리지를 확보하는게 낫지 않을까 싶다. 지금 외주 작업으로 하고 있는 서비스에서도 백업을 고려할 필요성이 크게 느껴진다 (RDS를 써야하나...)

profile
Full 'Snack' Developer

0개의 댓글