1、文件與文件組 在SQL Server 中數(shù)據(jù)庫是由數(shù)據(jù)庫文件和事務(wù)日志文件組成的。一個(gè)數(shù)據(jù)庫至少應(yīng)包含一個(gè)數(shù)據(jù)庫文件和一個(gè)事物日志文件。 (1) 數(shù)據(jù)庫文件(Database File) 數(shù)據(jù)庫文件是存放數(shù)據(jù)庫數(shù)據(jù)和數(shù)據(jù)庫對(duì)象的文件。一個(gè)數(shù)據(jù)庫可以有一個(gè)或多個(gè)數(shù)據(jù)庫文件,一個(gè)數(shù)據(jù)庫文件只屬于一個(gè)數(shù)據(jù)庫。當(dāng)有多個(gè)數(shù)據(jù)庫文件時(shí),有一個(gè)文件被定義為主數(shù)據(jù)庫文件(Primary Database File), 擴(kuò)展名為mdf, 它用來存儲(chǔ)數(shù)據(jù)庫的啟動(dòng)信息和部分或全部數(shù)據(jù),一個(gè)數(shù)據(jù)庫只能有一個(gè)主數(shù)據(jù)庫文件。其它數(shù)據(jù)庫文件被稱為次數(shù)據(jù)庫文件(Secondary Database File), 擴(kuò)展名為ndf, 用來存儲(chǔ)主文件沒存儲(chǔ)的其它數(shù)據(jù)。
采用多個(gè)數(shù)據(jù)庫文件來存儲(chǔ)數(shù)據(jù)的優(yōu)點(diǎn)體現(xiàn)在: ·數(shù)據(jù)庫文件可以不斷擴(kuò)充,而不受操作系統(tǒng)文件大小的限制; ·可以將數(shù)據(jù)庫文件存儲(chǔ)在不同的硬盤中,這樣可以同時(shí)對(duì)幾個(gè)硬盤做數(shù)據(jù)存取,提高了數(shù)據(jù)處理的效率。對(duì)于服務(wù)器型的計(jì)算機(jī)尤為有用。
(2) 事務(wù)日志文件(Transaction Log File) 事務(wù)日志文件是用來記錄數(shù)據(jù)庫更新情況的文件,擴(kuò)展名為ldf。例如使用INSERT、UPDATE、 DELETE、 等對(duì)數(shù)據(jù)庫進(jìn)行更的操作都會(huì)記錄在此文件中,而如SELECT 等對(duì)數(shù)據(jù)庫內(nèi)容不會(huì)有影響的操作則不會(huì)記錄在案。一個(gè)數(shù)據(jù)庫可以有一個(gè)或多個(gè)事務(wù)日志文件。
SQL Server 中采用“Write-Ahead (提前寫)”方式的事務(wù),即對(duì)數(shù)據(jù)庫的修改先寫入事務(wù)日志中,再寫入數(shù)據(jù)庫。其具體操作是,系統(tǒng)先將更改操作寫入事務(wù)日志中,再更改存儲(chǔ)在計(jì)算機(jī)緩存中的數(shù)據(jù),為了提高執(zhí)行效率,此更改不會(huì)立即寫到硬盤中的數(shù)據(jù)庫,而是由系統(tǒng)以固定4 的時(shí)間間隔執(zhí)行CHECKPOINT 命令,將更改過的數(shù)據(jù)批量寫入硬盤。SQL Server 有個(gè)特點(diǎn),它在執(zhí)行數(shù)據(jù)更改時(shí)會(huì)設(shè)置一個(gè)開始點(diǎn)和一個(gè)結(jié)束點(diǎn),如果尚未到達(dá)結(jié)束點(diǎn)就因某種原因使操作中斷,則在SQL Server 重新啟動(dòng)時(shí)會(huì)自動(dòng)恢復(fù)已修改的數(shù)據(jù),使其返回未被修改的狀態(tài)。 由此可見,當(dāng)數(shù)據(jù)庫破壞時(shí),可以用事務(wù)日志恢復(fù)數(shù)據(jù)庫內(nèi)容。
(3) 文件組(File Group) 文件組是將多個(gè)數(shù)據(jù)庫文件集合起來形成的一個(gè)整體。每個(gè)文件組有一個(gè)組名。與數(shù)據(jù)庫文件一樣,文件組也分為主文件組(Primary File Group) 和次文件組(Secondary FileGroup) 一個(gè)文件只能存在于一個(gè)文件組中,一個(gè)文件組也只能被一個(gè)數(shù)據(jù)庫使用。主文件組中包含了所有的系統(tǒng)表。當(dāng)建立數(shù)據(jù)庫時(shí),主文件組包括主數(shù)據(jù)庫文件和未指定組的其它文件。在次文件組中可以指定一個(gè)缺省文件組,那么在創(chuàng)建數(shù)據(jù)庫對(duì)象時(shí)如果沒有指定將其放在哪一個(gè)文件組中,就會(huì)將它放在缺省文件組中。如果沒有指定缺省文件組則主文件組,為缺省文件組。 注意:事務(wù)日志文件不屬于任何文件組。
6.1.2 用Enterprise Manager 創(chuàng)建數(shù)據(jù)庫 在Enterprise Manager 中可以按下列步驟來創(chuàng)建數(shù)據(jù)庫: (1) 單擊工具欄中的圖標(biāo) ,或在服務(wù)器的Databases 文件夾或其下屬數(shù)據(jù)庫圖標(biāo)上單擊右鍵,選擇New Database…選項(xiàng),即會(huì)出現(xiàn)如圖6-1 所示的對(duì)話框。 (2) 指定數(shù)據(jù)庫的名稱和編碼方式,如圖6-1 所示。
 圖6-1 創(chuàng)建數(shù)據(jù)庫對(duì)話框 (3) 點(diǎn)擊Transaction Log 頁框,指定數(shù)據(jù)庫文件的名稱、存儲(chǔ)位置、初始容量大小和所屬文件組,如圖6-2 所示。 (4) 進(jìn)行數(shù)據(jù)庫文件大小擴(kuò)充方式和容量限制設(shè)置,如圖6-2 所示。 (5) 點(diǎn)擊Transaction Log 頁框,指定事務(wù)日志文件的名稱、存儲(chǔ)位置和初始容量大小,如圖6-3 所示。 (6) 進(jìn)行事務(wù)日志文件大小擴(kuò)充方式和容量限制設(shè)置,如圖6-3 所示。
  (7) 單擊“確定”按鈕,則建新數(shù)據(jù)庫。 注意:數(shù)據(jù)庫的名稱最長(zhǎng)為128個(gè)字符,且不區(qū)分大小寫。 注意:在此指定的文件容量以MB為單們的,數(shù)據(jù)庫文件的最小容量為1MB,最大容量為1,048,516TB(這么大的硬盤還沒出世!);事務(wù)日志文件的最小容量為1MB。 一個(gè)服務(wù)器在理論上可以管理32,767數(shù)據(jù)庫。
6.1.3 用CREATE DATABASE 命令創(chuàng)建數(shù)據(jù)庫
 各參數(shù)說明如下:
- database_name
數(shù)據(jù)庫名稱,不能超過128 個(gè)字符,由于系統(tǒng)會(huì)在其后添加5 個(gè)字符的邏輯后綴,因此實(shí)際能指定的字符數(shù)為123 個(gè)。
- on
指明數(shù)據(jù)庫文件和文件組的明確定義。
- PRIMARY
指明主數(shù)據(jù)庫文件或主文件組。主文件組的第一個(gè)文件被認(rèn)為是主數(shù)據(jù)庫文件,其中包含了數(shù)據(jù)庫的邏輯啟動(dòng)信息和數(shù)據(jù)庫的系統(tǒng)表。如果沒有PRIMARY 項(xiàng),則在CREATE DATABASE 命令中列出的第一個(gè)文件將被默認(rèn)為主文件。
- filespec
文件說明。
- n
占位符表明可以指定多個(gè)類似的對(duì)象。
- filegroupspec
文件組說明。
- LOG ON>
指明事務(wù)日志文件的明確定義。如果沒有LOG ON 選項(xiàng),則系統(tǒng)會(huì)自動(dòng)產(chǎn)生一個(gè)文件名前綴與數(shù)據(jù)庫名相同,容量為所有數(shù)據(jù)庫文件大小1/4 的事務(wù)日志文件。
- COLLATE
指明數(shù)據(jù)庫使用的校驗(yàn)方式。collation_name 可以是Windows 的校驗(yàn)方式名稱,也可以是SQL 校驗(yàn)方式名稱。如果省略此子句,則數(shù)據(jù)庫使用當(dāng)前的SQL Server 設(shè)置的校驗(yàn)方式。
- FOR LOAD
此選項(xiàng)是為了與SQL Server 7.0 以前的版本兼容而設(shè)定的。讀者可以不用管它。RESTORE 命令可以更好地實(shí)現(xiàn)此功能。
- FOR ATTACH
用于附加已經(jīng)存在的數(shù)據(jù)庫文件到新的數(shù)據(jù)庫中,而不用重新創(chuàng)建數(shù)據(jù)庫文件。使用此命令必須指定主文件。被附加的數(shù)據(jù)庫文件的代碼頁(Code Page)和排序次序(Sort Order)必須和目前SQL Server 所使用的一致。建議使用sp_attach_db 系統(tǒng)存儲(chǔ)過程來代替此命令(關(guān)于sp_attach_db 系統(tǒng)存儲(chǔ)過程的用法請(qǐng)參見本章的第7 節(jié)“移動(dòng)和復(fù)制數(shù)據(jù)庫”)。CREATE DATABASE FOR ATTACH 命令只有在指定的文件數(shù)目超過16 個(gè)時(shí)才必須使用。
- NAME
指定文件在SQL Server 中的邏輯名稱。當(dāng)時(shí)用FOR ATTACH 選項(xiàng)時(shí),就不需要使用 NAME 選項(xiàng)了。
- FILENAME
指定文件在操作系統(tǒng)中存儲(chǔ)的路徑名和文件名稱。
- SIZE
指定數(shù)據(jù)庫的初始容量大小。如果沒有指定主文件的大小,則SQL Server 默認(rèn)其與模板數(shù)據(jù)庫中的主文件大小一致,其它數(shù)據(jù)庫文件和事務(wù)日志文件則默認(rèn)為1 MB。 指定大小的數(shù)字size 可以使用KB、 MB、 GB、 和TB 后綴,默認(rèn)的后綴是MB。 size 中不能使用小數(shù),其最小值為512 KB, 默認(rèn)值是1MB。 主文件的size 不能小于模板數(shù)據(jù)庫中的主文件(關(guān)于模板數(shù)據(jù)庫的介紹請(qǐng)參見本章最后一節(jié))。
- MAXSIZE
指定文件的最大容量。如果沒有指定MAXSIZE, 則文件可以不斷增長(zhǎng)直到充滿磁盤。
- UNLIMITED
指明文件無容量限制。
- FILEGROTH
指定文件每次增容時(shí)增加的容量大小。增加量可以為確定的以KB、 MB 作后綴的字節(jié)數(shù)或以%作后綴的被增容文件的百分比來表示。缺省后綴為MB。 如果沒有指定FILEGROWTH,則缺省值為10%, 每次擴(kuò)容的最小值為64 KB。 CREATE DATABASE 命令在SQL Server 中執(zhí)行時(shí)使用模板數(shù)據(jù)庫來初始化新建的數(shù)據(jù)庫(使用FOR ATTACH 選項(xiàng)時(shí)除外)。在模板數(shù)據(jù)庫中的所有用戶定義的對(duì)象和數(shù)據(jù)庫的設(shè)置都會(huì)被復(fù)制到新數(shù)據(jù)庫中。每個(gè)數(shù)據(jù)庫都有一個(gè)所有者(Database Owner,簡(jiǎn)稱DBO),創(chuàng)建數(shù)據(jù)庫的用戶被默認(rèn)為數(shù)據(jù)庫所有者。可以通過sp_changedbowner 系統(tǒng)存儲(chǔ)過程來更改數(shù)據(jù)庫所有者。
例6-1: 創(chuàng)建一個(gè)與上節(jié)中用Enterprise Manager 創(chuàng)建的數(shù)據(jù)庫類似的數(shù)據(jù)庫。 create database mydb on primary ( name = mydb_data1, filename = 'd:\sql data\mydb_data1.mdf', size = 1, maxsize = unlimited, filegrowth = 10% ), filegroup data2 ( name = mydb_data2, filename = 'd:\sql data\mydb_data2.ndf', size = 2, maxsize = 100, filegrowth = 1 ), filegroup data3 ( name = mydb_data3, filename = 'd:\sql data\mydb_data3.ndf', size = 3, maxsize = 50, filegrowth = 500kb ) log on ( name = 'mydb_log1', filename = 'd:\sql data\mydb_log1.ldf', size = 1mb, maxsize = 25mb, filegrowth = 10% ), ( name = 'mydb_log2', filename = 'd:\sql data\mydb_log2.ldf', size = 1mb, maxsize = 10mb, filegrowth = 10% ), ( name = 'mydb_log3', filename = 'd:\sql data\mydb_log3.ldf', size = 1mb, maxsize = 5mb, filegrowth = 512kb ) 運(yùn)行結(jié)果如下 -------------------- -------------------- The CREATE DATABASE process is allocating 1.00 MB on disk 'mydb_Data1'. The CREATE DATABASE process is allocating 2.00 MB on disk 'mydb_Data2'. The CREATE DATABASE process is allocating 3.00 MB on disk 'mydb_Data3'. The CREATE DATABASE process is allocating 1.00 MB on disk 'mydb_Log1'. The CREATE DATABASE process is allocating 1.00 MB on disk 'mydb_Log2'. The CREATE DATABASE process is allocating 1.00 MB on disk 'mydb_Log3'. |