データディクショナリテーブルは保護されており、MySQL のデバッグビルドでのみアクセスできます。 ただし、MySQL では、INFORMATION_SCHEMA
テーブルおよび SHOW
ステートメントを介したデータディクショナリテーブルに格納されたデータへのアクセスがサポートされています。 データディクショナリを構成するテーブルの概要は、データディクショナリテーブル を参照してください。
MySQL システムテーブルは MySQL 8.0 にまだ存在し、mysql
システムデータベースで SHOW TABLES
ステートメントを発行することで表示できます。 通常、MySQL データディクショナリテーブルとシステムテーブルの違いは、データディクショナリテーブルには SQL クエリーの実行に必要なメタデータが含まれるのに対し、システムテーブルにはタイムゾーンやヘルプ情報などの補助データが含まれることです。 MySQL システムテーブルとデータディクショナリテーブルも、アップグレード方法が異なります。 MySQL サーバーは、データディクショナリのアップグレードを管理します。 SQL サーバー。 データディクショナリのアップグレード方法を参照してください。 MySQL システムテーブルをアップグレードするには、完全な MySQL アップグレード手順を実行する必要があります。 セクション2.11.3「MySQL のアップグレードプロセスの内容」を参照してください。
MySQL の新しいバージョンには、データディクショナリテーブル定義の変更が含まれる場合があります。 このような変更は、新しくインストールされたバージョンの MySQL に存在しますが、MySQL バイナリのインプレースアップグレードを実行すると、新しいバイナリを使用して MySQL サーバーを再起動したときに変更が適用されます。 起動時に、データディクショナリテーブルをアップグレードする必要があるかどうかを判断するために、サーバーのデータディクショナリのバージョンがデータディクショナリに格納されているバージョン情報と比較されます。 アップグレードが必要でサポートされている場合、サーバーは、更新された定義を含むデータディクショナリテーブルを作成し、永続化されたメタデータを新しいテーブルにコピーし、古いテーブルを新しいテーブルに原子的に置き換え、データディクショナリを再初期化します。 アップグレードが不要な場合、データディクショナリテーブルを更新せずに起動が続行されます。
データディクショナリテーブルのアップグレードはアトミック操作で、すべてのデータディクショナリテーブルが必要に応じてアップグレードされるか、操作が失敗することを意味します。 アップグレード操作が失敗した場合、サーバーの起動はエラーで失敗します。 この場合、古いサーバーバイナリを古いデータディレクトリとともに使用してサーバーを起動できます。 新しいサーバーバイナリを再度使用してサーバーを起動すると、データディクショナリのアップグレードが再試行されます。
通常、データディクショナリテーブルが正常にアップグレードされた後は、古いサーバーバイナリを使用してサーバーを再起動することはできません。 その結果、データディクショナリテーブルのアップグレード後、MySQL サーバーバイナリの以前の MySQL バージョンへのダウングレードはサポートされません。
mysqld --no-dd-upgrade
オプションを使用すると、起動時のデータディクショナリテーブルの自動アップグレードを回避できます。 --no-dd-upgrade
が指定され、サーバーのデータディクショナリのバージョンがデータディクショナリに格納されているバージョンと異なることがサーバーで検出されると、データディクショナリのアップグレードが禁止されていることを示すエラーで起動が失敗します。
データディクショナリテーブルはデフォルトで保護されていますが、デバッグサポートを使用して (-DWITH_DEBUG=1
CMake オプションを使用して)MySQL をコンパイルし、+d,skip_dd_table_access_check
debug
オプションおよび修飾子を指定することでアクセスできます。 デバッグビルドのコンパイルの詳細は、セクション5.9.1.1「デバッグのための MySQL のコンパイル」 を参照してください。
データディクショナリテーブルを直接変更または書き込むことはお薦めしません。また、MySQL インスタンスが動作不能になる可能性があります。
デバッグサポート付きで MySQL をコンパイルした後、次の SET
ステートメントを使用して、mysql クライアントセッションでデータディクショナリテーブルを表示できるようにします:
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';
データディクショナリテーブル定義を表示するには、SHOW CREATE TABLE
を使用します。 例:
mysql> SHOW CREATE TABLE mysql.catalogs\G