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='
어구에 대한 지원의 도입과 함께 MySQL 5.6 0.6에 추가되었습니다. directory
'
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
시스템 테이블에서 발견 된 메타 데이터의 유형을 나타냅니다.
테스트 데이터베이스 및 테이블
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);
테이블
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
행 형식의 테이블에만 적용됩니다.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
)를 제공합니다.다시
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 이외의 값은 인덱스가 시스템 테이블 스페이스에 존재하지 않는 것을 나타냅니다.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
각 인덱스 필드의 메타 데이터를 제공합니다.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
행 형식의 테이블 공간에 적용됩니다).다시
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
는 완전한 디렉토리 경로입니다.마지막 단계는 테이블
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
테이블에 발견 된 데이터를 보여줍니다.
테스트 데이터베이스 및 부모 테이블과 자식 테이블을 만듭니다.
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;
부모 테이블과 자식 테이블이 작성되면
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
테이블의 정의를 참조하십시오.외부 키
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
: aINFORMATION_SCHEMA.INNODB_SYS_TABLESPACES
: bINFORMATION_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 | +------------------------+-------------+------------+-----------+-------+-----------+