跟我一起學Microsoft SQL Server 2012 Internals(3.4)

目錄

正確使用SQL Server文件與文件組

MS SQL Server引入文件組(filegroups)是爲了簡單的管理與分配數據(data)文件。同時,合理正確的使用SQL Server文件組可提升數據庫的性能,如將數據、非聚集索引分別存放在不同的文件組中並存放在不同的物理磁盤上(注意:聚集索引是數據的一部分)。

默認情況下,所有的數據與索引均放置在primary filegroup中,除非創建了一個新的filegroup,並進行使用。SQL Server有兩種類型的文件組:
1. Primary
2. User-defined

下圖所示是檢查數據庫默認的文件組
文件組

這裏首先區分一個概念:primary文件組(primary filegroup)與primary文件(primary file),即要區分文件組與文件的不同。我們在“跟我一起學Microsoft SQL Server 2012 Internals(3.2)”中簡單提到了primary data file,即.mdf文件。而這裏的filegroup是基於文件(file)基礎上的一個概念。更多的內容可查看MSDN文章“Files and Filegroups Architecture”。

那麼我們應該在什麼時候使用多個文件,什麼時候使用多個文件組?簡單來說,使用多個文件可以方便的管理數據恢復或移動數據。

下圖所示對數據庫使用默認primary文件組,但設置了多個文件:
文件1

而在備份時可選擇某個文件進行單獨備份:
文件2

而當用戶想使用SQL Server的數據與索引分區功能時,纔有使用文件組(filegroups)的必要,關於SQL Server的分區相關知識可查看MSDN中“Partitioned Tables and Indexes in SQL Server 2005”。

另需注意:表是基於單個filegroup的,而單個filegroup下可能有多個文件存放在不同磁盤,因此這有可能會提升某filegroup下所有表的性能

下圖是files與filegroups之間的關係圖
體系圖

你可通過如下T-SQL查詢當前數據庫的數據文件:

--查看數據文件的位置
sp_helpfile
select * from sys.sysfiles

select dbid,name,filename,* from sys.sysdatabases

演示

通過上述的理解,我們使用T-SQL創建多文件但僅使用primary文件組的數據庫mydb,然後嘗試對mydb進行文件備份與恢復:

--創建mydb數據庫
CREATE DATABASE [mydb] ON  PRIMARY 
( NAME = N'mydb', FILENAME = N'D:\DATA\mydb.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
( NAME = N'mydb1', FILENAME = N'D:\DATA\mydb1.ndf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
( NAME = N'mydb2', FILENAME = N'D:\DATA\mydb2.ndf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
( NAME = N'mydb3', FILENAME = N'D:\DATA\mydb3.ndf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
( NAME = N'mydb4', FILENAME = N'D:\DATA\mydb4.ndf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
( NAME = N'mydb5', FILENAME = N'D:\DATA\mydb5.ndf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'mydb_log', FILENAME = N'D:\DATA\mydb_log.ldf' , SIZE = 1280KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

在數據庫mydb上創建表,然後循環插入300條測試數據:

USE mydb
GO
--創建表hyper
CREATE table hyper (num bigint, name nvarchar(50));
--循環插入300條記錄
INSERT into hyper VALUES (10, 'HyperWang')
GO 300

對mydb的每個文件做備份,並備份事務日誌

BACKUP DATABASE [mydb] FILE = N'mydb' TO  DISK = N'D:\backup\mydb.bak'
BACKUP DATABASE [mydb] FILE = N'mydb1' TO  DISK = N'D:\backup\mydb1.bak'
BACKUP DATABASE [mydb] FILE = N'mydb2' TO  DISK = N'D:\backup\mydb2.bak'
BACKUP DATABASE [mydb] FILE = N'mydb3' TO  DISK = N'D:\backup\mydb3.bak'
BACKUP DATABASE [mydb] FILE = N'mydb4' TO  DISK = N'D:\backup\mydb4.bak'
BACKUP DATABASE [mydb] FILE = N'mydb5' TO  DISK = N'D:\backup\mydb5.bak'

--備份事務日誌
BACKUP LOG mydb TO DISK = 'D:\backup\mydblog.trn' WITH NOINIT

將備份的數據文件恢復到數據庫mydb_tmp上:

--還原主文件
RESTORE DATABASE mydb_tmp FROM DISK = 'D:\backup\mydb.bak' 
WITH 
 MOVE 'mydb' TO 'd:\data\mydb_tmp.mdf' 
,MOVE 'mydb1' TO 'd:\data\mydb_tmp1.ndf' 
,MOVE 'mydb2' TO 'd:\data\mydb_tmp2.ndf'
,MOVE 'mydb3' TO 'd:\data\mydb_tmp3.ndf'
,MOVE 'mydb4' TO 'd:\data\mydb_tmp4.ndf'
,MOVE 'mydb5' TO 'd:\data\mydb_tmp5.ndf'
,MOVE 'mydb_log' TO 'd:\data\mydb_tmp_log.ldf' 
,PARTIAL, NORECOVERY 
--還原其他文件
RESTORE DATABASE [mydb_tmp] FILE = N'mydb1' FROM  DISK = N'D:\backup\mydb1.bak'  WITH NORECOVERY
RESTORE DATABASE [mydb_tmp] FILE = N'mydb2' FROM  DISK = N'D:\backup\mydb2.bak'  WITH NORECOVERY
RESTORE DATABASE [mydb_tmp] FILE = N'mydb3' FROM  DISK = N'D:\backup\mydb3.bak'  WITH NORECOVERY
RESTORE DATABASE [mydb_tmp] FILE = N'mydb4' FROM  DISK = N'D:\backup\mydb4.bak'  WITH NORECOVERY
RESTORE DATABASE [mydb_tmp] FILE = N'mydb5' FROM  DISK = N'D:\backup\mydb5.bak'  WITH NORECOVERY

最後還原事務日誌:

--還原事務日誌備份
RESTORE LOG [mydb_tmp] FROM DISK = 'D:\backup\mydblog.trn' 

參考資料

1.《Microsoft SQL Server 2012 Internals》 - chapter 3

2.Files and Filegroups Architecture
https://technet.microsoft.com/en-us/library/ms179316(v=sql.105).aspx

3.Understanding Pages and Extents
https://technet.microsoft.com/en-us/library/ms190969(v=sql.105).aspx

4.Move an Existing Index to a Different Filegroup
https://technet.microsoft.com/en-us/library/ms175905(v=sql.110).aspx

5.Remove Defunct Filegroups (SQL Server)
https://technet.microsoft.com/en-us/library/ms175122(v=sql.110).aspx

6.SQL Server Storage Engine: Database Files and Filegroups
http://aboutsqlserver.com/2013/09/24/sql-server-storage-engine-database-files-and-filegroups/

7.Partitioned Tables and Indexes in SQL Server 2005
https://msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx

update by HyperWang at 2016/06/02

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章