14.19.3 InnoDB 데이터 사전 작업 문제 해결
테이블 정의에 대한 정보는 .frm
파일 및 InnoDB 데이터 사전 에 모두 저장됩니다. .frm
파일을 이리저리 이동하고 데이터 사전 작업 중에 서버가 충돌 할 때 이러한 정보의 소스에 일관성이 없어 질 수 있습니다.
데이터 사전의 파손이나 일관성의 문제로 InnoDB
를 시작할 수없는 경우 수동 복구에 관한 정보, 섹션 14.19.2 "InnoDB 복구 강제 실행" 을 참조하십시오.
CREATE TABLE에서의 문제
동기화되지 않은 데이터 사전의 하나의 현상으로 CREATE TABLE
문이 실패하는 것을들 수 있습니다. 이것이 발생하면 서버 오류 로그를 확인하십시오. 그 로그에 InnoDB
내부 데이터 사전의 내부에 테이블이 이미 존재하는 것으로 표시된 경우, InnoDB
테이블 스페이스 파일 내부에 해당 .frm
파일이없는 고립 된 테이블이 있습니다. 오류 메시지는 다음과 같습니다.
InnoDB : Error : table test / parent already exists in InnoDB internal InnoDB : data dictionary. Have you deleted the .frm file InnoDB : and not used DROP TABLE? Have you used DROP DATABASE InnoDB : for InnoDB tables in MySQL version <= 3.23.43? InnoDB : See the Restrictions section of the InnoDB manual. InnoDB : You can drop the orphaned table inside InnoDB by InnoDB : creating an InnoDB table with the same name in another InnoDB : database and moving the .frm file to the current database. InnoDB : Then MySQL thinks the table exists, and DROP TABLE will InnoDB : succeed.
이 고립 된 테이블은 오류 메시지에 표시된 단계를 수행하여 삭제할 수 있습니다. 그래도 DROP TABLE
을 성공적으로 사용할 수없는 경우, 그 문제의 원인은 mysql 클라이언트에서 이름 보완이 될 수 있습니다. 이 문제를 해결하려면 --skip-auto-rehash
옵션을 사용하여 mysql 클라이언트를 시작하고 DROP TABLE
을 다시 시도합니다. (이름 보완이 켜져 있으면, mysql은 테이블 이름의 목록을 구축하려고합니다, 지금 설명한 바와 같은 문제가 존재하면 실패합니다.)
테이블을 열 때의 문제
동기화되지 않은 데이터 사전의 또 다른 현상으로 MySQL에서 .InnoDB
파일을 열 수 없다는 오류가 출력됩니다.
ERROR 1016 : Can not open file : 'child2.InnoDB'(errno : 1)
오류 로그에 다음과 같은 메시지를 찾을 수 있습니다.
InnoDB : Can not find table test / child2 from the internal data dictionary InnoDB : of InnoDB though the .frm file for the table exists. Maybe you InnoDB : have deleted and recreated InnoDB data files but have forgotten InnoDB : to delete the corresponding .frm files of InnoDB tables?
이것은 InnoDB
내부에 대응하는 테이블이없는 고아 .frm
파일이 존재하는 것을 나타냅니다. 이 고립 된 .frm
파일은 수동으로 제거하여 삭제할 수 있습니다.
고립 된 중간 테이블
ALTER TABLE
연산 동안 MySQL이 충돌하는 경우는 고립 된 중간 테이블이 남게 될 수 있습니다. 중간 테이블 이름은 '# sql- "로 시작합니다. 데이터 디렉토리에는 #sql-*.ibd
파일을 찾을 것 외에 부수적 #sql-*.frm
파일도있을 수 있습니다. 중간 테이블은 또한 테이블 모니터 의 출력에도 표시되어 InnoDB
INFORMATION_SCHEMA
테이블에서 참조됩니다.
고립 된 중간 테이블을 삭제하려면 #sql-*.ibd
파일에 정의 된 테이블 스키마에 일치하는 테이블 형식 파일 ( .frm
파일)가 필요합니다 (컬럼과 인덱스가 동일해야합니다) . 충돌이 ALTER TABLE
작업 중 언제 발생했는지에 따라 고립 된 #sql-*.ibd
파일에는 ALTER
전에 또는 ALTER
뒤의 스키마 정의가 존재할 가능성이 동반 #sql-*.frm
파일 (있는 경우)의 데이터도 일치하는 경우와 일치하지 않을 수 있습니다.
고립 된 중간 테이블을 삭제하려면 다음 단계를 수행합니다.
#sql-*.ibd
파일에ALTER
전에 또는ALTER
뒤의 두 스키마 정의가 존재하는지 여부를 판정합니다. 중간 테이블의 컬럼과 인덱스는 테이블 모니터 를 사용하여 또는InnoDB
INFORMATION_SCHEMA
테이블을 쿼리하여 볼 수 있습니다.INNODB_SYS_TABLES
중간 테이블의TABLE_ID
을 제공합니다. 이것을 사용하면INNODB_SYS_COLUMNS
및INNODB_SYS_INDEXES
에서 컬럼과 인덱스 정보를 얻을 수 있습니다.#sql-*.ibd
파일에ALTER
전에 또는ALTER
뒤의 두 스키마 정의가 존재하는지 여부를 판정하면 일치하는#sql-*.frm
파일을 다른 데이터베이스 디렉토리에 만듭니다. 예를 들어, 중간 테이블에ALTER
뒤의 스키마 정의가 존재하는 경우, 변경된 스키마 정의에 일치하는.frm
파일을 만듭니다.mysql> CREATE TABLE tmp LIKE employees.salaries; ALTER TABLE tmp DROP COLUMN to_date; Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.06 sec) Records : 0 Duplicates : 0 Warnings : 0
.frm
파일을 분리 된 테이블이있는 데이터베이스 디렉토리에 복사하고 그 이름을#sql-*.ibd
파일의 이름과 일치하도록 변경합니다.shell> cp tmp.frm employees / # sql-ib87.frm
테이블 이름에 접두어
#mysql50#
을 붙이고 테이블 이름을 역 인용 부호로 둘러싼DROP TABLE
문을 발행하여 중간 테이블을 삭제합니다. 예 :mysql> DROP TABLE`# mysql50 ## sql-ib87`; Query OK, 0 rows affected (0.01 sec)
#mysql50#
의 프리픽스는 MySQL 5.1에서 도입 된file name safe encoding
을 무시하도록 MySQL에 지시합니다. 테이블 이름을 역 인용 부호로 둘러싸는 「#」등의 특수 문자가 포함 된 테이블 이름에 대해 SQL 문을 실행하는 데 필요합니다.나머지
#sql-*.frm
파일이 존재하는 경우는 그것을 삭제합니다. MySQL이 "알 수없는 테이블 '오류를보고하지만, 이것은 무시할 수 있습니다.mysql> DROP TABLE`# mysql50 ## sql-36ab_2`; ERROR 1051 (42S02) : Unknown table 'employees # mysql50 ## sql-36ab_2'
테이블 스페이스를 찾을 수없는 문제
innodb_file_per_table
가 활성화되어 있으면 .frm
또는 .ibd
파일 (또는 둘 다)가없는 경우 다음 메시지가 생성 될 수 있습니다.
InnoDB : in InnoDB data dictionary has TABLESPACE ID N
,
InnoDB : but tablespace with that id or name does not exist. Have
InnoDB : you deleted or moved .ibd files?
InnoDB : This may also be a table created with CREATE TEMPORARY TABLE
InnoDB : whose .ibd and .frm files MySQL automatically removed, but the
InnoDB : table still exists in the InnoDB internal data dictionary.
이것이 발생한 경우 문제를 해결하기 위해 다음 단계를 수행하십시오.
일치하는
.frm
파일을 어딘가 다른 데이터베이스 디렉토리에 만들고 그것을 고립 된 테이블이있는 데이터베이스 디렉토리에 복사합니다.원래 테이블에 대해
DROP TABLE
을 발행합니다. 그러면 테이블이 성공적으로 제거되고,InnoDB
하여.ibd
파일을 찾을 수 없다는 경고가 오류 로그에 기록 될 것입니다.