• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 1. InnoDB 소개
    2. InnoDB의 개념과 아키텍처
    3. InnoDB 구성
    4. InnoDB 관리
    5. InnoDB 테이블 스페이스 관리
    6. InnoDB 테이블 관리
    7. InnoDB 압축 테이블
    8. InnoDB 파일 형식 관리
    9. InnoDB Row Storage and Row Formats
    10. InnoDB 디스크 I/O 및 파일 영역 관리
    11. InnoDB와 온라인 DDL
    12. InnoDB 부팅 옵션 및 시스템 변수
    13. InnoDB의 성능
    14. InnoDB INFORMATION_SCHEMA 테이블
    15. InnoDB 모니터
    16. InnoDB 백업 및 복구
    17. InnoDB와 MySQL 복제
    18. InnoDB 및 memcached의 통합
    19. InnoDB 문제 해결
    1. InnoDB의 I/O 문제 해결
    2. InnoDB 복구 강제 실행
    3. InnoDB 데이터 사전 작업 문제 해결
    4. InnoDB 오류 처리
    5. InnoDB 오류 코드
    6. 운영 체제 오류 코드
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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 M​​ySQL 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 파일 (있는 경우)의 데이터도 일치하는 경우와 일치하지 않을 수 있습니다.

고립 된 중간 테이블을 삭제하려면 다음 단계를 수행합니다.

  1. #sql-*.ibd 파일에 ALTER 전에 또는 ALTER 뒤의 두 스키마 정의가 존재하는지 여부를 판정합니다. 중간 테이블의 컬럼과 인덱스는 테이블 모니터 를 사용하여 또는 InnoDB INFORMATION_SCHEMA 테이블을 쿼리하여 볼 수 있습니다. INNODB_SYS_TABLES 중간 테이블의 TABLE_ID 을 제공합니다. 이것을 사용하면 INNODB_SYS_COLUMNS 및 INNODB_SYS_INDEXES 에서 컬럼과 인덱스 정보를 얻을 수 있습니다.

  2. #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 
  3. .frm 파일을 분리 된 테이블이있는 데이터베이스 디렉토리에 복사하고 그 이름을 #sql-*.ibd 파일의 이름과 일치하도록 변경합니다.

      shell> cp tmp.frm employees / # sql-ib87.frm 
  4. 테이블 이름에 접두어 #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 문을 실행하는 데 필요합니다.

  5. 나머지 #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.

이것이 발생한 경우 문제를 해결하기 위해 다음 단계를 수행하십시오.

  1. 일치하는 .frm 파일을 어딘가 다른 데이터베이스 디렉토리에 만들고 그것을 고립 된 테이블이있는 데이터베이스 디렉토리에 복사합니다.

  2. 원래 테이블에 대해 DROP TABLE 을 발행합니다. 그러면 테이블이 성공적으로 제거되고, InnoDB 하여 .ibd 파일을 찾을 수 없다는 경고가 오류 로그에 기록 될 것입니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved