INFORMATION_SCHEMA는 MySQL에서 어떻게 구현됩니까?


14

INFORMATION_SCHEMA는 이론적으로 사용자가 시스템의 메타 데이터를 검사 할 수 있도록 SQL 표준에 지정된 뷰 세트입니다. 이것이 MySQL에서 어떻게 구현됩니까?

새로 설치에 연결하면 두 개의 데이터베이스 ( mysql및)가 표시 information_schema됩니다. 데이터베이스에서 SHOW CREATE TABLE명령문을 사용한 후에 information_schema는 뷰 세트로 구현되지 않고 기본 테이블로 구현 된 것처럼 보입니다. 이 가정이 맞습니까? 또는 사용자에게 숨겨진 다른 시스템 테이블이 있습니까?


+1 :) 한 번의 마지막 설명에 감사드립니다. 말한 후에 실제로 구체화 된 테이블에 해당하는 실제 .frm 파일에서 메타 데이터 정보를 직접 읽은다고 말하는 것이 옳습니까? 따라서 서버가 부팅 될 때 테이블에서 해당 정보를 읽고 INFORMATION_SCHEMA를 만듭니다. 그런 다음 ANALYZE TABLE 또는 CREATE INDEX 또는 일반적으로 DDL 문이 실행되면 INFORMATION_SCHEMA가 그에 따라 업데이트됩니까?
ivotron 2016 년

@ivotron : 맞습니다 !!! INFORMATION_SCHEMA에는 COLUMNS, STATISTICS, TABLE_CONSTRAINTS 등과 같은 스키마 변경을 기록하는 테이블이 있습니다. INFORMATION_SCHEMA가 모두 메모리에 있기 때문에 모든 DDL 변경 기록은 거의 즉각적입니다.
RolandoMySQLDBA 2016 년

답변:


30

그만큼 INFORMATION_SCHEMA의 데이터베이스는 MEMORY 스토리지 엔진을 사용하여 임시 테이블로 구성되어 있습니다.

예 : 다음은 MySQL 5.5.12 (Windows 버전)의 INFORMATION_SCHEMA.TABLES 테이블입니다.

mysql> show create table information_schema.tables\G
*************************** 1. row ***************************
       Table: TABLES
Create Table: CREATE TEMPORARY TABLE `TABLES` (
  `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
  `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
  `TABLE_TYPE` varchar(64) NOT NULL DEFAULT '',
  `ENGINE` varchar(64) DEFAULT NULL,
  `VERSION` bigint(21) unsigned DEFAULT NULL,
  `ROW_FORMAT` varchar(10) DEFAULT NULL,
  `TABLE_ROWS` bigint(21) unsigned DEFAULT NULL,
  `AVG_ROW_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `MAX_DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `DATA_FREE` bigint(21) unsigned DEFAULT NULL,
  `AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL,
  `CREATE_TIME` datetime DEFAULT NULL,
  `UPDATE_TIME` datetime DEFAULT NULL,
  `CHECK_TIME` datetime DEFAULT NULL,
  `TABLE_COLLATION` varchar(32) DEFAULT NULL,
  `CHECKSUM` bigint(21) unsigned DEFAULT NULL,
  `CREATE_OPTIONS` varchar(255) DEFAULT NULL,
  `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

해당 테이블의 실제 폴더는 없으며 .frm 파일도 없습니다. 당신은 그것을 mysqldump 할 수 없습니다. 떨어 뜨릴 수 없습니다. 테이블을 추가 할 수 없습니다. 테이블을 삭제할 수 없습니다. 그래서 테이블은 어디에 있습니까 ???

INFORMATION_SCHEMA 데이터베이스의 모든 테이블은 MEMORY 스토리지 엔진 테이블로 메모리에 직접 저장됩니다. 그것들은 완전히 MySQL 내부에 있으므로 .frm 메커니즘은 mysqld에서 처리됩니다. 내 대답에서는 먼저 INFORMATION_SCHEMA.TABLES의 테이블 레이아웃을 보여주었습니다. 메모리의 임시 테이블입니다. 스토리지 엔진 프로토콜을 사용하여 조작됩니다. 따라서 mysqld가 종료되면 모든 information_schema 테이블이 삭제됩니다. mysqld가 시작되면 모든 information_schema 테이블이 TEMPORARY 테이블로 작성되고 mysql 인스턴스의 모든 테이블에 대한 메타 데이터로 다시 채워집니다.

INFORMATION_SCHEMA의 데이터베이스가 먼저 당신에게 다른 스토리지 엔진의 테이블에 대한 메타 데이터에 대한 액세스를 제공하는 5.0 년에 도입되었다. 예를 들어, 할 수 있습니다 SHOW DATABASES 를 하여 데이터베이스 목록을 얻을 수 있습니다. 다음과 같이 쿼리 할 수도 있습니다.

SELECT schema_name database FROM information_schema.schemata;

두 가지 방법으로 데이터베이스에서 테이블 이름을 검색 할 수 있습니다.

use mydb
show tables;

또는

SELECT table_name from information_schema.tables WHERE table_schema = 'mydb';

MySQL은 처음부터 INFORMATION_SCHEMA 데이터베이스를 확장하여 프로세스 목록을 갖습니다 (MySQL 5.1 기준). 실제로 최소 10 분 동안 실행중인 장기 실행 쿼리를 찾기 위해 프로세스 목록을 쿼리 할 수 ​​있습니다.

SELECT * FROM information_schema.processlist WHERE time >= 600\G

INFORMATION_SCHEMA를 사용하여 다음과 같은 모든 정교한 작업을 수행 할 수 있습니다.

특정 스토리지 엔진을 사용하여 모든 테이블 수를 가져옵니다.

SELECT COUNT(1) TableCount,IFNULL(engine,'Total') StorageEngine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND engine IS NOT NULL
GROUP BY engine WITH ROLLUP;

MB 단위로 권장되는 MyISAM 키 버퍼 크기 가져 오기

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(pw<0,0,IF(pw>3,0,pw)))+0.49999),
SUBSTR(' KMG',IF(pw<0,0,IF(pw>3,0,pw))+1,1)) recommended_key_buffer_size
FROM (SELECT SUM(index_length) KBS FROM information_schema.tables WHERE
engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) A,
(SELECT 2 pw) B;

권장 InnoDB 버퍼 풀 크기 (GB) 가져 오기

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(pw<0,0,IF(pw>3,0,pw)))+0.49999),
SUBSTR(' KMG',IF(pw<0,0,IF(pw>3,0,pw))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 3 pw) B;

Storage Engine 별 모든 데이터베이스의 디스크 사용량 (MB) 가져 오기

SELECT Statistic,DataSize "Data Size",IndexSize "Index Size",TableSize "Table Size"
FROM (SELECT IF(ISNULL(table_schema)=1,10,0) schema_score,
IF(ISNULL(engine)=1,10,0) engine_score,
IF(ISNULL(table_schema)=1,'ZZZZZZZZZZZZZZZZ',table_schema) schemaname,
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=2,"Storage for All Databases",
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=1,CONCAT("Storage for ",B.table_schema),
CONCAT(B.engine," Tables for ",B.table_schema))) Statistic,
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') DataSize,
CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') IndexSize,
CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') TableSize
FROM (SELECT table_schema,engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY table_schema,engine WITH ROLLUP) B,
(SELECT 2 pw) A) AA ORDER BY schemaname,schema_score,engine_score;

시간이 지나서 더 이상 논의 할 수없는 INFORMATION_SCHEMA에 대한 더 멋진 사용법이 여전히 있습니다.

INFORMATION_SCHEMA는 mysql이 실행 중이고 다음을 수행 할 정도로 민감하다는 점을 명심하십시오.

cd /var/lib/mysql
mkdir junkfolder

그런 다음 mysql 실행으로 이동하십시오.

mysql> SHOW DATABASES;

정크 폴더를 데이터베이스 중 하나로 볼 수 있습니다.

이를 아는 것은 DBA 및 개발자에게 매우 중요합니다. 책 MySQL 5.0 Certification Study Guide의 20 장 (개발자) 및 31 장 (DBA)

여기에 이미지 설명을 입력하십시오

개발자 및 DBA ​​인증 시험을 준비하기 위해 있습니다. 이 책을 펴고 장을 잘 공부하면 MySQL의 INFORMATION_SCHEMA로 훌륭한 일을 할 수 있습니다.

MySQL 5.5부터 INFORMATION_SCHEMA 데이터베이스에는 이제 플러그인, 전역 변수 (상태 및 정적), 세션 변수 (상태 및 정적), 스토리지 엔진 상태, 성능 메트릭 계측, 트리거 맵, 이벤트 (프로그램 가능) 등이 있습니다.

죄송합니다. WTMI처럼 보이지만 INFORMATION_SCHEMA 데이터베이스를 사용하는 데 큰 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.