天天看點

SQL Server 批量主分區備份(One Job)一.本文所涉及的内容(Contents) 二.背景(Contexts)三.案例分析(Case)四.實作代碼(SQL Codes)五.主分區完整、差異還原(Primary Backup And Restore)六.參考文獻(References)

<a href="#_labelContents">本文所涉及的内容(Contents)</a>

<a href="#_labelContexts">背景(Contexts)</a>

<a href="#_labelCase">案例分析(Case)</a>

<a href="#_labelSQLCodes">實作代碼(SQL Codes)</a>

<a href="#_labelBackupType">主分區完整、差異還原(Primary Backup And Restore)</a>

<a href="#_labelReferences">參考文獻(References)</a>

  在我的資料庫執行個體中,有很多下圖所示的資料庫,這些資料庫的名稱是有規律的,每個資料庫包含的表都是相同的,其中2個表是類似流水記錄的表,表的資料量會比較大,占用的空間有幾十G到上百G不等,這2個表相對于其它的配置表來說是比較不重要的。

  現在有一個需求就是對資料庫進行備份,允許丢失這兩個表的資料,保留重要的配置表資料,你是否遇到過同樣的問題呢?這個時候你會怎麼做呢?你有什麼方案呢?有什麼方法可以快速備份這些資料庫呢?

SQL Server 批量主分區備份(One Job)一.本文所涉及的内容(Contents) 二.背景(Contexts)三.案例分析(Case)四.實作代碼(SQL Codes)五.主分區完整、差異還原(Primary Backup And Restore)六.參考文獻(References)

(Figure1:資料庫清單)

  通過上面的描述,其中很重要的一點就是每個資料庫中有2個大表,而且這些資料是不重要的,那麼我們對這2個大表做表分區,把大資料放到其它檔案組中,隻留重要的配置表在主檔案組(PRIMARY)中,接着就可以對主檔案組進行備份,這樣既滿足了備份重要表資料,而且不會造成備份檔案過大、占用磁盤空間、備份時間過長等問題。

  确定了方向之後我們接着考慮作業的問題,通過作業備份類似Figure1的資料庫,有下面兩種方案可供選擇:

SQL Server 批量主分區備份(One Job)一.本文所涉及的内容(Contents) 二.背景(Contexts)三.案例分析(Case)四.實作代碼(SQL Codes)五.主分區完整、差異還原(Primary Backup And Restore)六.參考文獻(References)

(Figure2:作業清單)

SQL Server 批量主分區備份(One Job)一.本文所涉及的内容(Contents) 二.背景(Contexts)三.案例分析(Case)四.實作代碼(SQL Codes)五.主分區完整、差異還原(Primary Backup And Restore)六.參考文獻(References)

(Figure3:作業清單)

  Figure3就是我們這篇文章需要講述的方案,這裡把所有的資料庫的備份都集中到一個作業中,這個方案有以下缺點:

    1) 整個備份過程是串行的;

    2) 如果沒有異常處理,那麼後面的資料庫就沒有辦法備份了;

    3) 在作業執行的時候對伺服器壓力比較大(沒有分散執行時間);

    4) 做本身的msdb資料庫中記錄的作業日志也沒有那麼清晰,排錯比較困難(隻有整個作業的資訊,msdb.dbo.sysjobhistory的message字段儲存不了太多資訊),需要自己建立表進行記錄;

  盡管有以上的缺點,但是也是有優點的:當新建立了一個類似的資料庫(業務需要),這個時候作業也會備份這個資料,不用人工去建立作業;另外還有一個,就是當資料庫多而小的時候,這個方案特别有用;下面就來講講這個Job實作的具體步驟。

實作步驟概要:

  1. 批量建立檔案夾;

  2. 建立維護表:[JobLog]和[ErrorLog];

  3. 建立備份所有資料庫的SQL腳本;

  4. 建立Job執行上面的腳本;

(一) 為了友善管理備份檔案,我們為每個資料庫建立單獨的檔案夾,下面的SQL代碼實作根據資料庫批量建立資料庫名對應的檔案夾,使用了遊标循環資料庫名進行建立檔案夾,執行cmd指令需要開啟資料庫的xp_cmdshell開關;

執行上面的腳本後,會在E:\DBBackup\目錄下建立如下圖所示的檔案夾:

SQL Server 批量主分區備份(One Job)一.本文所涉及的内容(Contents) 二.背景(Contexts)三.案例分析(Case)四.實作代碼(SQL Codes)五.主分區完整、差異還原(Primary Backup And Restore)六.參考文獻(References)

(Figure4:建立的檔案夾)

(二) 對備份的維護,我希望可以了解到所有資料庫的備份情況,是以下面建立2個維護表:[JobLog]和[ErrorLog],這兩個表用于記錄作業的執行情況,通過這兩個表,可以實作如Figure5、Figure6的效果;

  下面是生成的備份檔案命名的範例,這樣的備份檔案的命名可以友善維護,而且直覺知道備份檔案建立的時間,可以精确到秒,檔案名重複的幾率不大;

DBName _Primary_Full_2013_01_14_002007.bak

DBName_Primary_Diff_2013_01_16_002034.bak

  下面是整個批量備份資料庫的核心SQL腳本,如果你是建立維護計劃,那可以把這個SQL放到“執行 T-SQL 語句”任務,如果是建立Job的,可以放到作業的步驟裡;

  這個備份腳本中使用了遊标循環擷取資料庫名進行備份,在【--防止作業遺漏備份】标簽的SQL語句是為了保證記錄表[JobLog]每次執行都有新的記錄,即使備份失敗(如何檢視後面會講到)也可以觀察到對應的記錄;

  腳本中加入了異常處理,可以有效的防止某個資料庫備份失敗後,後面資料庫的備份不受影響,把異常資訊插入到[ErrorLog]。

  SQL代碼裡面強制了星期一進行主分區的完整備份,其它什麼時候做差異備份,這個就完全由作業中計劃來控制(如果你想,你可以通過作業中的計劃來調整每天都進行差異備份)。

(五) 檢視作業的運作情況;

SQL Server 批量主分區備份(One Job)一.本文所涉及的内容(Contents) 二.背景(Contexts)三.案例分析(Case)四.實作代碼(SQL Codes)五.主分區完整、差異還原(Primary Backup And Restore)六.參考文獻(References)

(Figure5:作業備份類型)

SQL Server 批量主分區備份(One Job)一.本文所涉及的内容(Contents) 二.背景(Contexts)三.案例分析(Case)四.實作代碼(SQL Codes)五.主分區完整、差異還原(Primary Backup And Restore)六.參考文獻(References)

(Figure6:作業執行時間)

  既然做了上面主檔案組的備份,當然我們需要去測試這個主檔案組的還原了,這樣才可以當遇到問題可以快速還原備份檔案,達到還原資料的目的;

  接下來會在另外一篇文章裡面專門講解;

<a href="http://technet.microsoft.com/zh-cn/library/ms187354(v=sql.100)">sp_update_schedule (Transact-SQL)</a>

<a href="http://www.cnblogs.com/yyed/archive/2008/11/07/1328951.html">如何修改 SQL Server 代理主作業 (Transact-SQL)</a>

<a href="http://deepfuture.iteye.com/blog/605883">bat實作檔案字元串替換</a>

<a href="http://www.cnblogs.com/Amaranthus/archive/2011/03/19/1989068.html">Sqlcmd 使用</a>