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: 10INNODB_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: 57INNODB_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: 0INNODB_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: 0INNODB_SYS_TABLESPACES테이블 공간SPACEID 및 연관된 테이블의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: 1STATS_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: 0FOR_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 | +------------------------+-------------+------------+-----------+-------+-----------+