檔案與檔案群組架構

SQL Server 會將資料庫對應到一組作業系統檔案。資料與記錄資訊永遠不會混在同一個檔案中,而且個別的檔案只能由單一資料庫使用。檔案群組是具名的檔案集合,用來協助資料置放與管理作業,例如備份和還原作業。

資料庫檔案

SQL Server 資料庫具有三種檔案類型:

  • 主要資料檔

    主要資料檔是資料庫的起點,並指到資料庫中的其他檔案。每個資料庫都有一個主要資料檔案。建議您將主要資料檔的副檔名設為 .mdf。

  • 次要資料檔

    次要資料檔是由主要資料檔以外的所有資料檔所組成。有些資料庫可能不包含任何次要資料檔,而有些則擁有數個次要資料檔。建議您將次要資料檔的副檔名設為 .ndf。

  • 記錄檔

    記錄檔中保存可用來復原資料庫的所有記錄資訊。每一個資料庫至少要有一個記錄檔,也可以有多個記錄檔。建議的記錄檔副檔名為 .ldf。

SQL Server 不會強制使用 .mdf、.ndf 及 .ldf 副檔名,但是這些副檔名可協助您識別不同種類的檔案及其用途。

在 SQL Server 中,資料庫中所有檔案的位置都會記錄在資料庫的主要檔案中,以及記錄在 master 資料庫中。SQL Server Database Engine 大部分時間都會使用 master 資料庫所提供的檔案位置資訊。然而,在下列情況下,Database Engine 會使用主要檔案所提供的檔案位置資訊來初始化 master 資料庫中的檔案位置項目:

  • 使用 CREATE DATABASE 陳述式搭配 FOR ATTACH 或 FOR ATTACH_REBUILD_LOG 選項,來附加資料庫時。

  • 從 SQL Server 2000 版或 7.0 版升級時。

  • 還原 master 資料庫時。

邏輯與實體檔案名稱

SQL Server 檔案有兩個名稱:

logical_file_name

logical_file_name 是用來參考所有 Transact-SQL 陳述式中之實體檔案的名稱。邏輯檔案名稱必須遵守 SQL Server 識別碼的規則,而且在資料庫的邏輯檔案名稱之間必須是唯一的。

os_file_name

os_file_name 是包含目錄路徑的實體檔案名稱。它必須遵循作業系統檔案名稱的規則。

SQL Server 資料及記錄檔可以放在 FAT 或 NTFS 檔案系統,因為 NTFS 安全性層面,我們建議使用 NTFS 檔案系統。但是讀寫資料檔案群組及記錄檔不能放在 NTFS 壓縮檔案系統。只有唯讀資料庫及唯讀次要檔案群組,才能放在 NTFS 壓縮檔案系統。如需詳細資訊,請參閱<唯讀檔案群組和壓縮>。

若有多個 SQL Server 執行個體執行於同一台電腦上,每個執行個體都會收到不同的預設目錄來包含建立於執行個體中的資料庫檔案。如需詳細資訊,請參閱<SQL Server 的預設和具名執行個體的檔案位置>。

資料檔分頁

SQL Server 資料檔中的分頁是循序編號,從零 (0) 開始,表示檔案中的第一頁。資料庫中的每一個檔案都具有唯一的檔案識別碼。若要唯一地識別資料庫中的分頁,則同時需要檔案識別碼及頁碼。下例顯示了擁有 4-MB 主要資料檔與 1-MB 次要資料檔之資料庫中的頁數。

兩個資料檔中的順序頁碼

每個檔案的第一個分頁,是包含了檔案屬性相關資訊的檔案標頭分頁。檔案開頭的幾個其他分頁中也包含系統資訊,如配置對應。同時儲存於主要資料檔與第一個記錄檔的系統分頁中,有一個是資料庫開機分頁,其中包含了資料庫屬性的相關資訊。如需分頁及分頁類型的詳細資訊,請參閱<了解頁面與範圍>。

檔案大小

SQL Server 檔案可以從它們原本指定的大小自動成長。當您定義檔案時,可指定特定的成長遞增。每次檔案填滿時,它就會根據成長遞增值來增加其大小。若檔案群組中有多個檔案,則必須等到所有檔案都填滿之後,才會開始自動成長。接著成長會以循環配置的方式來進行。

也可為每個檔案指定最大的大小。若並未指定最大的大小,檔案將持續成長,直到它用完磁碟中所有可用的空間為止。當 SQL Server 是用做應用程式中內嵌的資料庫,而且使用者不是那麼容易聯繫到系統管理員時,此項功能會特別有用。使用者可以讓檔案依需要自動成長,以減輕監視資料庫中可用空間以及手動配置額外空間的管理負擔。

資料庫快照集檔案

資料庫快照集用來儲存其「寫入時複製」資料的檔案格式,視快照集是由使用者建立或是內部使用而定:

  • 使用者所建立的資料庫快照集是將其資料儲存在一或多個疏鬆檔案。疏鬆檔案技術是 NTFS 檔案系統的一項功能。一開始,疏鬆檔案未包含使用者資料,而且也尚未配置使用者資料的磁碟空間給疏鬆檔案。如需有關使用資料庫快照集中的疏鬆檔案,以及資料庫快照集如何成長的一般資訊,請參閱<資料庫快照集如何運作>和<了解資料庫快照集內的疏鬆檔案大小>。

  • 資料庫快照集是由特定 DBCC 命令內部使用。這些命令包括 DBCC CHECKDB、DBCC CHECKTABLE、DBCC CHECKALLOC 和 DBCC CHECKFILEGROUP。內部資料庫快照集使用原始資料庫檔案的疏鬆替代資料流。和疏鬆檔案一樣,替代資料流也是 NTFS 檔案系統的一項功能。使用疏鬆替代資料流可讓多個資料配置與單一檔案或資料夾相關聯,但不影響檔案大小或磁碟區統計資料。

資料庫檔案群組

資料庫物件及檔案可以組成檔案群組,以便於配置和管理。檔案群組有三種類型:

主要

主要檔案群組中包含主要資料檔,以及不特別指定給別的檔案群組的其他任何檔案。所有的系統資料表分頁都會從主要檔案群組中配置。

使用者自訂

使用者自訂的檔案群組是在 CREATE DATABASE 或 ALTER DATABASE 陳述式中使用 FILEGROUP 關鍵字所指定的任何檔案群組。

記錄檔絕不能做為檔案群組的一部分。記錄空間將與資料空間分別管理。

一個檔案只能是一個檔案群組的成員。資料表、索引及大型物件資料則可與指定的檔案群組產生關聯。在此情況下,將在該檔案群組中配置它們的所有分頁,或將資料表及索引進行分割。資料分割資料表及索引的資料會分成若干單位,每一個單位都可以放在資料庫的個別檔案群組中。如需資料分割資料表及索引的詳細資訊,請參閱<資料分割資料表及索引>。

每一個資料庫中都會有一個檔案群組被指定為預設的檔案群組。當建立資料表或索引,但沒有指定檔案群組時,系統會假設是從預設檔案群組配置所有分頁。一次只能有一個檔案群組為預設檔案群組。db_owner 固定資料庫角色的成員可將預設的檔案群組從一個檔案群組切換到另一個檔案群組。如果沒有指定預設檔案群組,則預設值為主要檔案群組。

檔案與檔案群組範例

下例會在 SQL Server 的執行個體上建立資料庫。資料庫會有主要資料檔、使用者自訂的檔案群組以及記錄檔。主要資料檔位於主要的檔案群組中,而使用者自訂的檔案群組則擁有兩個次要資料檔。ALTER DATABASE 陳述式可讓使用者自訂的檔案群組成為預設的檔案群組。接著系統將建立一個資料表來指定使用者自訂的檔案群組。

USE master;
GO
-- Create the database with the default data
-- filegroup and a log file. Specify the
-- growth increment and the max size for the
-- primary data file.
CREATE DATABASE MyDB
ON PRIMARY
  ( NAME='MyDB_Primary',
    FILENAME=
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_Prm.mdf',
    SIZE=4MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB),
FILEGROUP MyDB_FG1
  ( NAME = 'MyDB_FG1_Dat1',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_FG1_1.ndf',
    SIZE = 1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB),
  ( NAME = 'MyDB_FG1_Dat2',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_FG1_2.ndf',
    SIZE = 1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB)
LOG ON
  ( NAME='MyDB_log',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB.ldf',
    SIZE=1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB);
GO
ALTER DATABASE MyDB 
  MODIFY FILEGROUP MyDB_FG1 DEFAULT;
GO

-- Create a table in the user-defined filegroup.
USE MyDB;
CREATE TABLE MyTable
  ( cola int PRIMARY KEY,
    colb char(8) )
ON MyDB_FG1;
GO

下圖摘要說明上述範例的結果。

資料庫的邏輯和實體檔案名稱

請參閱

概念