MySQL オンラインリカバリ UNDO テーブルスペース 実戦記録

MySQL オンラインリカバリ UNDO テーブルスペース 実戦記録

1 MySQL5.6

1.1 関連パラメータ

MySQL 5.6 では、innodb_undo_directory、innodb_undo_logs、innodb_undo_tablespaces の 3 つのパラメータが追加され、これにより、undo ログを ibdata1 から移動して個別に保存できるようになります。

  • innodb_undo_directory: UNDO テーブルスペースが個別に保存されるディレクトリを指定します。デフォルト値は . (つまり datadir) です。相対パスまたは絶対パスを設定できます。このパラメータ インスタンスは初期化後に直接変更することはできませんが、データベースを停止し、構成ファイルを変更してから、UNDO 表領域ファイルを移動することで変更できます。

デフォルトのパラメータ:

mysql> '%undo%' のような変数を表示します。
+-------------------------+-------+
| 変数名 | 値 |
+-------------------------+-------+
| innodb_undo_directory | . |
| innodb_undo_logs | 128 |
| innodb_undo_tablespaces | 0 |
+-------------------------+-------+
  • innodb_undo_tablespaces: 個別に保存される UNDO テーブルスペースの数を指定します。たとえば、3 に設定されている場合、UNDO テーブルスペースは undo001、undo002、undo003 となり、各ファイルの初期サイズはデフォルトで 10M になります。このパラメータを 3 以上に設定することをお勧めします。その理由については後述します。このパラメータインスタンスは初期化後に変更できません

インスタンスの初期化は、innodb_undo_tablespaces を変更することです。

mysql_install_db ...... --innodb_undo_tablespaces

$ ls
...
元に戻す001 元に戻す002 元に戻す003
  • innodb_rollback_segments: デフォルト値は 128 です。各ロールバック セグメントは、同時に 1024 のオンライン トランザクションをサポートできます。これらのロールバック セグメントは、各 UNDO 表領域に均等に分散されます。この変数は動的に調整できますが、物理的なロールバック セグメントは削減されず、使用されるロールバック セグメントの数のみが制御されます。

1.2 使用方法

インスタンスを初期化する前に、innodb_undo_tablespaces パラメータ (3 以上を推奨) を設定して、UNDO ログを別の UNDO テーブルスペースに設定するだけです。より高速なデバイスに undo ログを配置する必要がある場合は、innodb_undo_directory パラメータを設定できますが、現在 SSD が非常に普及しているため、通常はこれを行いません。 innodb_undo_logs はデフォルトで 128 に設定できます。

UNDO ログは ibdata の外部に保存できます。しかし、この機能はまだ役に立ちません:

  • まず、インスタンスをインストールするときに、独立した UNDO 表領域を指定する必要があります。インストールが完了した後は変更できません。
  • UNDO 表領域のスペース ID は 1 から始まる必要があります。UNDO 表領域を追加または削除することはできません。

1.3 大規模トランザクションのテスト

mysql> テーブル test.tbl( id int primary key auto_increment, name varchar(200) ) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)

mysql> トランザクションを開始します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> test.tbl(name) に値を挿入します(repeat('1',00));
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> test.tbl(name) に挿入し、test.tbl から name を選択します。
クエリは正常、1 行が影響を受けました (0.00 秒)
記録: 1 重複: 0 警告: 0

...

mysql> test.tbl(name) に挿入し、test.tbl から name を選択します。
クエリは正常、2097152 行が影響を受けました (24.84 秒)
レコード: 2097152 重複: 0 警告: 0

mysql> コミット;
クエリは正常、影響を受けた行は 0 行 (7.90 秒)

アンドログが拡大し始めたのがわかります!トランザクションがコミットされた後、スペースは再利用されません。

$ du -sh 元に戻す*
10M 元に戻す001
69M 元に戻す002
10M 元に戻す003

2 MySQL5.7

5.7 オンラインでの UNDO 表領域の切り捨てを導入

2.1 関連パラメータ

必要条件:

  • innodb_undo_tablespaces: クリーンアップ中に一方が他方を使用できるように、少なくとも 2 つ。このパラメータは、インスタンスの初期化後に変更することはできません。
  • innodb_rollback_segments: ロールバック セグメントの数。システム テーブルスペースには常に 1 つのロールバック セグメントが割り当てられ、一時テーブルスペース用に 32 個が予約されています。したがって、UNDO 表領域を使用する場合は、この値は少なくとも 33 である必要があります。たとえば、2 つの UNDO 表領域が使用されている場合、この値は 35 になります。複数の UNDO 表領域を設定すると、システム表領域内のロールバック セグメントは非アクティブになります。

起動パラメータ:

  • innodb_undo_log_truncate=オン
  • innodb_max_undo_log_size: この値を超えるテーブルスペースは切り捨てとしてマークされます。動的パラメータのデフォルト値は 1G です。
  • innodb_purge_rseg_truncate_frequency: ロールバック セグメントを解放する前にパージ操作を呼び出す回数を指定します。 UNDO 表領域は、UNDO 表領域内のロールバック セグメントが解放された場合にのみ切り捨てられます。パラメータが小さいほど、UNDO 表領域の切り捨てが頻繁に試行されることがわかります。

2.2 洗浄工程

  1. UNDO テーブルスペースのサイズが innodb_max_undo_log_size を超えると、テーブルスペースはクリーンアップ対象としてマークされます。テーブルスペースが繰り返し清掃されるのを避けるために、マーキングは繰り返されます。
  2. マーク表領域内のロールバック セグメントは非アクティブになり、実行中のトランザクションは完了を待機します。
  3. パージを開始する
  4. UNDO テーブルスペース内のすべてのロールバック セグメントを解放した後、truncate を実行して UNDO テーブルスペースを初期サイズに切り捨てます。初期サイズは innodb_page_size によって決定されます。デフォルト サイズの 16 KB は 10 MB のテーブルスペースに相当します。
  5. ロールバックセグメントを再アクティブ化して、新しいトランザクションに割り当てることができるようにします。

2.3 パフォーマンスに関する推奨事項

表領域を切り捨てるときにパフォーマンスの低下を回避する最も簡単な方法は、UNDO 表領域の数を増やすことです。

2.4 大規模トランザクションのテスト

8 つの UNDO テーブルスペース、innodb_purge_rseg_truncate_frequency=10 を設定します。

mysqld --initialize ... --innodb_undo_tablespaces=8

テストを開始

mysql> '%undo%' のようなグローバル変数を表示します。
+--------------------------+-------------+
| 変数名 | 値 |
+--------------------------+-------------+
| innodb_max_undo_log_size | 1073741824 |
| innodb_undo_directory | ./ |
| innodb_undo_log_truncate | オン |
| innodb_undo_logs | 128 |
| innodb_undo_tablespaces | 8 |
+--------------------------+-------------+

mysql> @@innodb_purge_rseg_truncate_frequency を選択します。
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
| 10 |
+----------------------------------------+

@@innodb_max_undo_log_size を選択します。
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
|10485760|
+----------------------------+

mysql> テーブル test.tbl( id int primary key auto_increment, name varchar(200) ) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)

mysql> トランザクションを開始します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> test.tbl(name) に値を挿入します(repeat('1',00));
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> test.tbl(name) に挿入し、test.tbl から name を選択します。
クエリは正常、1 行が影響を受けました (0.00 秒)
記録: 1 重複: 0 警告: 0

...

mysql> test.tbl(name) に挿入し、test.tbl から name を選択します。
クエリは正常、2097152 行が影響を受けました (24.84 秒)
レコード: 2097152 重複: 0 警告: 0

mysql> コミット;
クエリは正常、影響を受けた行は 0 行 (7.90 秒)

UNDO表領域は100MB以上に拡張した後、正常に回復されました。

$ du -sh 元に戻す*
10M 元に戻す001
10M 元に戻す002
10M 元に戻す003
10M 元に戻す004
10M 元に戻す005
10M 元に戻す006
125M 元に戻す007
10M 元に戻す008

$ du -sh 元に戻す*
10M 元に戻す001
10M 元に戻す002
10M 元に戻す003
10M 元に戻す004
10M 元に戻す005
10M 元に戻す006
10M 元に戻す007
10M 元に戻す008

3 参考文献

https://dev.mysql.com/doc/ref...

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL でテーブルスペースの断片化を解消する詳細な例
  • MySQLテーブルの断片化の原因とクリーンアップを分析する
  • MySQL テーブルスペースとは何ですか?
  • MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析
  • MySQL InnoDB テーブルスペース暗号化の例の詳細な説明
  • MySQL 5.7 一時テーブルスペースの詳細な分析
  • MySQL InnoDB テーブルスペースのアンロード、移行、ロードの使用方法
  • MySQL で、すべてのデータベースが占有するディスク容量と、単一データベース内のすべてのテーブルのサイズを照会する SQL ステートメント
  • MySQL テーブルスペースの断片化の概念と関連する問題の解決策

<<:  Webpack5-react スキャフォールディングをゼロから構築するための実装手順 (ソースコード付き)

>>:  Linux でユーザーにルート権限を追加する方法の概要

推薦する

Node.js管理ツールnvmの詳細なインストール手順

いいえnvmはnodejsの複数のバージョンを管理する役割を担っています。インストール: https...

Docker Composeを使用してDOCleverをインストールする詳細なプロセスを説明します

目次1. Docker Composeとは何か、インストールして使用する方法2. DOCleverと...

Linux クラウド サーバー上に SFTP サーバーとイメージ サーバーを構築する方法

まず、SFTP プロトコルと FTP プロトコルの違いを理解してください。ここでは詳細には触れません...

Dockerがコンテナを起動するたびに、IPとホストが指定した操作が実行されます。

序文Dockerを使ってHadoopクラスタを起動するたびに、ネットワークカードの再バインド、IPの...

antd pro に基づく SMS 認証コード ログイン機能 (プロセス分析)

目次まとめ全体的なプロセスフロントエンドページコード検証コードとログイン サービスをリクエストする ...

Unicode の数学記号の概要

数学、物理学、および一部の科学技術分野で使用される特殊記号は多数あります。Unicode コードには...

MySQLフィルタリングレプリケーションのアイデアの詳細な説明

目次mysql フィルター レプリケーションメインデータベースに実装ライブラリから実装いくつかの質問...

MySQL 継続的集計の原理と使用法の分析

この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...

MySQL 8.0.15 winx64 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.15 winx64 圧縮パッケージのインストールと設定方法を参考ま...

Linux で MySQL 5.7.19 をアンインストールする方法

1. MySQLが以前にインストールされていたかどうかを確認するコマンド: rpm -qa|grep...

Vue は PC カメラを呼び出してリアルタイムで写真を撮る機能を実装します

VueはPCカメラを呼び出してリアルタイムで写真を撮影します。参考までに、具体的な内容は次のとおりで...

WeChat 8.0の爆発的な特殊効果を実現するために300行以上のCSSコードが必要

WeChat 8.0 アップデートの主な特徴は、アニメーション絵文字のサポートです。送信するメッセー...

Reactでコンポーネントを作成する方法

目次序文コンポーネントの紹介クラスコンポーネントの作成状態についてレンダリングについて関数コンポーネ...