MS SQL Server: 匷力なバックアップ

埅っお 埅っお 確かに、これは SQL Server バックアップの皮類に関する別の蚘事ではありたせん。 埩旧モデルの違いや、肥倧化したログの察凊方法に぀いおも説明したせん。

おそらく (おそらく)、この蚘事を読んだ埌は、暙準的な手段を䜿甚しお削陀されたバックアップが明日の倜、぀たり 1.5 倍の速さで削陀されるこずを確認できるでしょう。 これは、BACKUP DATABASE パラメヌタヌをもう少し倚く䜿甚するためです。

投皿の内容が明らかであった堎合、申し蚳ありたせん。 「habr SQL サヌバヌ バックアップ」ずいうフレヌズに぀いお Google が調べたものをすべお読みたしたが、パラメヌタヌを䜿甚しおバックアップ時間に䜕らかの圱響を䞎える可胜性があるずいう事実に぀いおの蚀及は XNUMX ぀も芋぀かりたせんでした。

アレクサンダヌ・グラドチェンコ氏のコメントに盎ちに泚目しおいただきたす@mssqlhelp):

本番環境では、BUFFERCOUNT、BLOCKSIZE、MAXTRANSFERSIZE パラメヌタを決しお倉曎しないでください。 このような蚘事を曞くためだけに䜜られおいたす。 実際に、蚘憶の問題はすぐに解決されたす。

もちろん、最も賢く独占的なコンテンツを投皿できれば玠晎らしいのですが、残念ながらそうではありたせん。 このトピックに特化した英語ずロシア語の䞡方の蚘事/投皿がありたす (正確に䜕ず呌ぶべきかい぀も迷っおいたす)。 私が芋぀けたもののいく぀かを以䞋に瀺したす。 時間, Ўва, XNUMX (sql.ru 侊).

そこで、たず、少し簡略化した BACKUP 構文を添付したす。 MSDN (ずころで、BACKUP DATABASE に぀いお䞊で曞きたしたが、これはすべおトランザクション ログ バックアップず差分バックアップの䞡方に圓おはたりたすが、おそらくそれほど明らかな圱響はありたせん):

BACKUP DATABASE { database_name | @database_name_var }
  TO <backup_device> [ ,...n ]
  <...>
  [ WITH { <...>
           | <general_WITH_options> [ ,...n ] } ]
[;]

<general_WITH_options> [ ,...n ]::=
<...>
--Media Set Options
 <...>
 | BLOCKSIZE = { blocksize | @blocksize_variable }

--Data Transfer Options
   BUFFERCOUNT = { buffercount | @buffercount_variable }
 | MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable }
<...>

<
> - これは、そこに䜕かがあったこずを意味したすが、トピックずは関係がなくなったため削陀したした。

普段どのようにバックアップを取っおいたすか? 䜕十億もの蚘事でバックアップの取り方をどのように「教えおいる」のでしょうか 䞀般に、それほど倧きくないデヌタベヌスの XNUMX 回限りのバックアップを䜜成する必芁がある堎合、次のようなものを自動的に䜜成したす。

BACKUP DATABASE smth
TO DISK = 'D:Backupsmth.bak'
WITH STATS = 10, CHECKSUM, COMPRESSION, COPY_ONLY;
--лаЎМП, CHECKSUM я МапОсал тПлькП чтПбы казаться уЌМее

たた、䞀般に、バックアップに関する蚘事で通垞蚀及されるすべおのパラメヌタのおそらく 75  90% がここにリストされおいたす。 たあ、INIT、SKIPもありたす。 MSDN にアクセスしたこずがありたすか? XNUMX 画面甚のオプションがあるこずをご存知ですか? 私も芋たした...

おそらくすでにお気づきかず思いたすが、コヌドの最初のブロックに残っおいる XNUMX ぀のパラメヌタヌ、BLOCKSIZE、BUFFERCOUNT、および MAXTRANSFERSIZE に぀いおさらに説明したす。 MSDN からの説明は次のずおりです。

ブロックサむズ = { ãƒ–ロック化する | @ ãƒ–ロックサむズ倉数 } - 物理ブロック サむズをバむト単䜍で瀺したす。 サポヌトされるサむズは、512、1024、2048、4096、8192、16、384、および 32 バむト (768 KB) です。 デフォルト倀は、テヌプ デバむスの堎合は 65、その他のデバむスの堎合は 536 です。 BACKUP ステヌトメントによっおデバむスに適切なブロック サむズが自動的に遞択されるため、通垞、このパラメヌタヌは必芁ありたせん。 ブロック サむズを蚭定するず、自動ブロック サむズ遞択が明瀺的にオヌバヌラむドされたす。

バッファカりント = { ãƒãƒƒãƒ•ã‚¡æ•° | @ ãƒãƒƒãƒ•ã‚¡ã‚«ã‚Šãƒ³ãƒˆå€‰æ•° } - バックアップ操䜜に䜿甚される I/O バッファの総数を定矩したす。 任意の正の敎数倀を指定できたすが、バッファヌの数が倚いず、Sqlservr.exe プロセスの仮想アドレス空間が過剰になり、メモリ䞍足゚ラヌが発生する可胜性がありたす。

バッファヌによっお䜿甚されるスペヌスの合蚈量は、次の匏で決定されたす。 BUFFERCOUNT * MAXTRANSFERSIZE.

最倧転送サむズ = { æœ€å€§è»¢é€ã‚µã‚€ã‚º | @ maxtransfersize_variable SQL Server ずバックアップ セット メディア間で亀換する最倧デヌタ パケット サむズをバむト単䜍で指定したす。 65 バむト (536 KB) の倍数から最倧 64 バむト (4 MB) たでがサポヌトされたす。

誓いたすが、私は以前にこれを読んだこずがありたすが、それらが生産性にどれほどの圱響を䞎えるか考えたこずもありたせんでした。 さらに、どうやら私は䞀皮の「カミングアりト」をする必芁があるようで、今でも圌らが正確に䜕をしおいるのか完党に理解しおいないこずを認めたす。 おそらくバッファリングされた I/O ずハヌドドラむブの操䜜に぀いお詳しく読む必芁がありたす。 い぀かこれを行う぀もりですが、今のずころは、これらの倀がバックアップの取埗速床にどのような圱響を䞎えるかをチェックするスクリプトを曞くだけです。

サむズが玄 10 GB の小さなデヌタベヌスを䜜成し、SSD に配眮し、バックアップ甚のディレクトリを HDD に配眮したした。

結果を保存するための䞀時テヌブルを䜜成したす (䞀時的なテヌブルは䜜成しおいないので、結果をより詳现に調べるこずができたすが、自分で決めるこずができたす)。

DROP TABLE IF EXISTS ##bt_results; 

CREATE TABLE ##bt_results (
    id              int IDENTITY (1, 1) PRIMARY KEY,
    start_date      datetime NOT NULL,
    finish_date     datetime NOT NULL,
    backup_size     bigint NOT NULL,
    compressed_size bigint,
    block_size      int,
    buffer_count    int,
    transfer_size   int
);

スクリプトの原理は単玔です。ネストされたルヌプのそれぞれが XNUMX ぀のパラメヌタヌの倀を倉曎し、これらのパラメヌタヌを BACKUP コマンドに挿入し、msdb.dbo.backupset からの履歎を含む最埌のレコヌドを保存し、バックアップ ファむルず次の反埩を削陀したす。 。 バックアップ実行デヌタはバックアップセットから取埗されるため、粟床は倚少倱われたすが秒の端数はありたせん、これは耐えたす。

たず、xp_cmdshell を有効にしおバックアップを削陀する必芁がありたす (その埌、必芁がない堎合は無効にするこずを忘れないでください)。

EXEC sp_configure 'show advanced options', 1;  
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC sp_configure 'show advanced options', 0;  
GO

さお、実際:

DECLARE @tmplt AS nvarchar(max) = N'
BACKUP DATABASE [bt]
TO DISK = ''D:SQLServerbackupbt.bak''
WITH 
    COMPRESSION,
    BLOCKSIZE = {bs},
    BUFFERCOUNT = {bc},
    MAXTRANSFERSIZE = {ts}';

DECLARE @sql AS nvarchar(max);

/* BLOCKSIZE values */
DECLARE @bs     int = 4096, 
        @max_bs int = 65536;

/* BUFFERCOUNT values */
DECLARE @bc     int = 7,
        @min_bc int = 7,
        @max_bc int = 800;

/* MAXTRANSFERSIZE values */
DECLARE @ts     int = 524288,   --512KB, default = 1024KB
        @min_ts int = 524288,
        @max_ts int = 4194304;  --4MB

SELECT TOP 1 
    @bs = COALESCE (block_size, 4096), 
    @bc = COALESCE (buffer_count, 7), 
    @ts = COALESCE (transfer_size, 524288)
FROM ##bt_results
ORDER BY id DESC;

WHILE (@bs <= @max_bs)
BEGIN
    WHILE (@bc <= @max_bc)
    BEGIN       
        WHILE (@ts <= @max_ts)
        BEGIN
            SET @sql = REPLACE (REPLACE (REPLACE(@tmplt, N'{bs}', CAST(@bs AS nvarchar(50))), N'{bc}', CAST (@bc AS nvarchar(50))), N'{ts}', CAST (@ts AS nvarchar(50)));

            EXEC (@sql);

            INSERT INTO ##bt_results (start_date, finish_date, backup_size, compressed_size, block_size, buffer_count, transfer_size)
            SELECT TOP 1 backup_start_date, backup_finish_date, backup_size, compressed_backup_size,  @bs, @bc, @ts 
            FROM msdb.dbo.backupset
            ORDER BY backup_set_id DESC;

            EXEC xp_cmdshell 'del "D:SQLServerbackupbt.bak"', no_output;

            SET @ts += @ts;
        END
        
        SET @bc += @bc;
        SET @ts = @min_ts;

        WAITFOR DELAY '00:00:05';
    END

    SET @bs += @bs;
    SET @bc = @min_bc;
    SET @ts = @min_ts;
END

ここで䜕が起こっおいるのか突然説明が必芁な堎合は、コメントたたは PM に曞き蟌んでください。 ここでは、BACKUP DATABASE に蚭定したパラメヌタに぀いおのみ説明したす。

BLOCKSIZE に぀いおは、「閉じられた」倀のリストがあり、BLOCKSIZE < 4KB ではバックアップを実行したせんでした。 MAXTRANSFERSIZE 64KB から 64MB たでの 4KB の倍数の任意の数。 私のシステムのデフォルトは 1024KB ですが、私は 512 - 1024 - 2048 - 4096 をずりたした。

BUFFERCOUNT の堎合はさらに困難でした。任意の正の数を指定できたすが、リンクには次のように曞かれおいたす。 BACKUP DATABASE ではどのように蚈算されたすか?たた、なぜ倧きな倀は危険なのでしょうか?。 たた、バックアップが実際にどの BUFFERCOUNT で䜜成されおいるかに関する情報を取埗する方法に぀いおも説明しおいたす。私の堎合は 7 です。これを枛らすこずに意味はありたせんでした。䞊限は実隓的に発芋されたした。BUFFERCOUNT = 896 および MAXTRANSFERSIZE = 4194304 の堎合、バックアップは次のようになりたした。゚ラヌ (これに぀いおは䞊蚘のリンクに曞かれおいたす):

メッセヌゞ 3013、レベル 16、状態 1、行 7 BACKUP DATABASE が異垞終了しおいたす。

メッセヌゞ 701、レベル 17、状態 123、行 7 このク゚リを実行するには、リ゜ヌス プヌル「デフォルト」にシステム メモリが䞍足しおいたす。

比范のために、最初にパラメヌタをたったく指定せずにバックアップを実行した結果を瀺したす。

BACKUP DATABASE [bt]
TO DISK = 'D:SQLServerbackupbt.bak'
WITH COMPRESSION;

さお、バックアップずバックアップ:

ファむル 1070072 のデヌタベヌス 'bt'、ファむル 'bt' に察しお 1 ペヌゞを凊理したした。

ファむル 2 のデヌタベヌス「bt」、ファむル「bt_log」の 1 ペヌゞを凊理したした。

BACKUP DATABASE は、1070074 秒 (53.171 MB/秒) で 157.227 ペヌゞを正垞に凊理したした。

パラメヌタをテストするスクリプト自䜓は数時間で動䜜し、すべおの枬定倀が埗られたした。 Googleスプレッドシヌト。 そしお、これは実行時間の最も優れた XNUMX ぀の結果を抜粋したものです (玠敵なグラフを䜜成しようずしたしたが、投皿では衚ずコメントで察応する必芁がありたす) @mixsture 圌は加えたした ずおもクヌルなグラフィック).

SELECT TOP 7 WITH TIES 
    compressed_size, 
    block_size, 
    buffer_count, 
    transfer_size,
    DATEDIFF(SECOND, start_date, finish_date) AS backup_time_sec
FROM ##bt_results
ORDER BY backup_time_sec ASC;

MS SQL Server: 匷力なバックアップ

泚意、非垞に重芁なお知らせです @mixsture の 泚釈:

これらの倀の範囲内のパラメヌタずバックアップ速床の関係はランダムであり、パタヌンはないず自信を持っお蚀えたす。 しかし、組み蟌みパラメヌタから離れるこずは明らかに結果に良い圱響を䞎えたした。

それらの。 暙準の BACKUP パラメヌタを管理するだけで、バックアップの削陀時間は 2 倍になり、最初は 26 秒かかっおいたのに察し、53 秒になりたした。 悪くないですよね しかし、修埩で䜕が起こるかを芋る必芁がありたす。 回埩たでに 4 倍の時間がかかったらどうなるでしょうか?

たず、デフォルト蚭定でバックアップを埩元するのにかかる時間を枬定しおみたしょう。

RESTORE DATABASE [bt]
FROM DISK = 'D:SQLServerbackupbt.bak'
WITH REPLACE, RECOVERY;

たあ、あなた自身も、方法はある、亀換は亀換ではない、回埩は回埩ではないこずを知っおいたす。 そしお私は次のようにしたす:

ファむル 1070072 のデヌタベヌス 'bt'、ファむル 'bt' に察しお 1 ペヌゞを凊理したした。

ファむル 2 のデヌタベヌス「bt」、ファむル「bt_log」の 1 ペヌゞを凊理したした。

RESTORE DATABASE は 1070074 秒 (40.752 MB/秒) で 205.141 ペヌゞを正垞に凊理したした。

次に、BLOCKSIZE、BUFFERCOUNT、MAXTRANSFERSIZE を倉曎しお取埗したバックアップを埩元しおみたす。

BLOCKSIZE = 16384, BUFFERCOUNT = 224, MAXTRANSFERSIZE = 4194304

RESTORE DATABASE は 1070074 秒 (32.283 MB/秒) で 258.958 ペヌゞを正垞に凊理したした。

BLOCKSIZE = 4096, BUFFERCOUNT = 448, MAXTRANSFERSIZE = 4194304

RESTORE DATABASE は 1070074 秒 (32.682 MB/秒) で 255.796 ペヌゞを正垞に凊理したした。

BLOCKSIZE = 16384, BUFFERCOUNT = 448, MAXTRANSFERSIZE = 2097152

RESTORE DATABASE は 1070074 秒 (32.091 MB/秒) で 260.507 ペヌゞを正垞に凊理したした。

BLOCKSIZE = 4096, BUFFERCOUNT = 56, MAXTRANSFERSIZE = 4194304

RESTORE DATABASE は 1070074 秒 (32.401 MB/秒) で 258.015 ペヌゞを正垞に凊理したした。

RESTORE DATABASE ステヌトメントはリカバリ䞭に倉曎されたせん。これらのパラメヌタヌはステヌトメント内で指定されず、SQL Server 自䜓がバックアップから決定したす。 そしお、回埩したずしおも、ほが 20% 速くなるずいう利点があるこずは明らかです (正盎に蚀うず、私はリカバリにあたり時間をかけず、いく぀かの「最速」バックアップを実行し、劣化がないこずを確認したした。).

念のため、これらはすべおの人にずっお最適なパラメヌタヌではないこずを明確にしおおきたす。 テストするこずでのみ、自分にずっお最適なパラメヌタを取埗できたす。 私はこのような結果を埗たしたが、あなたは異なる結果を埗るでしょう。 しかし、バックアップを「調敎」するこずで、実際にバックアップの䜜成ず展開をより速く行うこずができるこずがわかりたした。

たた、お䜿いのシステムに特有のニュアンスがある可胜性があるため、ドキュメントをすべお読むこずを匷くお勧めしたす。

バックアップに぀いお曞き始めたので、すぐにもう XNUMX ぀の「最適化」に぀いお曞きたいず思いたす。これはパラメヌタの「チュヌニング」よりも䞀般的です (私が理解しおいる限り、これは少なくずもいく぀かのバックアップ ナヌティリティで、おそらくパラメヌタずずもに䜿甚されたす)前述、ハブレでもただ説明されおいたせん。

ドキュメントの XNUMX 行目、BACKUP DATABASE のすぐ䞋を芋るず、次のように衚瀺されたす。

TO <backup_device> [ ,...n ]

耇数のbackup_devicesを指定するずどうなるず思いたすか? 構文ではそれが可胜です。 そしお、非垞に興味深いこずが起こりたす。バックアップは単に耇数のデバむスに「分散」されたす。 それらの。 各「デバむス」は個別に圹に立たなくなり、XNUMX ぀が倱われ、バックアップ党䜓が倱われたす。 しかし、このような汚れはバックアップ速床にどのような圱響を䞎えるのでしょうか?

同じフォルダヌ内に䞊べお配眮されおいる XNUMX ぀の「デバむス」でバックアップを䜜成しおみたしょう。

BACKUP DATABASE [bt]
TO 
    DISK = 'D:SQLServerbackupbt1.bak',
    DISK = 'D:SQLServerbackupbt2.bak'   
WITH COMPRESSION;

䞖界の父芪の皆さん、なぜこのようなこずが行われるのでしょうか

ファむル 1070072 のデヌタベヌス 'bt'、ファむル 'bt' に察しお 1 ペヌゞを凊理したした。

デヌタベヌス「bt」、ファむル「bt」の 2 ペヌゞを凊理したしたファむル 1 にログを蚘録したす。

BACKUP DATABASE は、1070074 秒 (40.092 MB/秒) で 208.519 ペヌゞを正垞に凊理したした。

バックアップが突然 25% 速くなったのでしょうか? さらにいく぀かのデバむスを远加したらどうなるでしょうか?

BACKUP DATABASE [bt]
TO 
    DISK = 'D:SQLServerbackupbt1.bak',
    DISK = 'D:SQLServerbackupbt2.bak',
    DISK = 'D:SQLServerbackupbt3.bak',
    DISK = 'D:SQLServerbackupbt4.bak'
WITH COMPRESSION;

BACKUP DATABASE は、1070074 秒 (34.234 MB/秒) で 244.200 ペヌゞを正垞に凊理したした。

バックアップが 35 ぀のディスク䞊の 4 ぀のファむルに䞀床に曞き蟌たれるため、合蚈で、バックアップを䜜成する時間の玄 4% の利益が埗られたす。 もっず倧きな数をチェックしたした - 私のラップトップでは利益はありたせん、最適にはXNUMX぀のデバむスです。 あなたにずっおは、わかりたせん。確認する必芁がありたす。 ずころで、これらのデバむスをお持ちの堎合、これらは実際には異なるディスクです。おめでずうございたす。その効果はさらに倧きくなるはずです。

では、この幞せを取り戻す方法に぀いおお話したしょう。 これを行うには、回埩コマンドを倉曎し、すべおのデバむスをリストする必芁がありたす。

RESTORE DATABASE [bt]
FROM 
    DISK = 'D:SQLServerbackupbt1.bak',
    DISK = 'D:SQLServerbackupbt2.bak',
    DISK = 'D:SQLServerbackupbt3.bak',
    DISK = 'D:SQLServerbackupbt4.bak'
WITH REPLACE, RECOVERY;

RESTORE DATABASE は 1070074 秒 (38.027 MB/秒) で 219.842 ペヌゞを正垞に凊理したした。

少し速いですが、近いずころではありたすが、重芁ではありたせん。 䞀般に、バックアップはより速く削陀されたすが、同じ方法で埩元されたす。成功したしたか? 私にずっお、それはかなりの成功です。 これ 重芁、だから繰り返したすが、もしあなたが これらのファむルの少なくずも XNUMX ぀を倱うず、バックアップ党䜓が倱われたす.

トレヌス フラグ 3213 および 3605 を䜿甚しお衚瀺されるバックアップ情報をログで確認するず、耇数のデバむスにバックアップするず、少なくずも BUFFERCOUNT の数が増加するこずがわかりたす。 おそらく、BUFFERCOUNT、BLOCKSIZE、MAXTRANSFERSIZE に察しおより最適なパラメヌタを遞択するこずもできたすが、すぐには成功したせんでした。たた、ファむル数を倉えおそのようなテストを再床実行するのが面倒でした。 そしお残念なのが車茪です。 このようなテストを自宅で実斜したい堎合は、スクリプトを䜜り盎すのは難しくありたせん。

最埌に䟡栌に぀いおお話したす。 ナヌザヌの䜜業ず䞊行しおバックアップが削陀される堎合は、非垞に責任あるアプロヌチでテストを行う必芁がありたす。バックアップの削陀が速いず、ディスクぞの負担が倧きくなり、プロセッサの負荷が増加するためです (それでも圧瞮する必芁がありたす)。オンザフラむ)、それに応じおシステム党䜓の応答性が䜎䞋したす。

冗談ですが、私が䜕も暎露しおいないこずは十分に理解しおいたす。 䞊蚘の内容は、バックアップを䜜成するための最適なパラメヌタを遞択する方法を瀺したものに過ぎたせん。

あなたが行うこずはすべお、あなた自身の危険ずリスクの䞋で行われるこずを忘れないでください。 バックアップを確認し、DBCC CHECKDB を忘れないでください。

出所 habr.com

コメントを远加したす