sqlserver中文件和文件組的概念
參考文獻:博客:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html
sql server 中,數據庫在硬盤上的存儲方式和普通文件在windows中的存儲方式沒有什么不同,僅僅是幾個文件而已,sql server通過管理
邏輯上的文件組的方式來管理文件。
在sql server中,通過文件組這個邏輯對象來存放數據文件進行管理。
我們看到邏輯數據庫由一個或多個文件組構成。文件組管理着磁盤上的文件,文件中存放着實際數據。對於用戶角度來說
需要對創建的對象指定存儲的文件組只有三種數據:表,索引,大對象使用文件組可以隔離用戶和文件,使得用戶針對文件組來建立表和索引,而不是實際磁中的文件,
當文件移動或修改時,由於用戶建立的表和索引是建立在文件組上的,並不依賴於具體文件,這大大加強了可管理性(類似於:sqlserver 中架構的概念)
使用文件組來管理文件可以使得同一文件組內的不同文件分布在不同的硬盤中,提高了IO性能,
sqlserver會根據每個文件設置的初始大小和增長量自動分配新加入的空間,假設在同一文件組中的文件A設置的大小為文件B的兩倍,
新增一個數據占用三頁(Page),則按比例將2頁分配到文件A中,1頁分配到文件B中.
換一種說法,幫助你理解
1、文件和文件組的含義與關系
每個數據庫有一個主數據文件.和若干個從文件。文件是數據庫的物理體現。 文件組可以包括分布在多個邏輯分區的文件,實現負載平衡。文件組允許對文件進行分組,以便於管理和數據的分配/放置。例如,可以分別在三個硬盤驅動器上創建三個文件(Data1.ndf、Data2.ndf 和 Data3.ndf),並將這三個文件指派到文件組 fgroup1 中。然后,可以明確地在文件組 fgroup1 上創建一個表。對表中數據的查詢將分散到三個磁盤上,因而性能得以提高。在 RAID(磁盤冗余陣列)條帶集上創建單個文件也可以獲得相同的性能改善。然而,文件和文件組使您得以在新磁盤上輕易地添加新文件。另外,如果數據庫超過單個 Microsoft Windows 文件的最大大小,則可以使用次要數據文件允許數據庫繼續增長。
2、文件、文件組在實踐應用中常見的問題
通常情況下我們構造的數據庫都只有兩個文件,mdf文件和ldf文件.但是這樣有兩個缺點:
(一)容易導致文件過大
我們知道,mdf文件是數據庫文件,這樣的話也就意味着隨着數據庫的增大mdf就會相應的增大,顯然在現在的應用中數據膨脹是太常見的事情了,當你的應用變大后,mdf文件也會變大,然而windows對文件的大小是有要求的,這樣的話很容易導致mdf文件達到windows所允許的文件大小的界限(於是數據庫就崩潰了)。
(二)沒有利用到磁盤陣列
大型的服務器好多都有磁盤陣列,你可以把磁盤陣列簡單的假象成n個一塊轉動的磁盤,磁盤陣列的設計是希望通過多個磁盤的串聯來得到更大的讀寫效率.但是如果你的數據庫只有一個mdf文件(ldf文件暫時不考慮),那么你總是只能夠利用這個磁盤陣列里面的一個磁盤而已.那樣的話昂貴的磁盤陣列的效率就由並聯變成串聯了.試想如果我們能夠讓mdf分散成多個文件,比如說磁盤陣列上的每個磁盤中都分配一個文件,然后把mdf中的數據分散到各個文件中,我在讀取的時候就是串聯的讀取了,這樣就充分的利用了磁盤陣的存取效能.
這兩個問題平常我們沒有遇到過(條件不具備),但是做大型的服務開發的時候這幾乎是致命的.
3.文件分類:
首要文件:這個文件是必須有的,而且只能有一個。這個文件額外存放了其他文件的位置等信息.擴展名為.mdf
次要文件:可以建任意多個,用於不同目的存放.擴展名為.ndf
日志文件:存放日志,擴展名為.ldf
文件 | 說明 |
---|---|
主要 |
主要數據文件包含數據庫的啟動信息,並指向數據庫中的其他文件。用戶數據和對象可存儲在此文件中,也可以存儲在次要數據文件中。每個數據庫有一個主要數據文件。主要數據文件的建議文件擴展名是 .mdf。 |
次要 |
次要數據文件是可選的,由用戶定義並存儲用戶數據。通過將每個文件放在不同的磁盤驅動器上,次要文件可用於將數據分散到多個磁盤上。另外,如果數據庫超過了單個 Windows 文件的最大大小,可以使用次要數據文件,這樣數據庫就能繼續增長。 次要數據文件的建議文件擴展名是 .ndf。 |
事務日志 |
事務日志文件保存用於恢復數據庫的日志信息。每個數據庫必須至少有一個日志文件。事務日志的建議文件擴展名是 .ldf。 |
4.默認文件組
如果在數據庫中創建對象時沒有指定對象所屬的文件組,對象將被分配給默認文件組。不管何時,只能將一個文件組指定為默認文件組。默認文件組中的文件必須足夠大,能夠容納未分配給其他文件組的所有新對象。
PRIMARY 文件組是默認文件組,除非使用 ALTER DATABASE 語句進行了更改。但系統對象和表仍然分配給 PRIMARY 文件組,而不是新的默認文件組。
我們可以通過下面的語句來查看數據庫中的文件情況。
還有一點要注意的是,如果一個表是存在物理上的多個文件中時,則表的數據頁的組織為N(N為具體的幾個文件)個B樹.而不是一個對象為一個B樹.
對一個數據庫來說,既可以在創建時增加文件和文件組 也可以向現有的數據添加文件和文件組(默認就屬於primary文件組)
那么數據庫中建立多少文件組才合理呢?
看這里:http://www.sqlskills.com/blogs/paul/files-and-filegroups-survey-results/
5.具體操作
我們使用sql 語句來操作文件組(好像高手,一般都用SQL語句滴哦~~~)
CREATE DATABASE TEST ON PRIMARY --指定主要文件 ( NAME=TEST, FILENAME='F:\db\TEST.MDF', SIZE=50MB, MAXSIZE=100MB, --也可以指定為UNLIMITED FILEGROWTH=5% --中定義的文件的增長增量。文件的 FILEGROWTH 設置不能超過 MAXSIZE 設置 ), ( NAME=TESTLDF01, FILENAME='F:\db\TESTLDF01.NDF', SIZE=100MB, MAXSIZE=200MB, FILEGROWTH=5% ), ( NAME=TESTLDF02, FILENAME='F:\db\TESTLDF02.NDF', SIZE=100MB, MAXSIZE=200MB, FILEGROWTH=5% ) LOG ON ( NAME=TESTLOG, FILENAME='F:\db\TEST.LDF', SIZE=10, MAXSIZE=50, FILEGROWTH=5% ) --Test 自動歸於默認文件組 GO /* 一些參數解析: --FILEGROWTH-- 每次需要新的空間時為文件添加的空間大小。指定一個整數,不要包含小數位。 0 值表示不增長。該值可以 MB、KB、GB、TB 或百分比 (%) 為單位指定。 如果未在數量后面指定 MB、KB 或 %,則默認值為 MB。如果指定 %, 則增量大小為發生增長時文件大小的指定百分比。如果沒有指定 FILEGROWTH, 則默認值為 10%,最小值為 64 KB。指定的大小舍入為最接近的 64 KB 的倍數。 FILEGROWTH 的設置要合理: 默認SQL Server 在數據庫文件滿了后,是自動增加原數據庫文件的10%大小,用來繼續使用。 如果使用按照百分比增加,而此時數據庫又在繁忙的使用當中。一旦你的數據庫文件大了后, 上述超時就可能出現。這時候不要簡單地以為服務器壓力太大了。也許就是你的一個設置導致了超時。 是數據庫文件在增加的時候超時了。而不是平常常以為的具體的SQL語句超時。 某一條數據更新語句在數據庫或日志文件即將滿的時候執行,數據庫增長的IO操作會導致延時, 此延時會阻塞其他數據庫操作,連鎖反應,形成blocking,這個時候數據庫會成假死現象。 過幾分鍾,當這條語句執行完后,數據文件就會增長完成,所有的blocking也就解開了。 SIZE、MAXSIZE 和 FILEGROWTH 參數中不能指定分數。若要在 SIZE 參數中指定以兆字節為單位的分數, 請將該數字乘以 1,024 轉換成千字節 */ --添加文件組 ALTER DATABASE TEST ADD FILEGROUP[GROUP_NAME] --添加文件並指定到某個文件組中; ALTER DATABASE TEST ADD FILE( NAME=N'TEST01', FILENAME='F:\TEST\TEST01.DNF', SIZE=50MB, MAXSIZE=100MB, FILEGROWTH=5MB ) TO FILEGROUP[GROUP_NAME] --修改文件 ALTER DATABASE TEST MODIFY FILE ( NAME=TEST01, SIZE=60MB )
--刪除文件組(一切關於刪除的操作,都小心點好....)
ALTER DATABASE TEST
REMOVE FILEGROUP[NAME]
--一旦刪除文件組,那么文件組中的所有表就拜拜了
一旦文件加入到文件組,不能切換文件組了。 (網上,查閱之后,好像是可以切換的滴..待定)
下面演示將表添加到指定的文件組中的滴樣子;
--創建數據庫 --添加加文件組(A) --三個NDF(DATA1.NDF DATA2.NDF DATA3.NDF)添加到A中 --將三個NDF 放在不同磁盤中 --然后,我們再針對文件組(A) 創建一個表(table_A) --那么 我們對表(table_A)的查詢分配到三個磁盤中,實現了,均衡負載 --SELECT * FROM sys.filegroups 查看當前數據庫中的 文件組 CREATE TABLE table_A( ID INT NOT NULL PRIMARY KEY IDENTITY(1,1), CITYNAME VARCHAR(100)
) ON GROUP_NAME
至於 界面操作,我就不將啦~~(我要去吃飯了...)
總結-優缺點:
通常情況下,小型的數據庫並不需要創建多個文件來分布數據。但是隨着數據的增長,使用單個文件的弊端就開始顯現。
首先:使用多個文件分布數據到多個硬盤中可以極大的提高IO性能.
其次:多個文件對於數據略多的數據庫來說,備份和恢復都會輕松很多.
但是,在數據庫的世界中,每一項好處往往伴隨着一個壞處:
顯而易見,使用多文件需要占用更多的磁盤空間。這是因為每個文件中都有自己的一套B樹組織方式,和自己的增長空間。當然了,還有一套自己的碎片,但是在大多數情況下,
多占點磁盤空間帶來的弊端要遠遠小於多文件帶來的好處.
還有針對文件組的備份:
看大牛博客:
http://www.cnblogs.com/gaizai/p/3582024.html