서론
최근 MariaDB 10.4.19 버전에서 ERROR 1932 (42S02): Table 'mysql.innodb_table_stats' doesn't exist in engine 오류를 겪었다. 이 오류는 InnoDB 스토리지 엔진에서 해당 테이블을 찾지 못할 때 발생하며, 운영 중인 DBMS였기 때문에 중단하지 않고 해결하는 방법이 필요했다. 이 글에서는 이 오류를 중단 없이 해결한 방법을 정리해본다.
문제 상황
테이블을 조회하려고 할 때 아래와 같은 오류가 발생했다.
MariaDB [(none)]> SELECT * FROM mysql.innodb_table_stats;
ERROR 1932 (42S02): Table 'mysql.innodb_table_stats' doesn't exist in engine
이 오류는 주로 테이블 파일이 손상되었거나 누락되었을 때 발생한다. 운영 중인 DBMS의 중단은 서비스에 치명적으로 영향을 줄 수 있기 때문에 중단 없이 복구하는 것이 중요하다.
복구 과정
테이블 파일 백업
먼저 MariaDB 데이터 파일이 저장되어 있는 디렉토리에서 오류가 발생한 테이블 파일을 안전한 위치에 백업한다.
# cp mysql/innodb_table_stats.* /opt/
복구 작업 중 예기치 못한 문제가 발생할 경우를 대비해 백업해 두는 것이 중요하다. 복구가 정상적으로 완료된 후에는 이 파일을 삭제해도 된다.
테이블 삭제
복구를 위해 문제가 발생한 데이터베이스에서 테이블을 삭제한다.
MariaDB [(none)]> DROP TABLE mysql.innodb_table_stats;
Query OK, 0 rows affected, 1 warning (0.010 sec)
테이블 파일 삭제
데이터베이스에서 삭제한 테이블의 테이블 파일을 삭제한다.
# rm mysql/innodb_table_stats.ibd
rm: remove regular file ‘mysql/innodb_table_stats.ibd’? y
복구
mysql_upgrade 명령어는 MariaDB 업그레이드 과정에서 발생할 수 있는 호환성 문제를 해결하고, 데이터베이스 및 시스템 테이블의 구조를 최신 상태로 유지하기 위해 사용된다. 이 명령어는 테이블 구조를 점검하고 필요한 경우 재생성하는 작업을 수행한다. 특히 시스템 테이블에 문제가 발생한 경우 mysql_upgrade는 해당 테이블을 다시 생성하거나 복구해 오류를 해결할 수 있다. 이 과정에서 DBMS를 재시작하지 않아도 되므로 서비스 중단 없이 테이블을 복구할 수 있다는 장점이 있다.
다음 명령어를 통해 mysql_upgrade를 실행한다.
# mysql_upgrade --force
--force 옵션을 사용하면 이미 업그레이드 된 테이블이 있더라도 강제로 다시 검사 및 업그레이드를 수행한다. 그 외 옵션은 MariaDB에 접속할 때 사용하는 옵션들과 동일하게 사용하면 된다.
복구 확인
테이블이 정상적으로 조회되는지 확인한다.
MariaDB [(none)]> SELECT * FROM mysql.innodb_table_stats;
+---------------+------------+---------------------+--------+----------------------+--------------------------+
| database_name | table_name | last_update | n_rows | clustered_index_size | sum_of_other_index_sizes |
+---------------+------------+---------------------+--------+----------------------+--------------------------+
| TESTDB | test_table | 2024-11-06 01:01:52 | 177151 | 6032 | 4864 |
+---------------+------------+---------------------+--------+----------------------+--------------------------+
1 row in set (0.001 sec)
mysql_upgrade 명령어는 MariaDB 시스템 테이블과 데이터베이스 구조를 점검하고 복구하는 데 유용한 도구이다. 이 명령어를 통해 Table doesn't exist in engine 오류와 같은 시스템 테이블 관련 문제를 DBMS를 중단하지 않고 해결할 수 있다. 하지만 운영 중인 서비스에서는 작업 도중 예기치 못한 상황이 발생할 가능성이 있으므로 반드시 백업을 수행하고 신중하게 작업을 진행해야 한다.