Undo は何に使用しますか?
UNDO を紹介する前に、別のことについて話しましょう。トランザクションを実行する過程で多くのリソースを申請する必要があり、複雑なトランザクションを完了するには多くの手順も必要です。この場合、複雑なトランザクションの結果は成功か失敗の 2 つだけになります (これは、何も起こらないことと同じです)。
非常に典型的な例である銀行振込には、実際には 2 つのステップが必要です。最初のステップは、口座内のお金を差し引くことであり、2 番目のステップは、送金された口座にお金を追加することです。これは次のとおりです。完全なトランザクション。
途中で実行されて資金が減ったものの、送金口座からの資金が追加されなかった場合、この時点でトランザクションはロールバックされ、元の状態に戻ります。つまり、送金する前に、自分と送金口座の金額を記録する必要があります。これにより、トランザクションが失敗すると、トランザクションが発生する前の状態にロールバックされます。
トランザクションの独自性と整合性を確保するために、取り消しの概念が導入されています。 Undo は、トランザクション操作中にデータを記録および保存するために使用され、トランザクションでエラーが発生した場合、以前のデータで埋めることができます。
元に戻すセグメント 元に戻すセグメント:
上のビューから、データが変更されたことを削除したいことが明確にわかります。変更する前に、元に戻すときの古いイメージ。次に、新しい画像をテーブルに追加します。
プロセスが失敗した場合は、元に戻すときに古いイメージを元の位置に戻して、何も起こらなかったかのように見せることもできます。
Undo セグメントは表スペースに保存されます。 Undoのサイズは固定であり、固定であるため制限があります。保存されている記録が多すぎるといっぱいになり、新しい記録データが最も古いデータを上書きします。
だから円盤を使うとより鮮明に表現できるんです。データはある位置から書き込まれ、丸が塗りつぶされると、最も古いデータが最新のデータで上書きされます。
「元に戻す」では何ができるのですか?
トランザクションのロールバック トランザクションの取り消し、トランザクションの回復 トランザクションの回復。トランザクションの取り消しとトランザクションの回復の効果は同じです。トランザクションの取り消しは人が率先して行うもので、操作中に後悔する人がいますが、これは私が文書を書くときに Ctrl Z を押すのと同じです。トランザクションの回復はマシンによって自動的に完了します。たとえば、トランザクション中に Jianpin の電源が突然失われた場合、次回サービスが再起動された後にシステムが自動的にロールバックします。
読み取り一貫性 読み取りと実行。読み取りの一貫性は、マルチユーザー操作にとって非常に重要です。複数人による開発でバージョン管理ツール (git\cvs\svn) を使用したことがある場合は、次の概念を簡単に理解できるでしょう。
Oracle 読み取り一貫性の概念 このプロセスには数分かかる場合があります。このプロセス中に、他のユーザーがクエリしたデータを変更しました。ここでは、クエリの結果が変更される前であることを確認する必要があります。
ここに明確な概念があります。トランザクションの開始は、(更新、変更、削除) ステートメントを実行するときです。トランザクションの最後には、コミット アクションを実行する必要があります (コミットまたはロールバック コマンドを実行します)。 )上記のフローチャートから、Oracle が読み取りの一貫性をどのように確保するかを理解しましょう。
トランザクションを実行すると、Oracle は SCN 番号を割り当てますが、この番号は増加していきます。次のトランザクション番号は、現在のトランザクション番号より大きくなければなりません。 上の図では、実行された最初のトランザクションに割り当てられた番号は 10023 です。このトランザクションの実行中に、別のトランザクションが SCN 番号 10008 と 10021 のデータ ブロックを変更しました。置換に使用されたデータ ブロックの SCN 番号は 10024 で、置換されたデータ ブロックはアンドゥ用に保存されます。 最初のトランザクションが変更されたデータ ブロックを実行すると、10024 が 10023 より大きいことがわかります。この時点で、元に戻すセグメントに移動して、読み取るために自身の SCN 番号より小さいデータ ブロックを見つけます。 SCN 番号は 10008 と 10021 です。これにより、読み取りの一貫性が効果的に保証されます。もちろん、UNDO セグメントが小さすぎるため、最大 100 個のデータを配置できるという特殊な状況も発生しますが、一度に 120 個のデータが入ってくるため、最初の 20 個は配置されます。書き込まれたデータは、最後に書き込まれた 20 個のデータに置き換えられます。この時点でエラーが報告されるため、データを調整する必要があります。
やり直しまたは元に戻す d.回復目的のため。
たとえば、マシンの電源が失われた場合、再起動後にシステムを障害点まで復元するにはオンライン REDO ログが必要になります。たとえば、ディスクが破損した場合は、アーカイブ REDO ログとオンライン REDO ログ領域を使用してデータを回復する必要があります。
Undo とは
Redo は操作を再実行すること、Undo は逆に、実行した操作を元に戻すことです。元に戻すは、一般的に使用される Ctrl Z に似ており、前のステップを元に戻します。 Redo では、取り消し操作も記録されます。データを挿入すると、まずアクションが REDO ログに記録され、その操作が UNDO にも記録され、UNDO のアクション自体が記録されます。データの一部が REDO ログに記録される場合、データの一部が挿入されるとインデックスが変更され、インデックスの変更によってデータも REDO ログに記録されます。 Redo では、操作に関連するすべての情報が記録されるため、シーンを完全に再現できます。
なお、上図ではアンドゥとリドゥの両方がメモリに書き込まれており、電源を切ると全ての情報が消えてしまいます。停電によって失われないのは、ディスクに書き込まれた情報だけです。
REDO ログ情報は、最も包括的な情報を持ち、シーンの再現を完全に保証できるため、最初にディスクに書き込まれます。 3 秒ごとの書き込みや 1MB を超える REDO ログ ファイルの書き込みなど、さまざまなメカニズムを通じてディスクへの REDO 書き込みを制御できます。
元に戻すの設定と使用方法は?複数の UNDO 表スペースを作成できますが、使用できる UNDO 表スペースは 1 つだけです。
アンドゥ設定情報の表示:
SQL> show parameter undo NAME TYPE VALUE ------------------------------------ ---------------------------------------------------- undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1
アンドゥ設定パラメータの意味
-DNDO_MANAGEMENT アンドゥの管理モードは自動と手動に分かれています。-UNDO_TABLESPACEは現在使用されています 使用される元に戻すテーブル
-UNDO_RETENTION は、データを上書きできない期間を指定します。
AUTO は、取り消しが自動管理モードであることを意味します。
900 は、アンドゥのデータを 900 秒以内に上書きできないことを意味します。
UNDOTBS1 は、現在使用されている UNDO 表スペースです。
UNDO 表スペースの作成は、一般的な表スペースの作成と似ています。コマンドは次のとおりです:
SQL> create undo tablespace myundotbs 2 datafile '/ora10/product/oradata/ora10/myundotbs1.dbf' size 10M; Tablespace created.
新しく作成された UNDO 表スペースの表示
SQL> select tablespace_name,contents from dba_tablespaces; TABLESPACE_NAME CONTENTS ------------------------------------------------------------ ------------------ SYSTEM PERMANENT UNDOTBS1 UNDO //老的undo表空间 SYSAUX PERMANENT TEMP TEMPORARY USERS PERMANENT PAUL PERMANENT MYUNDOTBS UNDO // 新创建的undo表空间 SQL> show parameter undo 再次查看当前使用的表空间 NAME TYPE VALUE ------------------------------------ ---------------------------------------------------- undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1
Switch UNDO Table space:
SQL> alter system set undo_tablespace=myundotbs; System altered. SQL> show parameter undo 再次查看当前使用的表空间 NAME TYPE VALUE ------------------------------------ ---------------------------------------------------- undo_management string AUTO undo_retention integer 900 undo_tablespace string MYUNDOTBS //已经切换的了undo表空间
UNDO テーブル スペースの削除:
SQL> drop tablespace myundotbs; Tablespace dropped.
UNDO テーブル スペースを削除した後も、まだディスク上に存在します。オペレーティング システムを通じて rm コマンドを使用してファイルを削除する必要があります。レベル。
考え方:
表スペースの切り替えと削除のコマンドは非常に単純ですが、ここでは実際の切り替えシナリオについて考える必要があります。トランザクションを実行するとき、トランザクション実行の半分はまだコミットされていません。この時点で UNDO 表スペースを正常に切り替えることができますか?
理論的には、UNDO 表スペースは使用中であるため、切り替えは許可されません。ただし、実際には、UNDO 表スペースは使用中に切り替えることができますが、切り替え直後に削除すると、システムはエラーを要求します。トランザクションをコミットして削除した後も、システムからエラーが表示されます。ここで、置き換えられたUNDO表領域は、使用状態に切り替えられてから放棄状態に切り替えられた場合にのみ削除できます。
UNDOチューニング。より合理的に機能するように取り消しを設定するにはどうすればよいでしょうか?
UNDO 表スペースのサイズ:
UNDO 表スペースを作成するときは、そのサイズを指定します。一度作成すると、このサイズは変更できません。あまり大きく設定しすぎると無駄です。小さすぎると、たとえば 100 万件のレコードを削除すると、削除されたレコードは UNDO テーブルスペースに一時的に保存されます。UNDO サイズが 100 万件のレコードを保存できない場合は、問題が発生します。
元に戻すデータの保存時間:
也就是undo_retention 参数所对应的时间,undo上有数据存放时间与undo大小的密切关系。存放时间越长,需要的表空间越大。就像理发师的数量与理发师的效率的关系一样。理发师效率很高,一秒钟解决一个客户,那么就不需要太多的理发师傅。
Undo表空间的历史信息:
如何合理设置undo表空间的大小和存放时间呢?那么就需要参考历史记录
这个数据每隔10分钟采集一次,结束时间减去开始时间,在这段时间内使用了多少个undo数据块。
计算每秒钟使用数据块的多少?
求最大值: SQL> select max(undoblks / ((end_time-begin_time)*24*3600)) from v$undostat; MAX(UNDOBLKS/((END_TIME-BEGIN_TIME)*24*3600)) --------------------------------------------- 14.15833333 求平均值: SQL> select sum(undoblks)/sum((end_time - begin_time)*24*3600) from v$undostat; SUM(UNDOBLKS)/SUM((END_TIME-BEGIN_TIME)*24*3600) ------------------------------------------------ 4.122282389
以上がoracle undo解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。