그만큼 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 데이터베이스를 사용하는 데 큰 도움이됩니다.