私を探しています実用的に値を設定するためのガイダンスBUFFERCOUNT
、BLOCKSIZE
および、MAXTRANSFERSIZE
のBACKUP
コマンド。私は少し調査を行い(以下を参照)、少しテストを行いました。本当に価値のある答えは「まあ、それは...」で始まることを十分に認識しています。私が行ったテストと私が見つけたリソースのいずれかに示されているテスト(以下の方法を参照)に対する私の懸念は、テストが真空で行われることです。ほとんどの場合、他の負荷のないシステムで行われます。
長期的な経験に基づいたこれらの3つのオプションに関する適切なガイダンス/ベストプラクティスに興味があります:数週間または数か月にわたる多くのデータポイント。そして、特定の値を探しているわけではありません。それはほとんどが利用可能なハードウェアの機能だからです
- さまざまなハードウェア/負荷要因が、実行すべき内容にどのように影響するか。
- これらの値がどれもオーバーライドされるべきではない状況はありますか?
- すぐに明らかではないこれらのいずれかをオーバーライドするための落とし穴はありますか?メモリーやディスクI / Oを使いすぎていますか?復元操作を複雑にしますか?
- SQL Serverの複数のインスタンス(既定のインスタンスと2つの名前付きインスタンス)を実行しているサーバーがあり、3つのインスタンスすべてのバックアップを同時に実行すると、集合(
BUFFERCOUNT
*MAXTRANSFERSIZE
)使用可能なRAMを超えていませんか?可能なI / O競合? - 1つのサーバーで3つのインスタンスを使用し、3つすべてのバックアップを同時に同時に実行する同じシナリオで、各インスタンス内で複数のデータベースのバックアップを同時に実行すると、これらの値の設定にどのように影響しますか?つまり、3つのインスタンスのそれぞれに100個のデータベースがあり、各インスタンスごとに2つまたは3つのバックアップを同時に実行し、6から9のバックアップが同時に実行される場合。(この状況では、いくつかの大きなデータベースではなく、多くの中小規模のデータベースがあります。)
これまでに収集したもの:
BLOCKSIZE
:- サポートされるサイズは、512、1024、2048、4096、8192、16384、32768、および65536(64 KB)バイトです。[1]
- デフォルトは、テープデバイスの場合は65536、それ以外の場合は512です[1]
- CD-ROMへのコピーおよびCD-ROMからの復元を計画しているバックアップを作成する場合は、BLOCKSIZE = 2048 [1]を指定します
- 単一のディスクに書き込む場合、デフォルトの512で十分です。RAIDアレイまたはSANを使用する場合は、デフォルトまたは65536のどちらが優れているかをテストする必要があります。[13(18ページ)]
手動で設定する場合、値はデータファイルの作成に使用されるブロックサイズ以上でなければなりません。そうでない場合、次のエラーが表示されます。
メッセージ3272、レベル16、状態0、行3
'C:\ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ Backup \ BackupTest.bak'デバイスのハードウェアセクターサイズは4096ですが、ブロックサイズパラメーターは互換性のない512のオーバーライド値。互換性のあるブロックサイズを使用してステートメントを再発行します。
BUFFERCOUNT
:デフォルト[2]、[8]:
SQL Server 2005以降のバージョン:
(NumberofBackupDevices * [mystery_multiplier])+ NumberofBackupDevices +(2 * NumberofVolumesInvolved)[mystery_multiplier]:この値に関していくつかの矛盾があります。私はそれが3つの形式で表現されているのを見ました:
3
[2]GetSuggestedIoDepth
[8]GetSuggestedIoDepth + 1
[8]
3
SQL Server 2005 SP2 [9]で乗数が必要であることを示すテストが行われました。SQL Server 2008 R2および2012でのテスト、およびSQL Server 2014に関するユーザーコメント[8]は、乗数がであることを示しています
4
。意味GetSuggestedIoDepth
(以下のいずれかに報告された値が与えられた場合):GetSuggestedIoDepth
現在4
、または- 乗数は今
GetSuggestedIoDepth + 1
GetSuggestedIoDepth
3
DISKデバイスの返品[9]- ハードセットされた最大値はありませんが、必要なメモリ=(
BUFFERCOUNT
*MAXTRANSFERSIZE
)を考えると、実際の最大値は次のようになります。BUFFERCOUNT <= (available_memory / MAXTRANSFERSIZE)
MAXTRANSFERSIZE
:- 可能な値は、最大4194304バイト(4 MB)の範囲の65536バイト(64 KB)の倍数です。[1]
- デフォルト値:デバイスが読み取りモード(復元)の場合、またはこれがDesktopまたはExpress Editionで64Kを使用する場合、1 MBを使用します。[9]
- 一般/その他:
- 使用できる最大サイズは(バッファプールの物理メモリ/ 16)です。GlobalMemoryStatusEx(ullTotalPhys)API呼び出しから返されたとおり。[9]
- トレースフラグは
3213
、バックアップ/復元操作の実行中にバックアップ/復元構成パラメーターを3605
出力し、ERRORLOGファイルに出力をダンプします。DBCC TRACEON (3213, 3605, -1);
DISK = N'NUL:'
(DOS/dev/null
でUNIXに相当するWindows )を使用して、一部のメトリックのテストを簡単に行うことができます(ただし、書き込みI / Oをスキップしているため、合計プロセス時間を把握できません)。
資源
- T-SQL BACKUPコマンドのMSDNページ
- KB904804:SQL Server 2000でデータベースをバックアップするとパフォーマンスが低下する
- SQL Serverバックアップのパフォーマンスを向上させるオプション
- バックアップと復元
- SQL Serverのバックアップと復元の最適化
- バックアップパフォーマンスの最適化
- 圧縮およびソリッドステートディスクを使用してSQLデータベースの完全バックアップの速度を上げる方法
- 不適切なBufferCountデータ転送オプションは、OOM状態につながる可能性があります
- 仕組み:SQL Serverのバックアップと復元はどのように転送サイズを選択しますか
- 仕組み:SQL Serverバックアップバッファー交換(VDIフォーカス)
- SQLバックアップによる大規模データベースのチューニング
- バックアップバッファー用のSQL Serverメモリ
- ケーススタディ:ネットワークを介したVLDBの高速で信頼性の高いバックアップと復元(.docxファイル)
- バックアップパフォーマンスを向上させるために、バックアップデバイスをいくつ推奨しますか?
私はテストしました:
--DBCC TRACEON (3213, 3605, -1);
BACKUP DATABASE [Test] TO
DISK = 'NUL:'
--,DISK = 'NUL:'
-- DISK = 'BackupTest1.bak'
-- ,DISK = 'BackupTest2.bak'
WITH
STATS = 5,
FORMAT,
CHECKSUM,
NO_COMPRESSION,
COPY_ONLY
--,BUFFERCOUNT = 40
--,MAXTRANSFERSIZE = 4194304--2097152,
--,BLOCKSIZE = 16384
--DBCC TRACEOFF (3213, 3605, -1);
更新
質問に答えるときにいつも他の人に提供するように頼んでいる情報の一部を追加するのを忘れることがあるようです;-)。私は現在の状況に関して上記の情報を提供しましたが、詳細を提供できます。
私は24/7 / 365.25 SaaSアプリケーションを提供するクライアントで働いています。そのため、ユーザーはいつでもアクセスできる可能性がありますが、現実的には、ユーザーはすべて米国に拠点を置き(現時点では)、ほとんど「標準」時間で作業する傾向があります。 (つまり、東部標準時の午後10時)、ただし月曜日から金曜日だけでなく、週末の負荷は少し軽くなりますが、週7日です。
各クライアントが独自のDBを持つように設定されています。ニッチな業界なので、数万(またはそれ以上)の潜在的なクライアントはいません。クライアントDBの数はインスタンスごとに異なり、最大のインスタンスは206クライアントを保持します。最大のDBは約です。8 GBですが、1 GBを超えるデータベースは約30のみです。したがって、私は特にVLDBのパフォーマンスを最大化しようとはしていません。
このクライアントで始めたとき、それらのバックアップは常に1日1回フルで、LOGバックアップはありませんでした。また、MAXTRANSFERSIZEを4 MBに、BUFFERCOUNTを50に設定しました。そのセットアップを、Ola Hallengrenのデータベースバックアップスクリプトのわずかにカスタマイズされたバージョンに置き換えました。少しカスタマイズされた部分は、各インスタンスに接続するときに動的にDBを検出し、インスタンスごとに調整できるようにするマルチスレッドツール(私が書いてすぐに販売を開始する予定です)から実行されることです(したがって、現在実行しています3つのインスタンスを同時に実行しますが、各インスタンスごとにDBを順番に実行します。これらを同時に実行することの影響がわからないためです。
これで、1週間に1日フルバックアップを行い、他の日にはDIFFバックアップを行うようになりました。LOGバックアップは10分ごとに取得されます。ここで問い合わせている3つのオプションにはデフォルト値を使用しています。しかし、それらがどのように設定されているかを知って、私は最適化を元に戻していないことを確認したかった(古いシステムにいくつかの大きな欠陥があったからといって、すべてが間違っていました)。現在、206個のデータベースの場合、FULLバックアップ(約1週間に1回)には約62分かかり、残りの日(FULL後の初日には7分、前日には20分)のDIFFバックアップに7分から20分かかります次のFULL)。そして、それはそれらを順番に実行しています(シングルスレッド)。LOGバックアッププロセスの合計(3つのインスタンスすべてのすべてのDB)は、毎回(再び、10分ごとに)50〜90秒かかります。
DBごとに複数のファイルを実行できることを理解していますが、a)DBのマルチスレッド化と中小規模のサイズがどれほど優れているか、b)復元プロセスを複雑にしたくない(b)単一のファイルを扱うことが望ましい理由はさまざまです)。
また、圧縮を有効にできることも認識しています(テストクエリでは意図的に無効になっています)。チームにそれを推奨していましたが、組み込みの圧縮がちょっと厄介であることに気付きました。古いプロセスの一部は、各ファイルをRARに圧縮することでした。独自のテストを行ったところ、RARバージョンはネイティブに圧縮されたバージョンよりも少なくとも 50%小さいことがわかりました。最初にネイティブ圧縮を使用してファイルを高速化してからRARを試しましたが、これらのファイルは、単にネイティブに圧縮されたものよりも小さいですが、RARのみの圧縮バージョンよりもまだ少し大きく、正当化するのに十分な違いがありましたネイティブ圧縮を使用していません。バックアップを圧縮するプロセスは非同期で、X分ごとに実行されます。.bak
またはを見つけた場合.trn
ファイル、それを圧縮します。このように、各ファイルの圧縮にかかる時間によってバックアッププロセスが遅くなることはありません。