1

データベースを復元する前に、作業中のシステムをシャットダウンする必要があります。これを行わないと、アプリケーションサーバーのメモリ内の状態がデータベースと一致しないため、深刻な問題が発生する可能性があります。破損したデータベースがエラーを引き起こし、システムが動作を停止してデータベースが使用できなくなるまで、しばらく時間がかかる場合があります。

だから私はこの状況を検出して問題を回避しようとします。

  • アプリケーションサーバーは必ずしも接続を維持しているわけではないので、シングルユーザーモードやこのようなものはおそらく役に立たないでしょう。
  • 復元が失敗したり、サーバーがシャットダウンしたりするかどうかは関係ありません。それを無視するべきではありません
  • データベースは、任意のマシン上の任意のSQLサーバーツールによって復元できます。自分のツールに頼ることはできません。

誰かがすでにそのような問題を解決しましたか?

SQL Server 2005以降、.NET(C#)、SMOを使用しています。


編集:

アプリケーションの設計に関する誤解や議論があるため、問題の原因を説明する必要があります。

Hi-Loジェネレーター:アプリケーションは、Hi-LoidジェネレーターのHi-Valueのキャッシュを持つNHibernateを使用します。Hi-Valueはデータベースから読み取られ、データベースに戻って別の範囲の数値を取得する必要があるまで、アプリケーションが特定の数の主キーを生成できるようにします。データベースに格納されているHi-Valueはインクリメントされるだけで、デクリメントされることはありません(データベースの古いバージョンが復元された場合を除く)。これはHi-Loジェネレーターの概念であり、私自身が発明したものでも実装したものでもありません。

キャッシュ:キャッシュでは、データベース内のレコードを識別するために主キーが使用されます。データベースの通常の使用では、主キーは変更されません。復元の場合、主キーは同じレコードを識別しなくなり、キャッシュはまったく間違っています。これも検出できません。たとえば、新しいレコードに間違った外部キーを設定する可能性があります。

DB復元は、データベースの他の通常の使用法と比較することはできません。復元は、データ処理のすべてのルールに違反します。

多くのアプリケーションは、実行中は接続を開いたままにして、復元を不可能にしていると思います。他のほとんどのアプリケーションは、データベースが復元されたときにクラッシュし、その後データベースにアクセスしようとします。私の場合、しばらく動作し続けることがありますが、これは問題です。

ほとんどの人は、アプリケーションの実行中にデータベースを復元しようとさえしないと思います。

アプリケーションがまだメモリ内にある間にデータベースが復元されると、理論上、私の場合は証明されたリスクがあります。ほとんどのアプリケーションがそれを処理しないという理由だけで、これはまったく問題ではないと言われたくありません。

4

3 に答える 3

0

データベースへの接続方法がわからない場合は、接続ロジックに別の状態またはシステムデータベースでチェックを実行して、データベースのステータスを検証できます。

たぶん、接続の試行/キャッチを実行し、失敗した場合はステータスを確認して、その時点でユーザーに報告します。復元する頻度がわからないため、コード内の最適な場所を決定するには、ある程度の検討が必要です。

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status')

http://msdn.microsoft.com/en-us/library/ms186823.aspx

于 2012-04-18T13:26:52.540 に答える
0

SQL Serverに接続している間は、SQLServerのデータベースで完全な復元を実行することはできません。

また、SQL Serverは、SQLServerのメモリ内状態を破壊することを決して許可しません。そして、あなたはそれをそのようなものに騙すためにさえかなり懸命に働かなければならないでしょう。

于 2012-04-18T14:35:07.453 に答える
0

有用な答えが得られなかったので、この問題に対する一般的な解決策はないと思います。

私はそれを解決する2つの方法しか見ていません:

  • すべてのトランザクションの開始時にクエリを実行して、データベースが別のデータベースであるかどうかを確認します。たとえば、ここで説明されているように最後に復元されたとき。これはパフォーマンスを低下させる可能性があり、権限の問題になる可能性もあります
  • データベースへの「キープアライブ」接続を開きます。これにより、データベースが復元されなくなります。これは、実装がはるかに簡単な場合があります。接続を無駄にするので、あまり良くありません。
于 2012-07-18T05:38:25.410 に答える