웹사이트 검색

MySQL에서 손상된 테이블을 수정하는 방법


소개

경우에 따라 MySQL 테이블이 손상될 수 있습니다. 즉, 오류가 발생하여 테이블에 저장된 데이터를 읽을 수 없게 됩니다. 손상된 테이블에서 읽으려고 하면 일반적으로 서버 충돌이 발생합니다.

손상된 테이블의 몇 가지 일반적인 원인은 다음과 같습니다.

  • MySQL 서버가 쓰기 도중에 중지됩니다.
  • 외부 프로그램은 서버에서 동시에 수정되는 테이블을 수정합니다.
  • 머신이 예기치 않게 종료되었습니다.
  • 컴퓨터 하드웨어에 오류가 발생했습니다.
  • MySQL 코드 어딘가에 소프트웨어 버그가 있습니다.

테이블 중 하나가 손상되었다고 의심되는 경우 문제를 해결하거나 테이블 수정을 시도하기 전에 데이터 디렉터리를 백업해야 합니다. 이렇게 하면 데이터 손실 위험을 최소화하는 데 도움이 됩니다.

먼저 MySQL 서비스를 중지합니다.

  1. sudo systemctl stop mysql

참고: Rocky Linux와 같은 일부 플랫폼에서는 MySQL 서비스를 mysqld로 대신 호출할 수 있습니다.

그런 다음 모든 데이터를 새 백업 디렉터리에 복사합니다. Ubuntu 시스템에서 기본 데이터 디렉토리는 /var/lib/mysql/입니다.

  1. cp -r /var/lib/mysql /var/lib/mysql_bkp

백업을 만든 후에는 테이블이 실제로 손상되었는지 여부를 조사할 준비가 된 것입니다. 테이블이 MyISAM 스토리지 엔진을 사용하는 경우 MySQL을 다시 시작하고 MySQL 프롬프트에서 CHECK TABLE 문을 실행하여 손상 여부를 확인할 수 있습니다.

  1. sudo systemctl start mysql
  1. CHECK TABLE table_name;

손상 여부를 알려주는 메시지가 이 명령문의 출력에 나타납니다. MyISAM 테이블이 실제로 손상된 경우 일반적으로 REPAIR TABLE 문을 실행하여 복구할 수 있습니다.

  1. REPAIR TABLE table_name;

복구가 성공적이라고 가정하면 출력에 다음과 같은 메시지가 표시됩니다.

Output
+--------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------------+--------+----------+----------+ | database_name.table_name | repair | status | OK | +--------------------------+--------+----------+----------+

테이블이 여전히 손상된 경우 MySQL 문서는 손상된 테이블을 복구하기 위한 몇 가지 대체 방법을 제안합니다.

반면 손상된 테이블이 InnoDB 스토리지 엔진을 사용하는 경우 이를 복구하는 프로세스가 달라집니다. InnoDB는 버전 8.0부터 MySQL의 기본 스토리지 엔진이며 자동화된 손상 검사 및 복구 작업을 제공합니다. InnoDB는 읽는 모든 페이지에서 체크섬을 수행하여 손상된 페이지를 확인하고 체크섬 불일치를 발견하면 자동으로 MySQL 서버를 중지합니다.

InnoDB에는 서버가 다시 시작될 때 대부분의 문제를 해결할 수 있는 충돌 복구 메커니즘이 있으므로 InnoDB 테이블을 복구할 필요가 거의 없습니다. 그러나 손상된 InnoDB 테이블을 재구축해야 하는 상황이 발생하는 경우 MySQL 설명서에서는 테이블 구조와 그 안에 있는 데이터를 유지하는 테이블의 논리적 백업을 사용할 것을 권장합니다. 그런 다음 테이블을 데이터베이스로 다시 로드합니다.

이를 염두에 두고 MySQL 서비스를 다시 시작하여 서버에 액세스할 수 있는지 확인하십시오.

  1. sudo systemctl restart mysql

서버가 계속 충돌하거나 액세스할 수 없는 경우 InnoDB의 force_recovery 옵션을 활성화하는 것이 도움이 될 수 있습니다. mysqld.cnf 파일을 편집하여 이를 수행할 수 있습니다. Ubuntu 및 Debian 시스템에서 이 파일은 일반적으로 etc/mysql에 있습니다. Red Hat 및 Rocky 시스템에서 이 파일은 일반적으로 /etc/my.cnf.d에 있습니다.

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 섹션에서 다음 줄을 추가합니다.

. . .
[mysqld]
. . .
innodb_force_recovery=1

파일을 저장하고 닫은 다음 MySQL 서비스를 다시 시작하십시오. 손상된 테이블에 성공적으로 액세스할 수 있으면 mysqldump 유틸리티를 사용하여 테이블 데이터를 새 파일로 덤프하십시오. 이 파일의 이름은 원하는 대로 지정할 수 있지만 여기서는 out.sql로 이름을 지정하겠습니다.

  1. mysqldump database_name table_name > out.sql

그런 다음 데이터베이스에서 테이블을 삭제합니다. MySQL 프롬프트를 다시 열지 않으려면 다음 구문을 사용할 수 있습니다.

  1. mysql -u user -p --execute="DROP TABLE database_name.table_name"

그런 다음 방금 만든 덤프 파일로 테이블을 복원합니다.

  1. mysql -u user -p < out.sql

InnoDB 스토리지 엔진은 일반적으로 이전 MyISAM 엔진보다 내결함성이 더 뛰어납니다. InnoDB를 사용하는 테이블은 여전히 손상 될 수 있지만 자동 복구 기능으로 인해 테이블 손상 및 충돌 위험이 현저히 낮습니다.