본문 바로가기
그 외

[DB] MySQL 비정상 정지시 복구 (InnoDB, MyISAM)

by Hindsight.. 2020. 9. 9.

새로운 노트북을 세팅하면서 오랜만에 pem도 바꿔보기 위해 서버를 console 상에서 중지시켰다.

 

그리고 다시 서버에 접속해 데이터 파싱 python 파일을 실행시키니 오류를 뱉어낸다..

 

Python 오류 1

"Lost connection to MySQL server during query" 뭔가 심상치 않다.

구글링해보니 그저 타임아웃이라 대기 시간을 늘려주면 된다고 한다. ㅎㅎ 

 

Python 오류 2

대기 시간을 늘리고 mysql을 restart하니 이제는 아예 연결할 수 없다고 오류를 뱉는다..

 

심상치않아

이때부터 불길함을 느끼고 혹시라도 mysql이 실행이 되고 있지 않을때도 dump가 되지 않을까라는 헛된 희망에 dump 시도..

실패

askubuntu.com/questions/1008298/cant-start-mysql-server-database-corruption

 

Can't start MySQL server (database corruption)

Context: my noteboook froze and I force restarted it. After restart, I can't seem to start the mysql server. $ sudo systemctl start mysql Job for mysql.service failed because the control process e...

askubuntu.com

위 사이트에서 소개하는 DB 복구시 명령어

very helpful 이라는 문구를 보고 innodb_force_recovery = 1부터 6 까지 시도했지만 실패.

 

결국 /var/lib/mysql 경로에 있는 데이터베이스 파일로 복구를 하기로 한다.

 

이번에 새로 안 개념이지만 MySQL 엔진에는 여러 종류가 있었고 대표적으로 InnoDB와 MyISAM이 있다.

 

MyISAM은 InnoDB에 비해 기능이 없고, 데이터 모델이 단순해 전체적인 속도가 빠른데, 그 중에서도 Select 작업 속도가 빠르다.

하지만, 가장 중요한 무결성과 트랜잭션에 대한 원자성이 보장되지 않는다. 또한, Table-level Lock을 사용해 INSERT, UPDTAE의 쓰기 작업 속도가 느리다.  따라서 쓰기 작업이 적고, Select 위주의 기능을 할 DB에 적합하다.

 

InnoDB는 MyISAM과 달리 원자성 즉, TCL 들을 지원해 Commit, Rollback 등 데이터 원자성과 무결성이 보장되며, 보통 우리가 알고있는 데이터베이스의 역할을 다한다. 하지만 그만큼 시스템 리소스를 많이 사용한다.

 

난 엔진에 대해 무지했었고, 다행히도 default가 InnoDB로 설정되어있어서 인지 frm과 ibd 파일이 남아있었다.

frm 파일은 테이블 구조에 대한 정보, ibd는 테이블 내 데이터에 대한 정보들이 저장되어있다.

다행히도 dbsake라는 프로그램으로 복구가 가능하다는 글을 보았고,

xinet.kr/?p=2611

 

innodb frm ibd 파일 가지고 복구하기 ( dbsake frm 추출)

뭐 사람이 실수를 할수도 있다고 하지만 운영중인 데이터베이스가 innodb로 운영되고 있다다행히 innodb_file_per_table 옵션이 활성화 되어 있어서 각 테이블당 ibd 파일이 있다근데 내가 모르고 ibdata1

xinet.kr

 

성공적으로 데이터를 복구했다.. 정말 누군가에게는 의미 없을지 모르지만, 나름 1년 넘게 모은 데이터라 소중했었기 때문에 조마조마했다 ㅠㅠ

 

* 함부로 인스턴스를 강제종료하지말자..

* 데이터베이스는 주기적으로 백업해두자..