Wie ist INFORMATION_SCHEMA in MySQL implementiert?

14

Das INFORMATION_SCHEMA ist theoretisch eine Reihe von im SQL-Standard festgelegten Ansichten, mit denen der Benutzer die Metadaten des Systems überprüfen kann. Wie ist das in MySQL implementiert?

Wenn ich eine Verbindung zu einer Neuinstallation herstelle, werden zwei Datenbanken angezeigt: mysqlund information_schema. Nach der Verwendung von SHOW CREATE TABLEAnweisungen in der information_schemaDatenbank sieht es so aus, als ob sie nicht als Satz von Ansichten implementiert sind, sondern stattdessen mit Basistabellen. Ist diese Annahme richtig? Oder gibt es andere Systemtabellen, die dem Benutzer verborgen bleiben?

Ivotron
quelle
Vielen Dank für die +1 :) Eine letzte Klarstellung. Ist es richtig, nach dem Gesagten anzugeben, dass die Metadateninformationen direkt aus den tatsächlichen .frm-Dateien gelesen werden, die den tatsächlich materialisierten Tabellen entsprechen? Wenn der Server hochfährt, liest er diese Informationen aus den Tabellen und erstellt das INFORMATION_SCHEMA. Wenn dann eine ANALYZE TABLE oder ein CREATE INDEX oder generell eine DDL-Anweisung ausgeführt wird, wird das INFORMATION_SCHEMA entsprechend aktualisiert?
Ivotron
@ivotron: Das ist richtig !!! In INFORMATION_SCHEMA befinden sich Tabellen, in denen Schemaänderungen wie COLUMNS, STATISTICS, TABLE_CONSTRAINTS usw. aufgezeichnet werden. Da sich das INFORMATION_SCHEMA alle im Speicher befindet, erfolgt die Aufzeichnung aller DDL-Änderungen fast augenblicklich.
RolandoMySQLDBA

Antworten:

30

Die Datenbank INFORMATION_SCHEMA besteht aus temporären Tabellen, die die Speicher-Engine MEMORY verwenden.

Beispiel: Hier ist die Tabelle INFORMATION_SCHEMA.TABLES in MySQL 5.5.12 (Windows-Version)

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)

Für diese Tabellen gibt es keinen physischen Ordner, nicht einmal FRM-Dateien. Sie können es nicht mysqldumpen. Du kannst es nicht fallen lassen. Sie können keine Tabellen hinzufügen. Sie können keine Tabellen daraus löschen. Also, wo sind die Tische ???

Alle Tabellen in der Datenbank INFORMATION_SCHEMA werden direkt als MEMORY-Speicher-Engine-Tabellen gespeichert. Sie sind vollständig in MySQL integriert, daher werden die .frm-Mechanismen in mysqld behandelt. In meiner Antwort habe ich zuerst das Tabellenlayout von INFORMATION_SCHEMA.TABLES gezeigt. Es ist eine temporäre Tabelle im Speicher. Es wird mithilfe von Storage Engine-Protokollen manipuliert. Wenn mysqld heruntergefahren wird, werden daher alle information_schema-Tabellen gelöscht. Wenn mysqld gestartet wird, werden alle Tabellen information_schema als TEMPORARY-Tabellen erstellt und mit Metadaten für jede Tabelle in der mysql-Instanz neu gefüllt.

Die Datenbank INFORMATION_SCHEMA wurde erstmals in MySQL 5.0 eingeführt, um Ihnen den Zugriff auf Metadaten zu Tabellen anderer Speicher-Engines zu ermöglichen. Sie können beispielsweise SHOW DATABASES ausführen , um eine Liste der Datenbanken abzurufen . Sie können sie auch folgendermaßen abfragen:

SELECT schema_name database FROM information_schema.schemata;

Sie können Tabellennamen in einer Datenbank auf zwei Arten abrufen:

use mydb
show tables;

oder

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

Von Anfang an hat MySQL die Datenbank INFORMATION_SCHEMA um die Prozessliste erweitert (ab MySQL 5.1). Sie können die Prozessliste tatsächlich abfragen, um nach lang laufenden Abfragen zu suchen, die noch mindestens 10 Minuten ausgeführt werden:

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

Sie können das INFORMATION_SCHEMA verwenden, um alle durchdachten Dinge zu erledigen:

Abrufen der Anzahl aller Tabellen mithilfe bestimmter Speicher-Engines:

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;

Holen Sie sich die empfohlene MyISAM-Schlüsselpuffergröße in MB

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;

Ermitteln Sie die empfohlene InnoDB-Pufferpoolgröße in 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;

Datenträgernutzung aller Datenbanken durch Storage Engine in 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;

Glauben Sie mir, es gibt noch wundervollere Verwendungen für INFORMATION_SCHEMA, die ich nicht weiter besprechen kann.

Beachten Sie, dass INFORMATION_SCHEMA so vertraulich ist, dass mysql ausgeführt wird und Sie Folgendes tun:

cd /var/lib/mysql
mkdir junkfolder

und dann in MySQL ausführen

mysql> SHOW DATABASES;

Sie sehen Junk-Ordner als eine der Datenbanken.

Für DBAs und Entwickler ist es sehr wichtig, dies zu wissen. Kapitel 20 (Entwickler) und Kapitel 31 (DBAs) des Buches MySQL 5.0 Certification Study Guide

Bildbeschreibung hier eingeben

sind da, um sich auf die Entwickler- und DBA-Zertifizierungsprüfungen vorzubereiten. Holen Sie sich das Buch, studieren Sie diese Kapitel gut und Sie könnten mit MySQLs INFORMATION_SCHEMA großartige Dinge tun.

Die INFORMATION_SCHEMA-Datenbank ab MySQL 5.5 enthält jetzt Plugins, globale Variablen (Status und statisch), Sitzungsvariablen (Status und statisch), Status der Speicher-Engine, Leistungsmessinstrumente, Trigger-Map, Ereignisse (programmierbar) und vieles mehr.

Tut mir leid, dass dies wie WTMI scheint, aber ich bin ein großer Befürworter der Verwendung der Datenbank INFORMATION_SCHEMA.

RolandoMySQLDBA
quelle