この記事は、mysql に関する関連知識を提供します。主にロールバック関連の問題を整理し、主にブックストアのロールバックとロールバック メカニズムを紹介します。一緒に見てみましょう。皆さんが助けてくれることを願っています。
推奨学習: mysql ビデオ チュートリアル
大規模なテーブルを操作すると、操作時間が長すぎたり、オンラインに影響を与える ビジネスでは、大規模なテーブル操作をロールバックする必要があります。大規模なテーブル操作を停止した後、ロールバックを待つのは非常に長いプロセスです。時間を短縮する方法をいくつか知っていて、実稼働環境でのデータの整合性に懸念を抱いているかもしれませんが、介入しないことを選択することもできます。
トランザクションはリレーショナル データベースの実行単位であり、最終段階のコントロールを通じて送信またはロールバックできます。整合性が保証できないさまざまなシナリオでロールバック操作を実行します。 MySQL でのロールバックは、トランザクションに関連する最新の変更を元に戻す方法に関する情報が含まれる元に戻すログを通じて実行されます。 Undo ログは Undo ログ セグメントに存在し、Undo ログ セグメントはロールバック セグメントに含まれます。ロールバック セグメントは、UNDO 表スペースおよびグローバル Temporary 表スペースに配置されます。
関係は次のとおりです。
mysql > show variables like '%undo%'; +--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | innodb_max_undo_log_size | 1073741824 | | innodb_undo_directory | /opt/data8.0/mysql | | innodb_undo_log_encrypt | OFF | | innodb_undo_log_truncate | ON | | innodb_undo_tablespaces | 2 | +--------------------------+--------------------+ 5 rows in set (0.00 sec)
は、次のことを指します。グローバル Temporary ユーザー作成の一時テーブルに対する変更のロールバック セグメントを格納する一時テーブルスペース (ibtmp1)。
mysql > SELECT @@innodb_temp_data_file_path; +-------------------------------+ | @@innodb_temp_data_file_path | +-------------------------------+ | ibtmp1:128M:autoextend:max:30G | +-------------------------------+
ロールバックに含まれるファイルを理解したら、読み続けてください。
MySQL ロールバック制御は内部 innodb エンジンによって調整され、人間が制御するメカニズムは提供されません。現在提供されている MySQL ロールバック パラメータは次のとおりです:
mysql> SHOW VARIABLES LIKE '%ROLL%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | innodb_rollback_on_timeout | OFF | | innodb_rollback_segments | 128 | +----------------------------+-------+
innodb_rollback_on_timeout:
デフォルトでは、InnoDB はトランザクションがタイムアウトしたときにのみ最後のステートメントをロールバックします。 --InnoDB -rollback-on-timeout が指定されている場合、トランザクション タイムアウトにより InnoDB が中止され、トランザクション全体がロールバックされます。ロールバックなどの指定された時間が経過すると、デフォルトでオフになります。データに不整合が生じる可能性が考えられます。この方法はお勧めできません。
Innodb_rollback_segments (1~128):
各 UNDO 表スペースに割り当てられるロールバック セグメントの数と、UNDO レコードを生成するトランザクションに割り当てられるグローバル一時表スペースの数を定義します。
ロールバック セグメントでサポートされるトランザクションの数: ロールバック セグメントのアンドゥ スロットの数と、各トランザクションに必要なアンドゥ ログの数によって異なります。
公式に提供されるロールバックのアンドゥ スロットの数セグメントは InnoDB に基づいています ページ サイズ関連:
最新の MySQL8.0.27 ソース コード実装より storage\innobase\include\trx0rseg.h:
/* Number of undo log slots in a rollback segment file copy 这里 UNIV_PAGE_SIZE正常页面的大小 即 1024*/ #define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16) /* Maximum number of transactions supported by a single rollback segment 单个回滚段支持的最大事务数1024/2=512 */ #define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)
デフォルトではページ 1024 スロット (TRX_RSEG_N_SLOTS) に分割されており、各スロットがアンドゥ ログ オブジェクトに対応するため、理論上 InnoDB は 128 * 512 = 65536 個の通常トランザクションをサポートできます。
原則的な部分については、「MySQL」「エンジン機能」「InnoDB undo ログ ローミング」を参照してください。
undbo ロールバックの同時読み取りおよび書き込みシナリオを正式に提供します。
から戻るアピールの原則 実際のアプリケーション シナリオでは:
ロールバック セグメントをサポートする機能は依然として相当なものですが、ロールバックの大規模なバッチを実行すると非常に遅くなることがよくあります。特にオンライン処理中は、100,000 行をロールバックするのに 10 分かかる場合があります。あるいはそれ以上です。
以下では、sysbench を使用して 5,000 万の単一テーブル データを準備します。無負荷状態で、約 1 分間削除してから、kill -9 を使用してトランザクションを強制停止し、トランザクションをロールバックします。
明らかに再起動の効果が優れています。
ただし、kill -9 メソッドはデータ ページを簡単に破損する可能性があり、大きなリスクがあります。日常生活でもデータベースに負荷がかかるため、大規模なトランザクションをロールバックするコストが非常に高額になることが想像できます。
大規模なロールバック操作はできる限り回避する必要があります。これはデータベースのリソースとパフォーマンスを消費し、実稼働環境で重大な実稼働事故につながる可能性があります。大規模なトランザクションのロールバックを回避できない場合は、次の方法を実行できます。
以上がMySQL ロールバック (概要共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。