在SQL Server備份專題分享中,前四期我們分享了:三種常見的資料庫備份、備份政策的制定、如何查找備份鍊以及資料庫的三種恢複模式與備份之間的關系。本次月報我們分享SQL Server如何利用檔案組技術來實作資料庫冷熱資料隔離備份的方案。
假設某公司有一個非常重要的超大的資料庫(超過10TB),面臨如下場景:
該資料庫中存儲了近10年的使用者支付資訊(payment),非常重要
每年的資料歸檔存儲在年表中,曆史年表中的資料隻讀不寫(曆史payment資訊無需再修改),隻有目前年表資料既讀又寫
每次資料庫全備耗時太長,超過20小時;資料庫還原操作耗時更長,超過30小時
如何優化設計這個資料庫以及備份恢複系統,可以使得備份、還原更加高效?
檔案組的詳細介紹不是本次分享的重點,但是作為本文介紹的核心技術,有必要對其優點、建立以及使用方法來簡單介紹SQL Server中的檔案組。
SQL Server支援将表、索引資料存放到非Primary檔案組,這樣當資料庫擁有多個檔案組時就具備了如下好處:
分散I/O壓力到不同的檔案組上,如果不同檔案組的檔案位于不同的磁盤的話,可以分散磁盤壓力。
針對不同的檔案組進行DBCC CHECKFILEGROUP操作,并且同一個資料庫可以多個程序并行處理,減少大資料維護時間。
可以針對檔案組級别進行備份和還原操作,更細粒度控制備份和還原政策。
我們可以在建立資料庫時直接建立檔案組,代碼如下:
注意:
為了保證資料庫檔案組I/O的負載均衡能力,請将所有檔案的初始大小和自動增長參數保持一緻,以保證輪詢排程配置設定算法正常工作。
如果資料庫已經存在,我們也同樣有能力添加檔案組,代碼如下:
最終檔案組資訊,展示如下:

檔案組建立完畢後,我們可以将表和索引放到對應的檔案組。比如:
将聚集索引放到PRIMARY檔案組;表和索引資料放到FG2010檔案組,代碼如下:
檔案組的基本知識點介紹完畢後,根據場景引入中的内容,我們将利用SQL Server檔案組技術來實作冷熱資料隔離備份的方案設計介紹如下。
由于payment資料庫過大,超過10TB,單次全量備份超過20小時,如果按照正常的完全備份,會導緻備份檔案過大、耗時過長、甚至會因為備份操作對I/O能力的消耗影響到正常業務。我們仔細想想會發現,雖然資料庫本身很大,但是,由于隻有目前年表資料會不斷變化(熱資料),曆史年表資料不會修改(冷資料),是以正真有資料變化操作的資料量相對整個庫來看并不大。那麼,我們将資料庫設計為曆史年表資料放到Read only的檔案組上,把目前年表資料放到Read write的檔案組上,備份系統僅僅需要備份Primary和目前年表所在的檔案組即可(當然首次還是需要對資料庫做一次性完整備份的)。這樣既可以大大節約備份對I/O能力的消耗,又實作了冷熱資料的隔離備份操作,還達到了分散了檔案的I/O壓力,最終達到資料庫設計和備份系統優化的目的,可謂一箭多雕。
以上文字分析,畫一個漂亮的設計圖出來,直覺展示如下:
以下對設計圖做詳細說明,以便對設計方案有更加直覺和深入了解。
整個資料庫包含13個檔案,包括:
1個主檔案組(Primary File Group):使用者存放資料庫系統表、視圖等對象資訊,檔案組可讀可寫。
10個使用者自定義隻讀檔案組(User-defined Read Only File Group):用于存放曆史年表的資料及相應索引資料,每一年的資料存放到一個檔案組中。
1個使用者自定義可讀寫檔案組(User-defined Read Write File Group):用于存放目前年表資料和相應索引資料,該表資料必須可讀可寫,是以檔案組必須可讀可寫。
1個資料庫事務日志檔案:用于資料庫事務日志,我們需要定期備份資料庫事務日志。
設計方案完成以後,接下來就是方案的集體實作了,具體實作包括:
建立資料庫
建立年表
檔案組設定
冷熱備份實作
建立資料庫的同時,我們建立了Primary檔案組和2008 ~ 2017的檔案組,這裡需要特别提醒,請務必保證所有檔案組中檔案的初始大小和增長量相同,代碼如下:
考慮到每年我們都要添加新的檔案組到資料庫中,是以2018年的檔案組單獨建立如下:
最終再次确認資料庫檔案組資訊,代碼如下:
結果展示如下圖所示:
資料庫以及相應檔案組建立完畢後,接下來我們建立對應的年表并插入一些測試資料,如下:
這裡需要特别提醒兩點:
限于篇幅,建表代碼中省略了2010 - 2017表建立,請自行補充
每個年表的Payment_ID字段初始值是不一樣的,以免查詢所有payment資訊該字段值存在重複的情況
其次,我們檢查所有年表的檔案組分布情況如下:
查詢結果截取其中部分如下,我們看到所有年表及索引都按照我們的預期分布到對應的檔案組上去了。
最後,為了測試,我們在對應年表中放入一些資料:
年表建立完完畢、測試資料初始化完成後,接下來,我們做檔案組讀寫屬性的設定,代碼如下:
最終我們的檔案組讀寫屬性如下:
截圖如下:
所有檔案組建立成功,并且讀寫屬性配置完畢後,我們需要對資料庫可讀寫檔案組進行全量備份、差異備份和資料庫級别的日志備份,為了友善測試,我們會在兩次備份之間插入一條資料。備份操作的大體思路是:
首先,對整個資料庫進行一次性全量備份
其次,對可讀寫檔案組進行周期性全量備份
接下來,對可讀寫檔案組進行周期性差異備份
最後,對整個資料庫進行周期性事務日志備份
這樣備份的好處是,我們隻需要對可讀寫的檔案組(FGPayment2018)進行完整和差異備份(Primary中包含系統對象,變化很小,實際場景中,Primary檔案組也需要備份),而其他的9個隻讀檔案組無需備份,因為資料不會再變化。如此,我們就實作了冷熱資料隔離備份的方案。
接下來的一個問題是,萬一Payment資料發生災難,導緻資料損失,我們如何從備份集中将資料庫恢複出來呢?我們可以按照如下思路來恢複備份集:
首先,還原整個資料庫的一次性全量備份
其次,還原所有可讀寫檔案組最後一個全量備份
接下來,還原可讀寫檔案組最後一個差異備份
最後,還原整個資料庫的所有事務日志備份
最後檢查資料還原的結果,按照我們插入的測試資料,應該會有四條記錄。
展示執行結果,有四條結果集,符合我們的預期,截圖如下:
本篇月報分享了如何利用SQL Server檔案組技術來實作和優化冷熱資料隔離備份的方案,在大大提升資料庫備份還原效率的同時,還提供了I/O資源的負載均衡,提升和優化了整個資料庫的性能。