Vorwort Das Transaktionsdatenwörterbuch und das atomare DDL sind zwei sehr wichtige neue Funktionen, die in MySQL 8.0 eingeführt wurden. Der Grund, warum diese beiden neuen Funktionen zusammengeführt werden, liegt darin, dass sie eng miteinander verbunden sind. Das Transaktionsdatenwörterbuch ist eine Voraussetzung und das atomare DDL ist ein wichtiges Anwendungsszenario. Datenwörterbuch vor MySQL 8.0 Das Datenwörterbuch vor MySQL 8.0 besteht hauptsächlich aus den folgenden drei Teilen: (1) Dateien des Betriebssystems
(2) Nicht-InnoDB-Systemtabellen unter der MySQL-Datenbank mysql> wähle table_schema,table_name,table_type,engine aus information_schema.tables, wobei table_schema='mysql' und engine<>'InnoDB'; +--------------+------------------+------------+--------+ | Tabellenschema | Tabellenname | Tabellentyp | Engine | +--------------+------------------+------------+--------+ | mysql | columns_priv | BASISTABELLE | MyISAM | | mysql | db | BASISTABELLE | MyISAM | | mysql | Ereignis | BASISTABELLE | MyISAM | | mysql | Funktion | BASISTABELLE | MyISAM | | mysql | general_log | BASISTABELLE | CSV | | mysql | ndb_binlog_index | BASISTABELLE | MyISAM | | mysql | proc | BASISTABELLE | MyISAM | | mysql | procs_priv | BASISTABELLE | MyISAM | | mysql | proxies_priv | BASISTABELLE | MyISAM | | mysql | slow_log | BASISTABELLE | CSV | | mysql | tables_priv | BASISTABELLE | MyISAM | | mysql | Benutzer | BASISTABELLE | MyISAM | +--------------+------------------+------------+--------+ 12 Zeilen im Satz (0,00 Sek.) (3) InnoDB-Systemtabellen unter der MySQL-Datenbank mysql> wähle table_schema, table_name, table_type, engine aus information_schema.tables, wobei table_schema='mysql' und engine='InnoDB'; +--------------+------------------------------+------------+--------+ | Tabellenschema | Tabellenname | Tabellentyp | Engine | +--------------+------------------------------+------------+--------+ | mysql | engine_cost | BASISTABELLE | InnoDB | | mysql | gtid_executed | BASISTABELLE | InnoDB | | mysql | Hilfekategorie | BASISTABELLE | InnoDB | | mysql | Hilfeschlüsselwort | BASISTABELLE | InnoDB | | mysql | help_relation | BASISTABELLE | InnoDB | | mysql | Hilfethema | BASISTABELLE | InnoDB | | mysql | innodb_index_stats | BASISTABELLE | InnoDB | | mysql | innodb_table_stats | BASISTABELLE | InnoDB | | MySQL | Plugin | BASISTABELLE | InnoDB | | mysql | Serverkosten | BASISTABELLE | InnoDB | | MySQL | Server | BASISTABELLE | InnoDB | | mysql | slave_master_info | BASISTABELLE | InnoDB | | mysql | slave_relay_log_info | BASISTABELLE | InnoDB | | mysql | slave_worker_info | BASISTABELLE | InnoDB | | mysql | Zeitzone | BASISTABELLE | InnoDB | | mysql | Zeitzone_Schaltsekunde | BASISTABELLE | InnoDB | | mysql | Zeitzonenname | BASISTABELLE | InnoDB | | mysql | Zeitzonenübergang | BASISTABELLE | InnoDB | | mysql | Zeitzonenübergangstyp | BASISTABELLE | InnoDB | +--------------+------------------------------+------------+--------+ 19 Zeilen im Satz (0,00 Sek.) Wir können sehen, dass das Datenwörterbuch auf mehrere Standorte verteilt ist, was einerseits der einheitlichen Verwaltung von Metadaten nicht förderlich ist und andererseits leicht zu Dateninkonsistenzen führt (da Betriebssystemdateien und Nicht-InnoDB-Systemtabellen keine Transaktionen unterstützen, kann ACID bei der Ausführung von DDL-Operationen nicht garantiert werden). MySQL 8.0-Datenwörterbuch Um die oben genannten Probleme zu lösen, verbessert MySQL 8.0 das in der InnoDB-Speicher-Engine zu speichernde Datenwörterbuch, das in zwei Teile unterteilt ist: (1) Datenwörterbuchtabelle: speichert die wichtigsten Metadateninformationen, die sich in der MySQL-Datenbank befinden und im gemeinsam genutzten MySQL-Tabellenbereich (mysql.ibd) gespeichert sind. (2) Andere Systemtabellen: Speichern Sie zusätzliche Metadateninformationen, die sich in der MySQL-Datenbank befinden und im gemeinsam genutzten MySQL-Tabellenbereich (mysql.ibd) gespeichert sind. Datenwörterbuchtabelle Datenwörterbuchtabellen sind unsichtbar und können nicht über „Select“ aufgerufen werden. Sie werden auch nicht in den Ergebnissen von „Show Tables“ oder „information.schema.tables“ angezeigt. Der Versuch, auf sie zuzugreifen, führt zu folgendem Fehler: mysql> wähle * aus mysql.tables, Limit 10; FEHLER 3554 (HY000): Der Zugriff auf die Datenwörterbuchtabelle „mysql.tables“ wird abgelehnt. Auf diese versteckten Datenwörterbuchtabellen kann jedoch im Debugmodus zugegriffen werden. Wir kompilieren und installieren neu (der Prozess wird ausgelassen), starten den Prozess im Debugmodus und versuchen erneut, darauf zuzugreifen. Die Ergebnisse sind wie folgt: mysql> SET SESSION debug='+d,skip_dd_table_access_check'; mysql> SELECT Name, Schema-ID, versteckt, Typ FROM mysql.tables, wobei Schema-ID = 1 und versteckt = "System"; +------------------------------+--------------+--------+---------+ | Name | Schema-ID | versteckt | Typ | +------------------------------+--------------+--------+---------+ | Kataloge | 1 | System | BASISTISCH | | Zeichensätze | 1 | System | BASISTABELLE | | check_constraints | 1 | System | BASISTABELLE | | Sortierungen | 1 | System | BASISTABELLE | | Spaltenstatistik | 1 | System | BASISTABELLE | | Spaltentypelemente | 1 | System | BASISTABELLE | | Spalten | 1 | System | BASISTABELLE | | dd_properties | 1 | System | BASISTABELLE | | Ereignisse | 1 | System | BASISTABELLE | | Verwendung von Fremdschlüsselspalten | 1 | System | BASISTABELLE | | Fremdschlüssel | 1 | System | BASISTABELLE | | index_column_usage | 1 | System | BASISTABELLE | | Indexpartitionen | 1 | System | BASISTABELLE | | index_stats | 1 | System | BASISTABELLE | | Indizes | 1 | System | BASISTABELLE | | innodb_ddl_log | 1 | System | BASISTABELLE | | innodb_dynamic_metadata | 1 | System | BASISTABELLE | | Parametertypelemente | 1 | System | BASISTABELLE | | Parameter | 1 | System | BASISTABELLE | | Ressourcengruppen | 1 | System | BASISTABELLE | | Routinen | 1 | System | BASISTABELLE | | Schemata | 1 | System | BASISTABELLE | | st_spatial_reference_systems | 1 | System | BASISTABELLE | | table_partition_values | 1 | System | BASISTABELLE | | Tabellenpartitionen | 1 | System | BASISTABELLE | | table_stats | 1 | System | BASISTABELLE | | Tische | 1 | System | BASISTISCH | | Tablespace_Files | 1 | System | BASISTABELLE | | Tabellenbereiche | 1 | System | BASISTABELLE | | Auslöser | 1 | System | BASISTABELLE | | view_routine_usage | 1 | System | BASISTABELLE | | view_table_usage | 1 | System | BASISTABELLE | +------------------------------+--------------+--------+---------+ 32 Zeilen im Satz (0,01 Sek.) Andere Systemtabellen Andere Systemtabellen können über show tables oder information_schema.tables angezeigt werden. Sie sind alle auf die InnoDB-Speicher-Engine optimiert (außer general_log und slow_log. Diese beiden Tabellen zeichnen keine Metadateninformationen auf, sondern werden nur zum Protokollieren verwendet): mysql> wähle table_schema,table_name,engine aus information_schema.tables, wobei table_schema='mysql'; +--------------+------------------------------+--------+ | TABELLE_SCHEMA | TABELLENNAME | ENGINE | +--------------+------------------------------+--------+ | mysql | Spaltenpriv | InnoDB | | MySQL | Komponente | InnoDB | | MySQL | Datenbank | InnoDB | | mysql | Standardrollen | InnoDB | | MySQL | Engine-Kosten | InnoDB | | mysql | Funktion | InnoDB | | MySQL | allgemeines_Protokoll | CSV | | MySQL | globale_Zuschüsse | InnoDB | | mysql | gtid_ausgeführt | InnoDB | | mysql | Hilfekategorie | InnoDB | | mysql | Hilfeschlüsselwort | InnoDB | | mysql | Hilferelation | InnoDB | | mysql | Hilfethema | InnoDB | | mysql | innodb_index_stats | InnoDB | | mysql | innodb_table_stats | InnoDB | | mysql | Passwortverlauf | InnoDB | | MySQL | Plugin | InnoDB | | mysql | procs_priv | InnoDB | | mysql | proxies_priv | InnoDB | | mysql | Rollenkanten | InnoDB | | mysql | Serverkosten | InnoDB | | MySQL | Server | InnoDB | | mysql | Slave_Master_Info | InnoDB | | mysql | slave_relay_log_info | InnoDB | | mysql | Slave_Worker_Info | InnoDB | | MySQL | langsames_Protokoll | CSV | | mysql | Tabellen_priv | InnoDB | | mysql | Zeitzone | InnoDB | | mysql | Zeitzonen-Schaltsekunde | InnoDB | | mysql | Zeitzonenname | InnoDB | | mysql | Zeitzonenübergang | InnoDB | | mysql | Zeitzonenübergangstyp | InnoDB | | mysql | Benutzer | InnoDB | +--------------+------------------------------+--------+ 33 Zeilen im Satz (0,00 Sek.) Datenwörterbuchansichten Wie oben erwähnt, kann auf die Datenwörterbuchtabelle nur im Debugmodus zugegriffen werden. Wie sollten wir also Metadateninformationen in einer Produktionsumgebung erhalten? Die Antwort erfolgt über die Datenwörterbuchansichten unter der Bibliothek information_schema. Das Designkonzept ist das gleiche wie bei der Oracle-Datenbank, die Metadateninformationen in Basistabellen (x$, $) speichert und sie dann Benutzern über Ansichten (v$, dba_/all_/user_) zur Verfügung stellt. Dasselbe gilt für die MySQL-Datenbank, die Metadateninformationen in der Datenwörterbuchtabelle der MySQL-Bibliothek speichert und verbirgt und dann Ansichten der information_schema-Bibliothek zur Abfrage durch Benutzer bereitstellt: mysql> wähle table_schema, table_name, table_type, engine aus information_schema.tables, wobei table_schema='information_schema'; +--------------------+-----------------------------------------+-------------+--------+ | TABELLE_SCHEMA | TABELLENNAME | TABELLENTYP | ENGINE | +--------------------+-----------------------------------------+-------------+--------+ | Informationsschema | ADMINISTRABLE_ROLE_AUTHORIZATIONS | SYSTEMANSICHT | NULL | | Informationsschema | ANWENDBARE ROLLEN | SYSTEMANSICHT | NULL | | Informationsschema | Zeichensätze | SYSTEMANSICHT | NULL | | Informationsschema | CHECK_CONSTRAINTS | SYSTEMANSICHT | NULL | | Informationsschema | COLLATION_CHARACTER_SET_APPLICABILITY | SYSTEMANSICHT | NULL | | Informationsschema | SORTIMENTIERUNGEN | SYSTEMANSICHT | NULL | | Informationsschema | COLUMN_PRIVILEGES | SYSTEMANSICHT | NULL | | Informationsschema | SPALTENSTATISTIKEN | SYSTEMANSICHT | NULL | | Informationsschema | SPALTEN | SYSTEMANSICHT | NULL | | Informationsschema | ENABLED_ROLES | SYSTEMANSICHT | NULL | | Informationsschema | Motoren | Systemansicht | NULL | | Informationsschema | EREIGNISSE | SYSTEMANSICHT | NULL | | Informationsschema | DATEIEN | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_BUFFER_PAGE | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_BUFFER_PAGE_LRU | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_BUFFER_POOL_STATS | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_CACHED_INDEXES | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_CMP | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_CMP_PER_INDEX | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_CMP_PER_INDEX_RESET | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_CMP_RESET | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_CMPMEM | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_CMPMEM_RESET | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_COLUMNS | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_DATAFILES | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_FIELDS | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_FOREIGN | SYSTEM VIEW | NULL | | Informationsschema | INNODB_FOREIGN_COLS | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_FT_BEING_DELETED | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_FT_CONFIG | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_FT_DEFAULT_STOPWORD | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_FT_DELETED | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_FT_INDEX_CACHE | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_FT_INDEX_TABLE | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_INDEXES | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_METRICS | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_SESSION_TEMP_TABLESPACES | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_TABLES | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_TABLESPACES | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_TABLESPACES_BRIEF | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_TABLESTATS | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_TEMP_TABLE_INFO | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_TRX | SYSTEMANSICHT | NULL | | Informationsschema | INNODB_VIRTUAL | SYSTEM VIEW | NULL | | Informationsschema | KEY_COLUMN_USAGE | SYSTEMANSICHT | NULL | | Informationsschema | SCHLÜSSELWÖRTER | SYSTEMANSICHT | NULL | | Informationsschema | OPTIMIZER_TRACE | SYSTEMANSICHT | NULL | | Informationsschema | PARAMETER | SYSTEMANSICHT | NULL | | Informationsschema | PARTITIONEN | SYSTEMANSICHT | NULL | | Informationsschema | PLUGINS | SYSTEMANSICHT | NULL | | Informationsschema | PROZESSLISTE | SYSTEMANSICHT | NULL | | Informationsschema | PROFILIERUNG | SYSTEMANSICHT | NULL | | Informationsschema | REFERENTIAL_CONSTRAINTS | SYSTEMANSICHT | NULL | | Informationsschema | RESSOURCENGRUPPEN | SYSTEMANSICHT | NULL | | Informationsschema | ROLE_COLUMN_GRANTS | SYSTEMANSICHT | NULL | | Informationsschema | ROLE_ROUTINE_GRANTS | SYSTEMANSICHT | NULL | | Informationsschema | ROLE_TABLE_GRANTS | SYSTEMANSICHT | NULL | | Informationsschema | ROUTINEN | SYSTEMANSICHT | NULL | | Informationsschema | SCHEMA_PRIVILEGES | SYSTEMANSICHT | NULL | | Informationsschema | SCHEMATA | SYSTEMANSICHT | NULL | | Informationsschema | ST_GEOMETRY_COLUMNS | SYSTEM VIEW | NULL | | Informationsschema | ST_SPATIAL_REFERENCE_SYSTEMS | SYSTEMANSICHT | NULL | | Informationsschema | ST_UNITS_OF_MEASURE | SYSTEMANSICHT | NULL | | Informationsschema | STATISTIKEN | SYSTEMANSICHT | NULL | | Informationsschema | TABELLENBESTIMMUNGEN | SYSTEMANSICHT | NULL | | Informationsschema | Tabellenberechtigungen | Systemansicht | NULL | | Informationsschema | TABELLEN | SYSTEMANSICHT | NULL | | Informationsschema | TABELLENBEREICHE | SYSTEMANSICHT | NULL | | Informationsschema | TRIGGERS | SYSTEMANSICHT | NULL | | Informationsschema | BENUTZERRECHTE | SYSTEMANSICHT | NULL | | Informationsschema | VIEW_ROUTINE_USAGE | SYSTEM VIEW | NULL | | Informationsschema | VIEW_TABLE_USAGE | SYSTEM VIEW | NULL | | Informationsschema | ANSICHTEN | SYSTEMANSICHT | NULL | +--------------------+-----------------------------------------+-------------+--------+ 73 Zeilen im Satz (0,00 Sek.) mysql> anzeigen, erstellen, Tabelle information_schema.tables\G *************************** 1. Reihe *************************** Ansicht: TABELLEN Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`mysql.infoschema`@`localhost` SQL SECURITY DEFINER VIEW `information_schema`.`TABLES` AS select (`cat`.`name` collate utf8_tolower_ci) AS `TABLE_CATALOG`,(`sch`.`name` collate utf8_tolower_ci) AS `TABLE_SCHEMA`,(`tbl`.`name` collate utf8_tolower_ci) AS `TABLE_NAME`,`tbl`.`type` AS `TABLE_TYPE`,if((`tbl`.`type` = 'BASE TABLE'),`tbl`.`engine`,NULL) AS `ENGINE`,if((`tbl`.`type` = 'VIEW'),NULL,10) AS `VERSION`,`tbl`.`row_format` AS `ROW_FORMAT`,if((`tbl`.`type` = 'VIEW'),NULL,internal_table_rows(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(`stat`.`table_rows`,0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `TABLE_ROWS`,if((`tbl`.`type` = 'VIEW'),NULL,internal_avg_row_length(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(`stat`.`avg_row_length`,0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `AVG_ROW_LENGTH`,if((`tbl`.`type` = 'VIEW'),NULL,internal_data_length(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(`stat`.`data_length`,0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `DATA_LENGTH`,if((`tbl`.`type` = 'VIEW'),NULL,internal_max_data_length(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(`stat`.`max_data_length`,0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `MAX_DATA_LENGTH`,if((`tbl`.`type` = 'VIEW'),NULL,internal_index_length(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(`stat`.`index_length`,0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `INDEX_LENGTH`,if((`tbl`.`type` = 'VIEW'),NULL,internal_data_free(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(`stat`.`data_free`,0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `DATA_FREE`,if((`tbl`.`type` = 'VIEW'),NULL,internal_auto_increment(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(`stat`.`auto_increment`,0),coalesce(cast(`stat`.`cached_time` as unsigned),0),`tbl`.`se_private_data`)) AS `AUTO_INCREMENT`,`tbl`.`created` AS `CREATE_TIME`,if((`tbl`.`type` = 'VIEW'),NULL,internal_update_time(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(cast(`stat`.`update_time` as unsigned),0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `UPDATE_TIME`,if((`tbl`.`type` = 'VIEW'),NULL,internal_check_time(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(cast(`stat`.`check_time` as unsigned),0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `CHECK_TIME`,`col`.`name` AS `TABLE_COLLATION`,if((`tbl`.`type` = 'VIEW'),NULL,internal_checksum(`sch`.`name`,`tbl`.`name`,if((`tbl`.`partition_type` is null),`tbl`.`engine`,''),`tbl`.`se_private_id`,(`tbl`.`hidden` <> 'Visible'),`ts`.`se_private_data`,coalesce(`stat`.`checksum`,0),coalesce(cast(`stat`.`cached_time` as unsigned),0))) AS `CHECKSUM`,if((`tbl`.`type` = 'VIEW'),NULL,get_dd_create_options(`tbl`.`options`,if((ifnull(`tbl`.`partition_expression`,'NOT_PART_TBL') = 'NOT_PART_TBL'),0,1),if((`sch`.`default_encryption` = 'YES'),1,0))) AS `CREATE_OPTIONS`,internal_get_comment_or_error(`sch`.`name`,`tbl`.`name`,`tbl`.`type`,`tbl`.`options`,`tbl`.`comment`) AS `TABLE_COMMENT` from (((((`mysql`.`tables` `tbl` join `mysql`.`schemata` `sch` on((`tbl`.`schema_id` = `sch`.`id`))) join `mysql`.`catalogs` `cat` on((`cat`.`id` = `sch`.`catalog_id`))) left join `mysql`.`collations` `col` on((`tbl`.`collation_id` = `col`.`id`))) left join `mysql`.`tablespaces` `ts` on((`tbl`.`tablespace_id` = `ts`.`id`))) left join `mysql`.`table_stats` `stat` on(((`tbl`.`name` = `stat`.`table_name`) and (`sch`.`name` = `stat`.`schema_name`)))) where ((0 <> can_access_table(`sch`.`name`,`tbl`.`name`)) and (0 <> is_visible_dd_object(`tbl`.`hidden`))) Zeichensatzclient: utf8 Sortierverbindung: utf8_general_ci 1 Zeile im Satz (0,00 Sek.) Datenwörterbuch-Cache Um die Festplatten-E/A zu reduzieren und die Zugriffseffizienz zu verbessern, wurde in MySQL 8.0 der Datenwörterbuch-Cache eingeführt. Der Datenwörterbuch-Cache ist ein globaler gemeinsam genutzter Bereich, der den LRU-Algorithmus zur Speicherverwaltung verwendet, einschließlich: Cache-Partition für Tablespace-Definition: Wird zum Zwischenspeichern von Tablespace-Definitionsobjekten verwendet. Die Größenbeschränkung wird durch den Parameter tablespace_definition_cache bestimmt. Schemadefinitions-Cache-Partition: Wird zum Zwischenspeichern von Schemadefinitionsobjekten verwendet. Die Größenbeschränkung wird durch den Parameter schema_definition_cache bestimmt. Cache-Partition für Tabellendefinitionen: Wird zum Zwischenspeichern von Tabellendefinitionsobjekten verwendet. Die Größenbeschränkung wird durch den Parameter max_connections bestimmt. Cachepartition für gespeicherte Programmdefinitionen: Wird zum Zwischenspeichern von Definitionsobjekten gespeicherter Prozeduren verwendet. Die Größenbeschränkung wird durch den Parameter stored_program_definition_cache bestimmt. Cache-Partition für Zeichensatzdefinitionen: Wird zum Zwischenspeichern von Zeichensatzdefinitionsobjekten verwendet; fest codierte Begrenzung auf 256. Cachepartition für Sortierdefinitionen: Wird zum Zwischenspeichern von Sortierdefinitionsobjekten verwendet; fest codierter Grenzwert von 256. Atomares DDL Lassen Sie uns zunächst verstehen, was Atomizität ist. Atomarität bedeutet, dass die Ausführung einer Transaktion entweder vollständig erfolgreich ist oder vollständig fehlschlägt. Vor MySQL 8.0 konnte es aufgrund der fehlenden Unterstützung für atomares DDL zu Inkonsistenzen zwischen dem Datenwörterbuch, der Speicher-Engine-Struktur und dem Binärprotokoll kommen, wenn der Serviceprozess oder der Server ungewöhnlich abstürzte. In MySQL 8.0 wurden Datenwörterbücher in Tabellen der InnoDB-Speicher-Engine umgewandelt und außerdem wurde atomares DDL eingeführt. Atomic DDL führt Datenwörterbuchaktualisierungen, Speichermodulvorgänge und binäre Protokollschreibvorgänge in derselben Transaktion aus. Entweder werden alle erfolgreich festgeschrieben oder alle schlagen fehl und führen zu einem Rollback. Sehen wir uns als Nächstes ein Beispiel an, um atomares DDL zu verstehen. In diesem Beispiel gehören DROP TABLE t1 und t2 zur selben Transaktion. In Version 5.7 war eine Transaktion teilweise erfolgreich, schlug aber teilweise fehl, d. h. DROP TABLE t1 war erfolgreich, aber DROP TABLE t2 schlug fehl. In Version 8.0 schlug jedoch die gesamte Transaktion fehl und wurde zurückgesetzt, weil DROP TABLE t2 fehlschlug. Dieses Beispiel veranschaulicht den Unterschied zwischen Atomizität und Nichtatomizität. Version 5.7: mysql> TABELLE ERSTELLEN t1 (c1 INT); mysql> TABELLE DROP t1, t2; FEHLER 1051 (42S02): Unbekannte Tabelle „test.t2“ mysql> TABELLEN ANZEIGEN; Leerer Satz (0,00 Sek.) Version 8.0: mysql> TABELLE ERSTELLEN t1 (c1 INT); mysql> TABELLE DROP t1, t2; FEHLER 1051 (42S02): Unbekannte Tabelle „test.t2“ mysql> TABELLEN ANZEIGEN; +----------------+ | Tabellen_im_Test | +----------------+ | t1 | +----------------+ Nachdem wir uns mit dem atomaren DDL vertraut gemacht haben, stellen wir nun den spezifischen Prozess vor:
Abschließend möchte ich vorstellen, wie DDL-Protokolle angezeigt werden. Eine Methode besteht darin, auf die Tabelle mysql.innodb_ddl_log auf Debugebene zuzugreifen, um sie anzuzeigen (nicht empfohlen). Tabelle erstellen mysql.innodb_ddl_log ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, thread_id BIGINT UNSIGNED NOT NULL, Typ INT UNSIGNED NOT NULL, space_id INT UNSIGNED, Seitennummer INT UNSIGNED, index_id BIGINT UNSIGNED, Tabellen-ID BIGINT UNSIGNED, alter_dateipfad VARCHAR(512) COLLATE UTF8_BIN, neuer_Dateipfad VARCHAR(512) COLLATE UTF8_BIN, SCHLÜSSEL(Thread-ID) ); Eine andere Möglichkeit besteht darin, das DDL-Protokoll zur Ansicht in das Fehlerprotokoll zu drucken (empfohlen). mysql> setze global innodb_print_ddl_logs=on; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> setze global LOG_ERROR_VERBOSITY=3; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> Tabelle erstellen Test (ID int); Abfrage OK, 0 Zeilen betroffen (0,04 Sek.) $ tail -100f mysql-error.log 2020-08-17T19:55:09.804345+08:00 73 [Hinweis] [MY-012473] [InnoDB] DDL-Protokoll einfügen: [DDL-Eintrag: DELETE SPACE, id=57, thread_id=73, space_id=12, old_file_path=./test/test.ibd] 2020-08-17T19:55:09.804396+08:00 73 [Hinweis] [MY-012478] [InnoDB] DDL-Protokoll löschen: 57 2020-08-17T19:55:09.816850+08:00 73 [Hinweis] [MY-012477] [InnoDB] DDL-Protokoll einfügen: [DDL-Eintrag: CACHE ENTFERNEN, ID=58, Thread-ID=73, Tabellen-ID=1069, neuer Dateipfad=Test/Test] 2020-08-17T19:55:09.816887+08:00 73 [Hinweis] [MY-012478] [InnoDB] DDL-Protokoll löschen: 58 2020-08-17T19:55:09.820623+08:00 73 [Hinweis] [MY-012472] [InnoDB] DDL-Protokoll einfügen: [DDL-Eintrag: KOSTENLOS, ID=59, Thread-ID=73, Space-ID=12, Index-ID=160, Seitennr.=4] 2020-08-17T19:55:09.820673+08:00 73 [Hinweis] [MY-012478] [InnoDB] DDL-Protokoll löschen: 59 2020-08-17T19:55:09.837695+08:00 73 [Hinweis] [MY-012485] [InnoDB] DDL-Log-Post ddl: Beginn für Thread-ID: 73 2020-08-17T19:55:09.837721+08:00 73 [Hinweis] [MY-012486] [InnoDB] DDL-Log-Post DDL: Ende für Thread-ID: 73 Zusammenfassen Die in MySQL 8.0 enthaltenen Verbesserungen am Datenwörterbuch bringen viele Vorteile mit sich, darunter eine vereinheitlichte Metadatenverwaltung, die Zwischenspeicherung des Datenwörterbuchs, Leistungsverbesserungen bei Information_Schemas, atomares DDL und mehr. Oben finden Sie eine detaillierte Analyse der neuen Funktionen von MySQL 8.0 – Transaktionsdatenwörterbuch und Atomic DDL. Weitere Informationen zu den neuen Funktionen von MySQL 8.0 finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Eine Codezeile zeigt Ihnen, wie Sie Linux-Prozesse verbergen
Grundlegende Umgebung Pagoden-Montageservice [Pyt...
Schritt 1: Ubuntu-Quelle hinzufügen Wechseln Sie ...
Methode 1: Um Respin zu verwenden, folgen Sie die...
So verwenden Sie den Code im NetEase-Blog: Melden...
Inhaltsverzeichnis 1. Funktionsdefinition 1.1 Fun...
Warum müssen wir SQL optimieren? Wenn wir SQL-Anw...
1. Überprüfen Sie die Vue-Responsive-Nutzung Die...
MySQL x64 stellt kein Installationsprogramm berei...
Inhaltsverzeichnis 1. Ändern Sie den Port 2375 vo...
Docker zugrunde liegende Technologie: Die beiden ...
Inhaltsverzeichnis Vorwort Einführung in Closures...
Unter Linux ist alles eine Datei (Verzeichnisse s...
1. Offizielle Einführung grep ist ein häufig verw...
Das Meta-Tag wird verwendet, um Dateiinformationen...