운영 환경에서 MySQL 테이블이 갑자기 깨지는 문제는 서비스 중단으로 이어질 수 있는 심각한 장애입니다. 이번 글에서는 실제로 운영하던 MySQL 환경에서 gojizone_id 테이블이 손상되며 발생한 장애를 어떻게 진단하고 복구했는지 과정 전체를 정리합니다.
로그 내용은
251119 15:30:36 [ ERROR] /usr/libexec/mysqld: Table './gojizone_db/gojizone_id' is marked as crashed and last (automatic?) repair failed 에러 관련 내용 정리
평소처럼 서비스 로그를 점검하던 중, MySQL 에러 로그(/var/log/mysqld.log)에서 다음과 같은 메시지가 발견되었습니다.
[ERROR] /usr/libexec/mysqld: Table './gojizone_db/gojizone_id' is marked as crashed and last (automatic?) repair failed
이는 MyISAM 테이블이 손상되었고 자동 복구까지 실패했다는 의미입니다. 즉, 수동 복구가 필요한 상황이었습니다.
복구를 시작하기 전에 실제 테이블 파일(gojizone_id.MYD, gojizone_id.MYI, gojizone_id.frm)이 MySQL 데이터 디렉터리에 존재하는지 반드시 확인해야 합니다. 대부분의 CentOS·RHEL 기반 시스템에서는 기본 경로가 다음과 같습니다:
cd /var/lib/mysql/gojizone_db/
ls -al gojizone_id.*
위 명령을 통해 아래 세 파일이 모두 존재하는지 확인합니다:
파일이 정상적으로 존재하는 것을 확인한 후 테이블 상태 체크 및 복구 절차로 넘어갑니다.
먼저 MyISAM 테이블 상태를 확인하기 위해 myisamchk 명령어를 실행했습니다.
myisamchk gojizone_id.MYI
결과는 예상대로 테이블이 crash 상태였으며, 인덱스 관련 오류가 복구를 막고 있었습니다.
myisamchk는 MySQL이 실행 중인 상태에서 사용하면 안 됩니다.
MyISAM 테이블을 직접 파일 단위로 조작하는 명령이기 때문에, MySQL 서비스가 살아있는 상태에서 실행하면 추가 손상이 발생할 수 있습니다.
service mysqld stop
# 또는
systemctl stop mysqld
서비스가 완전히 종료되었는지 확인합니다.
ps -ef | grep mysqld
여기에서 mysqld 프로세스가 보이지 않아야 안전하게 복구를 진행할 수 있습니다.

myisamchk --recover gojizone_id.MYI
복구 도중 출력되는 메시지는 다음과 같습니다.
- recovering (with sort) MyISAM-table 'gojizone_id.MYI'
- Fixing index 1
- Fixing index 2
...
테이블 복구를 위해 아래 명령어로 강력한 복구 옵션을 적용했습니다.
myisamchk --recover gojizone_id.MYI
복구 과정에서는 다음과 같은 단계가 표시되며 디스크 I/O를 크게 사용합니다.
- recovering (with sort) MyISAM-table 'gojizone_id.MYI'
- Fixing index 1
- Fixing index 2
720070312
Data records: 720070312 → 복구 이후 실제 데이터 수 다시 계산됨
CPU 사용률과 I/O가 높게 나타났으며 테이블 크기에 따라 수 분에서 수십 분까지 소요될 수 있습니다. 복구 완료 후 메시지는 아래와 같습니다.
Data records: 720070312
복구가 정상적으로 끝났다면 MySQL 서비스를 다시 시작합니다.
service mysqld start
# 또는
systemctl start mysqld
MySQL 재시작 후 테이블 SELECT 테스트를 진행합니다.
mysql -u root -p
USE gojizone_db;
SELECT COUNT(*) FROM gojizone_id;
정상적인 데이터 건수가 출력되면 복구가 성공적으로 완료된 것입니다.
복구 작업이 끝난 후 MySQL을 통해 테이블 접근 테스트를 진행했습니다.
SELECT COUNT(*) FROM gojizone_id;
데이터 조회가 정상적으로 이루어졌으며 애플리케이션에서도 오류 없이 데이터를 불러오는 것을 확인했습니다.
이번 장애의 원인은 MyISAM 엔진의 구조적 특성(락 기반, 장애 시 인덱스 손상 가능성)에 따른 테이블 손상으로 추정됩니다.
gojizone_id 테이블이 손상되어 서비스 오류가 발생했으며, myisamchk 복구 작업을 통해 정상적으로 복구 완료하였습니다.
운영 환경에서 MyISAM 사용 시 테이블 손상은 언제든지 발생할 수 있으므로, 복구 절차를 숙지하고 정기 백업을 유지하는 것이 중요합니다.
| 리눅스 atop 설치 및 사용법 서버 성능 모니터링 최강 툴 (2) | 2025.09.22 |
|---|---|
| 리눅스 에러 로그 확인과 문제 해결 (0) | 2025.09.12 |
| Rocky Linux / RHEL / CentOS root 패스워드 분실 시 초기화 (0) | 2025.09.10 |
| 리눅스 서버 해킹 당했을 때 pstree 명령어로 숨은 악성 프로세스 찾는 법 (0) | 2025.09.05 |
| 지원 종료(EOL)된 CentOS 6에서 YUM 안될때 다시 사용하는 방법 (0) | 2025.09.04 |