災害後に Oracle インスタンスを復旧する必要があるとします。シーケンスは初期状態または最後に保存された状態にリセットされますか? それともキャッシュされた値は保持されますか?
どうもありがとうございました。:-)
シーケンス値はSYSTEM.SEQ$(私は思う)テーブルに格納され、キャッシュは次に使用される値のメモリに保持され、そのキャッシュのサイズはシーケンスのCACHE値に依存します。
キャッシュが使い果たされると、SEQ $テーブルが新しい値に更新され(一貫性のない方法で、つまり、ユーザーセッションのトランザクション制御が適用されない場合)、次に100個の値(CACHE = 100の場合)がメモリから読み取られます。 。
キャッシュサイズが20のシーケンスを使用していると仮定します。シーケンスから特定の値(たとえば1400)を選択すると、SEQ$テーブルが値1420に更新されます。トランザクションをロールバックしてもSEQ$次の20個のシーケンス値が使用されるまで、その値は保持されます。その時点で、SEQ $は1440に更新されます。値1423を使用したばかりで、インスタンスクラッシュが発生した場合、システムが次の値を再起動すると、読み取り元になります。シーケンスは1440になります。
したがって、はい、シーケンスの整合性は維持され、番号は「再発行」されません。同じことがグレースフルシャットダウンにも当てはまることに注意してください。再起動すると、上記の例では新しい値1440が得られます。このため、実際にはシーケンスにギャップがないことが保証されていません(値を使用してからロールバックしても、その値がキャッシュに復元されないためです)。
これについては経験がありませんが、一貫したシステム変更番号の状態に回復すると、シーケンスも最後に保存された状態に戻ると思います。回復に関しては、それ以外のものはほとんど役に立たないでしょう。
キャッシュされた値については、インスタンスが正常にシャットダウンされた場合でも失われます (失われる可能性があります) (*)。インスタンスは、毎回データベースにアクセスするのではなく、多数のシーケンス値をメモリ (SGA) にキャッシュします。インスタンスが予約した未使用のシーケンス値は「消える」可能性があり、シーケンスにギャップが残ります。
(*) 8i のドキュメントでは、これは並列インスタンス (RAC) で発生する可能性があると記載されています。その場合、シーケンスは厳密に昇順でさえない可能性があります (ただし、それでも一意です)。10g のドキュメントでは、インスタンスに障害が発生した場合に発生すると述べています。