web-dev-qa-db-ja.com

SQL Server 2016で完全、差分、トランザクションバックアップをスケジュールする

SQL Serverエージェントとメンテナンスプラン(SQL Serverエージェントにつながる)を使用したバックアップのスケジュールについて調査しました。

私の最初の懸念は、バックアップをスケジュールする最善の方法は何ですか?

毎日完全バックアップ、毎時間差分バックアップ、15分ごとにトランザクションログバックアップを実行したい。

私の2番目の懸念は、これは良い習慣ですか?

SQL Serverエージェントを使用しているときに問題が発生しました。完全バックアップと差分バックアップが上書きされます。フルバックアップを上書きしても問題ありませんが、復元する必要がある場合、差分バックアップの目的ではない差分バックアップは1つしかありません。

以前のバックアップでこれを上書きさせないようにするにはどうすればよいですか?

最後の懸念と質問は、バックアップのスケジュールを実装する方法に関するものです。メンテナンスプランを使用し、3つの異なるバックアップをスケジュールする場合があります。 1つは完全版、もう1つはディファレンシャル版、1つはトランスナショナル版です。

これは、ユーザーが毎日使用するデータベースのベストプラクティスですか? (1日あたり少なくとも2000トランザクション)

2
lili

Shekar Kolaの答えに追加。

個人的には、メンテナンスプランよりもカスタムスクリプトを提案して使用します。カスタムスクリプトは、複数のサーバーに展開しやすく、構成も簡単だからです。

メンテナンスプランではなくカスタムスクリプトのルートを使用する場合は、Ola Hallengrenスクリプトの使用を検討してください。 Ola hallengrenウェブサイト

これらは、よく文書化され、頻繁に使用される驚くべきスクリプトであり、バックアップ、インデックスのメンテナンス、および整合性チェックに関するすべてをカバーしています。これらのスクリプトは、最高のDBAから推奨されています。

バックアップはお互いを上書きせず、スクリプトは.bakファイルに日付を追加します。

あなたがしなければならない唯一のことは、スクリプトを実行し、いくつかのスケジュールを自分で追加することです。さらに設定が必要な場合は、ドキュメントを確認してください。必要に応じて、自分で追加/変更できることがたくさんあります。

更新:

システムデータベースを毎日バックアップしても問題ありませんか?

はい、何も問題ありません。

差分ユーザーデータベースのバックアップは4時間ごと、ログのバックアップは15分ごと。

勤務時間中に差分を作成すると、データベースに大きなストレスがかかり、パフォーマンスが大幅に低下する可能性があります。多くの場合、これは受け入れられません。この場合も、ケース、バックアップにかかる時間、データが変更される頻度によって異なります。

これは、1日あたり約2000トランザクションのデータベースには十分だと思いますか?

バックアップの量は通常、ビジネスによって決定されます。 RTOとRPO SQLSkills RTO/RPO を調べる必要があります。バックアップの数と必要なバックアップは、それらの数と、使用できるディスク容量に関連しています。よく使用されるスケジュールは、毎週1つ、毎日1つの差分、10〜15分ごとのログバックアップです。しかし、それはもちろんあなたのケースに依存します。

'DatabaseIntegrityCheck-USER_DATABASES'、 'IndexOptimize-USER_DATABASES'などの他のジョブがあります。私もそれらをスケジュールする必要がありますか?それともバックアップで自動的に使用されますか?

いいえ、バックアップで起動されません。それらは完全に別のジョブです。しかし、はい、何らかの整合性チェックとインデックスメンテナンスを実行する必要があります。彼らが何をしているのかについてのドキュメントを読んでください。非常に短い:整合性チェックはデータの破損をチェックし、IndexOptimizeはインデックスの断片化をチェックします。

ただし、まず第一に、必ずバックアップを取るようにしてください。バックアップがまったくないよりも、完全にスケジュールされていないバックアップの方がはるかに重要です。

5
Yannick Liekens

次の点を考慮することは、バックアップスケジュールを適切に計画するのに役立ちます。

保守計画以外の次の方法でバックアップをスケジュールできます。

  1. カスタムスクリプト(stored procedure)-SQLエージェント
  2. サードパーティのツール

個人的には柔軟なのでカスタムスクリプトを使用したいと思います。

3種類のバックアップに関する基本的な注意事項をいくつか示します(すでにご存じかもしれませんが)。

完全バックアップ

  1. すべてのデータファイルを含むデータベースの完全なコピーを含む(ファイルグループがインプレースの場合)

  2. compression enabledを使用しても、データベース全体のサイズの15〜20%を下回ることはできないため、完全バックアップ用のストレージを検討してください。

  3. リカバリは、LOGに比べて簡単で高速です
  4. 他のバックアップタイプと比較してサーバーからより多くのリソースを必要とするため、より頻繁に実行することはお勧めしません。データベースであまりアクティビティがないときに実行してください。

差分バックアップ

  1. 最後のfull backup以降に発生した変更のみを含む

  2. 最近のDifferential backupには、最後の完全バックアップ後の以前のすべてのDifferential backupデータが含まれます。つまり.
    0-満杯
    1- DIF1
    2- DIF2
    3- DIF3-このファイルには、DIF1およびDIF2でバックアップされたデータが含まれます。LOGバックアップとは異なります

  3. FULLバックアップを使用可能にしないと、リカバリは不可能です

  4. COPY ONLYオプションを指定して実行された完全バックアップは、Differential backup'. as usual, FULL BACKUP is start-point for theDifferentialバックアップ 'および' LOGバックアップ 'の開始点にはできません

LOGバックアップ

  1. 最後のfull backup以降に発生した変更のみを含む

  2. DATABASE RECOVERYFULLに設定されている場合のみ考慮し、それ以外の場合は不要(不可能)

  3. 差分バックアップとは異なり、すべてのLOG BACKUPファイルを順次使用できるようにする必要があります。そうしないと復元できません。つまり、0-フル
    1- LOG1
    2- LOG2
    3- LOG3

ただし、LOGバックアップはポイントインタイムリカバリを意味していましたが、LOG 2が何らかの理由で利用できない場合、LOG3バックアップが発生するまでは復旧できません。 4.ログファイルからすべてのトランザクションを再入力する必要があるため、ファイルコピーのように「FULL」および「Differential」の場合、回復時間が長くなります。

以下は、最初に使用できるカスタムスクリプトの例、または Ola Hallengrenバックアップスクリプト を使用できます。これは多くのDBAから信頼され、無料で使用できます。

バックアップスクリプトにより、目的のデータベースにストアドプロシージャが作成されます。作成後、次の構成を行うことができます。

  1. 希望するスケジュールで各バックアップタイプ(JOB1-フル、JOB2-差分、JOB3-ログ)のJOBを作成します。
  2. すべてのデータベースは、JOBのさまざまなステップで実行されます
  3. それはあなたの要件次第です:ステップフロー内のデータベースバックアップの失敗時にジョブを続行させるか、ジョブを失敗させて電子メール通知でレポートします

バックアップスクリプト

CREATE PROCEDURE [dbo].[DoBackup]

        @DatabaseName nvarchar (50) = Null,
        @BackupType nvarchar (25) = Null
AS
BEGIN

    SET NOCOUNT ON;


    Declare @ShareDrive nvarchar (max),
            @ServerName nvarchar (50),
            @BackupPath nvarchar (250),
            @BackupFilePath nvarchar (500),
            @VersionNumber nvarchar (50),
            @BackupDateTime nvarchar (20),
            @FileExtension nvarchar (5),
            @xpcommand varchar (1000),
            @IsPrefReplica bit;

    Declare @is_DB_HADREnabled bit;
    Declare @is_Server_HADREnabled bit;
    Declare @isPrimaryReplica bit;


    if @DatabaseName is null 
            begin
                set @DatabaseName = DB_NAME();
            end
    if @BackupType is null 
            begin
                set @BackupType = 'Full';
            end

            begin
                set @ShareDrive = '\\SharedServer\Backup$\DatabaseBackups\Production\';
            end
            set @ServerName = (select cast (SERVERPROPERTY ('MachineName') as nvarchar (20)) );
            set @BackupPath = (select  @ShareDrive + @DatabaseName + '\' ) ;
            set @VersionNumber = (select cast (SERVERPROPERTY ('productversion') as nvarchar (20)) + '_');
            set @FileExtension = '.bak';
            set @BackupDateTime = 
                                (   select  convert (nvarchar (20), getdate (), 112) + '_' +
                                            cast (datepart (HH,getdate () ) as nvarchar (2)) + 
                                            cast (datepart (MINUTE, getdate () ) as nvarchar (2))
                                );

      -- Validate is the replica is preferred for backup.
        select @IsPrefReplica = sys.fn_hadr_backup_is_preferred_replica (@DatabaseName);
        select @is_DB_HADREnabled = IIF(group_database_id IS NULL, 0,1) from sys.databases where [name] = @DatabaseName;
        select @is_Server_HADREnabled = Cast(SERVERPROPERTY ('Ishadrenabled') as int);


        BEGIN
            IF EXISTS (select db.name
                        from sys.dm_hadr_database_replica_states as hadr
                            join sys.databases as db on hadr.group_database_id = db.group_database_id
                        where is_local = 1 and is_primary_replica = 1 and db.name = @DatabaseName
                        )
                SET @isPrimaryReplica = 1 
            ELSE 
                SET @isPrimaryReplica = 0 
        END

    BEGIN

    -- =============================================================================================================================
    --  backup script
    -- =============================================================================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------               
        IF (@BackupType like 'Log%')
                BEGIN
                    --IF exists (select * from msdb.dbo.backupset where database_name = @DatabaseName and cast (backup_finish_date as date) = cast (getdate () as date))
                    IF exists (select 1 from sys.databases where [name] = @DatabaseName)
                        begin
                            -- When database not part of Availability Group @IsPrefReplica woulbe become "1", so backup can be execute Non AG databases
                            IF @IsPrefReplica = 1
                            BEGIN
                                    -- ---------------------------------------------------------------------------------------------------------------
                                    --  creating directories if not available with server name and DB name
                                    -- ---------------------------------------------------------------------------------------------------------------
                                    BEGIN
                                            exec sp_configure 'show advanced options', 1;
                                            reconfigure;

                                            exec sp_configure 'xp_cmdshell', 1;
                                            reconfigure;

                                                BEGIN
                                                    Select @xpcommand = ('if not exist "' + @BackupPath + '" mkdir ' + ('"' + @BackupPath + '"') );
                                                    Exec xp_cmdshell @xpcommand;
                                                END

                                            exec sp_configure 'show advanced options', 1;
                                            reconfigure;

                                            exec sp_configure 'xp_cmdshell', 0;
                                            reconfigure;

                                            exec sp_configure 'show advanced options', 0;
                                            reconfigure;
                                        END

                                -- Actual Backup command Begins---------------------------------------------------------------------------------------------------------------

                                set @BackupType = 'Log_';
                                set @BackupFilePath = (@BackupPath + @DatabaseName + '_' + @ServerName + '_' +@BackupType + @VersionNumber + @BackupDateTime + @FileExtension);

                                BACKUP Log @DatabaseName TO DISK = @BackupFilePath with compression;
                                Print 'Backup Created as '+ @BackupFilePath
                            END
                            ELSE Print 'Its not preffered replica for the backup '
                        end
                     Else 
                        --  Print 'Fullbackup has been already done today! ' +  @BackupFilePath
                    Print 'Database "'+ @DatabaseName +'" doesnt exists' 
                End
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        IF (@BackupType like 'Full')

                BEGIN 
                IF exists (select 1 from sys.databases where [name] = @DatabaseName)
                        begin
                            -- When database is part of Availability Group, run FULL Backup only on primary replica so that it makes DIFFERENTIAL Backups valid
                            IF @is_DB_HADREnabled = 0 or @isPrimaryReplica = 1
                            BEGIN
                                    -- ---------------------------------------------------------------------------------------
                                    --  creating directories if not available with server name and DB name
                                    -- ---------------------------------------------------------------------------------------
                                    BEGIN
                                            exec sp_configure 'show advanced options', 1;
                                            reconfigure;

                                            exec sp_configure 'xp_cmdshell', 1;
                                            reconfigure;

                                                BEGIN
                                                    Select @xpcommand = ('if not exist "' + @BackupPath + '" mkdir ' + ('"' + @BackupPath + '"') );
                                                    Exec xp_cmdshell @xpcommand;
                                                END

                                            exec sp_configure 'show advanced options', 1;
                                            reconfigure;

                                            exec sp_configure 'xp_cmdshell', 0;
                                            reconfigure;

                                            exec sp_configure 'show advanced options', 0;
                                            reconfigure;
                                        END
                        -- Actual Backup command Begins---------------------------------------------------------------------------------------------------------------
                                set @BackupType = 'Full_';
                                set @BackupFilePath = (@BackupPath + @DatabaseName + '_' + @ServerName + '_' +@BackupType + @VersionNumber + @BackupDateTime + @FileExtension);

                                BACKUP Database @DatabaseName TO DISK = @BackupFilePath with compression;
                                Print 'Backup Created as '+ @BackupFilePath
                            END
                            ELSE Print 'Backup NOT Possible here! as this is not primary replica, Full Backup recommened to perform on primary to keep further DIFF Backups valid'
                        end
                    Else 
                    --      Print 'Fullbackup has been already done today! ' +  @BackupFilePath
                    Print 'Database "'+ @DatabaseName +'" doesnt exists' 
                End
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        IF (@BackupType like 'Full_Copy' or @BackupType is null)
                BEGIN
                --  IF not exists (select * from msdb.dbo.backupset where database_name = @DatabaseName and cast (backup_finish_date as date) = cast (getdate () as date))
                IF exists (select 1 from sys.databases where [name] = @DatabaseName)
                        begin
                            -- When database is part of Availability Group, the FULL COPY_ONLY Backup can on only Preffered replica to avoid workload on Primary replica
                            IF @IsPrefReplica = 1
                            BEGIN

                                    -- ---------------------------------------------------------------------------------------
                                    --  creating directories if not available with server name and DB name
                                    -- ---------------------------------------------------------------------------------------
                                    BEGIN
                                            exec sp_configure 'show advanced options', 1;
                                            reconfigure;

                                            exec sp_configure 'xp_cmdshell', 1;
                                            reconfigure;

                                                BEGIN
                                                    Select @xpcommand = ('if not exist "' + @BackupPath + '" mkdir ' + ('"' + @BackupPath + '"') );
                                                    Exec xp_cmdshell @xpcommand;
                                                END

                                            exec sp_configure 'show advanced options', 1;
                                            reconfigure;

                                            exec sp_configure 'xp_cmdshell', 0;
                                            reconfigure;

                                            exec sp_configure 'show advanced options', 0;
                                            reconfigure;
                                        END
                        -- Actual Backup command Begins---------------------------------------------------------------------------------------------------------------
                                set @BackupType = 'Full_Copy_';
                                set @BackupFilePath = (@BackupPath + @DatabaseName + '_' + @ServerName + '_' +@BackupType + @VersionNumber + @BackupDateTime + @FileExtension);

                                BACKUP Database @DatabaseName TO DISK = @BackupFilePath with compression, copy_only;
                                Print 'Backup Created as '+ @BackupFilePath
                            END
                            ELSE Print 'Its not preffered replica for the backup '
                        end
                    Else 
                    --      Print 'Fullbackup has been done already for today! ' +  @BackupFilePath
                    Print 'Database "'+ @DatabaseName +'" doesnt exists' 
                End

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        IF @BackupType like 'Dif%'

                BEGIN

                IF exists (select 1 from sys.databases where [name] = @DatabaseName)
                        begin
                            -- When database is part of Availability Group, the FULL Backup must run on only primary replica so that it makes DIFFERENTIAL Backups valid
                            IF @IsPrefReplica = 1
                            BEGIN

                                    -- ---------------------------------------------------------------------------------------
                                    --  creating directories if not available with server name and DB name
                                    -- ---------------------------------------------------------------------------------------
                                    BEGIN
                                            exec sp_configure 'show advanced options', 1;
                                            reconfigure;

                                            exec sp_configure 'xp_cmdshell', 1;
                                            reconfigure;

                                                BEGIN
                                                    Select @xpcommand = ('if not exist "' + @BackupPath + '" mkdir ' + ('"' + @BackupPath + '"') );
                                                    Exec xp_cmdshell @xpcommand;
                                                END

                                            exec sp_configure 'show advanced options', 1;
                                            reconfigure;

                                            exec sp_configure 'xp_cmdshell', 0;
                                            reconfigure;

                                            exec sp_configure 'show advanced options', 0;
                                            reconfigure;
                                        END

                        -- Actual Backup command Begins---------------------------------------------------------------------------------------------------------------
                                set @BackupType = 'Dif_';
                                set @BackupFilePath = (@BackupPath + @DatabaseName + '_' + @ServerName + '_' +@BackupType + @VersionNumber + @BackupDateTime + @FileExtension);

                                BACKUP Database @DatabaseName TO DISK = @BackupFilePath with DIFFERENTIAL, compression;
                                Print 'Backup Created as '+ @BackupFilePath
                            END
                            ELSE Print 'Its not preffered replica for the backup '
                        end
                    Else 
                --      Print 'Fullbackup has been done already for today! ' +  @BackupFilePath
                    Print 'Database "'+ @DatabaseName +'" doesnt exists' 
                End

    End

END

フルバックアップを毎日、差分バックアップを1時間ごと、国境を越えたログバックアップを15分ごとに行いたい。私の2番目の懸念、これは良い習慣ですか?

決定は、ビジネスの要求から行われる必要があります。
リカバリポイントが問題になる場合は、LOGバックアップをより頻繁に実行して、最も近いポイントインタイムリカバリを可能にすることができます。

リカバリ時間が毎日FULLバックアップおよび日中の差分バックアップは、より迅速な回復に役立ちます。

注:復旧モデルがFULLに設定されている場合、復旧オブジェクトTime/Pointに関係なくLOGバックアップを定期的に実行する必要がある

データベースのリカバリモードを識別できます。

select name, recovery_model_desc from sys.databases 
1
Shekar Kola