DB

[MySQL] REPAIR TABLE 완벽 가이드 사용법(테이블 복구)

인생아 2025. 1. 7. 23:32
반응형

MySQL REPAIR TABLE은 손상된 MyISAM 테이블을 복구하는 데 사용되는 중요한 명령어입니다. 데이터베이스를 운영하다 보면 테이블이 손상되거나 잘못된 상태가 될 수 있습니다. 이러한 문제를 해결하기 위해 REPAIR TABLE 명령어를 활용하면 데이터의 안정성과 무결성을 유지할 수 있습니다.

REPAIR TABLE이란?

REPAIR TABLE은 MySQL에서 제공하는 명령어로, 주로 MyISAM 스토리지 엔진을 사용하는 테이블에서 손상된 데이터를 복구하기 위해 사용됩니다. 이는 테이블의 구조나 데이터 파일이 손상되었을 때, 복구를 시도하여 데이터 무결성을 유지할 수 있도록 돕습니다.

REPAIR TABLE의 주요 기능

  1. 테이블 손상 복구: 데이터 파일 또는 인덱스 파일의 손상된 부분을 복구합니다.
  2. 인덱스 재구성: 손상된 인덱스를 복구하거나 다시 생성합니다.
  3. 데이터 무결성 유지: 손상된 데이터를 복구함으로써 테이블의 무결성을 보장합니다.

기본 문법

REPAIR TABLE table_name [QUICK | EXTENDED | USE_FRM];
  • table_name: 복구할 테이블의 이름입니다.
  • QUICK: 데이터 파일을 건드리지 않고 인덱스만 복구합니다.
  • EXTENDED: 데이터를 재구성하면서 인덱스를 복구합니다. 시간이 오래 걸릴 수 있습니다.
  • USE_FRM: .frm 파일을 기반으로 테이블을 복구합니다.
반응형

REPAIR TABLE 사용 시점

  • 서버 충돌이나 강제 종료로 인해 테이블이 손상된 경우.
  • 테이블이 비정상적으로 작동하거나 데이터 검색이 실패하는 경우.
  • 인덱스가 손상된 경우.

REPAIR TABLE 사용 예제

기본 사용

REPAIR TABLE orders;

위 명령어는 orders 테이블을 복구합니다.

QUICK 옵션 사용

REPAIR TABLE orders QUICK;

인덱스만 복구하며, 데이터 파일은 건드리지 않습니다.

EXTENDED 옵션 사용

REPAIR TABLE orders EXTENDED;

데이터 파일과 인덱스를 모두 복구하며, 시간이 오래 걸릴 수 있습니다.

USE_FRM 옵션 사용

REPAIR TABLE orders USE_FRM;

.frm 파일을 기준으로 테이블을 복구합니다. 이 옵션은 데이터 파일이 심각하게 손상된 경우에 유용합니다.

반응형

REPAIR TABLE의 결과 출력

REPAIR TABLE orders;

출력 예시:

Msg_text

Table Op Msg_type Msg_text
mydb.orders repair status OK
  • Table: 복구된 테이블의 이름.
  • Op: 수행된 작업(여기서는 repair).
  • Msg_type: 메시지 유형(상태, 경고, 오류 등).
  • Msg_text: 작업 결과 메시지.
반응형

REPAIR TABLE 동작 방식

  1. MyISAM 테이블 복구: 손상된 데이터를 복구하고, 필요시 인덱스를 재구성합니다.
  2. 잠금 설정: 테이블이 복구되는 동안 읽기 또는 쓰기 작업이 차단됩니다.
  3. 데이터 무결성 확인: 복구 후 데이터가 정상적으로 작동하는지 확인합니다.

고급 사용 사례

복수 테이블 복구

여러 테이블을 한 번에 복구할 수 있습니다.

REPAIR TABLE orders, customers;

전체 데이터베이스 복구

데이터베이스 내 모든 MyISAM 테이블을 복구하려면 아래와 같이 스크립트를 사용할 수 있습니다.

SELECT CONCAT('REPAIR TABLE ', table_name, ';') AS query
FROM information_schema.tables
WHERE table_schema = 'my_database' AND engine = 'MyISAM';

생성된 쿼리를 실행하여 모든 테이블을 복구할 수 있습니다.

자동화된 복구 스크립트

복구 작업을 정기적으로 수행하려면 프로시저를 생성할 수 있습니다.

DELIMITER //
CREATE PROCEDURE repair_all_tables()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE tbl_name VARCHAR(255);
  DECLARE tbl_cursor CURSOR FOR 
    SELECT table_name 
    FROM information_schema.tables 
    WHERE table_schema = DATABASE() AND engine = 'MyISAM';
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN tbl_cursor;
  read_loop: LOOP
    FETCH tbl_cursor INTO tbl_name;
    IF done THEN
      LEAVE read_loop;
    END IF;
    SET @query = CONCAT('REPAIR TABLE ', tbl_name);
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  END LOOP;
  CLOSE tbl_cursor;
END //
DELIMITER ;
CALL repair_all_tables();
반응형

REPAIR TABLE 사용 시 주의사항

  1. 스토리지 엔진 제한: MyISAM 테이블에서만 사용할 수 있습니다. InnoDB 테이블에는 사용되지 않습니다.
  2. 백업 권장: 복구 과정에서 데이터 손실이 발생할 수 있으므로, 작업 전 반드시 백업을 수행해야 합니다.
  3. 성능 문제: 테이블 크기가 클수록 복구 시간이 오래 걸릴 수 있습니다.
  4. 데이터 손실 가능성: 심각하게 손상된 경우 일부 데이터가 복구되지 않을 수 있습니다.

REPAIR TABLE과 다른 명령어 비교

  • CHECK TABLE: 테이블의 무결성을 검사합니다.
  • OPTIMIZE TABLE: 테이블의 디스크 공간을 회수하고 인덱스를 최적화합니다.
  • ANALYZE TABLE: 인덱스 분포를 분석하여 쿼리 성능을 향상시킵니다.

공식 가이드문서

MySQL 공식 문서 : https://dev.mysql.com/doc/refman/8.0/en/

 

반응형