web-dev-qa-db-ja.com

SQL Serverデータベースを複数のファイルに移行する(shrinkfile emptyfileとlog shipping)

SQL Server 2008データベースが運用環境にあり、新しいサーバーに移行しています。現在のデータベースには、単一の〜400GB .MDFファイルがあります。新しいサーバーではSQL Server 2012が実行され、ミラーリングされたIntel 910 SSDが実行されます。これらのドライブは、4x 200GBパーティションを提供します。

これを機能させるには、.MDFを使用して、単一のDBCC SHRINKFILE with EMPTYFILEを4つの小さいものに分割する必要があります。テストでこれを実行しましたが、それでもまだ3.5時間程度かかります。既存のデータベースはOLTPであり、365/24/7でこのプロセス中にブロッキングが発生することがわかっているため、最初に本番環境でそれを行うことはできません。

私の質問です。データベースを一時的な場所にある新しいサーバーにバックアップおよび復元する方法はありますか。新しいファイルを作成し、temp .MDFを新しい場所に空にしてから、トランザクションログを適用しますか?そうすれば、現在の古い本番環境が稼働している間にデータを移動し、短時間のシャットダウンを実行して、ログを適用し、新しいDBを起動できますか?

または、サーバーAから1つのファイルを取得し、サーバーBから4つのファイルをさまざまなドライブに最小限のダウンタイムで取得する他のオプションはありますか?

4
Lauren

つまり、いいえ。あなたはそれをライブで行わなければなりません。

やりたいことは、3つの新しいファイルを追加することです。次に、インデックスの再構築操作を開始します。デフラグを行わずに再構築を行っている限り、SQLはすべてのデータファイルにデータを分散し始めます。

SQL Enterprise Editionで実行していて、オンラインでインデックスを再構築できると想定しています。

3
mrdenny

この質問はかなり古いですが、移行中に同様の状況があったため、コメントする必要がありました。

あなたができることは

  • 新しいボックスで、新しい2012データベースを空のシェルとしてセットアップします。
  • すべてのファイルグループが希望どおりにセットアップされていることを確認します(複数のディスクにストライプされ、同じサイズに割り当てられます)。
  • 2008データベースからすべてのスキーマオブジェクトをスクリプト化し、それらを新しい2012データベースの空のシェルに適用します(スクリプトウィザードですべてのオブジェクトにトリガー/インデックスを確実に適用します)。
  • 主キーを持つすべてのテーブルのソースデータベースから宛先へのトランザクションレプリケーションをセットアップします(オブジェクトが存在する場合にのみアーティクルを切り捨てるように設定します)。
  • 主キーを持たない他のテーブルの場合は、スナップショットレプリケーションをセットアップします。
  • トランザクションパブリケーションとスナップショットパブリケーションの両方のサブスクライバーとして、宛先データベースを追加します。
  • トランザクションレプリケーションでテーブルのスナップショットエージェントを実行してから、分散ジョブが完了し、データが流れていることを確認します。
  • 移行中にアプリをシャットダウンしてから、スナップショットレプリケーションパブリケーションのスナップショットエージェント/配布エージェントを実行します。
  • 次に、アプリチームにアプリを起動させ、煙のテストを実行してから、UATテストなどを実行してもらいます。

もちろん、これをUATまたは別の非製品環境で最初に実行します:)テストが完了すると、レプリケーション設定を分解し、データは新しいサーバーに残ります。

このようにデータをBCPするのではなく、この方法で移行を行うことの利点は、

  1. ソースデータベースは可能な限り利用可能なまま
  2. すべての依存関係はスナップショットプロセスによって処理されます
  3. データ移行は多くの変更なしで繰り返し可能です。

監視する必要がある唯一の警告は、CDC用にセットアップされたテーブル、またはソースのtrun/loadテーブルです。

1
Brian Stanley