MySQL 8.0 の新機能の分析 - トランザクション データ ディクショナリとアトミック DDL

MySQL 8.0 の新機能の分析 - トランザクション データ ディクショナリとアトミック DDL

序文

トランザクション データ ディクショナリとアトミック DDL は、MySQL 8.0 で導入された 2 つの非常に重要な新機能です。これら 2 つの新機能が組み合わされている理由は、これらが密接に関連しているためです。トランザクション データ ディクショナリは前提条件であり、アトミック DDL は重要なアプリケーション シナリオです。

MySQL 8.0 以前のデータ辞書

MySQL 8.0 より前のデータ ディクショナリは、主に次の 3 つの部分で構成されています。

(1)オペレーティングシステムファイル

db.opt: データベースのメタデータ情報
frm: テーブルメタデータ情報
par: テーブルパーティションのメタデータ情報
TRN/TRG: トリガーメタデータ情報
ddl_log.log: DDL プロセス中に生成されたメタデータ情報

(2) mysqlデータベースの非InnoDBシステムテーブル

mysql> information_schema.tables から table_schema、table_name、table_type、engine を選択します。ここで、table_schema='mysql'、engine<>'InnoDB' です。
+--------------+------------------+------------+---------+
| テーブルスキーマ | テーブル名 | テーブルタイプ | エンジン |
+--------------+------------------+------------+---------+
| mysql | columns_priv | ベーステーブル | MyISAM |
| mysql | db | ベーステーブル | MyISAM |
| mysql | イベント | ベース テーブル | MyISAM |
| mysql | 関数 | ベーステーブル | MyISAM |
| mysql | general_log | ベーステーブル | CSV |
| mysql | ndb_binlog_index | ベーステーブル | MyISAM |
| mysql | proc | ベーステーブル | MyISAM |
| mysql | procs_priv | ベーステーブル | MyISAM |
| mysql | proxies_priv | ベース テーブル | MyISAM |
| mysql | slow_log | ベーステーブル | CSV |
| mysql | tables_priv | ベーステーブル | MyISAM |
| mysql | ユーザー | ベース テーブル | MyISAM |
+--------------+------------------+------------+---------+
セット内の行数は 12 です (0.00 秒)

(3) mysqlデータベースのInnoDBシステムテーブル

mysql> information_schema.tables から table_schema、table_name、table_type、engine を選択します。ここで、table_schema='mysql'、engine='InnoDB' です。
+--------------+----------------------------+------------+---------+
| テーブルスキーマ | テーブル名 | テーブルタイプ | エンジン |
+--------------+----------------------------+------------+---------+
| mysql | engine_cost | ベーステーブル | InnoDB |
| mysql | gtid_executed | ベーステーブル | InnoDB |
| mysql | help_category | ベーステーブル | InnoDB |
| mysql | help_keyword | ベーステーブル | InnoDB |
| mysql | help_relation | ベーステーブル | InnoDB |
| mysql | help_topic | ベーステーブル | InnoDB |
| mysql | innodb_index_stats | ベーステーブル | InnoDB |
| mysql | innodb_table_stats | ベーステーブル | InnoDB |
| mysql | プラグイン | ベーステーブル | InnoDB |
| mysql | server_cost | ベーステーブル | InnoDB |
| mysql | サーバー | ベース テーブル | InnoDB |
| mysql | slave_master_info | ベーステーブル | InnoDB |
| mysql | slave_relay_log_info | ベーステーブル | InnoDB |
| mysql | slave_worker_info | ベーステーブル | InnoDB |
| mysql | タイムゾーン | ベーステーブル | InnoDB |
| mysql | time_zone_leap_second | ベーステーブル | InnoDB |
| mysql | time_zone_name | ベーステーブル | InnoDB |
| mysql | time_zone_transition | ベーステーブル | InnoDB |
| mysql | time_zone_transition_type | ベーステーブル | InnoDB |
+--------------+----------------------------+------------+---------+
セット内の行数は 19 です (0.00 秒)

データ ディクショナリが複数の場所に分散されていることがわかります。これは、一方ではメタデータの統一管理に役立たず、他方ではデータの不整合を引き起こしやすくなります (オペレーティング システム ファイルと非 InnoDB システム テーブルはトランザクションをサポートしていないため、DDL 操作を実行するときに ACID を保証できません)。

MySQL 8.0 データ辞書

上記の問題を解決するために、MySQL 8.0 では InnoDB ストレージ エンジンに格納されるデータ ディクショナリが改良され、次の 2 つの部分に分割されています。

(1)データ辞書テーブル:最も重要なメタデータ情報を格納し、MySQLデータベースにあり、MySQL共有テーブルスペース(mysql.ibd)に格納されます。

(2)その他のシステムテーブル:MySQLデータベース内の補助メタデータ情報を格納し、MySQL共有テーブルスペース(mysql.ibd)に格納される。

データ辞書テーブル

データ ディクショナリ テーブルは非表示であり、select を通じてアクセスすることも、show tables や information.schema.tables の結果にも表示されません。アクセスしようとすると、次のエラーが発生します。

mysql> mysql.tables から * を選択して、制限 10 を設定します。
エラー 3554 (HY000): データ ディクショナリ テーブル 'mysql.tables' へのアクセスが拒否されました。

ただし、これらの非表示のデータ ディクショナリ テーブルはデバッグ モードでアクセスできます。再コンパイルしてインストールし (プロセスは省略)、デバッグ モードでプロセスを開始して、再度アクセスを試みます。結果は次のとおりです。

mysql> SET SESSION debug='+d,skip_dd_table_access_check';

mysql> SELECT name, schema_id, hidden, type FROM mysql.tables where schema_id=1 AND hidden='System';
+------------------------------+-----------+--------+------------+
| 名前 | schema_id | 非表示 | タイプ |
+------------------------------+-----------+--------+------------+
| カタログ | 1 | システム | ベース テーブル |
| 文字セット | 1 | システム | ベース テーブル |
| check_constraints | 1 | システム | ベース テーブル |
| 照合 | 1 | システム | ベース テーブル |
| column_statistics | 1 | システム | ベース テーブル |
| column_type_elements | 1 | システム | ベース テーブル |
| 列 | 1 | システム | ベース テーブル |
| dd_properties | 1 | システム | ベース テーブル |
| イベント | 1 | システム | ベース テーブル |
| foreign_key_column_usage | 1 | システム | ベース テーブル |
| foreign_keys | 1 | システム | ベース テーブル |
| index_column_usage | 1 | システム | ベース テーブル |
| index_partitions | 1 | システム | ベース テーブル |
| index_stats | 1 | システム | ベース テーブル |
| インデックス | 1 | システム | ベース テーブル |
| innodb_ddl_log | 1 | システム | ベース テーブル |
| innodb_dynamic_metadata | 1 | システム | ベース テーブル |
| パラメータ タイプ要素 | 1 | システム | ベース テーブル |
| パラメータ | 1 | システム | ベース テーブル |
| resource_groups | 1 | システム | ベース テーブル |
| ルーチン | 1 | システム | ベース テーブル |
| スキーマ | 1 | システム | ベース テーブル |
| st_spatial_reference_systems | 1 | システム | ベース テーブル |
| table_partition_values ​​| 1 | システム | ベース テーブル |
| table_partitions | 1 | システム | ベース テーブル |
| table_stats | 1 | システム | ベース テーブル |
| テーブル | 1 | システム | ベース テーブル |
| tablespace_files | 1 | システム | ベース テーブル |
| 表領域 | 1 | システム | 基本テーブル |
| トリガー | 1 | システム | ベース テーブル |
| view_routine_usage | 1 | システム | ベース テーブル |
| view_table_usage | 1 | システム | ベース テーブル |
+------------------------------+-----------+--------+------------+
セット内の行数は 32 行 (0.01 秒)

その他のシステムテーブル

その他のシステム テーブルは、show tables または information_schema.tables を通じて表示できます。これらはすべて InnoDB ストレージ エンジンに改善されています (general_log と slow_log を除く。これら 2 つのテーブルはメタデータ情報を記録せず、ログ記録にのみ使用されます)。

mysql> information_schema.tables から table_schema、table_name、engine を選択します (table_schema='mysql')。
+--------------+---------------------------+--------+
| テーブルスキーマ | テーブル名 | エンジン |
+--------------+---------------------------+--------+
| mysql | columns_priv | InnoDB |
| mysql | コンポーネント | InnoDB |
| MySQL | データベース | InnoDB |
| mysql | デフォルトロール | InnoDB |
| mysql | エンジンコスト | InnoDB |
| mysql | 関数 | InnoDB |
| mysql | general_log | CSV |
| mysql | global_grants | InnoDB |
| mysql | gtid_executed | InnoDB |
| mysql | ヘルプカテゴリ | InnoDB |
| mysql | ヘルプキーワード | InnoDB |
| mysql | help_relation | InnoDB |
| mysql | ヘルプトピック | InnoDB |
| mysql | innodb_index_stats | InnoDB |
| mysql | innodb_table_stats | InnoDB |
| mysql | パスワード履歴 | InnoDB |
| mysql | プラグイン | InnoDB |
| mysql | procs_priv | InnoDB |
| mysql | proxies_priv | InnoDB |
| mysql | role_edges | InnoDB |
| mysql | server_cost | InnoDB |
| mysql | サーバー | InnoDB |
| mysql | スレーブマスター情報 | InnoDB |
| mysql | スレーブリレーログ情報 | InnoDB |
| mysql | スレーブワーカー情報 | InnoDB |
| mysql | slow_log | CSV |
| mysql | tables_priv | InnoDB |
| mysql | タイムゾーン | InnoDB |
| mysql | タイムゾーンのうるう秒 | InnoDB |
| mysql | タイムゾーン名 | InnoDB |
| mysql | タイムゾーン遷移 | InnoDB |
| mysql | タイムゾーン遷移タイプ | InnoDB |
| mysql | ユーザー | InnoDB |
+--------------+---------------------------+--------+
セット内の行数は 33 です (0.00 秒)

データディクショナリビュー

前述のとおり、データ ディクショナリ テーブルにはデバッグ モードでのみアクセスできます。では、実稼働環境でメタデータ情報を取得するにはどうすればよいでしょうか。答えは、information_schema ライブラリのデータ ディクショナリ ビューを通じて得られます。設計コンセプトは、メタデータ情報をベース テーブル (x$、$) に格納し、ビュー (v$、dba_/all_/user_) を通じてユーザーに提供する Oracle データベースと同じです。同じことが MySQL データベースにも当てはまり、メタデータ情報を MySQL ライブラリのデータ ディクショナリ テーブルに格納して非表示にし、ユーザーがクエリできるように information_schema ライブラリ ビューを提供します。

mysql> information_schema.tables から table_schema、table_name、table_type、engine を選択します。ここで、table_schema='information_schema' です。 
+--------------------+----------------------------------------+-------------+---------+
| テーブルスキーマ | テーブル名 | テーブルタイプ | エンジン |
+--------------------+----------------------------------------+-------------+---------+
| information_schema | ADMINISTRABLE_ROLE_AUTHORIZATIONS | システム ビュー | NULL |
| information_schema | APPLICABLE_ROLES | システム ビュー | NULL |
| information_schema | CHARACTER_SETS | システム ビュー | NULL |
| information_schema | CHECK_CONSTRAINTS | システム ビュー | NULL |
| information_schema | COLLATION_CHARACTER_SET_APPLICABILITY | システム ビュー | NULL |
| information_schema | 照合 | システム ビュー | NULL |
| information_schema | COLUMN_PRIVILEGES | システム ビュー | NULL |
| information_schema | COLUMN_STATISTICS | システム ビュー | NULL |
| information_schema | 列 | システム ビュー | NULL |
| information_schema | ENABLED_ROLES | システム ビュー | NULL |
| information_schema | エンジン | システム ビュー | NULL |
| information_schema | イベント | システム ビュー | NULL |
| information_schema | ファイル | システム ビュー | NULL |
| information_schema | INNODB_BUFFER_PAGE | システム ビュー | NULL |
| information_schema | INNODB_BUFFER_PAGE_LRU | システム ビュー | NULL |
| information_schema | INNODB_BUFFER_POOL_STATS | システム ビュー | NULL |
| information_schema | INNODB_CACHED_INDEXES | システム ビュー | NULL |
| information_schema | INNODB_CMP | システム ビュー | NULL |
| information_schema | INNODB_CMP_PER_INDEX | システム ビュー | NULL |
| information_schema | INNODB_CMP_PER_INDEX_RESET | システム ビュー | NULL |
| information_schema | INNODB_CMP_RESET | システム ビュー | NULL |
| information_schema | INNODB_CMPMEM | システム ビュー | NULL |
| information_schema | INNODB_CMPMEM_RESET | システム ビュー | NULL |
| information_schema | INNODB_COLUMNS | システム ビュー | NULL |
| information_schema | INNODB_DATAFILES | システム ビュー | NULL |
| information_schema | INNODB_FIELDS | システム ビュー | NULL |
| information_schema | INNODB_FOREIGN | システム ビュー | NULL |
| information_schema | INNODB_FOREIGN_COLS | システム ビュー | NULL |
| 情報スキーマ | INNODB_FT_BEING_DELETED | システム ビュー | NULL |
| information_schema | INNODB_FT_CONFIG | システム ビュー | NULL |
| information_schema | INNODB_FT_DEFAULT_STOPWORD | システム ビュー | NULL |
| information_schema | INNODB_FT_DELETED | システム ビュー | NULL |
| information_schema | INNODB_FT_INDEX_CACHE | システム ビュー | NULL |
| information_schema | INNODB_FT_INDEX_TABLE | システム ビュー | NULL |
| information_schema | INNODB_INDEXES | システム ビュー | NULL |
| information_schema | INNODB_METRICS | システム ビュー | NULL |
| information_schema | INNODB_SESSION_TEMP_TABLESPACES | システム ビュー | NULL |
| information_schema | INNODB_TABLES | システム ビュー | NULL |
| information_schema | INNODB_TABLESPACES | システム ビュー | NULL |
| information_schema | INNODB_TABLESPACES_BRIEF | システム ビュー | NULL |
| information_schema | INNODB_TABLESTATS | システム ビュー | NULL |
| information_schema | INNODB_TEMP_TABLE_INFO | システム ビュー | NULL |
| information_schema | INNODB_TRX | システム ビュー | NULL |
| information_schema | INNODB_VIRTUAL | システム ビュー | NULL |
| information_schema | KEY_COLUMN_USAGE | システム ビュー | NULL |
| information_schema | キーワード | システム ビュー | NULL |
| information_schema | OPTIMIZER_TRACE | システム ビュー | NULL |
| information_schema | パラメーター | システム ビュー | NULL |
| information_schema | パーティション | システム ビュー | NULL |
| information_schema | プラグイン | システム ビュー | NULL |
| information_schema | PROCESSLIST | システム ビュー | NULL |
| information_schema | プロファイリング | システム ビュー | NULL |
| information_schema | REFERENTIAL_CONSTRAINTS | システム ビュー | NULL |
| information_schema | RESOURCE_GROUPS | システム ビュー | NULL |
| information_schema | ROLE_COLUMN_GRANTS | システム ビュー | NULL |
| information_schema | ROLE_ROUTINE_GRANTS | システム ビュー | NULL |
| information_schema | ROLE_TABLE_GRANTS | システム ビュー | NULL |
| information_schema | ルーチン | システム ビュー | NULL |
| information_schema | SCHEMA_PRIVILEGES | システム ビュー | NULL |
| information_schema | スキーマ | システム ビュー | NULL |
| information_schema | ST_GEOMETRY_COLUMNS | システム ビュー | NULL |
| information_schema | ST_SPATIAL_REFERENCE_SYSTEMS | システム ビュー | NULL |
| information_schema | ST_UNITS_OF_MEASURE | システム ビュー | NULL |
| information_schema | 統計 | システム ビュー | NULL |
| information_schema | TABLE_CONSTRAINTS | システム ビュー | NULL |
| information_schema | TABLE_PRIVILEGES | システム ビュー | NULL |
| information_schema | テーブル | システム ビュー | NULL |
| information_schema | テーブルスペース | システム ビュー | NULL |
| information_schema | トリガー | システム ビュー | NULL |
| information_schema | USER_PRIVILEGES | システム ビュー | NULL |
| information_schema | VIEW_ROUTINE_USAGE | システム ビュー | NULL |
| information_schema | VIEW_TABLE_USAGE | システム ビュー | NULL |
| information_schema | ビュー | システム ビュー | NULL |
+--------------------+----------------------------------------+-------------+---------+
セット内の行数は 73 です (0.00 秒)

mysql> テーブル情報を表示_schema.tables\G を作成します
************************** 1. 行 ****************************
        表示: テーブル
     ビューの作成:アルゴリズムの作成= undefined definer = `mysql.infoschema`@` localhost` sql definerビューema`、( `tbl`.`name` utf8_tolower_ci)` table_name`、 `tbl`.`type`は` tbl`.`type` = 'base table')、 `eming` null `'as`' '' '' tbl`. 「バージョン」、 `tbl`.`row_format`は` row_format`、if( `tbl`.`type` = 'view')、null、internal_table_rows(` sch.`name`、 `tbl`.`name`、if .`se_private_id`、( `tbl`.`hidden` <> 'visible')、` ts`.`se_private_data`、coalesce( `statai`.`table_rows`、0)、coalesce(cast(` state`.` state`.`cached_time`)、unsigned)、signed 0) )、null、internal_avg_row_length( `sch`.`name`、` tbl`.`name`、if(( `tbl`.`partition_type」はnull)、` tbl`.`Engine`、 '')、 `tbl`.`se_private_id`、` tbl`.`_ididen`. data`、coalesce( `stat`.`avg_row_length`、0)、coalesce(` stat`.`cached_time` as unsigned)、0)、0))) `avg_row_length`、if ( `tbl`.`partition_type`はnull)、` tbl`.`Engine`、 ''、 ACHED_TIME`はunsigned)、0))))))if( `tbl`.`type` = 'view')、null、internal_max_data_length(` sch.`name`、 `tbl`.`name`、if(` tbl ` bl`.`se_private_id`、( `tbl`.`hidden`.`hidd` <> 'visible')、 `ts`.`se_private_data`、coalesce(` stat`.`max_data_length`、0)、coalesce(cast( `stat.` as as asigned _ data)、0) `thepe` = 'view')、null、internal_index_lents(` sch`name`、 `tbl`.`name`、(` tbl」 .`se_private_data`、coalesce( `stat`.`index_length`、0)、coalesce(cast(` stat`.`cached_time` as unsigned)、0))) `index_length`、if if(( `tbl`.`partition_type」、` tbl`.`engine`、 '')、 `tbl`.`se_private_id`、(` tbl`.`hidd` <> 'visible')、 `ts`.`se_private_data`、coales(coales(sati)、 `stati`.data`。 `cached_time` as unsigned)、0)))))if(` tbl`.`type` = 'view')、null、null、internal_auto_increment( `sch.`name`、` tbl`.`name`、if( `tbl` emint」 bl`.`se_private_id`、( `tbl`.`hidden` <> 'visible')、` ts`.`se_private_data`、coalesce( `stat`.`auto_increment`、0)、coalesce(cast(` state`.`cached_time」 _increment`、 `tbl`.`created`は` create_time`、( `tbl`.`type` = 'view')、null、internal_update_time(` sch.`name`、 `tbl`.`name`、if _private_id`、( `tbl`.`hidden` <> 'visible')、` ts`.`se_private_data`、coalesce( `stat`.`update_time` as unsigned)、0)、coalesce(cast(` stat.」 'view')、null、internal_check_time( `sch`name`、` tbl`.`name`、if(( `tbl`.`partition_type」はnull)、` tbl`.`Engine`、 '')、 `tbl`.`se_private_id`、(` tbl`.` _ididen`.`ididen`ibibid`) _data`、Coalesce(cast( `state`.`check_time` as unsigned)、0)、coalesse(` stat`.`cached_time` as unsigned)、0)) `check_time`.`name` ame`、 `tbl`.`name`、if(` tbl`.`partition_type`はnull)、 `tbl`.`engine`、 '')、` se_private_id`、 、coales(cast( `stat`.`cached_time」、unsigned)、0)))))if(` tbl`.`type` = 'view')、null、get_dd_create_options( `tbl`.`options`、if(` tbl」 art_tbl ')、0,1)、if(( `sch`.`default_encryption` =' yes ')、1,0))))` create_options`、internal_get_comment_or_error( `sch`.`name`、` tbl`.`name`、 `name`、` tbl`.`tpe`、 `tbl`. _comment` from )去り、( `tbl`.`collat​​ion_id` =` col`id`.`id`))on `mysql`.` ts` on(` tbl`.` tbl`.` `tbl` `tberespespace_id` =` ts` sattis`.`id`.(ts`.`id`.) `(`( `))`( `()`( `( `tbl`.`name` =` stati`.`table_name`)and( `sch`.`name` =` state`.`schema_name`))))))))))))))))
文字セットクライアント: utf8
照合接続: utf8_general_ci
セット内の 1 行 (0.00 秒)

データ辞書キャッシュ

ディスク IO を削減し、アクセス効率を向上させるために、MySQL 8.0 ではデータ ディクショナリ キャッシュが導入されました。データ ディクショナリ キャッシュは、メモリ管理に LRU アルゴリズムを使用するグローバル共有領域であり、次のものが含まれます。

表領域定義キャッシュ パーティション: 表領域定義オブジェクトをキャッシュするために使用されます。サイズ制限は、パラメーター tablespace_definition_cache によって決まります。
スキーマ定義キャッシュ パーティション: スキーマ定義オブジェクトをキャッシュするために使用されます。サイズ制限は、パラメーター schema_definition_cache によって決まります。
テーブル定義キャッシュ パーティション: テーブル定義オブジェクトをキャッシュするために使用されます。サイズ制限はパラメーター max_connections によって決まります。
ストアド プログラム定義キャッシュ パーティション: ストアド プロシージャ定義オブジェクトをキャッシュするために使用されます。サイズ制限は、パラメータstored_program_definition_cacheによって決まります。
文字セット定義キャッシュ パーティション: 文字セット定義オブジェクトをキャッシュするために使用されます。ハードコードされた制限は 256 です。
照合定義キャッシュ パーティション: 照合定義オブジェクトをキャッシュするために使用されます。ハードコードされた制限は 256 です。

アトミックDDL

まず、原子性とは何であるかを理解しましょう。アトミック性とは、トランザクションの実行が完全に成功するか、完全に失敗するかのいずれかを意味します。

MySQL 8.0 より前では、アトミック DDL がサポートされていないため、サービス プロセスが異常終了したり、サーバーが異常終了したりすると、データ ディクショナリ、ストレージ エンジン構造、バイナリ ログの間に不整合が発生する可能性があります。

MySQL 8.0 では、データ ディクショナリが InnoDB ストレージ エンジン テーブルに変換され、アトミック DDL も導入されました。アトミック DDL は、データ ディクショナリの更新、ストレージ エンジン操作、およびバイナリ ログの書き込みを同じトランザクションで実行します。すべてが正常にコミットされるか、すべてが失敗してロールバックされます。

次に、アトミック DDL を理解するための例を見てみましょう。この例では、DROP TABLE t1 と t2 は同じトランザクションに属しています。バージョン 5.7 では、トランザクションは部分的に成功しましたが、部分的に失敗しました。つまり、DROP TABLE t1 は成功しましたが、DROP TABLE t2 は失敗しました。ただし、バージョン 8.0 では、DROP TABLE t2 が失敗したため、トランザクション全体が失敗し、ロールバックされました。この例は、アトミック性と非アトミック性の違いを示しています。

バージョン 5.7:
mysql> テーブル t1 (c1 INT) を作成します。
mysql> テーブル t1、t2 を削除します。
エラー 1051 (42S02): 不明なテーブル 'test.t2'
mysql> テーブルを表示;
空のセット (0.00 秒)

バージョン 8.0:
mysql> テーブル t1 (c1 INT) を作成します。
mysql> テーブル t1、t2 を削除します。
エラー 1051 (42S02): 不明なテーブル 'test.t2'
mysql> テーブルを表示;
+----------------+
| テスト中のテーブル |
+----------------+
| t1 |
+----------------+

アトミック DDL について予備的に理解した後、具体的なプロセスを紹介しましょう。

(1)準備: 必要なオブジェクトを作成し、DDLログをmysql.innodb_ddl_logに書き込みます。DDLログには、DDL操作のロールフォワードとロールバックの方法を記録します。
(2)実行:DDL操作を実行する。
(3)コミット:データ辞書を更新し、コミットします。
(4)DDL後:DDLログを再生して削除します。 DDL ログは、インスタンスが異常終了した場合にのみ、mysql.innodb_ddl_log に保存され続けます。インスタンスが再起動された後、インスタンスのリカバリ フェーズで DDL ログが再生され、削除されます。ステップ 3 - データ ディクショナリの更新が正常に送信され、REDO ログと binlog に書き込まれた場合、DDL 操作は成功です。それ以外の場合、DDL 操作は失敗し、DDL ログに従ってロールバックされます。

最後に、DDL ログの表示方法を紹介します。

1 つの方法は、mysql.innodb_ddl_log テーブルをデバッグ レベルでアクセスして表示することです (推奨されません)

テーブルmysql.innodb_ddl_logを作成します(
 id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT 主キー、
 thread_id BIGINT UNSIGNED NOT NULL,
 型 INT UNSIGNED NOT NULL、
 スペースID INT UNSIGNED,
 ページ番号 INT UNSIGNED,
 index_id BIGINT UNSIGNED、
 テーブルID BIGINT UNSIGNED、
 古いファイルパス VARCHAR(512) COLLATE UTF8_BIN,
 新しいファイルパス VARCHAR(512) COLLATE UTF8_BIN,
 キー(スレッドID)
);

別の方法としては、DDLログをエラーログに出力して表示する方法があります(推奨)

mysql> グローバル innodb_print_ddl_logs をオンに設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> グローバル LOG_ERROR_VERBOSITY=3 を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> テーブル test(id int) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.04 秒)

$ テール -100f mysql-error.log
2020-08-17T19:55:09.804345+08:00 73 [注記] [MY-012473] [InnoDB] DDL ログ挿入: [DDL レコード: 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 [注記] [MY-012478] [InnoDB] DDL ログ削除: 57
2020-08-17T19:55:09.816850+08:00 73 [注記] [MY-012477] [InnoDB] DDL ログ挿入: [DDL レコード: REMOVE CACHE、id=58、thread_id=73、table_id=1069、new_file_path=test/test]
2020-08-17T19:55:09.816887+08:00 73 [注記] [MY-012478] [InnoDB] DDL ログ削除: 58
2020-08-17T19:55:09.820623+08:00 73 [注記] [MY-012472] [InnoDB] DDL ログ挿入: [DDL レコード: FREE、id=59、thread_id=73、space_id=12、index_id=160、page_no=4]
2020-08-17T19:55:09.820673+08:00 73 [注記] [MY-012478] [InnoDB] DDL ログ削除: 59
2020-08-17T19:55:09.837695+08:00 73 [注記] [MY-012485] [InnoDB] DDL ログ投稿 ddl: スレッド ID: 73 の開始
2020-08-17T19:55:09.837721+08:00 73 [注記] [MY-012486] [InnoDB] DDL ログ post ddl: スレッド ID の終了: 73

要約する

MySQL 8.0 のデータ ディクショナリの改善により、統合メタデータ管理、データ ディクショナリのキャッシュ、information_schema のパフォーマンス向上、アトミック DDL など、多くの利点がもたらされます。

上記は、MySQL 8.0 の新機能であるトランザクション データ ディクショナリとアトミック DDL の詳細な分析です。MySQL 8.0 の新機能の詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • MySQL 8.0 で列を素早く追加する方法
  • MySQLオンラインDDLの使用に関する詳細な説明
  • MySQL DDL による同期遅延を解決する方法
  • MySQL 8.0 アトミック DDL 構文の詳細な説明
  • MySQL オンライン DDL ツール gh-ost 原理分析
  • MySQL DDLステートメントの使用
  • 一般的なMysql DDL操作の概要
  • MySQL データ定義言語 DDL の基本ステートメント
  • MySQL 8.0 DDLアトミック機能と実装原則
  • MySQLオンラインDDL gh-ostの使用の概要
  • MySQL 5.7 でブロックポジショニング DDL の問題を解決する
  • MySQL 8.0 の新機能: アトミック DDL ステートメントのサポート
  • MySQL がユーザー名とパスワードの漏洩を引き起こす可能性のある Riddle の脆弱性を公開
  • MySQL 8.0 オンライン DDL クイック列追加の概要

<<:  Vue-router は現在の場所 (/path) へのナビゲーションを許可しません。エラーの原因と修正

>>:  Linux lsコマンドの使用

推薦する

Vue3+Vue-cli4 プロジェクトで Tencent スライダー検証コードを使用する方法

導入:従来の画像検証コードと比較して、スライダー検証コードには次の利点があります。サーバーは検証コー...

MySQL の null (IFNULL、COALESCE、NULLIF) に関する知識ポイントのまとめ

この記事では、MySQL の null (IFNULL、COALESCE、NULLIF) に関連する...

Linux で rsync を使用する方法

目次1. はじめに2. インストール3. 基本的な使い方3.1、-rパラメータ3.2、-aパラメータ...

アイデアを使用して Springboot 初期化サーバーを構築する際の問題分析

問題の説明最近、Springbootプロジェクトを構築していたところ、会社のネットワークケーブルに接...

Ubuntu 18.04の下のディレクトリにディスクをマウントします

導入この記事では、Ubuntu 18.04 デスクトップ システムでディスクを目的のディレクトリにマ...

Mac での MySQL と Squel Pro の設定

Node.js の人気に応えて、最近、いくつかのサーバー側機能を実装するために Node.js を使...

Nginx try_files ディレクティブの使用例

Nginx の設定構文は柔軟で、高度に制御可能です。バージョン 0.7 以降では、try_files...

初心者のための入門チュートリアル⑤:ウェブサイト登録はとても簡単、簡単な登録のヒント

スペースを購入してウェブサイトを構築したことがある友人なら、ウェブサイトは正式に開設する前に登録する...

LinuxシステムでのSystemC環境設定方法

以下はcentos7での設定方法ですsystemc ソース パッケージをダウンロード: System...

ブロックレベル要素、インライン要素、可変要素の概要

ブロック要素p - 段落テキストの事前フォーマットテーブルol - ソートフォームul - 順序なし...

ウェブページ HTML 順序付きリスト ol と順序なしリスト ul

データを整理するためのリストWeb ページの表示を制御する多数の HTML タグを学習した後、読者は...

jQueryはHTML要素の非表示と表示を実装します

商品を検索するときに、すべてのブランドまたは一部のブランドを表示するTaobaoの機能を真似してみま...

進捗バーのネイティブ JavaScript 実装

進捗バーを実装するためのJavaScriptの具体的なコードは参考までに。具体的な内容は次のとおりで...

CSS で背景ぼかし効果を実装するサンプルコード

以下のような効果でしょうか?もしそうなら、ぜひ読み進めてください! コードデモンストレーション(上の...

MySQL フィールドで NOT NULL を使用する必要があるのはなぜですか?

私は最近新しい会社に入社したのですが、データベース設計にいくつか小さな問題があることに気付きました。...