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 を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

推薦する

Vue の要素カレンダー コンポーネントを使用したサンプル コード

まず効果図を見てみましょう: 完全なコードは添付されています <テンプレート> <...

Docker 大規模プロジェクトのコンテナ化変革

仮想化とコンテナ化は、クラウドベースのプロジェクトでは避けられない 2 つの問題です。仮想化は純粋な...

DOCTYPEタイプの詳細な紹介

<br />通常、HTML では次の方法で DOCTYPE を宣言します。 <!D...

JS でシンプルな画像カルーセル効果を実現

この記事では、シンプルな画像カルーセル効果を実現するためのJSの具体的なコードを参考までに紹介します...

Vueは、サイドナビゲーションバーをタブページに関連付けるサンプルコードを実装します。

目次テクノロジースタック効果分析するテクノロジースタックサイドバー用Antdtabは要素を使用します...

JavaScript フレームワーク デザイン パターンの詳細な説明

目次動画最優秀選手ムヴヴムVueのソーススパ mpa要素を作成するクラス要約する動画 Model(模...

Linuxはjoin -a1を使用して2つのファイルを結合します

次の2つのファイルを結合するには、それらを結合して1.txtに結合します。 # 1.txt ジェリー...

MySQL の問題を解決する: MSVCR120.dll が見つからないため、コードの実行を続行できません

1. 問題MySQL の初期化時に発生する問題は、次のとおりです。 1. 「MSVCR120.dll...

MySQLの重複排除方法

MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...

ElementUI の el-dropdown に複数のパラメータを実装する方法

最近、業務上のボタンの増加により、ページレイアウトにボタンが多すぎて、ページが美しくなく、ユーザーエ...

MYSQL の 10 の典型的な最適化ケースとシナリオ

目次1. SQL最適化の一般的な手順1. SQL実行計画の分析を説明する2. プロフィール分析を表示...

Docker、Nginx、Jenkins をベースにした自動フロントエンド デプロイメント

目次事前準備展開ターゲットDocker環境構築クラウドサーバーに接続Docker環境をインストールす...

JavaScript で知らない Object.entries の使い方

目次序文1. 共通オブジェクトを反復処理するには for...of を使用します2. 通常のオブジェ...

Ubuntu 18でターミナルを美しいコマンドラインプロンプトに変更する方法

VMware と Ubuntu を再インストールしましたが、コマンドラインプロンプトが単調すぎて美し...

Linux での MySQL の文字化け問題の解決方法

プロジェクトはサーバーと対話し、post を通じてサーバー側の jsp にアクセスし、jsp はサー...