• 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 테이블
    1. 압축에 관한 InnoDB INFORMATION_SCHEMA테이블
    2. InnoDB INFORMATION_SCHEMA 트랜잭션과 잠금 테이블
    3. InnoDB INFORMATION_SCHEMA 시스템 테이블
    4. InnoDB INFORMATION_SCHEMA FULLTEXT 인덱스 테이블
    5. InnoDB INFORMATION_SCHEMA 버퍼풀 테이블
    6. InnoDB INFORMATION_SCHEMA 메트릭 테이블
    15. InnoDB 모니터
    16. InnoDB 백업 및 복구
    17. InnoDB와 MySQL 복제
    18. InnoDB 및 memcached의 통합
    19. InnoDB 문제 해결
  • 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.14.3 InnoDB INFORMATION_SCHEMA 시스템 테이블

MySQL 5.6의 시점에서는 InnoDB INFORMATION_SCHEMA 시스템 테이블을 사용하여 InnoDB 에 의해 관리되는 스키마 객체에 대한 메타 데이터를 추출 할 수 있습니다. 이 정보는 일반적으로 InnoDB 테이블과 달리 직접 쿼리 할 수없는 InnoDB 내부 시스템 테이블 ( InnoDB 데이터 사전이라고도 함)에서 가져온 것입니다. 종래부터 이러한 유형의 정보는 섹션 14.15 "InnoDB 모니터" 방법을 사용하여 InnoDB 모니터를 설정하고 SHOW ENGINE INNODB STATUS 명령의 출력을 분석하여 가져옵니다. InnoDB INFORMATION_SCHEMA 테이블의 인터페이스를 사용하면 SQL을 사용하여이 데이터를 쿼리 할 수 있습니다.

대응하는 내부 시스템 테이블이 존재하지 않는 INNODB_SYS_TABLESTATS 를 제외하고 InnoDB INFORMATION_SCHEMA 시스템 테이블은 메모리에 캐시 된 메타 데이터가 아닌 내부 InnoDB 시스템 테이블에서 직접 읽은 데이터에 채워집니다.

InnoDB INFORMATION_SCHEMA 시스템 테이블은 아래에 나열되어있는 테이블이 포함됩니다. INNODB_SYS_DATAFILES 과 INNODB_SYS_TABLESPACES 은 InnoDB file-per-table 테이블 공간 ( .ibd 파일)을 MySQL 데이터 디렉토리 이외의 장소에 작성할 수 있도록하는 CREATE TABLE 문 DATA DIRECTORY=' directory ' 어구에 대한 지원의 도입과 함께 MySQL 5.6 0.6에 추가되었습니다.

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_SYS%';
+--------------------------------------------+
| Tables_in_information_schema (INNODB_SYS%) |
+--------------------------------------------+
| INNODB_SYS_DATAFILES                       |
| INNODB_SYS_TABLESTATS                      |
| INNODB_SYS_FOREIGN                         |
| INNODB_SYS_COLUMNS                         |
| INNODB_SYS_INDEXES                         |
| INNODB_SYS_FIELDS                          |
| INNODB_SYS_TABLESPACES                     |
| INNODB_SYS_FOREIGN_COLS                    |
| INNODB_SYS_TABLES                          |
+--------------------------------------------+
 9 rows in set (0.00 sec) 

이러한 테이블 이름은 제공되는 데이터의 유형을 보여줍니다.

  • INNODB_SYS_TABLES 은 InnoDB 데이터 사전 SYS_TABLES 테이블의 정보와 동등한 InnoDB 테이블에 대한 메타 데이터를 제공합니다.

  • INNODB_SYS_COLUMNS 은 InnoDB 데이터 사전 SYS_COLUMNS 테이블의 정보와 동등한 InnoDB 테이블 컬럼에 대한 메타 데이터를 제공합니다.

  • INNODB_SYS_INDEXES 은 InnoDB 데이터 사전 SYS_INDEXES 테이블의 정보와 동등한 InnoDB 인덱스에 대한 메타 데이터를 제공합니다.

  • INNODB_SYS_FIELDS 은 InnoDB 데이터 사전 SYS_FIELDS 테이블의 정보와 동등한 InnoDB 인덱스 키 컬럼 (필드)에 대한 메타 데이터를 제공합니다.

  • INNODB_SYS_TABLESTATS 는 인 메모리 데이터 구조에서 취득 된 InnoDB 테이블에 대한 낮은 수준의 상태 정보보기를 제공합니다. 대응하는 내부 InnoDB 시스템 테이블은 없습니다.

  • INNODB_SYS_DATAFILES 은 InnoDB 데이터 사전 SYS_DATAFILES 테이블의 정보와 동등한 InnoDB 테이블 스페이스의 데이터 파일 경로 정보를 제공합니다.

  • INNODB_SYS_TABLESPACES 은 InnoDB 데이터 사전 SYS_TABLESPACES 테이블의 정보와 동등한 InnoDB 테이블 스페이스에 대한 메타 데이터를 제공합니다.

  • INNODB_SYS_FOREIGN 은 InnoDB 데이터 사전 SYS_FOREIGN 테이블의 정보와 동등한 InnoDB 테이블에 정의 된 외래 키에 대한 메타 데이터를 제공합니다.

  • INNODB_SYS_FOREIGN_COLS 은 InnoDB 데이터 사전 SYS_FOREIGN_COLS 테이블의 정보와 동등한 InnoDB 테이블에 정의 된 외래 키 컬럼에 대한 메타 데이터를 제공합니다.

InnoDB INFORMATION_SCHEMA 시스템 테이블을 TABLE_ID , INDEX_ID , SPACE 등의 필드를 통해 결합함으로써 조사 또는 모니터하려는 개체의 사용 가능한 모든 데이터를 쉽게 얻을 수 있습니다.

각 테이블의 컬럼은 InnoDB INFORMATION_SCHEMA 문서를 참조하십시오.

예 14.13 InnoDB INFORMATION_SCHEMA 시스템 테이블

이 예에서는 간단한 테이블 ( t1 )를 하나의 인덱스 ( i1 )로 사용하여 InnoDB INFORMATION_SCHEMA 시스템 테이블에서 발견 된 메타 데이터의 유형을 나타냅니다.

  1. 테스트 데이터베이스 및 테이블 t1 을 만듭니다.

    mysql> CREATE DATABASE test;
    
    mysql> USE test;
    
    mysql> CREATE TABLE t1 (
    col1 INT, 
    col2 CHAR(10), 
    col3 VARCHAR(10))
    ENGINE = InnoDB;
    
    mysql> CREATE INDEX i1 ON t1(col1);
  2. 테이블 t1 을 작성한 후 INNODB_SYS_TABLES 를 쿼리하고 test/t1 의 메타 데이터를 찾습니다.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test/t1' \G
    
    *************************** 1. row ***************************
         TABLE_ID: 71
             NAME: test/t1
             FLAG: 1
           N_COLS: 6
            SPACE: 57
      FILE_FORMAT: Antelope
       ROW_FORMAT: Compact
    ZIP_PAGE_SIZE: 0
    ...

    테이블 t1 의 TABLE_ID 는 71입니다. FLAG 필드는 테이블 형식 및 스토리지의 특성에 대한 비트 수준의 정보를 제공합니다. 6 개의 컬럼이 있고 그 중 3 개가 InnoDB 에 의해 생성 된 숨겨진 컬럼 ( DB_ROW_ID , DB_TRX_ID 및 DB_ROLL_PTR )입니다. 이 테이블 SPACE 의 ID는 57입니다 (0의 값은 테이블이 시스템 테이블 공간 내에 존재하는 것을 나타냅니다). FILE_FORMAT 은 Antelope이며, ROW_FORMAT 는 Compact입니다. ZIP_PAGE_SIZE 는 Compressed 행 형식의 테이블에만 적용됩니다.

  3. INNODB_SYS_TABLES 에서 TABLE_ID 정보를 사용하여이 테이블의 컬럼에 대한 정보를 얻기 위해 INNODB_SYS_COLUMNS 테이블을 쿼리합니다.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS where TABLE_ID = 71 \G 
    *************************** 1. row ***************************
    TABLE_ID: 71
        NAME: col1
         POS: 0
       MTYPE: 6
      PRTYPE: 1027
         LEN: 4
    *************************** 2. row ***************************
    TABLE_ID: 71
        NAME: col2
         POS: 1
       MTYPE: 2
      PRTYPE: 524542
         LEN: 10
    *************************** 3. row ***************************
    TABLE_ID: 71
        NAME: col3
         POS: 2
       MTYPE: 1
      PRTYPE: 524303
         LEN: 10

    INNODB_SYS_COLUMNS 은 TABLE_ID 와 열 NAME 이외에 각 열의 서수 위치 ( POS ) (0부터 시작 순차적으로 증가합니다) 컬럼 MTYPE 또는 "기본 형식"(6 = INT 2 = CHAR 1 = VARCHAR ) PRTYPE 또는 "정확한 유형"(MySQL 데이터 형식, 문자 세트 코드 및 NULL 가능성을 나타내는 비트를 포함한 바이너리 값) 및 컬럼의 길이 ( LEN )를 제공합니다.

  4. 다시 INNODB_SYS_TABLES 에서 TABLE_ID 정보를 사용하여 테이블 t1 과 연관된 인덱스에 대한 정보를 얻기 위해 INNODB_SYS_INDEXES 를 쿼리합니다.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = 71 \G
    *************************** 1. row ***************************
    INDEX_ID: 111
        NAME: GEN_CLUST_INDEX
    TABLE_ID: 71
        TYPE: 1
    N_FIELDS: 0
     PAGE_NO: 3
       SPACE: 57
    *************************** 2. row ***************************
    INDEX_ID: 112
        NAME: i1
    TABLE_ID: 71
        TYPE: 0
    N_FIELDS: 1
     PAGE_NO: 4
       SPACE: 57

    INNODB_SYS_INDEXES 는 2 개의 인덱스 데이터를 반환합니다. 첫 번째 인덱스는 GEN_CLUST_INDEX 입니다. 이것은 테이블에 사용자 정의 클러스터링 된 인덱스가 존재하지 않는 경우에 InnoDB 에 의해 생성 된 클러스터 된 인덱스입니다. 두 번째 인덱스 ( i1 )은 사용자 정의 보조 인덱스입니다.

    INDEX_ID 은 인스턴스의 모든 데이터베이스에 걸쳐 고유 인덱스 식별자입니다. TABLE_ID 는 그 인덱스가 연결된 테이블을 식별합니다. 인덱스의 TYPE 값은 인덱스의 유형 (1 = 클러스터 된 인덱스, 0 = 보조 인덱스)를 보여줍니다. N_FILEDS 값이 인덱스를 구성하는 필드의 수입니다. PAGE_NO 는 인덱스의 B 트리의 루트 페이지 번호이며, SPACE 는 인덱스가 존재하는 테이블 스페이스 ID입니다. 0 이외의 값은 인덱스가 시스템 테이블 스페이스에 존재하지 않는 것을 나타냅니다.

  5. INNODB_SYS_INDEXES 에서 INDEX_ID 정보를 사용하여 인덱스 i1 의 필드에 대한 정보를 얻기 위해 INNODB_SYS_FIELDS 를 쿼리합니다.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS where INDEX_ID = 112 \G
    *************************** 1. row ***************************
    INDEX_ID: 112
        NAME: col1
         POS: 0

    INNODB_SYS_FIELDS 인덱싱 된 필드의 NAME 과 인덱스에서 해당 서수 위치를 제공합니다. 인덱스 (i1)가 여러 필드에 정의되어있는 경우 INNODB_SYS_FIELDS 각 인덱스 필드의 메타 데이터를 제공합니다.

  6. INNODB_SYS_TABLES 에서 SPACE 정보를 사용하여이 테이블의 테이블 스페이스에 대한 정보를 얻기 위해 INNODB_SYS_TABLESPACES 테이블을 쿼리합니다.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE SPACE = 57 \G
    *************************** 1. row ***************************
            SPACE: 57
             NAME: test/t1
             FLAG: 0
      FILE_FORMAT: Antelope
       ROW_FORMAT: Compact or Redundant
        PAGE_SIZE: 16384
    ZIP_PAGE_SIZE: 0

    INNODB_SYS_TABLESPACES 테이블 공간 SPACE ID 및 연관된 테이블의 NAME 이외에 테이블 스페이스의 형식과 저장 특성에 대한 비트 수준의 정보 인 테이블 공간의 FLAG 데이터를 제공합니다. 또한 테이블 스페이스의 FILE_FORMAT , ROW_FORMAT , PAGE_SIZE 및 ZIP_PAGE_SIZE 데이터도 제공됩니다 ( ZIP_PAGE_SIZE 는 Compressed 행 형식의 테이블 공간에 적용됩니다).

  7. 다시 INNODB_SYS_TABLES 에서 SPACE 정보를 사용하여이 테이블 스페이스의 데이터 파일의 위치를 얻기 위해 INNODB_SYS_DATAFILES 를 쿼리합니다.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_DATAFILES WHERE SPACE = 57 \G 
    *************************** 1. row ***************************
    SPACE: 57
     PATH: ./test/t1.ibd

    데이터 파일은 MySQL의 data 디렉토리 아래의 test 디렉토리에 있습니다. file-per-table 테이블 스페이스가 CREATE TABLE 문 DATA DIRECTORY 절을 사용하여 MySQL 데이터 디렉토리가 아닌 다른 위치에 생성 된 경우, 테이블 스페이스의 PATH 는 완전한 디렉토리 경로입니다.

  8. 마지막 단계는 테이블 t1 ( TABLE_ID = 71 )에 행을 삽입하고 INNODB_SYS_TABLESTATS 테이블의 데이터를 표시합니다. 이 테이블의 데이터는 InnoDB 테이블의 쿼리 할 때 사용할 인덱스를 결정하기 위해 MySQL 최적화에 의해 사용됩니다. 이 정보는 인 메모리 데이터 구조에서 검색됩니다. 대응하는 내부 InnoDB 시스템 테이블은 없습니다.

    mysql> INSERT INTO t1 VALUES(5, 'abc', 'def');
    Query OK, 1 row affected (0.06 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS where TABLE_ID = 71 \G
    *************************** 1. row ***************************
             TABLE_ID: 71
                 NAME: test/t1
    STATS_INITIALIZED: Initialized
             NUM_ROWS: 1
     CLUST_INDEX_SIZE: 1
     OTHER_INDEX_SIZE: 0
     MODIFIED_COUNTER: 1
              AUTOINC: 0
            REF_COUNT: 1

    STATS_INITIALIZED 필드는이 테이블의 통계가 수집되고 있는지를 나타냅니다. NUM_ROWS 은 현재 추정되는 테이블의 행수입니다. CLUST_INDEX_SIZE 및 OTHER_INDEX_SIZE 필드는 각 테이블의 클러스터 된 인덱스와 보조 인덱스를 포함하는 디스크의 페이지 수를보고합니다. MODIFIED_COUNTER 값은 외부 키에서 DML 작업 및 케스케이드에 의해 변경된 행 수를 나타냅니다. AUTOINC 값은 자동 증가 기반의 작업에 대해 발행 된 다음의 번호입니다. 테이블 t1 에서는 자동 증가 컬럼이 정의되어 있지 않기 때문에,이 값은 0입니다. REF_COUNT 값은 카운터입니다. 이 카운터가 0에 도달하면 테이블 캐시 테이블 메타 데이터를 삭제할 수 있음을 나타냅니다.

예 14.14 외래 키 INFORMATION_SCHEMA 시스템 테이블

INNODB_SYS_FOREIGN 및 INNODB_SYS_FOREIGN_COLS 테이블은 외래 키 관계에 대한 데이터를 제공합니다. 이 예에서는 외부 키 관계를 가진 부모 테이블과 자식 테이블을 사용하여 INNODB_SYS_FOREIGN 및 INNODB_SYS_FOREIGN_COLS 테이블에 발견 된 데이터를 보여줍니다.

  1. 테스트 데이터베이스 및 부모 테이블과 자식 테이블을 만듭니다.

    mysql> CREATE DATABASE test;
    
    mysql> USE test;
    
    mysql> CREATE TABLE parent (id INT NOT NULL,
        -> PRIMARY KEY (id)) ENGINE=INNODB;
    
    mysql> CREATE TABLE child (id INT, parent_id INT,
        -> INDEX par_ind (parent_id),
        -> CONSTRAINT fk1
        -> FOREIGN KEY (parent_id) REFERENCES parent(id)
        -> ON DELETE CASCADE) ENGINE=INNODB;
  2. 부모 테이블과 자식 테이블이 작성되면 INNODB_SYS_FOREIGN 를 쿼리하여 test/child 와 test/parent 의 외부 키 관계의 외래 키 데이터를 찾습니다.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN \G
    *************************** 1. row ***************************
          ID: test/fk1
    FOR_NAME: test/child
    REF_NAME: test/parent
      N_COLS: 1
        TYPE: 1

    메타 데이터는 자식 테이블에 정의 된 CONSTRAINT 로 지정되는 외부 키 ID ( fk1 )가 포함되어 있습니다. FOR_NAME 외부 키가 정의되어있는 자식 테이블의 이름입니다. REF_NAME 부모 테이블 ( "참조 된"테이블)의 이름입니다. N_COLS 는 외부 키 인덱스의 컬럼 수입니다. TYPE 은 foreign 키 컬럼에 대한 추가 정보를 제공하는 비트 플래그를 나타내는 수치입니다. 이 경우 TYPE 값은 1입니다. 이것은 외부 키에 대해 ON DELETE CASCADE 옵션이 지정된 것을 나타냅니다. TYPE 값의 자세한 내용은 INNODB_SYS_FOREIGN 테이블의 정의를 참조하십시오.

  3. 외부 키 ID 를 사용하여이 외부 키 컬럼에 대한 데이터를 표시하기 위해 INNODB_SYS_FOREIGN_COLS 를 쿼리합니다.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS WHERE ID = 'test/fk1' \G
    *************************** 1. row ***************************
              ID: test/fk1
    FOR_COL_NAME: parent_id
    REF_COL_NAME: id
             POS: 0

    FOR_COL_NAME 은 자식 테이블의 foreign 키 컬럼의 이름이며, REF_COL_NAME 은 부모 테이블에서 참조되는 컬럼의 이름입니다. POS 값은 외부 키의 인덱스의 키 필드의 서수 위치 (0부터 시작).

예 14.15 InnoDB INFORMATION_SCHEMA 시스템 테이블의 결합

이 예에서는 employees 샘플 데이터베이스의 테이블에 대한 파일 형식 행 형식, 페이지 크기 및 색인 크기 정보를 수집하기 위해 3 개의 InnoDB INFORMATION_SCHEMA 시스템 테이블 ( INNODB_SYS_TABLES , INNODB_SYS_TABLESPACES 및 INNODB_SYS_TABLESTATS )를 결합하는 방법을 보여줍니다 .

쿼리 문자열을 단축하기 위하여 다음의 테이블 이름의 별칭이 사용됩니다.

  • INFORMATION_SCHEMA.INNODB_SYS_TABLES : a

  • INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES : b

  • INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS : c

압축 테이블에 대응하기 위해 IF() 제어 흐름 함수가 사용되고 있습니다. 테이블이 압축되어있는 경우 인덱스 크기는 PAGE_SIZE 대신 ZIP_PAGE_SIZE 을 사용하여 계산됩니다. 바이트 단위로보고되는 CLUST_INDEX_SIZE 및 OTHER_INDEX_SIZE 를 1024*1024 로 나누면 M 바이트 (MB) 단위의 인덱스 크기를 얻을 수 있습니다. MB 값은 ROUND() 함수를 사용하여 소수점 이하 0 자리로 반올림합니다.

mysql> SELECT a.NAME, a.FILE_FORMAT, a.ROW_FORMAT,
 @page_size :=
  IF(a.ROW_FORMAT='Compressed',
   b.ZIP_PAGE_SIZE, b.PAGE_SIZE)
   AS page_size,
  ROUND((@page_size * c.CLUST_INDEX_SIZE)
   /(1024*1024)) AS pk_mb,
  ROUND((@page_size * c.OTHER_INDEX_SIZE)
   /(1024*1024)) AS secidx_mb
FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES a
INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES b on a.NAME = b.NAME
INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS c on b.NAME = c.NAME 
WHERE a.NAME LIKE 'employees/%'
ORDER BY a.NAME DESC;
+------------------------+-------------+------------+-----------+-------+-----------+
| NAME                   | FILE_FORMAT | ROW_FORMAT | page_size | pk_mb | secidx_mb |
+------------------------+-------------+------------+-----------+-------+-----------+
| employees/titles       | Antelope    | Compact    |     16384 |    20 |        11 |
| employees/salaries     | Antelope    | Compact    |     16384 |    91 |        33 |
| employees/employees    | Antelope    | Compact    |     16384 |    15 |         0 |
| employees/dept_manager | Antelope    | Compact    |     16384 |     0 |         0 |
| employees/dept_emp     | Antelope    | Compact    |     16384 |    12 |        10 |
| employees/departments  | Antelope    | Compact    |     16384 |     0 |         0 |
+------------------------+-------------+------------+-----------+-------+-----------+


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