MySQL が InnoDB テーブルが独立したテーブルスペースか共有テーブルスペースかを判断する方法の詳細な説明

MySQL が InnoDB テーブルが独立したテーブルスペースか共有テーブルスペースかを判断する方法の詳細な説明

序文

InnoDB はデータをテーブルスペースに保存します。デフォルト設定では、初期サイズが 10 MB で、名前が ibdata1 のファイルがあります。このファイルはデフォルトのテーブルスペース ファイル (テーブルスペース ファイル) です。ユーザーは、パラメータ innodb_data_file_path を通じてこれを設定できます。データ ファイルは複数存在できます。innodb_file_per_table が設定されていない場合、それらの Innodb ストレージ タイプ テーブルのデータは、この共有テーブルスペースに配置されます。システム変数 innodb_file_per_table=1 の場合、InnoDB ストレージ エンジン タイプ テーブルは独立したテーブルスペースを生成します。独立したテーブルスペースの命名規則は、テーブル名.idb です。これらの個別のテーブルスペース ファイルには、テーブルのデータ、インデックス、挿入バッファー BITMAP、およびその他の情報のみが格納されます。その他の情報は、引き続き共有テーブルスペースに保存されます。では、データベース内のどのテーブルが独立したテーブルスペースで、どのテーブルが共有テーブルスペースであるかをどのように判断すればよいでしょうか。

InnoDB 論理ストレージ構造

方法1: ibdファイルで識別する

テーブルのストレージ エンジンが InnoDB であり、テーブルスペースが共有テーブルスペースである場合、データベースの対応するディレクトリに「テーブル名.ibd」ファイルは存在しません。独立表領域内のテーブルの場合、「テーブル名.ibd」ファイルがあります。しかし、この方法は非常に愚かです。本番環境では、この方法で多数のテーブルを判断するのは良い方法ではありません。

mysql> 'innodb_file_per_table' のような変数を表示します。
+-----------------------+-------+
| 変数名 | 値 |
+-----------------------+-------+
| innodb_file_per_table | オン |
+-----------------------+-------+
セット内の1行(0.01秒)
 
mysql> MyDB を使用します。
テーブル名と列名の補完のためのテーブル情報の読み取り
-Aでこの機能をオフにすると起動が速くなります。
 
データベースが変更されました
mysql> テーブル Independent_tablespace(name varchar(64)) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)
 
mysql>終了
 
[root@DB-Server ~]# cd /data/mysql/MyDB/
[root@DBサーバー MyDB]# ls -lrt Independent_tablespace*
-rw-rw---- 1 mysql mysql 8560 8月21日 22:05 Independent_tablespace.frm
-rw-rw---- 1 mysql mysql 98304 8月21日 22:05 Independent_tablespace.ibd
[root@DBサーバーMyDB]#

設定ファイル my.cnf で innodb_file_per_table=0 を設定し、MySQL サービスを再起動して、テーブル common_tablespace を作成すると、データ ディレクトリに common_tablespace.frm ファイルのみが表示されます。

mysql> 'innodb_file_per_table' のような変数を表示します。
+-----------------------+-------+
| 変数名 | 値 |
+-----------------------+-------+
| innodb_file_per_table | オフ |
+-----------------------+-------+
セット内の 1 行 (0.00 秒)
 
mysql> MyDB を使用します。
テーブル名と列名の補完のためのテーブル情報の読み取り
-Aでこの機能をオフにすると起動が速くなります。
 
データベースが変更されました
mysql> テーブル common_tablespace(name varchar(64)) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
 
mysql>終了
さよなら
[root@DBサーバー MyDB]# ls -lrt common_tablespace*
-rw-rw---- 1 mysql mysql 8560 8月21日 22:08 common_tablespace.frm
[root@DBサーバーMyDB]#

方法 2: INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES を使用して決定します。

MySQL 5.6

MySQL 5.6 INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES このシステム テーブルは、行形式、圧縮ページ サイズ ビット レベル (該当する場合)、INNODB テーブルスペース情報など、テーブルの形式とストレージ特性に関する情報を提供します。

INNODB_SYS_TABLESPACES テーブルは、InnoDB データ ディクショナリの SYS_TABLESPACES テーブルの情報と同等の、InnoDB テーブルスペースに関するメタデータを提供します。

私は、INFORMATION_SCHEMA データベースの下にある INNODB_SYS_TABLESPACES テーブルを理解するために時間を費やし、それらの InnoDB エンジン テーブルが独立したテーブル スペースであるか共有テーブル スペースであるかを判断するための SQL を作成しました。

共有表領域:

テーブルスキーマを選択
 ,テーブル名
 ,テーブルタイプ
 ,N'共有テーブルスペース' AS TABLE_SPACE
 、エンジン
 、バージョン
 ,テーブル行
 ,平均行長
 、作成時間
 、更新日時
INFORMATION_SCHEMA.TABLES Tから
INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME を左結合します
I.NAME が NULL であり、T.TABLE_SCHEMA='MyDB' かつ T.ENGINE='InnoDB' の場合; 

ただし、このスクリプトには小さなバグがあります。テーブル名に特殊文字が含まれている場合、エラーが発生する可能性があります。これは、テーブル名に特殊文字が含まれている場合、ファイル名またはINFORMATION_SCHEMA.INNODB_SYS_TABLESPACESのNAMEが以下のようにエスケープされるためです。

独立したテーブルスペース

テーブルスキーマを選択
 ,テーブル名
 ,テーブルタイプ
 ,N'独立テーブルスペース' AS TABLE_SPACE
 、エンジン
 、バージョン
 ,テーブル行
 ,平均行長
 、作成時間
 、更新日時
INFORMATION_SCHEMA.TABLES Tから
INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME
ここで、T.TABLE_SCHEMA='MyDB' かつ T.ENGINE='InnoDB'; 

方法3: INFORMATION_SCHEMA.INNODB_SYS_TABLESの決定

MySQL 5.7

MySQL 5.7 であれば、MySQL 5.6 よりも方法が 1 つ増えます。MySQL 5.7 の INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES には追加の SPACE_TYPE フィールドがありますが、その値はすべて Single です。また、INFORMATION_SCHEMA.INNODB_SYS_TABLES にも追加のフィールド SPACE_TYPE があり、その値は Single と System で、それぞれ別のテーブルスペースと共有テーブルスペースを表します。

#別のテーブルスペース

INFORMATION_SCHEMA.INNODB_SYS_TABLES から * を選択
ここで、SPACE_TYPE='シングル';
 
 
 
テーブルスキーマを選択
 ,テーブル名
 ,テーブルタイプ
 ,N'独立テーブルスペース' AS TABLE_SPACE
 、エンジン
 、バージョン
 ,テーブル行
 ,平均行長
 、作成時間
 、更新日時
INFORMATION_SCHEMA.TABLES Tから
INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME
ここで、T.TABLE_SCHEMA='YourDatabase' かつ T.ENGINE='InnoDB';

#共有テーブルスペース

INFORMATION_SCHEMA.INNODB_SYS_TABLES から * を選択
ここで、SPACE_TYPE='System';
 
 
 
テーブルスキーマを選択
 ,テーブル名
 ,テーブルタイプ
 ,N'共有テーブルスペース' AS TABLE_SPACE
 、エンジン
 、バージョン
 ,テーブル行
 ,平均行長
 、作成時間
 、更新日時
INFORMATION_SCHEMA.TABLES Tから
INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME を左結合します
I.NAME が NULL であり、T.TABLE_SCHEMA='YourDatabase' かつ T.ENGINE='InnoDB' の場合

方法4: INFORMATION_SCHEMA.INNODB_TABLESの決定

MySQL 8.0

MySQL 8.0 であれば、INFORMATION_SCHEMA.INNODB_TABLES で判断する方法がもう 1 つあります。この新しく追加されたシステム テーブルは、SPACE_TYPE フィールドを通じて共有テーブルスペースと独立テーブルスペースを区別できます。

INFORMATION_SCHEMA.INNODB_TABLES から * を選択し、 SPACE_TYPE を 'Single' に設定します。

参考文献:

参考文献

参考文献: innodb_i_s_tables

https://dev.mysql.com/doc/refman/5.6/en/innodb-sys-tablespaces-table.html#innodb-sys-tablespaces-table-flag-column

https://dev.mysql.com/doc/refman/5.6/en/innodb-sys-tablespaces-table.html

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL InnoDB テーブルスペースのアンロード、移行、ロードの使用方法
  • MySQL InnoDB テーブルスペース暗号化の例の詳細な説明

<<:  Vue 3.0 カスタムディレクティブの使い方

>>:  docker-compsoe を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

推薦する

Docker-compose インストール db2 データベース操作

db2 データベースをホストマシンに直接インストールするのは面倒で、ユーザーや権限を巻き込むのも不便...

jconsole を使用してリモート Tomcat サービスを監視する方法

JConsoleとはJConsole は Java 5 で導入されました。 JConsole は、コ...

TomcatとJDKのバージョンの対応と各Tomcatバージョンの機能

Apache Tomcat は、Java Servlet および Java Server Pages...

vue.js を使用してドラッグ アンド ドロップ機能を実装する方法

序文ドラッグ アンド ドロップ機能を追加すると、プログラムがより自然でユーザーフレンドリーになります...

CentOS の環境変数と設定ファイルの詳細な説明

序文CentOS 環境変数設定ファイル システムは階層型システムであり、他のマルチユーザー アプリケ...

HTML 順序なしリスト 箇条書き 画像を使用した CSS の記述

少なくとも 5 冊のベストセラー書籍の順序なしリストを含む HTML ページを作成します。各書籍の前...

MySQLカバーインデックスの使用例

カバーインデックスとは何ですか?クエリで使用されるすべてのフィールドを含むインデックスを作成すること...

いくつかの面接の質問を使ってJavaScriptの実行メカニズムを調べる

目次前の単語同期と非同期前菜プレートを追加マクロタスク マイクロタスク約束しましょうタイマーを追加す...

jQueryはバウンドボールゲームを実装します

この記事では、バウンドボールゲームを実装するためのjQueryの具体的なコードを参考までに共有します...

設定ファイルを変更した後、操作を再開します

余計なことは言わないで、コードだけ見てみましょう〜 # docker-compose をダウン # ...

Tomcat を使用して Centos 環境に SpringBoot WAR パッケージをデプロイする

戦争パッケージを準備する1. 既存のSpringBootプロジェクトを準備し、pomに依存関係を追加...

美しいチェックボックススタイル(複数選択ボックス)はIE8/9/10、FFなどと完全に互換性があります。

恥ずかしながら、このようなよく使われるチェックボックスのスタイルを変更するために、Baidu で長い...

太字の <b> と <strong> の違いの分析

私たちウェブマスターは皆、ウェブサイトを最適化する際に記事内のキーワードを太字にすることが最適化に非...