資料庫備份分為數據文件備份和日誌文件備份,數據文件的備份分為:完整備份和差異備份。在SQL Server 2012中,能夠將數據分散式備份到不同的存儲設備上,一般情況,只將數據備份到一個備份文件(.bak)中,只有在備份超大的資料庫時,才需要分散式備份。 資料庫備份的策略一般是:一周一次完整備份,一 ...
資料庫備份分為數據文件備份和日誌文件備份,數據文件的備份分為:完整備份和差異備份。在SQL Server 2012中,能夠將數據分散式備份到不同的存儲設備上,一般情況,只將數據備份到一個備份文件(.bak)中,只有在備份超大的資料庫時,才需要分散式備份。
資料庫備份的策略一般是:一周一次完整備份,一天一次差異備份,一小時一次事務日誌備份,根據數據容災的要求,適當增減備份的時間間隔。
為了便於管理數據備份文件,推薦的做法是:
- 數據/日誌的每次備份都使用一個單獨的備份文件,數據備份的擴展名是 .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 關鍵字指定,只備份從上一次完整備份之後發生更新的數據,而不是備份整個資料庫,通常情況下,差異備份比完整備份占用的空間更少。差異備份的參考基準是上一次完整備份,而,事務日誌,只備份是從上一次差異備份之後產生的事務日誌。因此,備份是有順序的,如果存在以下備份序列:
- FullBackup1.bak
- DifferentialBackup2.bak
- LogBackup3.trn
- DifferentialBackup4.bak
- LogBackup5.trn
- 出現錯誤
還原的策略是:備份尾日誌,使資料庫處於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.
四,事務日誌備份
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=5, norecovery
參考doc: