SQL Serverエージェントとメンテナンスプラン(SQL Serverエージェントにつながる)を使用したバックアップのスケジュールについて調査しました。
私の最初の懸念は、バックアップをスケジュールする最善の方法は何ですか?
毎日完全バックアップ、毎時間差分バックアップ、15分ごとにトランザクションログバックアップを実行したい。
私の2番目の懸念は、これは良い習慣ですか?
SQL Serverエージェントを使用しているときに問題が発生しました。完全バックアップと差分バックアップが上書きされます。フルバックアップを上書きしても問題ありませんが、復元する必要がある場合、差分バックアップの目的ではない差分バックアップは1つしかありません。
以前のバックアップでこれを上書きさせないようにするにはどうすればよいですか?
最後の懸念と質問は、バックアップのスケジュールを実装する方法に関するものです。メンテナンスプランを使用し、3つの異なるバックアップをスケジュールする場合があります。 1つは完全版、もう1つはディファレンシャル版、1つはトランスナショナル版です。
これは、ユーザーが毎日使用するデータベースのベストプラクティスですか? (1日あたり少なくとも2000トランザクション)
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はインデックスの断片化をチェックします。
ただし、まず第一に、必ずバックアップを取るようにしてください。バックアップがまったくないよりも、完全にスケジュールされていないバックアップの方がはるかに重要です。
次の点を考慮することは、バックアップスケジュールを適切に計画するのに役立ちます。
保守計画以外の次の方法でバックアップをスケジュールできます。
stored procedure
)-SQLエージェント個人的には柔軟なのでカスタムスクリプトを使用したいと思います。
3種類のバックアップに関する基本的な注意事項をいくつか示します(すでにご存じかもしれませんが)。
完全バックアップ
すべてのデータファイルを含むデータベースの完全なコピーを含む(ファイルグループがインプレースの場合)
compression enabled
を使用しても、データベース全体のサイズの15〜20%を下回ることはできないため、完全バックアップ用のストレージを検討してください。
LOG
に比べて簡単で高速です差分バックアップ
最後のfull backup
以降に発生した変更のみを含む
最近のDifferential backup
には、最後の完全バックアップ後の以前のすべてのDifferential backup
データが含まれます。つまり.
0-満杯
1- DIF1
2- DIF2
3- DIF3-このファイルには、DIF1
およびDIF2
でバックアップされたデータが含まれます。LOG
バックアップとは異なります
FULL
バックアップを使用可能にしないと、リカバリは不可能です
COPY ONLY
オプションを指定して実行された完全バックアップは、Differential backup'. as usual, FULL BACKUP is start-point for the
Differentialバックアップ 'および' LOGバックアップ 'の開始点にはできません
LOGバックアップ
最後のfull backup
以降に発生した変更のみを含む
DATABASE RECOVERY
がFULL
に設定されている場合のみ考慮し、それ以外の場合は不要(不可能)
差分バックアップとは異なり、すべてのLOG BACKUP
ファイルを順次使用できるようにする必要があります。そうしないと復元できません。つまり、0-フル
1- LOG1
2- LOG2
3- LOG3
ただし、LOGバックアップはポイントインタイムリカバリを意味していましたが、LOG 2
が何らかの理由で利用できない場合、LOG3
バックアップが発生するまでは復旧できません。 4.ログファイルからすべてのトランザクションを再入力する必要があるため、ファイルコピーのように「FULL」および「Differential」の場合、回復時間が長くなります。
以下は、最初に使用できるカスタムスクリプトの例、または Ola Hallengrenバックアップスクリプト を使用できます。これは多くのDBAから信頼され、無料で使用できます。
バックアップスクリプトにより、目的のデータベースにストアドプロシージャが作成されます。作成後、次の構成を行うことができます。
バックアップスクリプト
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