InnoDBのオンディスク構造(5) - REDOログ&元に戻すログ(転載)

1.Redoログイン

REDOログが不完全なトランザクションによって書き込まれたデータを修正するために、クラッシュリカバリの際に使用されるディスクベースのデータ構造です。通常の操作時には、REDOログは、SQL文または低レベルAPIの呼び出しに起因するテーブルのデータを変更する要求を符号化します。予期しないシャットダウンする前に、データファイルの更新を終了しませんでした変更は、初期化時に自動的に再生され、そして接続が受け入れられる前に。

デフォルトでは、REDOログは、物理的に2つの名前付きファイルがディスク上に表現さ  ib_logfile0 と  ib_logfile1MySQLは循環方式でREDOログ・ファイルに書き込みます。REDOログ内のデータは影響を受けるレコードの面でエンコードされています。このデータをまとめリドゥと呼ばれます。REDOログを介してデータの通路が増え続けるLSN値で表されます。

1.1 REDOログ・ファイルの数やサイズの変更

番号またはREDOログ・ファイルのサイズを変更するには、次の手順を実行します。

  1. MySQLサーバを停止し、それがエラーなくシャットダウンすることを確認してください。

  2. 編集  my.cnf ログファイルの設定を変更します。ログファイルのサイズを変更するには、設定します  innodb_log_file_sizeログファイルの数を増やすには、設定innodb_log_files_in_group

  3. 再度、MySQLサーバを起動します。

場合は、  InnoDB ことを検出した  innodb_log_file_size REDOログ・ファイルのサイズと異なるが、それが閉じて、ログのチェックポイントを書き込み、古いログファイルを削除し、要求されたサイズで新しいログファイルを作成し、新しいログファイルを開きます。

1.2グループのREDOログ・フラッシングのためにコミット

InnoDBそれがコミットされる前に、他のACID準拠のデータベース・エンジンのように、トランザクションのREDOログをフラッシュします。 InnoDB グループは、各コミットに1つのフラッシュを避けるために、一緒にグループの複数のそのようなフラッシュの要求に機能をコミット使用しています。グループがコミットすると、  InnoDB 大幅にスループットを向上、ほぼ同時にコミット複数のユーザー・トランザクションのコミットアクションを実行するためにログファイルにシングルライトを発行します。

1.3 REDOログのアーカイブ

レコードをREDOログ・コピーのバックアップユーティリティは時々により上書きされて、それらのレコードへのバックアップ操作が失われたREDOログレコードで、その結果、進行中にREDOログ生成のペースを維持するために失敗することがあります。重要MySQLサーバの活動は、バックアップ操作中に存在するとき、この問題が最も多く発生し、REDOログ・ファイル・ストレージ・メディアは、バックアップストレージ媒体よりも速い速度で動作します。MySQLの8.0.17で導入された機能を、アーカイブREDOログは、順次REDOログ・ファイルに加えて、アーカイブファイルへのREDOログレコードを書き込むことによって、この問題に対処しています。バックアップユーティリティは、これにより、データ損失の可能性を回避、必要に応じてアーカイブファイルからレコードをREDOログ・コピーすることができます。

REDOログのアーカイブをMySQLのEnterprise Editionで利用可能なサーバー、MySQLのエンタープライズバックアップ、上に構成されている場合、MySQLサーバーをバックアップするとき、REDOログのアーカイブ機能を使用しています。

サーバー上のアーカイブREDOログを有効にするための値が設定する必要が  innodb_redo_log_archive_dirs システム変数を。値は、標識されたREDOログ・アーカイブディレクトリをセミコロンで区切ったリストとして指定されています。 label:directory ペアは(コロンで区切られています:)。例えば:

MySQLの> SET GLOBALのinnodb_redo_log_archive_dirsの= ' LABEL1:directory_path1の[; LABEL2:directory_path2; ...] ' ;

label アーカイブディレクトリのための任意の識別子です。それは許可されていないコロン(:)を除いて、文字の任意の文字列を指定できます。空のラベルをも許可されていますが、コロン(:)、まだこのような場合には必要とされます。 directory_path 指定しなければなりません。REDOログのアーカイブが有効化されたときにREDOログ・アーカイブファイルを選択したディレクトリが存在しなければならない、またはエラーが返されます。(「:」)パスはコロン含むことができるが、セミコロン(;)が許可されていません。

innodb_redo_log_archive_dirs REDOログのアーカイブをアクティブにする前に変数を設定する必要があります。デフォルト値は  NULL、REDOログのアーカイブを活性化許可しません、。

注意事項:

指定したアーカイブディレクトリは、次の要件を満たす必要があります。(REDOログのアーカイブが活性化されたときの要件が適用されます。):

  • ディレクトリが存在している必要があります。ディレクトリは、REDOログ・アーカイブ・プロセスによって作成されていません。それ以外の場合は、次のエラーが返されます。

    ERROR 3844(HY000):やり直しアーカイブディレクトリ「をログに記録directory_path1」が存在しないか、ディレクトリではありません

  • ディレクトリは、世界的にアクセス可能であってはなりません。これは、システム上の権限のないユーザーに公開されることから、REDOログ・データを防ぐためです。それ以外の場合は、次のエラーが返されます。

    3846(HY000)はERROR:アーカイブディレクトリ「をREDOログには、directory_path1」すべてのOSのユーザーがアクセス可能です

  • ディレクトリは、それらによって定義することができない  datadir、  innodb_data_home_dir、  innodb_directories、  innodb_log_group_home_dirinnodb_temp_tablespaces_dir、  innodb_tmpdir innodb_undo_directory、または  secure_file_priv、また彼らは親ディレクトリまたはそのディレクトリのサブディレクトリとすることができます。そうでない場合は、次のようなエラーが返されます。

    ERROR 3845(HY000):アーカイブディレクトリを'REDOログdirectory_path1'の下で、中にある、またはサーバ・ディレクトリの上に'DATADIR' - ' /path/to/data_directory'

アーカイブREDOログサポートするバックアップユーティリティは、バックアップを開始すると、バックアップユーティリティが起動することにより、アーカイブREDOログアクティブ  innodb_redo_log_archive_start() ユーザー定義関数を。

あなたは、図示のようにも、手動で有効にすることができ、アーカイブREDOログのアーカイブREDOログサポートするバックアップ・ユーティリティを使用していない場合:

MySQLの> SELECT innodb_redo_log_archive_start(' ラベル'' サブディレクトリ' );
+ ------------------------------------------ + 
| innodb_redo_log_archive_start(' ラベル')| 
+ ------------------------------------------ + 
| 0                                         | 
+ ------------------------------------------ +

または:

MySQLの> innodb_redo_log_archive_start(DO ' ラベル'' サブディレクトリを' ); 
クエリOK、0影響を受ける行(0.09秒)

注意事項:

(使用してログのアーカイブをやり直しアクティブにMySQLのセッションは  innodb_redo_log_archive_start())アーカイブの期間中、開いたままにしなければなりません。同じセッションでは、REDOログのアーカイブ(使用を無効にする必要があります  innodb_redo_log_archive_stop())。REDOログのアーカイブが明示的に非アクティブ化される前に、セッションが終了した場合、サーバーは、暗黙的にアーカイブREDOログ非アクティブにしてREDOログのアーカイブファイルを削除します。

どこ  label で定義されたラベルがあります  innodb_redo_log_archive_dirs。 subdir で識別されるディレクトリのサブディレクトリを指定するためのオプションの引数である  label アーカイブファイルを保存するためには、それは、単純なディレクトリ名(スラッシュ(/)、バックスラッシュ(\)、またはコロン(:)が許可されている)でなければなりません。 subdir ヌル、空にすることができ、またはそれは除外することができます。

持つユーザーのみ  INNODB_REDO_LOG_ARCHIVE 権限が呼び出すことによって、REDOログのアーカイブを有効にすることができ  innodb_redo_log_archive_start()、または使用してそれを無効にinnodb_redo_log_archive_stop()バックアップユーティリティやMySQLユーザのREDOログのアーカイブを有効化と無効化を実行しているMySQLユーザは、手動でこの権限を持っている必要があります。

REDOログ・アーカイブ・ファイルのパスがある  場合は、   アーカイブディレクトリがで識別される   ための引数  。  以下のために使用されるオプションの引数です  directory_identified_by_label/[subdir/]archive.serverUUID.000001.logdirectory_identified_by_labellabelinnodb_redo_log_archive_start()subdirinnodb_redo_log_archive_start()

たとえば、REDOログ・アーカイブ・ファイルの絶対パスと名前は次のようになります。

/directory_path/subdirectory/archive.e71a47dc-61f8-11e9-a3cb-080027154b4d。000001の.log

バックアップユーティリティは、コピー終了後に  InnoDB データファイルを、それが呼び出すことによって、アーカイブREDOログ非アクティブ  innodb_redo_log_archive_stop() ユーザー定義関数を。

あなたがアーカイブREDOログサポートするバックアップユーティリティを使用していない場合は、アーカイブREDOログ示されているようにも、手動で無効にすることができます。

MySQLの> innodb_redo_log_archive_stopをSELECT();
+ -------------------------------- + 
| innodb_redo_log_archive_stop()| 
+ -------------------------------- + 
| 0                               | 
+ -------------------------------- +

または:

MySQLの> ()innodb_redo_log_archive_stopをDO。
クエリOK、0影響を受ける行(0.01秒)

停止機能が正常に完了した後、バックアップユーティリティは、バックアップにアーカイブファイルをコピーしてから、REDOログ・データの関連するセクションを探します。

バックアップユーティリティは、REDOログ・データをコピーが終了し、もはやのREDOログのアーカイブファイルを必要とした後、それは、アーカイブファイルを削除します。

アーカイブファイルの除去は、通常の状況でのバックアップユーティリティの責任です。REDOログのアーカイブ操作が前に予期せず終了した場合は、innodb_redo_log_archive_stop() と呼ばれ、MySQLサーバは、ファイルを削除します。

1.4パフォーマンスの考慮事項

アクティベーションのREDOログのアーカイブは、一般的に、追加の書き込み活性による軽微なパフォーマンスコストがあります。

UnixやUnixライクなオペレーティングシステムでは、パフォーマンスへの影響は、更新の持続的な高レートが存在しないと仮定すると、通常は軽微です。Windowsでは、パフォーマンスへの影響は同じと仮定すると、典型的には少し高くなります。

アップデートの持続的な高レートおよびREDOログ・アーカイブファイルがある場合は、REDOログ・ファイルと同じ記憶媒体にある、パフォーマンスへの影響が原因配合書き込み活動にもっと重要なことがあります。

REDOログ・アーカイブファイルは、REDOログ・ファイルより遅いストレージメディア上で持続的な高い更新頻度とがある場合、パフォーマンスが任意に影響を受けています。

REDOログ・アーカイブファイルへの書き込みは、REDOログ・アーカイブ・ファイル・ストレージ・メディアは、REDOログ・ファイル・ストレージ・メディアよりもはるかに遅い速度で動作している場合を除き、通常のトランザクションログを妨げ、およびブロックをREDOログ・持続の大きなバックログが存在していませんREDOログ・アーカイブファイルに書き込まれるのを待っています。この場合、トランザクションロギングレートは、REDOログ・アーカイブファイルが存在低速のストレージメディアで管理できるレベルにまで低減されます。

2.元に戻すログ

アンドゥログは、単一の読み取り・書き込みトランザクションに関連付けられたUNDOログレコードのコレクションです。アンドゥログレコードは、クラスタ化インデックスレコードにトランザクションによって、最新の変更を元に戻す方法に関する情報が含まれています。別のトランザクションが一貫した読み出し動作の一部として、元のデータを参照する必要がある場合、未修飾データは、アンドゥログレコードから検索されます。アンドゥログは、ロールバック・セグメント内に含まれるアンドゥログセグメント内に存在します。ロールバック・セグメントは、グローバル一時表領域にアンドゥtablespacesandに存在します。

グローバル一時表領域に存在するログを元に戻すには、ユーザー定義の一時テーブル内のデータを変更するトランザクションのために使用されています。彼らはクラッシュの回復のために必要とされていないように、これらは、ログはREDOログ・ログに記録されません元に戻します。サーバが稼働している間、彼らは唯一のロールバックのために使用されています。REDOログI / Oを回避することによってアンドゥログの利点性能のこのタイプ。

それぞれが個々に128個のロールバック・セグメントの最大をサポートし、表領域、グローバル一時表を元に戻します。 innodb_rollback_segments 変数は、ロールバック・セグメントの数を定義します。

ロールバック・セグメントがサポートするトランザクションの数は、ロールバック・セグメントにおけるアンドゥスロットの数と、各トランザクションで必要とされるアンドゥログの数に依存します。

ロールバック・セグメント内のアンドゥスロット数に応じて異なる  InnoDB ページ・サイズ。

InnoDBのページサイズ ロールバック・セグメントで元に戻すスロットの番号(InnoDBのページサイズ/ 16)
4096 (4KB) 256
8192 (8KB) 512
16384 (16KB) 1024
32768 (32KB) 2048
65536 (64KB) 4096

トランザクションは4つのアンドゥログ、次の操作の種類ごとに1つまで割り当てられます。

  1. INSERT ユーザ定義のテーブルの操作

  2. UPDATE そして  DELETE 、ユーザ定義のテーブルの操作

  3. INSERT ユーザー定義の一時テーブル上の操作

  4. UPDATE そして  DELETE 、ユーザ定義の一時テーブル上の操作

必要に応じて元に戻すログが割り当てられます。例えば、実行トランザクション  INSERT、  UPDATEおよび  DELETE 定期的かつ一時テーブル上の操作は4つのアンドゥログの完全な割り当てを必要とします。のみ実行トランザクション  INSERT 通常のテーブルでの操作は、単一のアンドゥログが必要です。

通常のテーブルに対して操作を実行するトランザクションは、割り当てられたUNDO表領域のロールバック・セグメントからアンドゥログを割り当てられます。一時テーブルに対して操作を実行するトランザクションは、割り当てられたグローバル一時表ロールバック・セグメントからアンドゥログを割り当てられます。

トランザクションに割り当てられたUNDOログは、その期間のトランザクションに関連付けられたまま。例えば、トランザクションのために割り当てられたアンドゥログ  INSERT 通常のテーブルの操作は、すべてのために使用され  INSERT 、そのトランザクションによって行われる定期的なテーブルの操作。

上記の要因を考えると、次式が同時読み書きトランザクションの数を推定するために使用することができる  InnoDB サポートすることが可能です。

  • 各トランザクションがいずれかの実行する場合  INSERT や  UPDATE 、または  DELETE 操作を、同時読み書きトランザクションの数  InnoDB サポートすることが可能であるです。

    (innodb_page_size /  16* innodb_rollback_segments *   アンドゥ表領域
  • 各トランザクションが実行する場合  INSERT 及び  UPDATE 又は  DELETE 動作を、同時読み書きトランザクションの数  InnoDB サポートすることが可能であるです。

    (innodb_page_size /  16  /  2* innodb_rollback_segmentsは*  数値 表領域を元に戻します
  • 各トランザクションが実行する場合  INSERT 、一時テーブル上の操作を、同時読み書きトランザクションの数  InnoDB サポートすることが可能であるです。

    (innodb_page_size /  16* innodb_rollback_segments
  • 各トランザクションが実行する場合  INSERT や  UPDATE 、または  DELETE 一時テーブル上の操作を、同時読み書きトランザクションの数  InnoDB サポートすることが可能であるです。

(innodb_page_size /  16  /  2* innodb_rollback_segments

 

で重版抜粋  https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html

                      https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-logs.html

 

おすすめ

転載: www.cnblogs.com/xuliuzai/p/11388667.html