SqlServer批量備份多個數據庫且刪除3天前的備份


/*******************************************
 * 批量備份數據庫且刪除3天前的備份
 *******************************************/
DECLARE @backupfile VARCHAR(1024)  
DECLARE @backdesc VARCHAR(1024)  
DECLARE @filename VARCHAR(1024)  
DECLARE @path VARCHAR(1024)  
DECLARE @dbname VARCHAR(1024)  
DECLARE @extension_name VARCHAR(16)  
  
--備份參數  
DECLARE tmp_Cur CURSOR  
FOR  
    SELECT  NAME  
    FROM    [sys].[databases]  
    WHERE   NAME NOT IN ( 'master', 'model','msdb','tempdb' )  
  
SET @path = N'D:\Backup\Autoback\';  
SET @extension_name = N'bak';  
  
--生成文件名  
SET @filename = CONVERT(VARCHAR(1024), GETDATE(), 120)  
SET @filename = REPLACE(@filename, ':', '')  
SET @filename = REPLACE(@filename, '-', '')  
SET @filename = REPLACE(@filename, ' ', '')  
SET @filename = @filename + '_' + CONVERT (VARCHAR(3), DATEPART(ms, GETDATE()))  
    + N'.' + @extension_name  
  
OPEN tmp_Cur;  
FETCH NEXT FROM tmp_Cur INTO @dbname;  
WHILE @@FETCH_STATUS = 0   
    BEGIN  
        -- 得到完整目標文件,數據庫將備份到這個文件中  
        SET @backupfile = @path + @dbname + @filename  
        --SELECT  @backupfile  
        SET @backdesc =@dbname + N'-完整 數據庫 備份'  
  
        -- 開始備份, COMPRESSION 參數表示壓縮,可節省磁盤空間  
        BACKUP DATABASE @dbname TO DISK = @backupfile WITH NOFORMAT, NOINIT,  NAME = @backdesc, SKIP, NOREWIND, NOUNLOAD,  STATS = 10, COMPRESSION  
  
        FETCH NEXT FROM tmp_Cur INTO @dbname  
    END  
CLOSE tmp_Cur;  
DEALLOCATE tmp_Cur;  
  
-- 刪除3天前的備份文件  
DECLARE @olddate DATETIME  
SELECT  @olddate = DATEADD(d, -3, GETDATE())  
-- 執行刪除 (SQL 2008 具備)  
EXECUTE master.dbo.xp_delete_file 0, @path, @extension_name, @olddate, 1  
復制代碼

 

復制代碼
 
 
-- 作業定時壓縮腳本支持多庫 DECLARE @DatabaseName NVARCHAR( 50 ) DECLARE @ExecuteSql NVARCHAR( MAX ) SET @ExecuteSql = '' DECLARE name_cursor CURSOR FOR SELECT name FROM master..sysdatabases WHERE name NOT IN ( ' master ', ' model ', ' msdb ', ' tempdb ' , ' northwind ', ' pubs ', ' AgentSys ', ' ydttimedtask ', ' YiDianTongV2 ' ) OPEN name_cursor; FETCH NEXT FROM name_cursor INTO @DatabaseName ; WHILE @@FETCH_STATUS = 0 BEGIN SET @ExecuteSql = '' SET @ExecuteSql += ' USE [ ' + @DatabaseName + ' ]; DECLARE @Error INT SET @Error=(SELECT TOP 1 size/128.0 - CAST(FILEPROPERTY([NAME], '' SpaceUsed '' ) AS int)/128.0 AS AvailableSpaceInMB FROM sys.database_files ORDER BY [NAME] DESC) --PRINT @Error IF(@Error>1) BEGIN ALTER DATABASE [ ' + @DatabaseName + ' ]  --數據庫名字 SET RECOVERY SIMPLE;  --設置簡單恢復模式 DBCC SHRINKFILE ([YiDianTongV2], 1);  --(M)不能小於1M, DBCC SHRINKFILE ([YiDianTongV2_log], 1);  --(M)不能小於1M ALTER DATABASE [ ' + @DatabaseName + ' ] SET RECOVERY FULL;  --恢復為原來完整模式 END ' PRINT @ExecuteSql; -- 打印 EXEC( @ExecuteSql) -- 執行 FETCH NEXT FROM name_cursor INTO @DatabaseName ; END ; CLOSE name_cursor; DEALLOCATE name_cursor;

backup1:開始數據庫備份

數據庫備份分為數據文件備份和日志文件備份,數據文件的備份分為:完整備份和差異備份。在SQL Server 2012中,能夠將數據分布式備份到不同的存儲設備上,一般情況,只將數據備份到一個備份文件(.bak)中,只有在備份超大的數據庫時,才需要分布式備份,對於備份集(backup set),備份介質(backup Media),備份族(backup family),鏡像備份,等等看似復雜的術語,不用深入了解,簡單了解一下基本知識:

  • backup set:是數據或日志的一次備份;
  • backup media:是備份存儲的文件,分為兩部分:media header和content,content是由一個或多個backup sets構成的;
  • 鏡像備份:一次備份操作創建一個相同的備份,最多三個鏡像備份;
  • backup  family:多個備份設備和鏡像備份構成backup family;

數據庫備份的策略一般是:一周一次完整備份,一天一次差異備份,一小時一次事務日志備份,根據數據容災的要求,適當增減備份的時間間隔。

為了便於管理數據備份文件,推薦的做法是:

  • 數據/日志的每次備份都使用一個單獨的備份文件,數據備份的擴展名是 .bak,日志備份的擴展名是.trn;
  • 合理命名每個備份文件,建議使用:database_name+date+time+(.bak/.trn),該命名方式,很容易識別備份的數據庫和開始備份的時間;
  • 創建schedule,定時清理備份文件,避免備份文件耗盡磁盤空間;

一,創建數據庫的完整備份和差異備份

使用backup database命令創建數據庫的數據文件的備份,backup database 命令語法(簡化):

復制代碼
BACKUP DATABASE database_name 
TO DISK  =  'physical_device_name'
[ WITH { DIFFERENTIAL
|  COPY_ONLY 
| { COMPRESSION | NO_COMPRESSION } 
| { NOINIT | INIT } 
| { NOSKIP | SKIP } 
| { NOFORMAT | FORMAT } 
| STATS [ = percentage ] }]
復制代碼

1,完整備份和差異備份

差異備份由DIFFERENTIAL 關鍵字指定,只備份從上一次完整備份之后發生更新的數據,而不是備份整個數據庫,通常情況下,差異備份比完整備份占用的空間更少。差異備份的參考基准是上一次完整備份,而,事務日志,只備份是從上一次差異備份之后產生的事務日志。因此,備份是有順序的,如果存在以下備份序列:

  1. FullBackup1.bak
  2. DifferentialBackup2.bak
  3. LogBackup3.trn
  4. DifferentialBackup4.bak
  5. LogBackup5.trn
  6. 出現錯誤

還原的策略是:備份尾日志,使數據庫處於Restoring狀態,依次還原FullBackup1.bak,DifferentialBackup4.bak,LogBackup5.trn,尾日志,就能將數據庫還原到一個合適的有效時間點。

在執行完整備份和差異備份時,SQL Server會備份足夠的事務日志,用於將數據庫還原到一致性的狀態。對於master數據庫,只能執行完整備份。

  • During a full or differential database backup, SQL Server backs up enough of the transaction log to produce a consistent database when the backup is restored.
  • Only a full database backup can be performed on the master database.

2,只復制(COPY_ONLY )備份

備份是有順序的,使用COPY_ONLY選項不會影響備份的正常順序,僅僅創建一個數據庫的副本。

差異備份的基准是上一次完整備份,即差異是指從上一次full backup之后,對數據文件執行的更新操作。如果執行一次Copy-Only的完整數據庫備份,不會影響差異備份的base(基准),該base是上一次full backup,而非本次 Copy-only full backup。

3,壓縮數據{ COMPRESSION | NO_COMPRESSION }

在備份時,將數據壓縮,由於壓縮的備份較小,能夠減少Disk Sapce和Disk IO消耗,提高數據備份的速度,但是,備份文件的壓縮和解壓縮十分消耗CPU資源。

4,建議:每一次數據備份,都存儲在單個備份文件上

由於硬盤空間有限,不可能保留過多的備份文件,將數據的每一次備份都存儲在單個文件上,便於對備份文件進行管理(刪除或歸檔)。

每次備份都存儲在新的備份上,搭配選項 Init、Skip、Format,將數據備份存儲在新的備份文件上,這三個選項的含義是:

  • Format 選項:將備份文件格式化,默認選項是 NoFormat;
  • Init 選項:初始化備份文件,Init選項不會初始化Media Header,只將backup set初始化,默認選項是NoInit,將備份存儲到備份文件的末尾;
  • SKIP 選項:不做任何檢查,不會檢查Media Header是否有效,也不會檢查backup set的有效期,默認選項是NoSkip;

5,備份進度(stats)

使用stats選項,每當備份進行到一定的百分比時,SQL Server顯式進度消息,默認值是10,即,每完成10%,SQL Server顯式完成的進度消息,例如,設置stats=10,當備份進程完成30%時,SQL Server會打印消息:30 percent processed.

The STATS option reports the percentage complete as of the threshold for reporting the next interval. This is at approximately the specified percentage; for example, with STATS=10, if the amount completed is 40 percent, the option might display 43 percent. For large backup sets, this is not a problem, because the percentage complete moves very slowly between completed I/O calls.

二,數據備份操作

建議:每一次數據備份,都存儲在單個備份文件上

1,數據庫完整備份,沒有指定Differential選項

復制代碼
backup database [TestSite]
to disk = 'D:\TestDBBackupFolder\Sitedb_bak1.bak' --specify new backup file
with
compression,
format,
init,
skip,
stats=5
復制代碼

2,數據庫差異備份,指定Differential選項

復制代碼
backup database [TestSite]
to disk = 'D:\TestDBBackupFolder\Sitedb_bak2.bak' --specify new backup file
with differential,
compression, 
format, 
init, 
skip, 
stats=5
復制代碼

三,事務日志備份

要執行事務日志的備份,數據庫的恢復模式(Recovery Mode)必須是FULL,並且數據庫必須執行過一次數據庫的完整備份操作,否則,事務日志將處於自動截斷(Auto-Truncate)狀態,無法進行事務日志備份。

使用backup log命令對事務日志進行備份,跟backup database命令的差異是,不能使用differential選項,多了NoRecovery 和 NO_Truncate選項;

復制代碼
BACKUP LOG database_name 
TO DISK  =  'physical_device_name'
[ WITH { 
  COPY_ONLY
| { COMPRESSION | NO_COMPRESSION } 
| { NOINIT | INIT } 
| { NOSKIP | SKIP } 
| { NOFORMAT | FORMAT } 
| STATS [ = percentage ] 
| { NORECOVERY | STANDBY = undo_file_name }
| NO_TRUNCATE }]
復制代碼

1,尾日志備份

NORECOVERY 選項,指定備份事務日志的尾部,並使數據庫處於RESTORING狀態

Backs up the tail of the log and leaves the database in the RESTORING state. NORECOVERY is useful when failing over to a secondary database or when saving the tail of the log before a RESTORE operation. To perform a best-effort log backup that skips log truncation and then take the database into the RESTORING state atomically, use the NO_TRUNCATE and NORECOVERY options together.

2,日志截斷

正常情況下,數據庫處於Online狀態,在進行事務日志備份時,如果不指定 NO_TRUNCATE 選項,那么數據庫將已備份的事務日志文件截斷,避免事務日志過大,耗盡disk空間;如果指定 NO_TRUNCATE 選項,表示日志備份不會將事務日志文件截斷,該選項一般在數據庫處於異常狀態時使用。

Specifies that the log not be truncated and causes the Database Engine to attempt the backup regardless of the state of the database. Consequently, a backup taken with NO_TRUNCATE might have incomplete metadata. This option allows backing up the log in situations where the database is damaged.
The NO_TRUNCATE option of BACKUP LOG is equivalent to specifying both COPY_ONLY and CONTINUE_AFTER_ERROR.
Without the NO_TRUNCATE option, the database must be in the ONLINE state. If the database is in the SUSPENDED state, you might be able to create a backup by specifying NO_TRUNCATE. But if the database is in the OFFLINE or EMERGENCY state, BACKUP is not allowed even with NO_TRUNCATE. 

3,自動截斷模式

如果數據庫符合以下兩種條件之一,那么Database就處於自動截斷模式:

  • 數據庫的恢復模式是simple;
  • 數據庫的恢復模式是full 或 bulk_Logged,並且沒有做過數據庫完整備份;

自動截斷模式是指數據庫引擎把處於可還原狀態(recoverable)狀態的事務日志自動截斷,使日志文件能夠重復使用,避免日志文件無限增長。如果事務日志不是自動截斷模式,那么事務日志會保存到日志文件中,導致日志文件持續增長。只有做日志備份時,日志文件才會被截斷;如果沒有定期的日志備份,那么日志文件會持續地增長,直到耗盡磁盤的所有空間,因此,必須制定一個日志備份計划,把事務日志截斷,才能使數據庫的事務日志文件的大小保持在一個可以管理的水平上。

select db_name(database_id) as DBName,
    case when last_log_backup_lsn is null then 'Auto' else 'Manul' end as TruncateMode
from sys.database_recovery_status

四,事務日志備份

1,正常情況下的事務日志備份

復制代碼
backup log [TestSite]
to disk = 'D:\TestDBBackupFolder\Sitedb_bak3.trn'
with
compression,
format,
init,
skip,
stats=5
復制代碼

2,備份尾日志,進而還原數據庫

復制代碼
backup log [TestSite]
to disk = 'D:\TestDBBackupFolder\Sitedb_bak4.trn'
with
compression,
format,
init,
skip,
stats=5norecovery

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com