サイトにページを表示するために使用される情報がキャッシュされた読み取り専用データベースがあります。データベースを生成するために実行されるプロセスと、別のサーバーで実行されるプロセスがあります。ライブ データベースを更新する必要がある場合は、このデータベースをライブ サーバーに新しい名前とファイルで復元します。次に、ライブ データベースを削除し、このデータベースの名前を元の名前に変更します。現在、ストアド プロシージャでこれを行っています。これは、'sp_who' と 'kill' を介してすべての接続を強制終了し、次に drop database コマンド、次に 'sp_renamedb' を実行します。すべての接続を切断すると、現在これらのページにアクセスしているユーザーとクローラーのサイトでエラーがスローされます。この手順を実行するためのより良い方法はありますか?
4 に答える
データ生成サーバーをパブリッシャーとして、ライブサーバーをサブスクライバーとしてトランザクションレプリケーションを設定します。クライアント接続は何も気づきません。
おそらく、次のコマンドを使用して、ライブ データベースをオフラインにする必要があります。
ALTER DATABASE name SET OFFLINE
詳しくはこちらで読むことができますが、次のように書かれています。
上記のコマンドは、指定されたデータベースをただちにオフラインにしようとします。ユーザーまたはバックグラウンド プロセスが現在データベースに接続されている場合、コマンドは完了できません。この状況では、ALTER DATABASE ステートメントはブロックされ、すべての接続が閉じられるまで待機します。これにより、トランザクションが予期せずロールバックされることがなくなります。ブロック中は、データベースへの新しい接続は許可されません。
データベースがオフラインになると、復元/名前変更操作を安全に実行でき、完了したらオンラインに戻すことができます。データベースがオフライン状態のときに何が許可されているかを確認するには、いくつか試してみる必要があるかもしれません。
オフライン中に復元/名前変更を行うのに問題がある場合は、シングル ユーザー モードでオンラインに戻すことをお勧めします。
このシナリオでは、接続プーリングまたはその他の実行時間の長い接続が問題を引き起こす可能性があります。ALTER DATABASE SET OFFLINE コマンドが発行された後、一定期間 (たとえば 15 分) 待機するようにスクリプトを設定することができます。データベースがまだオフラインになっていない場合は、WITH NO_WAIT を指定してコマンドを再発行できます。強制的にオフラインにするオプション。
それが十分に強力でない場合は、SQL Server を正常にシャットダウンすることもできます。これは、サーバー内のすべての作業が完了するまで待機してから停止します。
ユーザーのために本当にシームレスなことをしたい場合。私はこのようなことをします。
データベースの新しいバージョンをコピーするときは、データベースを更新する頻度に応じて、新しい名前を付けます。名前は日時で指定することもできます。そこに到達したら、新しいデータベースの使用を開始するようにWebアプリケーションに指示します。これは、web.configの接続文字列を変更するか、構成データベースにすることで実行できます。
一定の時間が経過したら、サイトの使用特性に基づいて、古いデータベースを削除します。
+1 Mike Sharek - 私はあなたのソリューションが好きです。それは非常にきちんとしていて、ユーザーが突然(そして非常に失礼に)切断されるのを防ぎます。
ユーザーがログオフするのを何時間も待ちたくない場合は、別の方法があります。基本的に「開いている」サイトに構築したAJAXメカニズムを介して、接続されたクライアントにアラートを送信し、サーバーからの通知をタイムアウトして再接続する前に一定期間待機するため、基本的にXmlHttpObjectは常に応答を待っています. 応答を受信した時点で、それを画面に表示し、別の接続を開きます。次に、待機中の AJAX コンポーネントにメッセージをプッシュする管理者インターフェイスを用意します。
これにより、Microsoft の Outlook Mobile Access と同様の方法でほぼリアルタイムでメッセージを送信でき、10 分後にサイトがメンテナンスのためにダウンすることをユーザーに通知できます。
これを行うビルド済みのコンポーネントがあるかどうかはわかりませんが、実装がそれほど難しくないことは確かです.
すぐに役立つわけではありませんが、サイトの将来のリリースについて考える価値はあります。