MySQL 5.7 の一時テーブルスペースを使用して落とし穴を回避する方法

MySQL 5.7 の一時テーブルスペースを使用して落とし穴を回避する方法

導入

MySQL 5.7 は、SSL/TLS と全体的なセキュリティ開発におけるいくつかの重要な変更により、これまでにリリースされた中で最も安全な MySQL サーバーになることを目指しています。

MySQL 5.7 以降では独立した一時表領域がサポートされていますが、問題が発生する場合があります。

MySQL 5.7 以降では、独立した一時テーブルスペースが使用されます (独立した UNDO テーブルスペースとは異なります)。ファイルの名前は ibtmp1 で、12 MB に初期化され、デフォルトでは上限はありません。

オプション innodb_temp_data_file_path は、一時表領域関連のパラメータを構成します。

innodb_temp_data_file_path = ibtmp1:12M:自動拡張

一時表領域に関する注意事項

  • 一時表領域は、通常の InnoDB 表領域のような RAW デバイスをサポートしません。
  • 一時表領域は動的表領域 ID を使用するため、再起動のたびに変更されます (一時表領域ファイルは再起動のたびに再初期化されます)。
  • オプション設定が正しくない場合、またはその他の理由 (権限不足など) により一時テーブルスペースを作成できない場合は、mysqld インスタンスも起動できません。
  • 一時テーブルスペースには、圧縮されていない InnoDB 一時テーブルが格納されます。圧縮された InnoDB 一時テーブルの場合は、tmpdir (/tmp) ディレクトリに格納されている独自のテーブルスペース ファイルに個別に格納する必要があります。
  • 一時テーブルのメタデータは、INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO ビューに保存されます。

SQL リクエストを実行すると、一時テーブルが生成されることがあります。極端な場合、一時テーブル スペース ファイルが突然増加することがあります。私がサポートしたケースでは、最大増加は 300G 近くで、これは私がこれまでに経験した ibdata1 ファイルの突然の増加よりもさらに深刻です...

一時テーブルの使用に関する提案

  • innodb_temp_data_file_path オプションを設定して、最大ファイルサイズを設定します。サイズが最大値を超えると、一時テーブルを生成する必要がある SQL 文は実行できなくなります (一般に、このような SQL 文の効率も比較的低いため、この機会に最適化することができます)。
  • INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO をチェックし、最大の一時テーブルに対応するスレッドを見つけて、それを強制終了して解放します。ただし、ibtmp1 ファイルは解放できません (システムを再起動しない限り)。
  • ibtmp1 ファイルを解放するには、適切なタイミングでインスタンスを再起動します。ibdata1 とは異なり、ibtmp1 は再起動時に再初期化されますが、ibdata1 は再初期化できません。
  • N 秒以上 (たとえば、N = 300) 実行されている SQL ステートメントを定期的にチェックし、ジャンク SQL ステートメントが長時間実行されてビジネスに影響を与えるのを防ぐために、それらのステートメントを強制終了することを検討してください。

添付ファイル: 一時テーブルテストケース

テーブルDDL

一時テーブル `tmp1` を作成します (
 `id` int(10) unsigned NOT NULL DEFAULT '0',
 `name` varchar(50) NOT NULL デフォルト ''
 `aid` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 `nid` int(11) unsigned 常に ((`id` + 1)) VIRTUAL NOT NULL として生成されます。
 `nnid` int(11) unsigned 常に ((`id` + 1)) として生成され、NULL として保存されません。
 主キー (`aid`)、
 キー `name` (`name`),
 キー `id` (`id`),
 キー `nid` (`nid`)
) エンジン=InnoDB デフォルト文字セット=utf8

元のテーブルのサイズはわずか 120 MB です。このテーブルから直接 INSERT...SELECT を実行して、tmp1 テーブルにデータをインポートします。

-rw-r----- 1年前 imysql 120M 4月14日 10:52 /data/mysql/test/sid.ibd

一時テーブルを生成し(仮想列を削除、一時テーブルは仮想列をサポートしていないため、データを書き込みます)、さらに大きくなります(理解できません。理由は後で調べます)。

-rw-r----- 1 yejr imysql 140M 6月25日 09:55 /Users/yejinrong/mydata/ibtmp1

一時テーブルのメタデータ情報を表示する

[email protected] [テスト]>* を選択 
 INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO_G
********************** 1. 行 ************************
   テーブルID: 405
    名前: #sql14032_300000005_3
    列数: 6
    スペース: 421
PER_TABLE_TABLESPACE: 偽
  IS_COMPRESSED: 偽

インデックスを再度削除すると、さらに大きくなります。

-rw-r----- 1年前 imysql 204M 6月25日 09:57 /data/mysql/ibtmp1

2回目のテストでインデックスを削除したら200Mになった(2回目のテストでは一時テーブルの最大サイズを200Mに設定していたため)

innodb_temp_data_file_path = ibtmp1:12M:自動拡張:最大:200M
-rw-r----- 1年前 imysql 200M 6月25日 10:15 /data/mysql/ibtmp1

一時テーブルを生成する低速の SQL ステートメントを実行します。

注意: MySQL 5.7 以降では、UNION ALL を実行しても一時テーブルは生成されなくなりました (追加のソートが必要な場合を除く)。

[email protected] [テスト]> select * from tmp1 union の説明 
 sid\G から id、name、aid を選択
************************** 1. 行 ****************************
   id: 1
 選択タイプ: プライマリ
  テーブル: tmp1
 パーティション: NULL
   タイプ: すべて
可能なキー: NULL
   キー: NULL
  キー長さ: NULL
   参照: NULL
   行数: 3986232
  フィルター: 100.00
  追加: NULL
************************** 2. 行 ****************************
   id: 2
 選択タイプ: UNION
  テーブル: sid
 パーティション: NULL
   タイプ: すべて
可能なキー: NULL
   キー: NULL
  キー長さ: NULL
   参照: NULL
   行数: 802682
  フィルター: 100.00
  追加: NULL
************************** 3. 行 ****************************
   id: NULL
 select_type: UNION 結果
  テーブル: <union1,2>
 パーティション: NULL
   タイプ: すべて
可能なキー: NULL
   キー: NULL
  キー長さ: NULL
   参照: NULL
   行: NULL
  フィルター: NULL
  追加: 一時的な使用

ファイルサイズが588Mに増加しましたが、まだ完了していません。

-rw-r----- 1年前 imysql 588M 6月25日 10:07 /data/mysql/ibtmp1

2 回目のテストでは、一時表領域ファイルの最大サイズが 200 MB に設定され、再度実行したときにエラーが報告されました。

[email protected] [テスト]>tmp1 ユニオンから * を選択 
 sid から id、name、aid を選択します。
エラー 1114 (HY000): テーブル '/var/folders/bv/j4tjn6k54dj5jh1tl8yn6_y00000gn/T/#sql14032_5_8' がいっぱいです

要約する

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

参照する

[MySQL FAQ] シリーズ - 一時テーブルを使用する場合

FAQ シリーズ | ibdata1 ファイルのサイズが急上昇するのを防ぐ方法

一時ファイル

内部一時テーブル

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_temp_data_file_path

一時テーブルスペース

以下もご興味があるかもしれません:
  • Mysql の一時テーブルとパーティションテーブルの違いの詳細な説明
  • Mysql一時テーブルの原理と作成方法の分析
  • mysql 一時テーブルの使用状況の分析 [クエリ結果は一時テーブルに保存できます]
  • MySQL FAQ シリーズ: 一時テーブルを使用する場合
  • JDBC および MySQL 一時テーブルスペースの詳細な分析
  • MySQL 一時テーブルの簡単な使用法
  • MySQL における単一テーブルと複数テーブル、およびビューと一時テーブルに対する Update と Select の違い
  • MySQL の 2 種類の一時テーブルの使用方法の詳細な説明
  • MySQL の一時テーブルと派生テーブルについての簡単な説明
  • MySQL の一時テーブルの基本作成と使用のチュートリアル
  • MySQL の一時テーブルの基本的な使用方法
  • 一時テーブルを使用して MySQL クエリを高速化する方法
  • MySQL での一時テーブルの使用例

<<:  Nginx で limit_req_zone を使用して同じ IP へのアクセスを制限する方法

>>:  jsは古典的なマインスイーパゲームを実装します

推薦する

JS で Websocket ベースのマルチターミナル ブリッジング プラットフォームを実装する方法

目次1. デバッグ対象2. WebSocketの機能3. ソケット接続を確立する3.1 部屋の作成方...

MySQL でトランザクションのコミットとロールバックを実装する方法の詳細な例

最近、データベース データのスケジュールされた移行を実行する必要があります。実行プロセス中に何らかの...

HTML テーブルタグチュートリアル (12): 境界線スタイル属性 FRAME

FRAME プロパティを使用して、表の境界線のスタイル タイプを制御します。基本的な構文<T...

VMware15.5 インストール Ubuntu20.04 グラフィック チュートリアル

1. インストール前の準備1. 公式ウェブサイトからUbuntu 20.04のイメージファイルを直接...

MySql が常に mySqlInstallerConsole ウィンドウをポップアップする問題の解決策

MySql は常に MySQLInstallerConsole.exe ウィンドウを定期的にポップア...

CentOS 7 に Docker 1.8 をインストールする詳細な手順

Docker は、次の CentOS バージョンでの実行をサポートしています。 • CentOS 7...

HTMLがHikvisionカメラのリアルタイム監視機能を実現

最近、同社は CCFA 関連のいくつかの作業を行う予定で、その 1 つはカメラのリアルタイム監視を再...

Linux環境でのActiveMQ導入方法の詳しい説明

この記事では、Linux 環境での ActiveMQ の展開方法について説明します。ご参考までに、詳...

JavaScript の基礎: エラーキャプチャメカニズム

目次序文エラーオブジェクト投げる試して…捕まえて…最後に最終ルールトライ/キャッチパフォーマンスウィ...

Vueはvueメタ情報を使用して各ページのタイトルとメタ情報を設定します。

title: vue は vue-meta-info を使用して各ページのタイトルとメタ情報を設定...

CSSはリストのスタイルを設定し、ナビゲーションメニューの実装コードを作成します。

1. リストシンボルを設定するlist-style-type: attribute; //リストの...

nginx と keepalived を組み合わせて高可用性を実現するための手順を完了する

序文システムの高可用性を満たすためには、通常、クラスターを構築する必要があります。ホストがクラッシュ...

Jupyter Notebook で JavaScript を実行する方法

その後、VSC で Jupyter Notebook を使用する方法も追加しました...アナコンダを...

MySQL 5.7 と Mac 上の MySql の詳細なインストール図をダウンロードする

1.ブラウザに次のアドレスを入力します参考: 2. 次のインターフェースに入ります。下の場所をクリッ...

MySQL 演算子の具体的な使用法 (and、or、in、not)

目次1. はじめに2. 本文2.1 および演算子2.2 または演算子2.3 オペレーター2.4 no...