web-dev-qa-db-ja.com

大きなSQLサーバーの分割MDFファイル

新しいサーバーに移行する必要がある大きな(1.2テラバイト)SQL Serverデータベースがあります。ほとんどのデータベースは、1.25 TB=データファイルの1つにあり、管理しやすい550 GBのファイル(実際には空です)に少し置かれています。

少し注意が必要です。移行先のサーバーには3つの700 GBボリュームしかないため、このゴリアテを何らかの方法で3つの等しいチャンクに分割する必要があります。私が見つけたほとんどのアドバイスは、3つのターゲットファイルを作成し、メインファイルでDBCC SHRINKFILE EMPTYFILEを実行してそれをターゲットに空にすることですが、データベースがこれほど大きい場合は時間がかかります。

これほど大きなデータベースを分割するための推奨される方法はありますか? Sql Server Integration Servicesのデータエクスポート機能を使用して、適切なファイル構造を持つクローンデータベースにデータをダンプすることを検討していますが、もっと良い方法があるかどうか知りたいです。

5
Garrett

DBCC SHRINKFILE-はシングルスレッドになります–これは長いランタイム。

また、SQL Server Integration Servicesのデータエクスポートは、データベースのサイズが大きいため(1 TB)、遅くなります。

代わりに、データベースでBCP OUT(バイナリ形式)およびBULK INSERTを探す必要があります。

  • BCPは、SQL Serverのネイティブ形式をテキストファイルから読み取ることができます。これは非常に高速なオプションであり、テキストファイル入力の解析が最小限で済みます。
  • BULK INSERTコマンドは、テキストファイルからSQL Serverにデータを取り込むためのインプロセスメソッドです。 Sqlservr.exeとインプロセスで実行されるため、データファイルをSQL Serverにロードする非常に高速な方法です。
  • さらに、トレースフラグ610を有効にして、BATCHSIZEパラメータとROWS_PER_BATCHパラメータとともに、インデックス付きテーブルへの挿入を最小限に記録します。
  • SQLサーバー2005では、通常、割り当てられた5000のロックで発生するロックエスカレーションを無効にすることもできます。これをSQLサーバー2005で無効にするには、batchsizeをこれより小さい値に設定するか、トレースフラグ1211を有効にします(ロックエスカレーションを完全に無効にします)。 SQL Server 2008では、alter table <table_name> (LOCK_ESCLATION = DISABLE)を使用して実行できます。
  • BCPには-aスイッチがあり、パケットサイズを指定できます。SSISを使用する場合は、接続マネージャーのプロパティで実行できます-> PacketSize = 32767
  • PFS競合 を回避するには、-E起動パラメーターの使用を検討してください。

また、ハードウェアレベルでは、

  • 高速NICおよびスイッチを使用します。
  • NICの最新の認定ドライバーを用意します。
  • 全二重を有効にします。
  • ジャンボフレームのサポートを有効にします。
  • TCP Chimney Offloadを使用します。
  • 受信側スケーリング(RSS)を使用します。

ここで提供したBCPおよびBULK INSERTスクリプトを確認します

注:データのロード時に、ディスクのパーティション分割、レイアウト、CPUの数、NUMA構成などのハードウェアもパフォーマンスに大きな影響を与えます。

優れた読書:

4
Kin Shah