1. 程式人生 > >SQL Server中的高可用性(2)----檔案與檔案組

SQL Server中的高可用性(2)----檔案與檔案組

    在談到SQL Server的高可用性之前,我們首先要談一談單例項的高可用性。在單例項的高可用性中,不可忽略的就是檔案和檔案組的高可用性。SQL Server允許在某些檔案損壞或離線的情況下,允許資料庫依然保持部分線上,從而保證了高可用性。

檔案和檔案組

    有關檔案和檔案組的基本概念,有很多文章已經闡述過了。這裡我只是提一下,檔案組作為SQL Server訪問檔案的一個抽象層而存在。因此SQL Server上所做的操作不是直接針對檔案,而是針對檔案組。

    資料庫中使用多個檔案或檔案組在高可用性方面的好處包括:

  • 某檔案的IO損壞,資料庫還可以保證部分線上。
  • 將索引和表分開存放,假如索引檔案不線上,資料依然可以被訪問。
  • 歷史資料和熱資料分開,歷史歸檔資料損壞,不影響熱資料。
  • 分開資料檔案使得在災難恢復時僅僅恢復部分資料從而縮短了宕機時間
  • 資料庫分為多個檔案使得可以通過增加檔案或移動檔案的方式解決空間不足的問題

檔案

    在SQL Server中,檔案分為三類,分別為:

  • 主資料檔案
  • 輔助資料檔案
  • 日誌檔案

    其中,主資料檔案預設以副檔名mdf結尾,輔助資料庫檔案預設以ndf結尾,日誌檔案以ldf結尾。雖然副檔名是可以修改的,但強烈建議不要去改副檔名。

    上面提到檔名值得是物理檔名,但是實際上在SQL Server中進行操作,操作的是邏輯檔名。

    任何時間,檔案都會處於某一種狀態,這些狀態包括:

  • 線上
  • 離線
  • 恢復中
  • 還原掛起
  • 質疑

    可以通過sys.database_files這個DMV來檢視資料庫檔案中包含狀態在內的相關資訊,如圖1所示。

    1

圖1.檢視資料庫中檔案的狀態等相關資訊

檔案組

在SQL Server中,檔案組中某個檔案的狀態決定了整個檔案組的狀態。但檔案的狀態獨立於資料庫的狀態,比如說檔案的狀態是離線,但資料庫依然能保證線上,這也就是所謂的資料庫部分線上,舉個例子,某個檔案包含了名為selldata的表,如果該檔案離線,但資料庫線上,所有針對該selldata的表上的操作都會失敗。

   如果需要資料庫中的某個檔案組線上,該檔案組中的所有檔案都應該處於線上狀態。

表分割槽

    表分割槽是自SQL Server 2005之後出現的一個概念,我之前已經寫過一篇關於表分割槽的文章。表分割槽的概念雖然很老了,但是很多地方對於表分割槽的使用依然處於非常初級的階段。

    我見過大部分想到使用表分割槽的例子是出現效能問題,從而考慮分散大表的IO。但實際上,表分割槽還會提高可用性。使用表分割槽的好處還包括:

  • 輕鬆管理大表或分割槽
  • 提高併發性(產生分割槽鎖,而不是表鎖)
  • 以檔案組級別就行備份和還原,從而僅僅只備份和還原表的一部分(比如說只備份表中的熱資料),從而減少了還原時間
  • 可以僅僅線上重建某個分割槽

    值得注意的是,對錶分割槽後,也要對錶上的非聚集索引進行索引分割槽。否則有可能造成效能方面的例子。

DEMO

DEMO1 :僅重建某個分割槽

    下面例子是一個簡單的分割槽表,並對索引進行分割槽後,僅僅重建某個分割槽,而不是整個索引。比如說表中按照資料冷熱進行分割槽,可以僅僅對熱資料進行重建,從而大大減少了重建索引所需的時間,如程式碼清單1所示。

--建立分割槽函式
CREATE PARTITION FUNCTION [t](int) AS RANGE LEFT FOR VALUES (100, 500)
--分割槽架構
CREATE PARTITION SCHEME [x] AS PARTITION [t] TO ([PRIMARY], [FileGroup1], [FileGroup1])

--建立表
CREATE TABLE [Sales].[SalesOrderDetailPartition](
	[SalesOrderID] [int] NOT NULL,
	[SalesOrderDetailID] [int] IDENTITY(1,1) NOT NULL,
	[CarrierTrackingNumber] [nvarchar](25) NULL,
	[OrderQty] [smallint] NOT NULL,
	[ProductID] [int] NOT NULL,
	[SpecialOfferID] [int] NOT NULL,
	[UnitPrice] [money] NOT NULL,
	[UnitPriceDiscount] [money] NOT NULL,
	[LineTotal]  AS (isnull(([UnitPrice]*((1.0)-[UnitPriceDiscount]))*[OrderQty],(0.0))),
	[rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
	[ModifiedDate] [datetime] NOT NULL,
) ON x(SalesOrderID)

INSERT 	INTO [Sales].[SalesOrderDetailPartition]([SalesOrderID],
	[CarrierTrackingNumber],
	[OrderQty] ,
	[ProductID] ,
	[SpecialOfferID],
	[UnitPrice],
	[UnitPriceDiscount],ModifiedDate,rowguid)
SELECT 	[SalesOrderID],
	[CarrierTrackingNumber],
	[OrderQty] ,
	[ProductID] ,
	[SpecialOfferID],
	[UnitPrice],
	[UnitPriceDiscount],ModifiedDate,rowguid FROM [Sales].[SalesOrderDetail]


go
--建立索引分割槽
CREATE NONCLUSTERED INDEX test_partition_idx ON [Sales].[SalesOrderDetailPartition](ProductID) on x(SalesOrderID)

--僅僅重建某個分割槽
ALTER INDEX test_partition_idx
ON [Sales].[SalesOrderDetailPartition]
REBUILD Partition = 1

   程式碼清單1.僅僅重建某個分割槽,而不是整個索引

DEMO2:資料庫部分線上和檔案還原

--建立測試資料庫
CREATE DATABASE test
 GO
--改成完整恢復模式
ALTER DATABASE test SET  RECOVERY FULL
--新增一個檔案組
ALTER DATABASE test
ADD FILEGROUP WW_GROUP
 GO
 --向檔案組中新增檔案
ALTER DATABASE test
ADD FILE 
( NAME = ww,
FILENAME = 'D:\wwdat1.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)
TO FILEGROUP ww_Group
 
 --在不同檔案組上分別建立兩個表
CREATE TABLE test..test ( id INT IDENTITY )
ON  [primary]
CREATE TABLE test..test_GR ( id INT IDENTITY )
ON  ww_Group
 

--做完整備份
BACKUP DATABASE test
 TO DISK='D:\Test_backup.bak'WITH INIT

--做檔案備份
BACKUP DATABASE test
    FILE = 'ww',
    FILEGROUP = 'ww_Group'
    TO DISK='D:\CROUPFILES.bak'WITH INIT
--備份日誌
BACKUP LOG test
    TO DISK='D:\Test__log.ldf'WITH INIT

 
--刪除檔案組中的表內的資料
TRUNCATE TABLE test..test_GR

--還原備份,日誌僅僅被應用於那個還原狀態的檔案
RESTORE DATABASE test
    FILE = 'ww',
    FILEGROUP = 'ww_Group'
    FROM DISK ='D:\CROUPFILES.bak'
    WITH FILE = 1,NORECOVERY
RESTORE LOG test
    FROM DISK='D:\Test__log.ldf'
    WITH FILE = 1, NORECOVERY

--備份尾端日誌
BACKUP LOG test
    TO DISK='D:\Test__log.ldf' WITH NOINIT,NO_TRUNCATE
--還原尾端日誌
RESTORE LOG test
    FROM DISK='D:\Test__log.ldf'
    WITH FILE = 2, RECOVERY
 GO

 --檢視資料,刪除資料的操作被成功恢復
 SELECT  *
FROM    test..test_GR

--清除資料庫
DROP DATABASE test

   程式碼清單2.備份還原單個檔案

    程式碼清單2很好的闡述了整個檔案備份還原的過程,其中,在檔案還原的過程中我們可以看到資料庫本身是線上的,但資料庫中有一個檔案處於還原狀態,如圖2所示。

2

圖2.ww檔案處於還原中狀態

   此時對於表test_GR做操作的話,會提示因檔案組沒有聯機而失敗,如圖3所示。

3

圖3.因為檔案組沒有聯機而導致操作失敗

    再對尾端日誌進行備份還原之後,該檔案組成功上線。

小結

    本篇文章闡述了檔案和檔案組在高可用性中的作用。瞭解這些特性對於降低還原時間非常有必要。在資料庫開始上線之前,儘量合理的把一個數據庫分為多個檔案組和檔案,不僅僅提升效能和併發性,還可以使得DR更加容易。

相關推薦

SQL Server中的高可用2----檔案檔案

    在談到SQL Server的高可用性之前,我們首先要談一談單例項的高可用性。在單例項的高可用性中,不可忽略的就是檔案和檔案組的高可用性。SQL Server允許在某些檔案損壞或離線的情況下,允許資料庫依然保持部分線上,從而保證了高可用性。 檔案和檔案組     有關檔案和檔案組的基本概念,有很

全廢話SQL Server統計信息2——統計信息基礎

position amp 要去 fault href 過程 字符串 最大 實用 接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958我想在大地上畫滿窗子,

關於SQL SERVER 儲存過程使用2

  現在有一場景,需要調用出公司員工在本週的請假天數。程式碼如下(1),本人一開始寫的時候用遍歷裡面套著一個遍歷,發現效果出不來如下(2),求是否有什麼方法可以實現遍歷裡面還有個遍歷。 SQL程式碼(1): --建立儲存過程 create procedure LeaveT

SQL SERVER大話儲存結構2_非聚集索引如何查詢到行記錄

1 行記錄如何儲存     這裡引入兩個概念:堆跟聚集索引表。本部分參考MSDN。 1.1 堆表     堆表,沒有聚集索引的表格,可以建立一個或者多個非聚集索引。沒有按照某個規則進行儲存,一般來說,按照行記錄入表的順序,但是由於效能要求,可能會在不同區域移動入庫資料

SQL Server中的高可用1----高可用概覽

    自從SQL Server 2005以來,微軟已經提供了多種高可用性技術來減少宕機時間和增加對業務資料的保護,而隨著SQL Server 2008,SQL Server 2008 R2,SQL Server 2012的不斷髮布,SQL Server中已經存在了滿足不同場景的多種高可用性技術。    

SQL Server 全文索引介紹轉載

所在 ubd exec nchar 配置管理 system data ase 百度搜索 概述 全文引擎使用全文索引中的信息來編譯可快速搜索表中的特定詞或詞組的全文查詢。全文索引將有關重要的詞及其位置的信息存儲在數據庫表的一列或多列中。全文索引是一種特殊類型的基於標記的

【架構】Heartbeat高可用服務2

agents 可用 分享 ont .com war 集群 需求 spa Heartbeat高可用服務 【13】Heartbeat發展情況及分支軟件介紹   有關Heartbeat分3個分支的說明     自2.1.4版本後,Linux-HA將Heartbeat分包

SQL SERVER的鎖機制——概述鎖的種類範圍

row 定性 針對 共享 互斥 drop 問題 停止 共享鎖 SQL SERVER的鎖機制系列: SQL SERVER的鎖機制(一)——概述(鎖的種類與範圍) SQL SERVER的鎖機制(二)——概述(鎖的兼容性與可以鎖定的資源) SQL SERVER的鎖機制(三)

SQL Server 2012安裝配置Part1

數據庫 SQL Server 1 安裝前準備安裝 SQL Server 2012 服務器及客戶端前,需要提前做以下兩項準備:SQL Server2012 依賴於.Net Framework 3.5.1 組件。Windows Server 2012 缺省未安裝該組件,所以需要手動安裝。為保證SQL Se

SQL Server 2012安裝配置Part2

數據庫 SQL Server SQL Server 2012安裝配置(Part1 )2. 服務器安裝運行安裝程序後,首先進入 SQL Server 安裝中心。選擇左側導航樹中的“安裝”菜單項。圖2-1 SQL Server 安裝中心 在右側菜單中點擊“全新 SQL Server 獨立安裝或向現有安裝添

SQL Server 2012安裝配置Part3

數據庫 SQL Server SQL Server 2012安裝配置(Part1 ) SQL Server 2012安裝配置(Part2 ) ? 3 客戶端安裝 3.1 安裝客戶端 功能選擇之前的操作與 SQL Server 安裝方法相同,在此不再贅述,下面將直接從功能選擇開始。 圖3-1 功能

SQL Server 2012安裝配置Part4

數據庫 SQL Server SQL Server 2012安裝配置(Part1)SQL Server 2012安裝配置(Part2)SQL Server 2012安裝配置(Part3 )SQL Server 2012安裝配置(Part4 ) 5 卸載 點擊系統“開始”按鈕,選擇“控制面板”菜單項,

sql server可用技術總結

結構 故障轉移 ppi 靈活 使用 表數 定時 不支持 http 原文:sql server 高可用性技術總結一. 復制Replication(快照、事務、合並)    應用場景:     負載均衡、提供副本讀,寫操作。     分區將歷史數據復制到其它

SQL Server中有關約束constraint的一些細節

並發 自動生成 fault 自動 方式 view str 自己 數據庫 原文:SQL Server中有關約束(constraint)的一些細節 本文出處:http://www.cnblogs.com/wy123/p/7350265.html (保留出處並非什麽原創作品權

如何提高阿里雲上應用的可用

這是如何提高阿里雲上應用的可用性系列文章的第二篇,第一篇傳送門。 在單體應用時代,最大的問題是如何解決資料庫瓶頸,而微服務之下,一個大應用被拆分成了幾十個甚至上百個微服務,資料訪問的壓力被傳導到了服務之間的網路,服務強弱依賴,服務雪崩等各種問題隨之而來,那麼如何保障服務的可用性以及整個應用的健壯性呢?常見的

如何提高阿里雲上應用的可用

摘要: 如今,開發並上線一款應用十分方便。因為雲端計算提供了從最基礎的計算資源如伺服器網路、資料庫服務、中介軟體PaaS平臺到各種應用支撐的雲管理服務,同時開源社群的迅猛發展也提供了從資料庫、快取到應用全生命流程中各種必須的元件,所以越來越多的應用開發者可以把精力放在業務創新上。 如今,開發並上線一款應用十

如何提高阿裏雲上應用的可用

依賴 服務 技術 動態 應用 接下來 agen rod 雲計 摘要: 如今,開發並上線一款應用十分方便。因為雲計算提供了從最基礎的計算資源如服務器網絡、數據庫服務、中間件PaaS平臺到各種應用支撐的雲管理服務,同時開源社區的迅猛發展也提供了從數據庫、緩存到應用全生命流程中各

如何提高阿裏雲上應用的可用

級別 經驗 process term 保險絲 ddb 控制 假設 cdb 摘要: 這是如何提高阿裏雲上應用的可用性系列文章的第二篇,第一篇傳送門。 在單體應用時代,最大的問題是如何解決數據庫瓶頸,而微服務之下,一個大應用被拆分成了幾十個甚至上百個微服務,數據訪問的壓力被傳導

Coalesce (MS SQL Server)——取指定內容中第一個不為空的值

oalesce 獲得引數中第一個不為空的表示式。 語法:        COALESCE ( expression [ ,...n ] )  例子:CREATE TABLE wages  &nbs

sql server練習過程記錄1

sqlserver中 --將查詢結果作為一個臨時表 select * from (Select AVG(Grade) as avg, Sno from SC group by Sno) as A --將查詢結果插入一個新表(這個表不能預先被建立) select Sname, Sno,