私は最近次の仕事の面接に出席し、これを尋ねられました:
SQL Serverで1 TBまたは800 GBに近いサイズのデータベースのバックアップを高速化するにはどうすればよいですか?
私の回答:データベース圧縮を使用するか、Light Speedなどのサードパーティツールを使用できます。
しかし、彼らは私が知らなかったこの答えを期待していました:
解決策:宛先ファイルを追加してスループットを向上させます
バックアップ先のファイルをさらに追加して、このサンプルスクリプトを作成しました。
DBCC TRACEON (3605, -1)
DBCC TRACEON (3213, -1)
BACKUP DATABASE [AdventureWorks2008] TO
DISK = N'E:\ADWBackup\AdventureWorks2008-Full.bak',
DISK = N'E:\ADWBackup\AdventureWorks2008-Full-File2.bak',
DISK = N'E:\ADWBackup\AdventureWorks2008-Full-File3.bak'
WITH
NOFORMAT, INIT, NAME = N'AdventureWorks2008-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
DBCC TRACEOFF(3605, -1)
DBCC TRACEOFF(3213, -1)
以下の質問にお答えください。
1TBデータベースのバックアッププロセス(および復元)を高速化する最適な方法は、SANまたはVMWareスナップショットを取得することです。
それにもかかわらず、あなたの潜在的な雇用主が期待する答えは大丈夫ですが、状況によってはまったく結果が得られない場合があります。このアプローチが機能するには、複数のディスクアレイが必要です。このアイデアを単純化するために、1つのSSDではなく、5つの異なるバックアップファイルを5つの異なるSSDに並行して書き込む場合を想像してみてください。これは彼らが考えていたものです。
スクリプトは完全に問題ありませんが、前述のようにラップトップでテストすると、ほとんど改善されないか、まったく改善されない可能性があります。さらに、ネットワークのスループットなど、他の要因も考慮する必要があります。
バックアップの複数のターゲットは非常に便利ですが、特定の状況でのみです。
ソースデータベースは、現在の単一ファイルバックアップが書き込むことができるよりも速く読み取ることができます。
各データベースのバックアップターゲットは、別々のスピンドルにあります。
SQL Serverインスタンスとメディア間で共有SAN HBAまたはiSCSIまたはその他の帯域幅を使用していません。
つまり、バックアップファイルAの書き込みからのIOPS禁止は、バックアップファイルBの書き込みと同じディスクを使用します。
これらすべてが当てはまる場合、ある程度の並列処理(多くの出力ファイル)によって速度が向上する可能性があります。これらのすべてが当てはまらない場合は、1つ以上のディスクセットがスラッシュする可能性が高く、マルチファイルバックアップは実際には遅くなり、また、OSのファイルシステムまたはストレージレベルの断片化を引き起こす可能性があります。バックアップファイルAとバックアップファイルBを同時に!
トランザクションログバックアップのシリアルまたはパラレルへの私の答え で説明したのと同じことが多く適用されることに注意してください。これは、並列に書き込むことに関するものです(ただし、ファイルグループとファイルの方法によっては必ずしも読み取る必要はありません)レイアウトされています)。
これを本当に理解するには、親しい友人からいくつかの機器を借りることについて見る必要があるかもしれません。
1つの高速ソリッドステートディスクを取得する
良いSATA2またはSATA3またはmSATAのいずれかSamsung、Crucial、Mushkinなど 内蔵ドライブ
書くよりも速く読むことができるようにする必要があります。
SQL Serverのデータとログファイルが存在するドライブに加えて、少なくとも2つのディスクドライブを頼むか、借りるか、購入します。
これらの1つは、USB2ポートに接続されたUSB2外部ドライブ(またはUSB3ドライブ)にすることができます。
これらの1つは、USB3ポートに接続されたUSB2外付けドライブにすることができます
USB2およびUSB3ポートがバスの異なるコントローラーを共有していないことを合理的に確認できます
ここでは、USB3ドライブをUSB3ポートに挿入することはできません。バックアップデバイスを個別に低速にしたいが、バス帯域幅について互いに競合しないようにするためです。
1つ以上のドライブをSATA回転ディスクにすることができます
ローカルのSQL Server DeveloperまたはSQL Server Expressインスタンスにログインします。
高速SATA SSDにデータファイルとログファイルを含むかなり大きなデータベースを作成します。
次に、一度に1つのデバイスを各バックアップデバイスに2回続けて(同じSQLバッチで2つの BACKUP DATABASE コマンド)バックアップしてみます。
バックアップの速度を記録し、それぞれの2番目のバックアップのみを確認します。つまり、キャッシュがいっぱいになった後です。
これで、それぞれがどれだけ速いかがわかります。 1つは他よりも優れている可能性があります。
次に、連続して2回(同じSQLバッチで2つの BACKUP DATABASE コマンド)をすべてのバックアップデバイスに(つまり、複数のDISK引数を使用して)バックアップします。
速度の違いがわかりますか?
次に、BUFFERCOUNT、MAXTRANSFERSIZE、そして開発者版の場合はCOMPRESSIONを試してください。
常にCHECKSUMオプションを使用してください!
単一のファイルを使用するのではなく、この方法に従うのは何ですか?
これは、バックアップをミラーリングされていない複数のデバイスに分割するために使用されます。各デバイスは、バックアップの一部のみを保持し、バックアップの復元に必要なすべてのデバイスを保持します。はい、これは、I/Oが宛先への書き込みの最も遅い部分である場合に、より高速なバックアップを実現するために使用できます。
詳細はこちら: メディアセット、メディアファミリ、およびバックアップセット(SQL Server)
これが好きなら時差はありますか?
知っておくべき2つの主なこと:
複数の分割ファイルを使用してDBを復元するにはどうすればよいですか?
バックアップと同じように、restoreコマンドでは複数のファイルを使用します(1つを指定しないと、システムが例外をスローし、復元を実行しません)。 GUIを使用している場合は、バックアップファイルウィンドウにすべてのファイルを追加します。
それは本当にバックアップの速度を上げますか?
バックアッププロセスの最も遅い部分をテストする必要があります。たとえば、圧縮を使用しているかどうかはわかりません。これはCPUに影響を与える可能性があり、CPUの負荷が高い場合は、10個のファイルの宛先を追加しても効果がありません。