MSSQL-最佳實踐-SQL Server三種常見備份

姬子玉發表於2017-12-08

SQL 日誌 LOG 阿里技術協會 資料庫 Sqlserver Server Transaction 儲存 日誌備份 備份還原災難恢復 完全備份 差異備份 LSN

# 摘要 本期月報是SQL Server資料庫備份技術系列文章的開篇,介紹三種常見的SQL Server備份方法的工作方式、使用T-SQL語句和使用SSMS IDE建立備份集三個層面,介紹SQL Server的三種常見備份的工作原理和使用方法。三種常見的備份包括: 資料庫完全備份(Full Backup) 資料庫日誌備份(Transaction Log Backup) 資料庫差異備份

摘要

本期月報是SQL Server資料庫備份技術系列文章的開篇,介紹三種常見的SQL Server備份方法的工作方式、使用T-SQL語句和使用SSMS IDE建立備份集三個層面,介紹SQL Server的三種常見備份的工作原理和使用方法。三種常見的備份包括:
資料庫完全備份(Full Backup)
資料庫日誌備份(Transaction Log Backup)
資料庫差異備份(Differential Backup)

備份的重要性

在開始分享之前,我們首先來看看資料庫備份的重要性。進入DT時代,資料的價值越發體現,資料已經成為每個公司賴以生存的生命線,資料的重要性不言而喻,而公司絕大多數核心資料都存放在資料庫裡。資料庫本身的災難恢復(DR)能力是資料安全的最後一道防線,也是資料庫從業者對資料安全底線的堅守。資料庫中資料潛在的安全風險包括:硬體故障、惡意入侵、使用者誤操作、資料庫損壞和自然災害導致的資料損失等。在關係型資料庫SQL Server中,資料庫備份是災難恢復的能力有力保證。

Full Backup

Full Backup(完全備份)是SQL Server所有備份型別中,最為簡單、最基礎的資料庫備份方法,它提供了某個資料庫在備份時間點的完整拷貝。但是,它僅支援還原到資料庫備份成功結束的時間點,即不支援任意時間點還原操作。

Full Backup工作方式

以上是Full Backup是什麼的解釋,那麼接下來,我們通過一張圖和案例來解釋Full Backup的工作原理。
01.png
這是一張某資料庫的資料產生以及資料庫備份在時間軸上的分佈圖,從左往右,我們可以分析如下:
7 P.m.:產生了資料#1
10 P.m.:資料庫完全備份,備份檔案中包含了#1
2 a.m.:產生了資料#2,目前資料包含#1,#2
6 a.m.:產生了資料#3,目前資料包含#1,#2,#3
10 a.m.:資料庫完全備份,備份檔案中包含#1,#2,#3
1 p.m.:產生了資料#4,目前資料包含#1,#2,#3,#4
5 p.m.:產生了資料#5,目前資料包含#1,#2,#3,#4,#5
8 p.m.:產生了資料#6,目前資料包含#1,#2,#3,#4,#5,#6
10 p.m.:資料庫完全備份,備份檔案中包含了資料#1,#2,#3,#4,#5,#6
從這張圖和相應的解釋分析來看,資料庫完全備份工作原理應該是非常簡單的,它就是資料庫在備份時間點對所有資料的一個完整拷貝。當然在現實的生產環境中,事務的操作遠比這個複雜,因此,在這個圖裡面有兩個非常重要的點沒有展示出來,那就是:
備份操作可能會導致I/O變慢:由於資料庫備份是一個I/O密集型操作,所以在資料庫備份過程中,可能會導致資料庫的I/O操作變慢。
全備份過程中,資料庫的事務日誌不能夠被截斷:對於具有大事務頻繁操作的資料庫,可能會導致事務日誌空間一直不停頻繁增長,直到佔滿所有的磁碟剩餘空間,這個場景在阿里雲RDS SQL產品中有很多的客戶都遇到過。其中之一解決方法就需要依賴於我們後面要談到的事務日誌備份技術。

T-SQL建立Full Backup

使用T-SQL語句來完成資料庫的完全備份,使用BACKUP DATABASE語句即可,如下,對AdventureWorks2008R2資料庫進行一個完全備份:

USE master
GO

BACKUP DATABASE [AdventureWorks2008R2] 
TO DISK = 'C:\Temp\AdventureWorks2008R2_20171112_FULL.bak' WITH COMPRESSION, INIT, STATS = 5;
GO複製程式碼

SSMS IDE建立Full Backup

除了使用T-SQL語句建立資料庫的完全備份外,我們還可以使用SSMS IDE介面操作來完成,方法:
右鍵點選想要備份的資料庫 => Tasks => Backup => 選擇FULL Backup Type => 選擇Disk 做為備份檔案儲存 => 點選Add 新增備份檔案 => 選擇你需要儲存備份檔案的目錄 => 輸入備份檔名,如下圖兩張圖展示。
02.png

Back up Database設定介面
03.png

Transaction Log Backup

SQL Server資料庫完全備份是資料庫的完整拷貝,所以備份檔案空間佔用相對較大,加之可能會在備份過程中導致事務日誌一直不斷增長。為了解決這個問題,事務日誌備份可以很好的解決這個問題,因為:事務日誌備份記錄了資料庫從上一次日誌備份到當前時間內的所有事務提交的資料變更,它可以配合資料庫完全備份和差異備份(可選)來實現時間點的還原。當日志備份操作成功以後,事務日誌檔案會被截斷,事務日誌空間將會被重複迴圈利用,以此來解決完全備份過程中事務日誌檔案一致不停增長的問題,因此我們最好能夠週期性對資料庫進行事務日誌備份,以此來控制事務日誌檔案的大小。但是這裡需要有一個前提是資料庫必須是FULL恢復模式,SIMPLE恢復模式的資料庫不支援事務日誌的備份,當然就無法實現時間點的還原。請使用下面的語句將資料庫修改為FULL恢復模式,比如針對AdventureWorks2008R2資料庫:

USE [master]
GO
ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY FULL WITH NO_WAIT
GO複製程式碼

Transaction Log Backup工作方式

事務日誌備份與資料完全備份工作方式截然不同,它不是資料庫的一個完整拷貝,而是至上一次日誌備份到當前時間內所有提交的事務資料變更。用一張圖來解釋事務日誌備份的工作方式:
04.png

00:01:事務#1,#2,#3開始,未提交
00:02:事務#1,#2,#3成功提交;#4,#5,#6事務開始,未提交;這時備份事務日誌;事務日誌備份檔案中僅包含已提交的#1,#2,#3的事務(圖中的LSN 1-4,不包含#4)
00:04:由於在00:02做了事務日誌備份,所以#1,#2,#3所佔用的空間被回收;#4,#5,#6事務提交完成
00:05:事務#7已經提交成功;#8,#9,#10開始,但未提交;事務日誌備份檔案中包含#4,#5,#6,#7的事務(圖中的LSN4-8,不包含#8)。
從這張圖我們看到,每個事務日誌備份檔案中包含的是已經完成的事務變更,兩次事務日誌備份中存放的是完全不同的變更資料。而每一次事務日誌備份成功以後,事務日誌空間可以被成功回收,重複利用,達到了解決資料庫完全備份過程中事務日誌一致不斷增長的問題。

T-SQL建立事務日誌備份

使用T-SQL語句來建立事務日誌的備份方法如下:

USE Master
GO

BACKUP LOG [AdventureWorks2008R2]
TO DISK = N'C:\temp\AdventureWorks2008R2_log_201711122201.trn' with compression,stats=1;
GO
BACKUP LOG [AdventureWorks2008R2]
TO DISK = N'C:\temp\AdventureWorks2008R2_log_201711122202.trn' with compression,stats=1;
GO
BACKUP LOG [AdventureWorks2008R2]
TO DISK = N'C:\temp\AdventureWorks2008R2_log_201711122203.trn' with compression,stats=1;
GO複製程式碼

SSMS IDE建立事務日誌備份

使用SSMS IDE建立事務日誌備份的方法:
右鍵點選想要建立事務日誌備份的資料庫 => Tasks => Backup => 選擇Transaction Log Backup Type => 選擇Disk 做為備份檔案儲存 => 點選Add 新增備份檔案 => 選擇你需要儲存備份檔案的目錄 => 輸入備份檔名,如下圖展示:
05.png

事務日誌備份鏈

由於資料庫完全備份是時間點資料的完整拷貝,每個資料庫完整備份相互獨立,而多個事務日誌備份是通過事務日誌鏈條連線在一起,事務日誌鏈起點於完全備份,SQL Server中的每一個事務日誌備份檔案都擁有自己的FirstLSN和LastLSN,FirstLSN用於指向前一個事務日誌備份檔案的LastLSN;而LastLSN指向下一個日誌的FirstLSN,以此來建立這種連結關係。這種連結關係決定了事務日誌備份檔案還原的先後順序。當然,如果其中任何一個事務日誌備份檔案丟失或者破壞,都會導致無法恢復整個事務日誌鏈,僅可能恢復到你擁有的事務日誌鏈條的最後一個。事務日誌備份鏈條的關係如下圖所示:
06.png

我們使用前面“T-SQL建立事務日誌備份”建立的事務日誌鏈,使用RESTORE HEADERONLY方法來檢視事務日誌鏈的關係:

USE Master
GO
RESTORE HEADERONLY FROM DISK = N'C:\temp\AdventureWorks2008R2_log_201711122201.trn';
RESTORE HEADERONLY FROM DISK = N'C:\temp\AdventureWorks2008R2_log_201711122202.trn';
RESTORE HEADERONLY FROM DISK = N'C:\temp\AdventureWorks2008R2_log_201711122203.trn';複製程式碼

查詢結果如下:
07.png

從這個結果展示來看,事務日誌備份檔案AdventureWorks2008R2_log_201711122201的LastLSN指向了的AdventureWorks2008R2_log_201711122202的FirstLSN,而AdventureWorks2008R2_log_201711122202的LastLSN又指向了AdventureWorks2008R2_log_201711122203的FirstLSN,以此來建立了事務日誌備份鏈條關係。假如AdventureWorks2008R2_log_201711122202的事務日誌備份檔案丟失或者損壞的話,資料庫只能還原到AdventureWorks2008R2_log_201711122201所包含的所有事務行為。
這裡有一個問題是:為了防止資料庫事務日誌一直不斷的增長,而我們又不想每次都對資料庫做完全備份,那麼我們就必須對資料庫事務日誌做週期性的日誌備份,比如:5分鐘甚至更短,以此來降低資料丟失的風險,以此推算每天會產生24 * 12 = 288個事務日誌備份,這樣勢必會導致事務日誌恢復鏈條過長,拉長恢復時間,增大了資料庫還原時間(RTO)。這個問題如何解決就是我們下面章節要分享到的差異備份技術。

Differential Backup

事務日誌備份會導致資料庫還原鏈條過長的問題,而差異備份就是來解決事務日誌備份的這個問題的。差異備份是備份至上一次資料庫全量備份以來的所有變更的資料頁,所以差異備份相對於資料庫完全備份而言往往資料空間佔用會小很多。因此,備份的效率更高,還原的速度更快,可以大大提升我們災難恢復的能力。

Differential Backup工作方式

我們還是從一張圖來了解資料庫差異備份的工作方式:
08.png

7 a.m.:資料包含#1
10 a.m.:資料庫完全備份,備份檔案中包含#1
1 p.m.:資料包含#1,#2,#3,#4
2 p.m.:資料庫差異備份,備份檔案中包含#2,#3,#4(上一次全備到目前的變更資料)
4 p.m.:資料包含#1,#2,...,#6
6 p.m.:資料庫差異備份,備份檔案中包含#2,#3,#4,#5,#6
8 p.m.:資料包含#1,#2,...,#8
10 p.m.:資料庫完全備份,備份檔案中包含#1,#2,...,#8
11 p.m.:產生新的資料#9,#10;資料包含#1,#2,...,#10
2 a.m.:資料庫差異備份,備份檔案中包含#9,#10
從這個差異備份的工作方式圖,我們可以很清楚的看出差異備份的工作原理:它是備份繼上一次完全備份以來的所有資料變更,所以它大大減少了備份日之鏈條的長度和縮小備份集的大小。

T-SQL建立差異備份

使用T-SQL語句建立差異備份的方法如下:

USE master
GO
BACKUP DATABASE [AdventureWorks2008R2] 
TO DISK = 'C:\Temp\AdventureWorks2008R2_20171112_diff.bak' WITH DIFFERENTIAL
GO複製程式碼

SSMS建立差異備份

使用SSMS IDE建立差異備份的方法:
右鍵點選想要建立事務日誌備份的資料庫 => Tasks => Backup => 選擇Differential Backup Type => 選擇Disk 做為備份檔案儲存 => 點選Add 新增備份檔案 => 選擇你需要儲存備份檔案的目錄 => 輸入備份檔名,如下圖展示:
09.png

最後總結

本期月報分享了SQL Server三種常見的備份技術的工作方式和備份方法。資料庫完全備份是資料庫備份時間的一個完整拷貝;事務日誌備份是上一次日誌備份到當前時間的事務日誌變更,它解決了資料庫完全備份過程中事務日誌一直增長的問題;差異備份上一次完全備份到當前時間的資料變更,它解決了事務日誌備份鏈過長的問題。
將SQL Server這三種備份方式的工作方式,優缺點總結如下表格:
10.png
從這個表格,我們知道每種備份有其各自的優缺點,那麼我們如何來制定我們的備份和還原策略以達到快速災難恢復的能力呢?這個話題,我們將在下一期月報中進行分享。

參考

Full Backup工作方式圖參考
Transaction Log Backup工作方式圖參考
Differential Backup工作方式圖參考

原文連結


相關文章