目錄
正確使用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文件組,但設置了多個文件:
而在備份時可選擇某個文件進行單獨備份:
而當用戶想使用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