この記事の内容は、MySQL トランザクションの redo と undo の分析 (写真とテキスト) です。必要な方は参考にしていただければ幸いです。
トランザクションには、アトミック性、一貫性、分離性、耐久性という 4 つの特性があることは誰もが知っています。これがトランザクションの目的です。トランザクションの分離はロック機構によって実現され、トランザクションのアトミック性、一貫性、耐久性はREDOログとUNDOログによって保証されます。したがって、この記事では、トランザクションにおけるやり直しと取り消しに関するいくつかの問題について説明します。
やり直しログと取り消しログとは何ですか?
redo トランザクションの耐久性を確保するにはどうすればよいですか?
UNDO ログは REDO ログの逆のプロセスですか?
redo ログ
Redo の種類
Redo ログ (REDO ログ) が使用されることを保証しますトランザクションの耐久性。これはトランザクション ACID の D です。実際には、次の 2 つのタイプに分類できます。
- #物理 REDO ログ
- 論理 REDO ログ
ほとんどの場合、Redo はデータ ページの物理的な変更を記録する物理ログです。論理 REDO ログは、ページの実際の変更を記録するのではなく、ページを変更する操作の種類を記録します。たとえば、新しいデータ ページを作成する場合、論理ログを記録する必要があります。論理 REDO ログに関しては、より低レベルのコンテンツが含まれます。ここで覚えておく必要があるのは、ほとんどの場合、ページ上の DML 変更操作は Redo を記録する必要があるということです。役割。 Redo の構成
Redo ログの主な機能はデータベースのクラッシュ回復です
Redo の構成
Redo ログは単純に次の 2 つの部分に分けることができます:
- 最初のファイルはメモリ内の揮発性の REDO ログ バッファです。
- 2 番目のファイルは永続的な REDO ログ ファイルです。
- Redo を書き込むタイミングは?
上の図は、Redo の書き込みプロセスを簡単に示したものです。ここでさらに詳しく説明します。 REDO 書き込みのタイミング:
- データ ページの変更が完了した後、ダーティ ページがディスクからフラッシュされる前に、REDO ログが書き込まれます。データが最初に変更され、ログが後で書き込まれることに注意してください
- ##REDO ログはデータ ページの前にディスクに書き戻されます
-
#aggregation インデックス、セカンダリ インデックス、および元に戻すページへの変更はすべて、REDO ログに記録する必要があります。
- Redo の全体的なプロセス
- 2 番目のステップ: REDO ログを生成し、REDO ログ バッファに書き込み、データの変更された値を記録します。 3 番目のステップ: トランザクションがコミットされたら、REDO ログ・バッファーの内容を REDO ログ・ファイルにリフレッシュし、REDO ログ・ファイルへの追加書き込みを使用します。
- ステップ 4: 定期的にメモリ内の変更されたデータをディスクにコピーします
- REDO はトランザクションの耐久性をどのように確保しますか?
- InnoDB は、トランザクションのストレージ エンジンです。
Force Log at Commit メカニズム
を通じてトランザクションの耐久性を実現します。つまり、トランザクションがコミットされると、REDO ログ バッファーが最初に書き込まれます。 REDO ログ ファイルへの永続化は、トランザクションのコミット操作が完了するまで完了しません。このアプローチは、 Write-Ahead Log (ログ前永続化)
fsync を呼び出す必要があります。 Operation ,REDO ログは O_DIRECT オプションなしで開かれるため、REDO ログは最初にファイル システム キャッシュに書き込まれます。 REDO ログがディスクに確実に書き込まれるようにするには、fsync 操作を実行する必要があります。 fsync はシステム コール操作です。そのため、ディスクのパフォーマンスはトランザクションの実行、つまりデータベースのパフォーマンスにも影響します。 (O_DIRECT オプションは Linux システムのオプションです。このオプションを使用すると、ファイルは直接 IO 操作され、ファイル システム キャッシュを経由せずにディスクに直接書き込まれます)
上記の Force Log at Commit メカニズム は、InnoDB ストレージ エンジンによって提供されるパラメータ
innodb_flush_log_at_trx_commit によって制御されます。このパラメータは、ディスクへの REDO ログのフラッシュ設定を制御できます。パラメータ値も次のように、ユーザーが非永続性を設定できるようにすることができます。
設定パラメータが 1 の場合 (デフォルトは 1)、トランザクションが次のように設定されている必要があることを意味します。 fsync コミット時に 1 回呼び出される操作。耐久性を確保する最も安全な構成です。
パラメータを 2 に設定すると、トランザクションのコミット時に write 操作のみが実行され、REDO ログ バッファのみがシステムのページ キャッシュに書き込まれることが保証されます。 、fsync 操作は実行されないため、MySQL データベースがダウンしてもトランザクションは失われませんが、
パラメータが に設定されている場合、オペレーティング システムがダウンする可能性があります。 0 の場合、トランザクションの送信時に REDO が書き込まれないことを意味します。ログ操作はマスター スレッドでのみ完了し、REDO ログの fsync 操作はマスター スレッドで 1 秒ごとに実行されるため、インスタンスがクラッシュします。最大 1 秒以内にトランザクションが失われます。 (マスター スレッドは、データの一貫性を確保するために、バッファ プール内のデータをディスクに非同期的に更新する役割を担います)
fsync
および write
操作 これは実際にはシステム コール関数であり、多くの永続化シナリオで使用されます。たとえば、Redis の AOF 永続化でも 2 つの関数が使用されます。 fsync
操作はデータをハードディスクに送信し、ハードディスクへの書き込みが完了して戻るまでブロックされます。 ## 操作にはパフォーマンスのボトルネックがあり、write
操作はシステムのページ キャッシュにデータを書き込んだ直後に戻り、システムのスケジューリング メカニズムに依存してキャッシュされたデータをディスクにフラッシュします。ユーザーバッファ—>ページキャッシュ—>ディスクです。
Redo は InnoDB にどのように実装されますか?ミニトランザクションとの関係?
Redo の実装は、実際にはミニトランザクションと密接に関連しています。ミニトランザクションは、同時トランザクション操作下でデータ ページ内のデータを
確保するために使用されるメカニズムです。データベースが異常であるが、それがトランザクションの一部ではない場合。ミニトランザクションがデータ ページ データの一貫性を確保するには、ミニトランザクションは次の 3 つのプロトコルに従う必要があります
:FIX ルール
#Write-Ahead Log
Force-log-at-commit
- ## FIX ルール
データ ページを変更する場合は、ページの x-latch (排他ロック) を取得する必要があります。データ ページを取得する場合は、s-latch (読み取り) が必要です。ページのロックまたは共有ロック) または x-latch。ページを変更またはアクセスする操作が完了するまでページのロックを保持します。
先行書き込みログ先行書き込みログについては、前の説明で説明しました。データ ページを永続化する前に、メモリ内の対応するログ ページをまず永続化する必要があります。各ページには、ログ シーケンス番号を表す LSN (ログ シーケンス番号) があります (LSN は 8 バイトを占め、単調増加します)。データ ページを永続デバイスに書き込む必要がある場合、必要なデータはページの LSN よりも少なくなります。ログは最初に永続化デバイスに書き込まれます。では、なぜ最初にログを書き込む必要があるのでしょうか。ログを書き込まずにデータをディスクに直接書き込むことは可能ですか?原理的には可能ですが、データ変更によりランダム IO が発生しますが、ログはシーケンシャル IO であるため、ディスクのパフォーマンスを最大限に発揮できます。活用されている。
Force-log-at-commitこれは、上記のトランザクションの耐久性を確保する方法の内容に相当します。トランザクション内で複数のページを変更できます。先行書き込みログは単一のデータ ページの一貫性を保証できますが、トランザクションのコミット時にすべてのページを生成する必要があるトランザクションの耐久性を保証することはできません。 mini - トランザクション ログをディスクにフラッシュする必要があります。ログのフラッシュが完了した後、バッファ プール内のページが永続ストレージ デバイスにフラッシュされる前にデータベースがクラッシュした場合、データベースの再起動時にデータの整合性が保たれる可能性があります。ログを通じて確認されます。
REDO ログの書き込みプロセス
上図は、各ミニの REDO ログの書き込みプロセスを示しています。 -transaction は、ミニトランザクションによって保証される更新ステートメントなどの各 DML 操作に対応します。データが変更された後、REDO1 が生成され、最初にミニトランザクションのプライベート バッファーに書き込まれ、更新されます。ステートメント 完了後、redo1 をプライベート バッファからパブリック ログ バッファにコピーします。外部トランザクション全体がコミットされると、REDO ログ バッファが REDO ログ ファイルにフラッシュされます。
undo ログの定義
undo ログは主に、データの論理的な変更を記録します。エラーが発生したときに前の操作をロールバックするには、以前の操作をすべて記録し、エラーが発生したときにロールバックする必要があります。
undo ログの役割undo は 2 つの機能を持つ論理ログです:
トランザクションの場合ロールバック
MVCC
ここでは MVCC (Multi-version Concurrency Control) については多くを述べませんが、トランザクション ロールバックの Undo ログに焦点を当てます。
undo ログは、ロールバック中にデータベースを論理的に元の状態に復元するだけです。たとえば、INSERT は DELETE に相当し、各 UPDATE は逆の UPDATE に相当します。変更前の行に戻ります。 UNDO ログは、トランザクションのアトミック性を確保するためにトランザクションのロールバック操作に使用されます。
#UNDO ログの書き込みタイミング
- #DML 操作でクラスタード インデックスが変更される前に UNDO ログを記録します
- セカンダリ インデックス レコードを変更しても、元に戻すログは記録されません。
- 元に戻すページを変更する場合も、REDO ログを記録する必要があることに注意してください。
InnoDB ストレージ エンジンでは、アンドゥはロールバック セグメント (ロールバック) に保存されます。 セグメント)、各ロールバック セグメントは 1024 個のアンドゥ ログ セグメントを記録し、アンドゥは各アンドゥ ログ セグメントで実行されます。 5.6 より前では、ページを申請するには、ロールバック セグメントが共有テーブル スペースにありました。5.6.3 以降は、次の方法を使用できます。 innodb_undo_tablespace は、UNDO ストレージの場所を設定します。
アンドゥの種類InnoDB ストレージ エンジンでは、アンドゥ ログは次のように分割されます:
- アンドゥ ログの挿入
- update undo log
- insert undo log は、挿入操作中に生成された undo ログを指します。これは、挿入操作の記録が表示されるのは次のユーザーのみであるためです。トランザクション自体は他のトランザクションには見えません。したがって、UNDO ログはトランザクションの送信後に直接削除でき、パージ操作は必要ありません。
更新取り消しログには、削除および更新操作によって生成された取り消しログが記録されるため、トランザクションがコミットされたときに削除できないように、MVCC メカニズムを提供する必要がある場合があります。送信するときは、それを元に戻すログ リストに入れて、パージ スレッドが最終的な削除を実行するまで待ちます。
補足: パージ スレッドの 2 つの主な機能は、元に戻すページのクリーニングと、ページ内の Delete_Bit 識別子を持つデータ行のクリアです。 InnoDB では、トランザクションの Delete オペレーションは実際にはデータ行を削除しませんが、レコードを削除せずにレコードの Delete_Bit をマークする Delete Mark オペレーションです。これは一種の「偽の削除」であり、マークが付けられているだけであり、実際の削除作業はバックグラウンドのパージ スレッドによって完了する必要があります。
UNDO ログは REDO ログの逆のプロセスですか?アンドゥログ やり直しですか? ログの逆の処理?実際、その答えは前の記事から導き出すことができます。Undo ログは論理ログであり、トランザクションをロールバックする場合、データベースを元の状態に論理的に復元するだけです。一方、REDO ログは論理的なログです。 ログは、データ ページの物理的な変更を記録する物理ログです。明らかに、UNDO ログは REDO ログの逆のプロセスではありません。
redo と undo の概要次に、2 つのログ プロセスを理解しやすくするために、redo ログ undo ログのプロセスを簡略化して示します。実際、挿入/更新/削除操作では、やり直しと元に戻すでは異なる内容と量が記録されます。 InnoDB メモリでは、一般的なシーケンスは次のとおりです。
Write undo redo
Write undo
データの変更ページ
やり直しの書き込み
- 概要
この記事では、やり直しの内容を分析します。およびアンドゥログは一部の情報書籍を参考にまとめており、明記されていない箇所があるかもしれません。何か間違っているところがあれば、ご指摘ください。
以上がMySQL トランザクションにおけるやり直しと元に戻すの分析 (画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版
ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。
