N.B.: le informazioni che seguono si riferiscono a MySQL 8+. Nelle versioni precedenti al posto del dizionario dei dati si usava un mix di vari file di metadati e i database mysql e sys (questi ultimi tutt’ora presenti per altre funzioni). Inoltre, information_schema conteneva viste che ora sono state spostate in performance_schema (e.g. global_variables).
information_schema è un database in sola lettura che contiene dei metadati relativi agli oggetti contenuti nel server MySQL in questione. Per essere più precisi, si tratta di una serie di viste costruite a partire da tabelle del dizionario dei dati di MySQL, il quale è direttamente accessibile solo lanciando il server in modalità debug.
E’ possibile leggere i dati contenuti in information_schema usando delle select classiche oppure, per alcuni di essi, l’istruzione SHOW (e.g. SHOW TABLES, SHOW COLUMS, ecc.).
Trattandosi di viste in sola lettura, non è possibile modificarne direttamente i dati. Tuttavia, alcuni dati possono essere modificati usando specifiche istruzioni (e.g. a seguito di una CREATE TABLE si potranno vedere nuovi record in varie viste di information_schema, tra cui TABLES, INNODB_TABLES, COLUMNS, INNODB_COLUMNS, REFERENTIAL_CONSTRAINTS (se si definiscono chiavi esterne), ecc.).
Un utente può vedere in information_schema solo i record relativi agli oggetti (database, tabelle, ecc.) ai quali ha accesso.
Le viste presenti in information_schema si suddividono in 5 categorie:
- Generali (nessun prefisso): utenti e permessi, database, statistiche tabelle, ecc.;
- InnoDB (prefisso INNODB_): informazioni su tabelle, indici, ecc. che usano innoDB come engine;
- Thread pool (prefisso TP_: informazioni sullo stato dei thread nel thread pool. Queste tabelle sono deprecate a favore di analoghe tabelle in performance_schema;
- Connection control (prefisso CONNECTION_CONTROL_): questa categoria comprende solamente una vista, relativa ai login falliti;
- Firewall (prefisso MYSQL_FIREWALL_): viste presenti solamente nella versione enterprise con plugin del firewall installato.
E’ interessante notare che alcune tabelle della categoria innoDB (e.g. tabelle, colonne, ecc.) contengono dati presenti anche in tabelle generali. Se si usa esclusivamente innoDB come engine, si possono considerare alcune delle tabelle generali come versioni “denormalizzate” di analoghe tabelle della categoria innoDB.
Ad esempio, la tabella generale COLUMS al suo interno contiene anche i nomi del database e della tabella che contengono la colonna, oltre a varie informazioni relative a tipo, privilegi, ecc.. La tabella INNODB_COLUMNS invece contiene solo il nome della colonna e gli id dei record relativi a tabella, tipo, privilegi, ecc..