1

Oracle クラスター (1 つのデータベースにサービスを提供するために複数のマシンが連携している) では、「sysdate」関数は常に一貫した回答を返しますか? サーバーのオペレーティング システムのクロックが一貫性のない値を報告している場合でも?

4

4 に答える 4

2

SYSDATE はノード OS 関連です。クラスター全体で正しいことが保証されている場合、SYSDATE を呼び出すたびにノードを同期する必要があります。クラスター化された環境では、順序付けられたシーケンスはコストがかかります。可能であれば避けるのが最善です。順序付けられたシーケンスは一意性と順序を保証しますが、シーケンスから選択した後、トランザクションをコミットする前に処理が失敗した場合、ギャップが発生する可能性があります。

いくつかの回避策を使用します。

  1. 通常、シーケンスは大きなキャッシュ サイズ (25,000) で順不同に設定され、クラスター間の通信を減らします。
  2. NTP を使用してノードの時刻を同期します (まだ誤差がある可能性があり、+/- ナノ秒であるため、これに依存することはできません)
  3. 監査スタイルのログでは、一意の識別子として systimestamp (timestamp(6)) を使用します。また、ログが順不同で表示される可能性があるという事実 (これは通常の処理でも可能です。コミットがいつ発生するかによって異なります)
  4. 順序付けされたシーケンスが必要で、ギャップが存在する可能性がある場合 - 順序付けられたシーケンスを使用します (「キャッシュ」は役に立たないため、クラスター化された環境では避けるようにしてください)。

  5. 順序付けられたシーケンスが必要な場合 (ただし、ギャップがあってはなりません)、独自のシーケンス テーブルがあり、レコードをロックし、番号を取得してから、ユーザーがコミットするまでレコードをロックしたままにします。これにより、ユーザーのトランザクションが完全にコミットされるまで、同じシーケンスを取得しようとする他のすべての人が待機することになります。可能な限り、これを行うことは避けてください。

于 2009-07-14T14:21:31.850 に答える
1

NTP を使用して、すべてのサーバー (Oracle およびその他) で時刻を同期し、それが起こらないようにします。一貫性のないシステム クロックは、災害のレシピです。

あなたが説明したシナリオでは、sysdate が一貫性のない結果を返すと思います。

于 2008-10-10T12:07:14.897 に答える
1

SYSDATEもOSにリンクされていると強く思います。それを使用する必要がある理由に十分注意してください。イベントのインクリメンタル トラッキングを実装するロジックがあり (インクリメンタル エクスポートを実行している場合など)、アイテムの除外や重複がないことを確認する必要がある場合は、SYSDATE ではなくシーケンシャル ID に基づいてトラッキングします。

実際、SYSDATE は時々変更されることがあるため (時間の節約、システム管理者のエラーなど)、これはクラスタ以外のシステムにも当てはまります。

于 2008-10-15T00:42:11.500 に答える
0

これに対する答えを探すのに(少し)時間を費やしましたが、見つけることができませんでしたが、sysdateがオペレーティングシステムから日付/時刻を返しているだけなので、dmitriyが正しいと思います。

于 2008-10-10T23:07:53.563 に答える