2.11.4 테이블 또는 인덱스를 다시 만들거나 복구
이 섹션에서는 데이터 형식 또는 문자 집합의 처리 방법에 대한 MySQL의 변경된 테이블 재구성 방법을 설명합니다. 예를 들어, 데이터 정렬 오류가 수정되어 그 데이터 정렬을 사용하는 문자 컬럼의 인덱스를 업데이트하기 위해 테이블 재구성이 필요할 수 있습니다. (예를 들어, 섹션 2.11.3 "테이블 또는 인덱스 재구성이 필요한지 확인" 을 참조하십시오.) CHECK TABLE
, mysqlcheck 또는 mysql_upgrade에 의해 실행되는 같은 테이블 확인 작업에 표시된대로 테이블을 복구하거나 업그레이드해야하는 경우가 있습니다.
테이블을 다시 작성하는 방법은 테이블을 덤프하고 다시로드하는 방법과 ALTER TABLE
또는 REPAIR TABLE
을 사용하는 방법이 있습니다. REPAIR TABLE
은 MyISAM
, ARCHIVE
및 CSV
의 각 테이블에만 적용됩니다.
바이너리 (in-place) 업그레이드 또는 다운 그레이드 후 MySQL의 다른 버전이 테이블을 처리하지 않기 때문에 테이블을 다시 작성하는 경우 덤프하고 다시로드하는 방법을 사용해야합니다. 업그레이드 또는 다운 그레이드 전에 원래 버전의 MySQL을 사용하여 테이블을 덤프합니다. 다음은 업그레이드 또는 다운 그레이드 후에 테이블을 다시로드합니다.
인덱스를 다시 작성하는 목적만을위한 덤프하고 다시로드하는 방법을 사용하여 테이블을 재구성하는 경우 업그레이드 또는 다운 그레이드하기 전이나 후에도 덤프를 실행할 수 있습니다. 그 경우에도 장전 후에 실시해야합니다.
테이블을 덤프하고 다시로드하여 다시 구축하려면 mysqldump를 사용하여 덤프 파일을 생성하고 mysql에서 파일을 다시로드합니다.
shell>mysqldump db_name t1 > dump.sql
shell>mysql db_name < dump.sql
단일 데이터베이스의 모든 테이블을 재구성하는 경우, 데이터베이스 이름을 그 뒤에 테이블 이름없이 지정합니다.
shell>mysqldump db_name > dump.sql
shell>mysql db_name < dump.sql
모든 데이터베이스의 모든 테이블을 다시로드하려면 --all-databases
옵션을 사용하십시오.
shell>mysqldump --all-databases > dump.sql
shell>mysql < dump.sql
ALTER TABLE
로 테이블을 다시 작성하는 경우는 "null"변경을 사용합니다. 즉 이미 사용하고있는 스토리지 엔진을 사용하도록 테이블을 "변경"하는 ALTER TABLE
문입니다. 예를 들어, t1
이 InnoDB
테이블 인 경우 다음 문을 사용합니다.
mysql> ALTER TABLE t1 ENGINE = InnoDB;
ALTER TABLE
문에서 지정한 스토리지 엔진을 모르는 경우, SHOW CREATE TABLE
을 사용하여 테이블 정의를 표시합니다.
CHECK TABLE
조작으로 테이블의 업그레이드가 필요하다는 것을 표시하는 데 InnoDB
테이블을 재구성 할 필요가있는 경우는 전술 한 바와 같이 mysqldump를 사용하여 덤프 파일을 생성하고 mysql에서 파일을 다시로드 합니다. CHECK TABLE
조작에 손상이있는 것으로 나타났습니다하거나 InnoDB
가 실패 할 경우 innodb_force_recovery
옵션을 사용하여 InnoDB
를 다시 시작하는 방법 섹션 14.19.2 "InnoDB 복구 강제 실행" 를 참조하십시오. CHECK TABLE
이 발생하고있는 문제의 유형을 이해하려면 섹션 13.7.2.2 "CHECK TABLE 구문」 의 InnoDB
에 대한 참고를 참조하십시오.
MyISAM
, ARCHIVE
또는 CSV
테이블은 테이블 확인 작업에 손상이 있는지와 업그레이드가 필요하다는 내용이 포함 된 경우 REPAIR TABLE
을 사용할 수 있습니다. 예를 들어, MyISAM
테이블을 복구하려면 다음 문을 사용합니다.
mysql> REPAIR TABLE t1;
mysqlcheck --repair 명령 행에서 REPAIR TABLE
문에 대한 액세스를 제공합니다. --databases
옵션 또는 --all-databases
옵션을 각각 사용하여 특정 데이터베이스 또는 모든 데이터베이스의 모든 테이블을 복구 할 수 있기 때문에 테이블 복구 방법으로 더 편리한 경우가 있습니다.
shell>mysqlcheck --repair --databases db_name ...
shell>mysqlcheck --repair --all-databases
MySQL 5.1.24에서 Bug # 27877에 대한 수정 ( utf8_general_ci
및 ucs2_general_ci
데이터 정렬을 수정했습니다)에 의해 도입 된 비 호환성은 MySQL 5.1.62,5.5.21 및 5.6.5에서 해결 방법을 구현 되어 있습니다. 이들 중 하나의 버전으로 업그레이드 한 후 영향을받는 각 테이블을 다음 방법 중 하나를 사용하여 변환합니다. 어떤 경우에도 해결 방법은 영향을받는 열을 utf8_general_mysql500_ci
및 ucs2_general_mysql500_ci
데이터 정렬을 사용하도록 변경할 수 있습니다. 이 데이터 정렬은 원래 5.1.24 이전 utf8_general_ci
및 ucs2_general_ci
순서를 유지합니다.
테이블 파일을 그대로 남겨 바이너리 업그레이드 후 영향을받는 테이블을 변환하려면 새로운 데이터 정렬을 사용하도록 테이블을 변경합니다. 테이블
t1
에 하나 이상의 문제가있는utf8
컬럼이 있다고합니다. 테이블을 테이블 수준에서 변환하려면 다음과 같은 명령문을 사용합니다.ALTER TABLE t1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_mysql500_ci;
컬럼 별 기반으로 변경을 적용하려면 다음과 같은 명령문을 사용합니다 (
COLLATE
절을 제외하고 먼저 지정되어 컬럼 정의를 반드시 반복합니다).ALTER TABLE t1 MODIFY c1 CHAR (N) CHARACTER SET utf8 COLLATE utf8_general_mysql500_ci;
덤프하고 다시로드하는 방법을 사용하여 테이블을 업그레이드하는 경우, mysqldump를 사용하여 테이블을 덤프하고 덤프 파일에서
CREATE TABLE
문을 새로운 데이터 정렬을 사용하도록 변경하여 테이블을 다시로드 합니다.
적절한 변경을하면 CHECK TABLE
은 오류를보고하지 않는 것입니다.