Il database INFORMATION_SCHEMA è costituito da tabelle temporanee che utilizzano il motore di archiviazione MEMORY.
Esempio: ecco la tabella INFORMATION_SCHEMA.TABLES in MySQL 5.5.12 (versione Windows)
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)
Non esiste una cartella fisica per quelle tabelle, nemmeno i file .frm. Non puoi mysqldump. Non puoi lasciarlo cadere. Non è possibile aggiungere tabelle ad esso. Non è possibile eliminare tabelle da esso. Quindi, dove sono i tavoli ???
Tutte le tabelle nel database INFORMATION_SCHEMA sono archiviate direttamente in memoria come tabelle del motore di archiviazione MEMORY. Sono totalmente interni a MySQL, quindi i meccanismi .frm sono gestiti in mysqld. Nella mia risposta, ho prima mostrato il layout della tabella di INFORMATION_SCHEMA.TABLES. È una tabella temporanea in memoria. Viene manipolato utilizzando i protocolli del motore di archiviazione. Pertanto, quando mysqld viene arrestato, tutte le tabelle information_schema vengono eliminate. All'avvio di mysqld, tutte le tabelle information_schema vengono create come tabelle TEMPORANEE e ripopolate con metadati per ogni tabella nell'istanza mysql.
Il database INFORMATION_SCHEMA è stato introdotto per la prima volta in MySQL 5.0 per consentire l'accesso ai metadati relativi alle tabelle di altri motori di archiviazione. Ad esempio, è possibile eseguire SHOW DATABASES per ottenere un elenco di database. Puoi anche fare una query per loro in questo modo:
SELECT schema_name database FROM information_schema.schemata;
È possibile recuperare i nomi delle tabelle in un database in due modi:
use mydb
show tables;
o
SELECT table_name from information_schema.tables WHERE table_schema = 'mydb';
Fin dalla sua istituzione, MySQL ha ampliato il database INFORMATION_SCHEMA per includere l'elenco dei processi (a partire da MySQL 5.1). Puoi effettivamente eseguire una query sull'elenco dei processi alla ricerca di query a esecuzione prolungata che siano ancora in esecuzione per almeno 10 minuti:
SELECT * FROM information_schema.processlist WHERE time >= 600\G
Puoi utilizzare INFORMATION_SCHEMA per eseguire tutte le operazioni elaborate: come:
Ottieni conteggi di tutte le tabelle utilizzando specifici motori di archiviazione:
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;
Ottieni le dimensioni consigliate per il buffer delle chiavi MyISAM 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;
Ottieni le dimensioni consigliate del pool di buffer InnoDB 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;
Ottieni l'utilizzo del disco di tutti i database dal motore di archiviazione 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;
Credetemi, ci sono ancora usi meravigliosi per INFORMATION_SCHEMA che il tempo non mi consente di discutere ulteriormente.
Tieni presente che INFORMATION_SCHEMA è così sensibile che se mysql è in esecuzione e fai quanto segue:
cd /var/lib/mysql
mkdir junkfolder
e poi vai in mysql run
mysql> SHOW DATABASES;
Vedrai junkfolder come uno dei database.
Conoscerlo è molto vitale per DBA e sviluppatori. Capitolo 20 (sviluppatori) e Capitolo 31 (DBA) del libro MySQL 5.0 Guida allo studio di certificazione
sono lì per la preparazione per gli esami di certificazione Developer e DBA. Prendi il libro, studia bene quei capitoli e potresti fare grandi cose con il MySQL_SCHEMA di MySQL.
Il database INFORMATION_SCHEMA a partire da MySQL 5.5, ora include plug-in, variabili globali (stato e statico), variabili di sessione (stato e statico), stato del motore di archiviazione, strumentazione delle metriche delle prestazioni, mappa di trigger, eventi (programmabili) e molto altro.
Mi dispiace che possa sembrare WTMI, ma sono un grande sostenitore dell'utilizzo del database INFORMATION_SCHEMA.