체스 게임 미션을 진행 중에 노트북이 퍽 하더니 블루스크린을 띄웠다.
어느 정도 시간이 지나니 다행히 재시작되었지만 문제는 다른데 있었다.
체스 게임과 연동하여 사용하던 ChessBoard와 ChessGame, User 테이블이 보이지 않았다.
설마 하며 ChessBoard에 select 쿼리를 날려 보았더니 테이블이 존재하지 않는다는 에러가 출력된다.
쿼리를 통해서도 테이블이 존재하지 않음을 확인한 셈이다.
도커를 사용해 작업중이었기 때문에 재시작하는 과정에서 테이블이 삭제되었다고 생각했다.
테이블에 딱히 중요한 정보가 없었기 때문에 '아쉽지만 그냥 다시 만들면 되지'라는 생각으로 create table 쿼리를 실행했다.
이번엔 또 있단다.
이게 도대체 뭔소린가 하며 살짝 머리가 아파올 즈음에 두 에러 메시지의 차이점을 발견했다.
select문을 통해 발생한 에러는 'Table 이 존재하지 않는다'였지만 create문에서의 에러 메시지는 'Tablespace가 존재한다.'였다.
Table은 알겠는데 Tablespace는 처음 듣는 용어였다. Tablespace가 도대체 무엇일까?
테이블스페이스(Tablespace)
간단히 말하면 DB에서 실제 데이터를 저장하는 공간이다.
MySQL에서 tablespace는 InnoDB 스토리지 엔진에서 사용되는 개념으로, 물리적인 디스크 공간을 논리적인 데이터 저장 단위로 매핑하는 역할을 담당한다.
각 테이블에 대해 하나의 tablespace를 생성하며, 해당 테이블의 데이터와 인덱스를 저장하고, 데이터 파일의 크기 조정 및 위치 변경, 데이터 복구 등의 작업을 수행한다.
이렇게 테이블스페이스는 우리가 사용하는 테이블들의 실제 저장 장소라고 생각하면 되는데, 콘솔을 통해 테이블을 삭제하더라도 어떠한 오류에 의해 테이블스페이스가 삭제되지 않았다면 사실상 해당 테이블의 실 데이터는 존재하는 상황이다. (사실 손상되었을 경우가 크다.)
이러한 경우, 완전한 삭제와 테이블 복구의 두 가지 방식을 시도할 수 있는데, 나는 이미 다른 테이블을 만들어 작업을 마저 진행했기 때문에 파일을 삭제하는 방향을 선택했다. 테이블스페이스를 삭제하는 방법은 간단하다. 데이터를 실제 저장하고 있는 디렉터리에서 확장자가. ibd인 파일을 삭제하면 된다. 나의 경우에는 도커를 사용해서 해당 컨테이너의 data 디렉터리에 위치해 있었다.
테이블스페이스 파일이 손상되지 않았다면 원래의 테이블을 복구하는 것도 이론상 가능하다고 한다.
직접 시도해 보는 것도 나름의 공부가 되겠지만 아직 MySQL의 구조에 대해서 파고들기에는 준비되지 않았다는 생각이 들어 테이블의 복구 과정은 GPT선생님의 도움을 받아 보았다.
생각보다 해당 오류에 대해 설명한 글이 없어 완전 초간단하게 해결 과정을 작성해 보았다.
사실 컴퓨터가 재부팅되는 과정에서 어떤 문제로 인해 테이블만 사라졌는지 아직 이해가 가지 않기 때문에 이후에도 비슷한 상황이 발생하면 조금씩 더 내용을 추가해 볼 생각이다.