質問

Oracleインスタンスは、災害後に回収する必要があるとします。シーケンスは、初期状態、または最後に保存した状態にリセット入手できますか、または保存された値をキャッシュしていますか?

ありがとうございました。 : - )

役に立ちましたか?

解決

sequnce値はSYSTEM.SEQの$(と思う)テーブルに格納され、キャッシュはそのキャッシュのサイズは、シーケンスのキャッシュ値に依存すると共に、使用される次の値をメモリ内に維持されますます。

キャッシュがなくなると、

配列$テーブルが新しい値に更新される(非一貫した方法で - 。ユーザーセッションのtransacton制御を適用せず、すなわち)、次の100個の値(CACHE = 100の場合)と言っていますメモリから読み出されます。

あなたが列から特定の値を選択すると、1400年と言うのは、あなたが20のキャッシュサイズとシーケンスを使用していると仮定しましょう、SEQ $表は、あなたのトランザクションをロールバックする場合でも、1420の値に更新されますSEQ $はまだあなたがそれからちょうど値1423を使用していると、システムが隣に値を再起動すると、インスタンスのクラッシュが、その後、発生した場合、配列$が1440に更新された時点で、次の20個のシーケンス値が使用されるまで、その値を、持っています1440年になりますsequnceから読み取ることがます。

だから、そう順序の整合性が維持されますと数字は「再発行」されることはありません。あなたは上記の例では1440年の新しい値を取得します再起動すると - 同じことが正常なシャットダウンに適用されることに注意してください。シーケンスは、このような理由のために実際にギャップがないことを保証(も値を使用しているため、その後、ロールバックすると、キャッシュにその値を復元しません)されていません。

他のヒント

私はこれでの経験を持っていますが、私は非常に一貫性のあるシステム変更番号の状態への回復がまた最後に保存した状態にシーケンスを返すことを前提としていないこと。それ以外は、回復の面でかなり役に立たないだろう。

キャッシュされた値については、それらは、(可能)されているインスタンスが整然と(*)にダウンをシャットても、失われた:インスタンスではなく、データベースに毎回行くの(SGA)メモリー内のシーケンス値の数をキャッシュします。未使用のシーケンスは、インスタンスがシーケンスのギャップであなたを残して、「消える」ことが可能に予約した値ます。

(*)8Iのドキュメントでは、これはシーケンスでも厳密に昇順する(まだユニークな)しないことがあり、その場合には、並列インスタンス(RAC)で発生する可能性があることに言及、10グラムのドキュメントは、インスタンスに障害が発生した場合に起こることを言います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top