ALTER DATABASE 檔案及檔案群組選項 (Transact-SQL)

修改與資料庫相關聯的檔案和檔案群組。在資料庫中新增或移除檔案和檔案群組、變更資料庫或其檔案和檔案群組的屬性。如需其他 ALTER DATABASE 選項,請參閱<ALTER DATABASE (Transact-SQL)>。

主題連結圖示Transact-SQL 語法慣例

語法

ALTER DATABASE database_name 
{
    <add_or_modify_files>
  | <add_or_modify_filegroups>
}
[;]

<add_or_modify_files>::=
{
    ADD FILE <filespec> [ ,...n ] 
        [ TO FILEGROUP { filegroup_name } ]
  | ADD LOG FILE <filespec> [ ,...n ] 
  | REMOVE FILE logical_file_name 
  | MODIFY FILE <filespec>
}

<filespec>::= 
(
    NAME = logical_file_name  
    [ , NEWNAME = new_logical_name ] 
    [ , FILENAME = {'os_file_name' | 'filestream_path' } ] 
    [ , SIZE = size [ KB | MB | GB | TB ] ] 
    [ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ] 
    [ , FILEGROWTH = growth_increment [ KB | MB | GB | TB| % ] ] 
    [ , OFFLINE ]
) 

<add_or_modify_filegroups>::=
{
    | ADD FILEGROUP filegroup_name 
        [ CONTAINS FILESTREAM ]
    | REMOVE FILEGROUP filegroup_name 
    | MODIFY FILEGROUP filegroup_name
        { <filegroup_updatability_option> 
        | DEFAULT
        | NAME = new_filegroup_name 
        }
}
<filegroup_updatability_option>::=
{
    { READONLY | READWRITE } 
    | { READ_ONLY | READ_WRITE }
}

引數

<add_or_modify_files>::=

指定要新增、移除或修改的檔案。

  • database_name
    這是要修改的資料庫名稱。

  • ADD FILE
    將檔案加入資料庫中。

    • TO FILEGROUP { filegroup_name }
      指定要加入指定檔案的檔案群組。若要顯示目前檔案群組及目前是預設值的檔案群組,請使用 sys.filegroups 目錄檢視。
  • ADD LOG FILE
    將記錄檔加入指定的資料庫中。

  • REMOVE FILE logical_file_name
    從 SQL Server 執行個體中移除邏輯檔案描述和刪除實體檔案。除非檔案是空的,否則無法移除檔案。

    • logical_file_name
      這是在參考檔案時,SQL Server 所用的邏輯名稱。
  • MODIFY FILE
    指定應該修改的檔案。每次只能變更一個 <filespec> 屬性。您必須在 <filespec> 中指定 NAME,以識別要修改的檔案。如果指定了 SIZE,新的大小必須大於目前檔案大小。

    若要修改資料檔或記錄檔的邏輯名稱,請在 NAME 子句中指定要重新命名的邏輯檔案名稱,在 NEWNAME 子句中指定檔案的新邏輯名稱。例如:

    MODIFY FILE ( NAME = logical_file_name, NEWNAME = new_logical_name ) 
    

    若要將資料檔或記錄檔移至新的位置,請在 NAME 子句中指定目前的邏輯檔案名稱,在 FILENAME 子句中指定新的路徑和作業系統檔案名稱。例如:

    MODIFY FILE ( NAME = logical_file_name, FILENAME = ' new_path/os_file_name ' )
    

    當您移動全文檢索目錄時,只有當 FILENAME 子句中指定新的路徑。請勿指定作業系統檔案名稱。

    如需詳細資訊,請參閱<移動資料庫檔案>。

    如果是 FILESTREAM 檔案群組,可以在線上修改 NAME。可以在線上修改 FILENAME;但是,要等到實際重新放置容器且伺服器關閉並重新啟動之後,變更才會生效。

    您可以將 FILESTREAM 檔案設定為 OFFLINE。當 FILESTREAM 檔案離線時,它的父檔案群組會在內部標示為離線;因此,該檔案群組內 FILESTREAM 資料的所有存取都將失敗。

<filespec>::=

控制檔案屬性。

  • NAME logical_file_name
    指定檔案的邏輯名稱。

    • logical_file_name
      這是在參考檔案時,SQL Server 執行個體所用的邏輯名稱。
  • NEWNAME new_logical_file_name
    指定檔案的新邏輯名稱。

    • new_logical_file_name
      這是要取代現有邏輯檔案名稱的名稱。這個名稱在資料庫內必須是唯一的,且必須符合識別碼的規則。這個名稱可以是字元或 Unicode 常數、正規識別碼,或分隔的識別碼。如需詳細資訊,請參閱<將識別碼當成物件名稱使用>。
  • FILENAME { 'os_file_name' | 'filestream_path' }
    指定作業系統 (實體) 檔案名稱。

    • ' os_file_name '
      如果是標準 (ROWS) 檔案群組,這就是當您建立檔案時,作業系統所用的路徑和檔案名稱。這個檔案必須在安裝了 SQL Server 的伺服器中。在執行 ALTER DATABASE 陳述式之前,指定的路徑必須已經存在。

      當指定檔案的 UNC 路徑時,無法設定 SIZE、MAXSIZE 和 FILEGROWTH 參數。

      除非檔案是唯讀的次要檔案,或資料庫是唯讀的,否則,不應將資料檔放在壓縮的檔案系統中。記錄檔永遠不應放在壓縮的檔案系統中。如需詳細資訊,請參閱<唯讀檔案群組和壓縮>。

      如果檔案在原始資料分割中,os_file_name 只能指定現有原始資料分割的磁碟機代號。每個原始資料分割只能放置一個檔案。

    • 'filestream_path'
      如果是 FILESTREAM 檔案群組,FILENAME 會參考儲存 FILESTREAM 資料所在的路徑。到最後一個資料夾為止的路徑必須存在,而最後一個資料夾必須不存在。例如,如果您指定 C:\MyFiles\MyFilestreamData 路徑,則在您執行 ALTER DATABASE 之前,C:\MyFiles 必須存在,但是 MyFilestreamData 資料夾不能存在。

      檔案群組和檔案 (<filespec>) 必須在相同的陳述式中建立。FILESTREAM 檔案群組只能有一個檔案 <filespec>,。

      SIZE、MAXSIZE 和 FILEGROWTH 屬性不會套用到 FILESTREAM 檔案群組。

  • SIZE size
    指定檔案大小。SIZE 不會套用到 FILESTREAM 檔案群組。

    • size
      這是檔案的大小。

      當設定 ADD FILE 來指定時,size 是檔案的起始大小。當設定 MODIFY FILE 來指定時,size 是檔案的新大小,且必須大於目前的檔案大小。

      當未提供主要檔案的大小 (size) 時,SQL Server 會採用 model 資料庫中主要檔案的大小。當指定了次要資料檔或記錄檔,但未指定檔案的大小 (size ) 時,Database Engine 會使檔案成為 1 MB。

      您可以利用 KB、MB、GB 和 TB 後置詞來指定千位元組、百萬位元組、十億位元組或兆位元組。預設值是 MB。請指定不包括小數的整數。若要指定 MB 的小數,請將數字乘以 1024,以便將值轉換成 KB。例如,請指定 1536 KB,而不要指定 1.5 MB (1.5 x 1024 = 1536)。

  • MAXSIZE { max_size| UNLIMITED }
    指定檔案所能成長的大小上限。MAXSIZE 不會套用到 FILESTREAM 檔案群組。

    • max_size
      這是檔案大小上限。您可以利用 KB、MB、GB 和 TB 後置詞來指定千位元組 (KB)、百萬位元組 (MB)、十億位元組 (GB) 或兆位元組 (TB)。預設值是 MB。請指定不包括小數的整數。如果未指定 max_size,檔案大小會增加到磁碟已滿。

    • UNLIMITED
      指定檔案可成長直到磁碟已滿。在 SQL Server 中,指定為無限成長的記錄檔,大小上限是 2 TB,資料檔的大小上限是 16 TB。

  • FILEGROWTH growth_increment
    指定檔案的自動成長遞增。檔案的 FILEGROWTH 設定不能超過 MAXSIZE 設定。FILEGROWTH 不會套用到 FILESTREAM 檔案群組。

    • growth_increment
      這是每次需要新空間時,檔案所增加的空間量。

      您可以利用 MB、KB、GB、TB 或百分比 (%) 來指定這個值。如果指定的數字不含 MB、KB 或 % 後置詞,預設值是 MB。當指定 % 時,成長遞增大小便是遞增發生時,檔案大小的指定百分比。指定的大小會捨入到最接近 64 KB。

      0 值表示將自動成長設為關閉,且不允許任何其他空間。

      如果未指定 FILEGROWTH,資料檔的預設值是 1 MB,記錄檔的預設值是 10%,最小值是 64 KB。

      [!附註]

      從 SQL Server 2005 開始,資料檔的預設成長遞增已從 10% 改成 1 MB。記錄檔預設值 10% 維持不變。

  • OFFLINE
    將檔案設成離線,使檔案群組中的所有物件都成為無法存取。

    警告注意事項警告

    請只在檔案損毀且可以還原時,才使用這個選項。設為 OFFLINE 的檔案,只能藉由從備份中還原檔案來設成連接。如需有關還原單一檔案的詳細資訊,請參閱<RESTORE (Transact-SQL)>。

<add_or_modify_filegroups>::=

在資料庫中新增、修改或移除檔案群組。

  • ADD FILEGROUP filegroup_name
    將檔案群組加入資料庫中。

  • CONTAINS FILESTREAM
    指定檔案群組會將 FILESTREAM 二進位大型物件 (BLOB) 儲存在檔案系統中。

  • REMOVE FILEGROUP filegroup_name
    從資料庫中移除檔案群組。除非檔案群組是空的,否則無法移除檔案群組。請先移除檔案群組中的所有檔案。如需詳細資訊,請參閱本主題前面的「REMOVE FILE logical_file_name」。

  • MODIFY FILEGROUP filegroup_name { <filegroup_updatability_option> | DEFAULT | NAME **=**new_filegroup_name }
    將狀態設成 READ_ONLY 或 READ_WRITE,使檔案群組成為資料庫的預設檔案群組,或變更檔案群組名稱,來修改檔案群組。

    • <filegroup_updatability_option>
      將檔案群組的屬性設成唯讀或讀取/寫入。

    • DEFAULT
      將預設資料庫檔案群組改為 filegroup_name。資料庫中只能有一個檔案群組是預設檔案群組。如需詳細資訊,請參閱<了解檔案及檔案群組>。

    • NAME = new_filegroup_name
      將檔案群組名稱改為 new_filegroup_name。

<filegroup_updatability_option>::=

將檔案群組的屬性設成唯讀或讀取/寫入。

  • READ_ONLY | READONLY
    將檔案群組指定成唯讀狀態。不允許更新其中的物件。主要檔案群組不能設為唯讀。若要變更這個狀態,您必須有資料庫的獨佔存取權。如需詳細資訊,請參閱 SINGLE_USER 子句。

    由於唯讀資料庫不允許修改資料,因此,會出現下列情況:

    • 在系統開機時跳過自動復原。

    • 不可能壓縮資料庫。

    • 唯讀資料庫不會出現鎖定。因此,查詢效能會比較快。

    [!附註]

    在未來的 MicrosoftSQL Server 版本中,將移除 READONLY 關鍵字。請避免在新的開發工作中使用 READONLY,並規劃修改目前在使用 READONLY 的應用程式。請改用 READ_ONLY。

  • READ_WRITE | READWRITE
    將群組指定成 READ_WRITE 狀態。檔案群組中的物件可以更新。若要變更這個狀態,您必須有資料庫的獨佔存取權。如需詳細資訊,請參閱 SINGLE_USER 子句。

    [!附註]

    在未來的 MicrosoftSQL Server 版本中,將移除 READWRITE 關鍵字。請避免在新的開發工作中使用 READWRITE,並規劃修改目前在使用 READWRITE 的應用程式。請改用 READ_WRITE。

您可以檢查 sys.databases 目錄檢視中的 is_read_only 資料行或 DATABASEPROPERTYEX 函數的 Updateability 屬性來判斷這些選項的狀態。

備註

若要縮小資料庫大小,請使用 DBCC SHRINKDATABASE

當 BACKUP 陳述式在執行中,您不能新增或移除檔案。

每個資料庫最多可以指定 32,767 個檔案和 32,767 個檔案群組。

在 SQL Server 2005 或更新版本中,資料庫檔案狀態 (如線上或離線) 的維護與資料庫狀態無關。如需詳細資訊,請參閱<檔案狀態>。檔案群組內的檔案狀態決定了整個檔案群組的可用性。若要能夠使用檔案群組,檔案群組內的所有檔案都必須在線上。如果檔案群組離線,SQL 陳述式存取檔案群組的任何嘗試都會失敗,且會出現錯誤。當您建置 SELECT 陳述式的查詢計畫時,查詢最佳化工具會避開在離線檔案群組中的非叢集索引和索引檢視。這使得這些陳述式能夠執行成功。不過,如果這個離線檔案群組包含目標資料表的堆積或叢集索引,SELECT 陳述式便會失敗。另外,當資料表有任何索引在離線檔案群組中時,任何修改這份資料表的 INSERT、UPDATE 或 DELETE 陳述式都會失敗。

移動檔案

在 SQL Server 2005 或更新版本中,您可以在 FILENAME 中指定新位置來移動系統或使用者定義資料和記錄檔。在下列狀況中,這非常有用:

  • 失敗復原。例如,在質疑模式的資料庫或硬體故障所造成的關閉。

  • 計畫的重新放置。

  • 重新放置排程的磁碟維護。

如需詳細資訊,請參閱<移動資料庫檔案>。

初始化檔案

依預設,資料和記錄檔初始化的方式是在您執行下列作業之一時,在檔案中填入 0:

  • 建立資料庫。

  • 將檔案加入現有的資料庫中。

  • 增加現有檔案的大小。

  • 還原資料庫或檔案群組。

資料檔可以立即初始化。這可以加快這些檔案作業的執行速度。如需詳細資訊,請參閱<資料庫檔案初始化>。

範例

A. 將檔案加入資料庫中

下列範例會將 5 MB 的資料檔加入 AdventureWorks 資料庫中。

USE master;
GO
ALTER DATABASE AdventureWorks 
ADD FILE 
(
    NAME = Test1dat2,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\t1dat2.ndf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB

);
GO

B. 將含有兩個檔案的檔案群組加入資料庫中

下列範例會在 AdventureWorks 資料庫中建立 Test1FG1 檔案群組,且會將兩個 5 MB 的檔案加入檔案群組中。

USE master
GO
ALTER DATABASE AdventureWorks
ADD FILEGROUP Test1FG1;
GO

ALTER DATABASE AdventureWorks 
ADD FILE 
(
    NAME = test1dat3,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\t1dat3.ndf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB
),
(
    NAME = test1dat4,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\t1dat4.ndf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB
)
TO FILEGROUP Test1FG1;
GO

C. 將兩個記錄檔加入資料庫中

下列範例會將兩個 5 MB 的記錄檔加入 AdventureWorks 資料庫中。

USE master;
GO
ALTER DATABASE AdventureWorks 
ADD LOG FILE 
(
    NAME = test1log2,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test2log.ldf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB
),
(
    NAME = test1log3,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test3log.ldf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB
);
GO

D. 從資料庫中移除檔案

下列範例會移除 B 範例中所加入的其中一個檔案。

USE master;
GO
ALTER DATABASE AdventureWorks
REMOVE FILE test1dat4;
GO

E. 修改檔案

下列範例會增加 B 範例中所加入的其中一個檔案的大小。

USE master;
GO
ALTER DATABASE AdventureWorks 
MODIFY FILE
    (NAME = test1dat3,
    SIZE = 20MB);
GO

F. 將檔案移到新位置

下列範例會將 A 範例中所建立的 Test1dat2 檔移至新目錄中。

[!附註]

您必須實際上將檔案移到新目錄之後,才能執行這個範例。之後,請停止再啟動 SQL Server 的執行個體,或使 AdventureWorks 資料庫離線 (OFFLINE) 再連接 (ONLINE),來實作變更。

USE master;
GO
ALTER DATABASE AdventureWorks
MODIFY FILE
(
    NAME = Test1dat2,
    FILENAME = N'c:\t1dat2.ndf'
);
GO

G. 將 tempdb 移到新位置

下列範例會將 tempdb 從磁碟中目前的位置移到另一個磁碟位置。由於在每次啟動 MSSQLSERVER 服務時都會重新建立 tempdb,因此您不需要實際移動資料和記錄檔。在步驟 3 重新啟動此服務時,將會建立檔案。在重新啟動此服務之前,tempdb 會繼續在現有的位置運作。

  1. 決定 tempdb 資料庫的邏輯檔案名稱,及它們目前在磁碟中的位置。

    SELECT name, physical_name
    FROM sys.master_files
    WHERE database_id = DB_ID('tempdb');
    GO
    
  2. 請利用 ALTER DATABASE 來變更每個檔案的位置。

    USE master;
    GO
    ALTER DATABASE tempdb 
    MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQLData\tempdb.mdf');
    GO
    ALTER DATABASE  tempdb 
    MODIFY FILE (NAME = templog, FILENAME = 'E:\SQLData\templog.ldf');
    GO
    
  3. 停止和重新啟動 SQL Server 執行個體。

  4. 確認檔案變更。

    SELECT name, physical_name
    FROM sys.master_files
    WHERE database_id = DB_ID('tempdb');
    
  5. 將 tempdb.mdf 和 templog.ldf 檔案從它們的原始位置刪除。

H. 使檔案群組成為預設值

下列範例會使 B 範例所建立的 Test1FG1 檔案群組成為預設檔案群組。之後,預設檔案群組會重設為 PRIMARY 檔案群組。請注意,您必須用方括號或引號來分隔 PRIMARY。

USE master;
GO
ALTER DATABASE AdventureWorks 
MODIFY FILEGROUP Test1FG1 DEFAULT;
GO
ALTER DATABASE AdventureWorks 
MODIFY FILEGROUP [PRIMARY] DEFAULT;
GO

I. 使用 ALTER DATABASE 加入檔案群組

下列範例會將包含 FILESTREAM 子句的 FILEGROUP 加入 FileStreamPhotoDB 資料庫。

--Create and add a FILEGROUP that CONTAINS the FILESTREAM clause to
--the FileStreamPhotoDB database.
ALTER database FileStreamPhotoDB
ADD FILEGROUP TodaysPhotoShoot
CONTAINS FILESTREAM
GO

--Add a file for storing database photos to FILEGROUP 
ALTER database FileStreamPhotoDB
ADD FILE
(
    NAME= 'PhotoShoot1',
    FILENAME = 'C:\Users\Administrator\Pictures\TodaysPhotoShoot.ndf'
)
TO FILEGROUP TodaysPhotoShoot
GO