Sql-Server

SQL Server - 自動完整備份使用 EntityFramework-Migrations 自動創建的新數據庫

  • April 2, 2021

我有一個具有多租戶架構的 ASP.NET MVC 應用程序(使用 SQL-Server)。我正在使用 EntityFramework DB-Migrations,它會自動為每個客戶生成一個數據庫。

在 SQL-Server 中,我設置了 3 個維護計劃:完整備份、差異備份和事務備份。完全備份每天只發生一次。

現在,如果自動生成新的客戶數據庫,則下一個事務/差異備份將失敗,因為沒有任何可用的完整備份。

我發現以下執行緒存在類似問題:full-backup-on-database-creation

但在這種情況下,會為所有數據庫創建完整備份 - 這可能會導致執行時間更長。我只想為新數據庫做一個完整的備份(它是空的,應該在幾秒鐘內完成)。

我已經通過從維護計劃中提取程式碼來嘗試這個:

ON ALL SERVER 
FOR CREATE_DATABASE
AS 

SET NOCOUNT ON;
   DECLARE @EventData XML = EVENTDATA();
   DECLARE @db sysname = @EventData.value(N'(/EVENT_INSTANCE/DatabaseName)[1]', N'sysname');
   DECLARE @SubDir nvarchar(1024) =  N'PATH TO BACKUP-LOCATION' + @db;
   DECLARE @BackupName nvarchar(1024) = @db + N'_backup_initial';
   DECLARE @BakFile nvarchar(1024) = @SubDir + N'\' + @BackupName + N'.bak';
   DECLARE @ErrMessage nvarchar(1024) = N'Verify failed. Backup information for database ' + @db + ' not found';
   declare @backupSetId as int

   EXECUTE master.dbo.xp_create_subdir @SubDir
   
   exec('BACKUP DATABASE ' + @db + ' TO  DISK = ''' + @BakFile + ''' WITH NOFORMAT, NOINIT,  NAME = ''' + @BackupName + ''', SKIP, REWIND, NOUNLOAD, COMPRESSION, ENCRYPTION(ALGORITHM = AES_256, SERVER CERTIFICATE = [BackupCert]),  STATS = 10, CHECKSUM, CONTINUE_AFTER_ERROR')
       
   select @backupSetId = position from msdb..backupset where database_name=@db and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=@db )
   if @backupSetId is null begin raiserror(@ErrMessage, 16, 1) end
   --RESTORE VERIFYONLY FROM  DISK = @BakFile WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND
   
GO

手動執行備份腳本正在工作,但在觸發器中失敗並顯示錯誤消息:

無法在事務中執行備份或恢復操作

有誰知道如何讓這個工作?

有誰知道如何讓這個工作?

不要直接從觸發器執行它。而是編寫一個代理作業來備份任何沒有完整備份的完整恢復數據庫。此狀態有時稱為“偽簡單恢復”,因為即使數據庫恢復模型已更改為 FULL,它的行為就像 SIMPLE 恢復一樣。

然後每 5 分鐘執行一次,使用觸發器中的sp_start_job啟動該作業,或者將其集成到您的計劃維護中,以便它在您的日誌備份之前執行。

EG 執行游標

select d.name
from sys.databases d
join sys.database_recovery_status ds
 on d.database_id = ds.database_id
where recovery_model_desc = 'FULL'
and last_log_backup_lsn is null

並進行完整備份。

引用自:https://dba.stackexchange.com/questions/289158