SQL Server使用文件組備份降低備份文件占用的存儲空間

来源:http://www.cnblogs.com/TeyGao/archive/2016/03/30/5338233.html
-Advertisement-
Play Games

對於DBA來說,備份和刷新簡歷是最重要的兩項工作,如果發生故障後,發現備份也不可用,那麼刷新簡歷的重要性就顯現出來,哇咔咔!當然備份是DBA最重要的事情(沒有之一),在有條件的情況下,我們應該在多個伺服器上保留多份完備和日誌備份,甚至某些公司會要求將完備數據保留到磁帶或超大存儲上,以保證可以恢復很久 ...


對於DBA來說,備份和刷新簡歷是最重要的兩項工作,如果發生故障後,發現備份也不可用,那麼刷新簡歷的重要性就顯現出來,哇咔咔!當然備份是DBA最重要的事情(沒有之一),在有條件的情況下,我們應該在多個伺服器上保留多份完備和日誌備份,甚至某些公司會要求將完備數據保留到磁帶或超大存儲上,以保證可以恢復很久之前的數據。

於是便有一個艱難的選擇:備份空間和備份保存期,磁碟再便宜也是要錢的,尤其某些吝嗇的老闆寧願多花幾十萬招個人也不寧願在硬體上多投資一丁點,把不得把伺服器所有資源都利用起來才高興,在備份空間有限的情況下,我們如何合理設計備份策略以及“備份驗證”策略變得尤為關鍵。

 

在很久之前讀過一篇文章,描述某DBA為降低資料庫完備占用的存儲空間,採用如下方式:

1. 採用完整備份和日誌備份將資料庫還原到特定時間點(如每天凌晨0點)

2. 刪除用戶資料庫上所有非聚集索引,然後壓縮備份

3. 將該備份進行歸檔保存。

 

從業務角度來說,對於很早之前的數據,即使需要恢復,也不可能將該庫恢復到特定時間點並使用恢復的新庫進行生產,因此對於很早之前的備份,我們只關心數據而不關心數據上建立的那些索引,即使處於查詢需要,也可以重新建立索引後再進行查詢。該DBA正是以此為出發點,很多資料庫上的非聚集索引能占資料庫50%甚至70%的空間(我曾經看過一個表上數十個非聚集索引,部分還是包含索引,占用空間是數據的四五倍以上),刪除非聚集索引方式能很有效地降低備份占用的存儲空間。

=============================================================

當然上面的廢話不是今天的重點,今天的重點是文件組備份。

周末與小伙伴吃飯時,好友paddy提到一個備份策略,將數據和索引拆分到不同文件組(這策略應該很多DBA都會採用),然後只備份“數據”文件組,這樣在保證恢複數據的需求的前提下最大限度地降低“數據備份”的占用的存儲空間。

 

演示Demo:

首先創建資料庫TestDB1001,並創建兩個文件組來分別存放DATA和INDEX

CREATE DATABASE [TestDB1001]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TestDB1001', FILENAME = N'D:\SQLDATA\TestDB1001.mdf' ), 
 FILEGROUP [FG_DATA] 
( NAME = N'TestDB1001_DATA1', FILENAME = N'D:\SQLDATA\TestDB1001_DATA1.ndf' ), 
 FILEGROUP [FG_INDEX] 
( NAME = N'TestDB1001_INDEX1', FILENAME = N'D:\SQLDATA\TestDB1001_INDEX1.ndf'  )
 LOG ON 
( NAME = N'TestDB1001_log', FILENAME = N'D:\SQLDATA\TestDB1001_log.ldf')
GO

PS: 為方便演示,文件增長屬性或其他相關信息被移除,演示代碼請勿較真

然後創建表和插入數據,註意聚集索引和非聚集索引使用的不同的文件組

USE TestDB1001
GO
CREATE TABLE TB001
(
    C1 INT IDENTITY(1,1) NOT NULL,
    C2 INT
)
GO
ALTER TABLE TB001
ADD CONSTRAINT PK_TB001
PRIMARY KEY(c1)
ON FG_DATA
GO
CREATE INDEX IDX_C2
ON TB001
(
C2
)
ON FG_INDEX
GO

INSERT INTO TB001(C2)
SELECT 1 FROM sys.objects


對資料庫進行文件組備份,僅備份PRIMARY和FG_DATA兩個文件組:

BACKUP DATABASE TestDB1001 FILEGROUP = N'PRIMARY',FILEGROUP='FG_DATA' 
TO  DISK = N'D:\SQLDATA\TestDB1001_F1.bak'

 

對資料庫進行第一次日誌備份:

BACKUP LOG TestDB1001
TO DISK = N'D:\SQLDATA\TestDB1001_L1.bak'

 

為演示需要,第二次插入數據:

INSERT INTO TB001(C2)
SELECT 2 FROM sys.objects

 

然後進行第一次差異備份

BACKUP DATABASE TestDB1001 FILEGROUP = N'PRIMARY',FILEGROUP='FG_DATA' 
TO  DISK = N'D:\SQLDATA\TestDB1001_D1.bak' WITH DIFFERENTIAL

 

為演示需要,第三次插入數據:

INSERT INTO TB001(C2)
SELECT 3 FROM sys.objects

 

然後進行第二次日誌備份:

BACKUP LOG TestDB1001
TO DISK = N'D:\SQLDATA\TestDB1001_L2.bak'


備份完成後,我們來驗證備份還原的可行性,

首先進行文件組還原,註意在還原時,由於未備份FG_INDEX文件組,因此還原時不需要制定INDEX相關的文件信息

RESTORE DATABASE [TestDB1002] 
FILE = N'TestDB1001',  
FILE = N'TestDB1001_DATA1'
FROM  DISK = N'D:\SQLDATA\TestDB1001_F1.bak' 
WITH  FILE = 1,  MOVE N'TestDB1001' TO N'D:\SQLDATA\TestDB1002.mdf',  
MOVE N'TestDB1001_DATA1' TO N'D:\SQLDATA\TestDB1002_DATA1.ndf',
MOVE N'TestDB1001_log' TO N'D:\SQLDATA\TestDB1002_log.ldf',  
NOUNLOAD,  STATS = 10,NORECOVERY,PARTIAL

 

然後還原差異備份:

RESTORE DATABASE [TestDB1002] FROM DISK='D:\SQLDATA\TestDB1001_D1.bak' WITH NORECOVERY

 

最後還原日誌備份:

RESTORE DATABASE [TestDB1002] FROM DISK='D:\SQLDATA\TestDB1001_L2.bak' WITH RECOVERY

 

驗證數據是否正常:

SELECT C2,COUNT(1) FROM TB001
GROUP BY C2

數據驗證通過,證明該方法的確可行。

========================================================

在進行文件組還原的時候,其中PARTIAL選項非常關鍵,其直接影響後面日誌備份是否可用,如果未指定PARTIAL選項,則:

使用WITH RECOVERY選項還原差異備份,不報錯,資料庫仍處於“正在還原”模式下,還原信息為:

已為資料庫 'TestDB1002',文件 'TestDB1001' (位於文件 1 上)處理了 72 頁。
已為資料庫 'TestDB1002',文件 'TestDB1001_DATA1' (位於文件 1 上)處理了 16 頁。
已為資料庫 'TestDB1002',文件 'TestDB1001_log' (位於文件 1 上)處理了 3 頁。
通過資料庫或文件還原操作,只還原了文件“TestDB1001_INDEX1”的一部分。必須成功還原整個文件後,才能應用此備份集。
此 RESTORE 語句成功地執行了一些操作,但由於需要一個或多個 RESTORE 步驟,無法使資料庫線上。以前的消息說明瞭此時無法進行恢復的原因。
RESTORE DATABASE ... FILE=<name> 成功處理了 91 頁,花費 0.059 秒(11.983 MB/秒)。

使用WITH RECOVERY選項還原日誌備份,直接報錯,錯誤消息為:

消息 4320,級別 16,狀態 13,第 1 行
通過資料庫或文件還原操作,只還原了文件“TestDB1001_INDEX1”的一部分。必須成功還原整個文件後,才能應用此備份集。
消息 3119,級別 16,狀態 1,第 1 行
在計劃 RESTORE 語句時發現了問題。以前的消息提供了詳細信息。
消息 3013,級別 16,狀態 1,第 1 行
RESTORE DATABASE 正在異常終止。


因此在還原文件組備份時,請務必確保使用PARTIAL選項。

========================================================

打完收工,再次感謝paddy的提點。

最近很少寫博客,也沒有收集妹子的動力,妹子質量下降,各位將就下。。。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以上是個非常簡單的操作系統helloworld源碼,用bochs載入後如下圖(bochs是個虛擬機,模擬操作系統載入),顯示了紅色的Hello,OS world,實際上是系統載入起來的樣子: 源碼解析: 1.org 07c00h和dw 0xaa55和times 510-($-$$) db 0 當計算 ...
  • 今天一大清早去面試, 公司距離我家還挺近的, 花了一個小時走著去, 也順路印下簡歷, 理理思路, 到了公司面試官什麼的都不錯, 還給我講了很多知識, 收貨也是滿滿的, 總結下今天都遇到了哪些問題, 調整調整狀態. 1, 當需要自定義tabbar的item的數量可變時怎麼做的 這裡原本是想說自定義ta ...
  • - (void)initActionSheet { UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButto ...
  • Could not find Developer Disk Image 這是由於真機系統過高或者過低,Xcode中沒有匹配的配置包文件,我們可以通過這個路徑進入配置包的存放目錄: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneO ...
  • 經過兩篇的介紹我想對RunLoop應該有了簡單的瞭解,至少不至於一無所知。 在這篇我想對“CFRunLoopObserverRef”做一下簡單的補充。 在補充之前先說一下。 在現在的開發中已經很少見到ARC了。 但是那是對與OC對象的。 CFRunLoopObserverRef屬於CF (Core ...
  • 偉大的設計來源於一致性和細緻化,而其實只要有足夠的紀律,每個團隊都可以實現這一點。 品牌(源碼:http://www.jinhusns.com/Products/Download/?type=xcj) 品 牌是應用設計的基石。它回答了“用戶使用應用時應該獲得何等感受”這個問題。首先,你應該確定你的主 ...
  • 一,代碼。 AppDelegate.h AppDelegate.m ...
  • 上一篇我們說了runloop 的幾種模式,那麼我們在模式中又要做些什麼呢??? 模式中有三個模塊: 事件源(輸入源) Source Source: 按照官方文檔分類 Port-Based Custom Input Cocoa Perform Selector 按照函數調用棧,Source的分類 So ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...