187.數據庫操做

第7章 數據庫的建立和管理數據庫

•     7.1數據庫和數據庫文件

 

7.1.1 數據庫的組成


  從操做系統的角度看,做爲存儲數據的邏輯對象,數據庫最終是以文件的形式保存在磁盤上。這些文件就是所謂的數據庫文件。數據庫文件又分爲數據文件和日誌文件。
  數據文件是數據庫用於存儲數據的操做系統文件,它保存了數據庫中的所有數據。數據文件又分爲主數據文件和次要數據文件。主數據文件是數據庫的起點,指向數據庫的其餘文件。每一個數據庫有且僅有一個主數據文件,而次要數據文件能夠有多個或沒有。主數據文件的默認擴展名是.mdf,次要數據文件的默認擴展名是.ndf。
       日誌文件記錄了針對數據庫的全部修改操做,其中每條日誌記錄多是記錄了所執行的邏輯操做,也可能記錄了已修改數據的前像和後像。前像是操做執行前的數據複本;後像是操做執行後的數據複本。日誌文件包含了用於恢復數據庫的全部日誌信息。利用日誌文件,能夠在數據庫出現故障或崩潰時把它恢復到最近的狀態,從而最大限度地減小由此帶來的損失。在建立數據庫的時候,默認建立一個日誌文件被,其推薦的文件擴展名是.ldf。每一個數據庫至少有一個日誌文件,固然也能夠有多個。


  數據文件和日誌文件能夠保存在FAT或NTFS文件系統中。但從安全性角度考慮,通常使用NTFS文件系統保存這些文件。數據文件名和日誌文件名是面向操做系統的,即操做系統是經過這些名稱來訪問數據文件和日誌文件。
  從邏輯結構看,數據庫是數據表的集合,此外數據庫還包含索引、視圖等「附屬部件」,數據表、索引、視圖等統稱爲數據庫對象。在建立數據庫的時候,咱們要給數據庫輸入一個合法的字符串做爲數據庫的名稱,這個名稱簡稱爲數據庫名。
  數據庫名是數據庫的邏輯名稱,應用程序對數據庫對象的訪問必須經過數據庫名來完成,即數據庫名是面向應用程序的(而非操做系統,數據庫文件是面向操做系統的)。另外,支撐數據庫的數據文件和日誌文件也有面嚮應用程序的名稱,分別稱爲數據文件和日誌文件的邏輯文件名。經過邏輯文件名,SQL語句就能夠有限度地訪問和操做數據文件和日誌文件。爲了區別於邏輯文件名,數據文件和日誌文件對應的磁盤文件(即.mdf文件、.ndf文件、.ldf文件)稱爲它們的物理文件名。
  對於每一個數據文件和日誌文件,它們既有本身的邏輯文件名(面向應用程序),也有本身的物理文件名(面向操做系統)。在SQL Server 2014中,當建立數據庫時會自動生成一個主數據文件和一個日誌文件。在默認狀況下,主數據文件的邏輯文件名與數據庫名(數據庫名由用戶設置)相同,其物理文件名等於其邏輯文件名加上擴展名「.mdf」;日誌文件的邏輯文件名等於數據庫名加上「_log」,日誌文件的物理文件名等於數據庫名加上「_log.ldf」。

  【例子】 當建立一個名爲MyDatabase的數據庫時,會自動造成一個主數據文件和一個日誌文件,其默認的邏輯文件和物理文件名如表7.1所示。安全

 


7.1.2 文件組    

  文件組是數據文件的一種邏輯劃分。文件組就是將若干個數據文件放在一塊兒而造成的文件集。
  文件組有兩種類型:主文件組(PRIMARY)和用戶定義文件組。
    主文件組包含主數據文件和任何沒有明確指定文件組的其餘數據文件。
    用戶定義文件組是用戶利用Transact-SQL語句或者在SQL Server Management Studio(SSMS)中經過可視化操做建立的文件組。
   一個文件組包含多個不一樣的數據文件,一個數據文件只能屬於一個文件組。一個數據庫至少有一個文件組(主文件組),也可能有多個文件組(至多爲32767個文件組)。在一個數據庫中,有且僅有一個文件組被指定爲默認文件組。在數據庫建立時主文件組會自動被設置爲默認文件組,但咱們也能夠將用戶定義文件組設置爲默認文件組。在建立數據表或者其餘數據庫對象的時候,若是不顯式指定文件組,那麼這些數據庫對象將自動在默認文件組上建立,即被建對象的全部頁都在默認文件組中分配。

服務器

•     7.2 數據庫的建立


7.2.1 建立數據庫的SQL語法


    建立數據庫可用CREATE DATABASE語句來完成,其語法以下:架構

CREATE DATABASE database_name
    [ ON
        [ PRIMARY ] [ <filespec> [ ,...n ]
        [ , <filegroup> [ ,...n ] ]
    [ LOG ON { <filespec> [ ,...n ] } ]
    ]
    [ COLLATE collation_name ]
    [ WITH <external_access_option> ]
]
[;]

 


其中,<filespec>、<filegroup>和<external_access_option>分別定義以下:函數

<filespec> ::=
{
(
    NAME = logical_file_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 | % ] ]
) [ ,...n ]
}
----------
<filegroup> ::=
{
FILEGROUP filegroup_name [ CONTAINS FILESTREAM ] [ DEFAULT ]
    <filespec> [ ,...n ]
}
----------
<external_access_option> ::=
{
  [ DB_CHAINING { ON | OFF } ]
  [ , TRUSTWORTHY { ON | OFF } ]
}

 



語法參數說明以下:工具

database_name
    database_name表示待建立數據庫的名稱,它在當前的實例中必須惟一,且要符合標識符規則,最大長度爲128個字節。post

 

 ON
    關鍵字ON用於指定數據文件,其後跟以逗號分隔的<filespec>項列表。該項列表用以定義主文件組的數據文件,主文件組的文件列表可後跟以逗號分隔的<filegroup>項列表。該項列表是可選項,用於定義用戶文件組。

spa

PRIMARY
    PRIMARY則用於指定關聯的<filespec>列表定義主文件。在主文件組的<filespec>項中指定的第一個文件將成爲主文件,一個數據庫只能有一個主文件。若是沒有指定PRIMARY,那麼database_name將成爲主文件。

操作系統

NAME
    NAME用於爲<filespec>定義的數據庫文件指定邏輯名稱,若是未指定邏輯名稱則使用database_name做爲邏輯名稱。


日誌

FILENAME
    FILENAME用於指定數據庫文件的物理文件名(操做系統文件名,也稱磁盤文件名)。若是未指定該名稱則將NAME值(邏輯名稱)後綴「.mdf」(對數據文件)或後綴「.ldf」(對日誌文件)做爲數據庫文件的物理文件名,存儲的路徑能夠根據須要來設定。

SIZE
    SIZE用於指定數據庫文件的初始大小,若是沒有指定則採用默認值(數據文件的默認值爲3MB,日誌文件的默認值爲1MB)。
  

MAXSIZE
    MAXSIZE用於指定數據庫文件可以增加到的最大值(最大文件大小)。若是取值爲UNLIMITED則表示無窮大。其實是受到磁盤空間的限制,在 SQL Server 2008 中,指定爲UNLIMITED的日誌文件的最大大小爲2 TB,而數據文件的最大大小爲16 TB。
 

FILEGROWTH
    FILEGROWTH用於指定文件大小增加的幅度,能夠用百分比,也能夠用絕對數值,設置值爲0時代表關閉自動增加功能,不容許自動增長空間。

LOG ON  
    LOG ON用於指定用於存儲數據庫日誌的磁盤文件。LOG ON後跟以逗號分隔的<filespec>項列表,該項列表用於定義日誌文件。若是沒有指定LOG ON,將自動建立一個日誌文件,其大小爲該數據庫的全部數據文件大小總和的25%或512KB,取二者之中的較大者。
   

FILEGROUP
    FILEGROUP用於定義文件組,其中,filegroup_name爲文件組的邏輯名稱,在數據庫中必須是惟一的,不能是系統提供的名稱PRIMARY和 PRIMARY_LOG。名稱能夠是字符或 Unicode 常量,也能夠是常規標識符或分隔標識符。名稱必須符合標識符規則。 當待參數DEFAULT時,表示將該文件組設置爲數據庫中默認的文件組。
   

COLLATE   
     COLLATE用於指定數據庫的默認排序規則。若是沒有指定排序規則,則採用SQL Server實例的默認排序規則。排序規則名稱既能夠是Windows排序規則名稱,也能夠是SQL排序規則名稱。


7.2.2 建立使用默認參數的數據庫


    由CREATE DATABASE的語法結構能夠看出,除了database_name(數據庫名)之外,其餘的參數都是可選參數。所以,僅帶database_name的CREATE DATABASE語句是最簡單的形式,相應的簡化語法以下:

CREATE DATABASE database_name;

 


     這是最簡單、也是較爲經常使用的數據庫建立方法,由此建立的數據庫的參數都是使用默認設置。
【例7.1】 建立名爲DB1的數據庫,數據庫的全部可選參數使用默認值。
      這種數據庫的建立方法最簡單,相應代碼以下:

CREATE DATABASE DB1;

 


        執行上述代碼,當顯示「命令已成功完成。」的提示時,便可完成建立名爲DB1的數據庫,這是會自動生成一個數據文件DB1.mdf和一個日誌文件DB1_log.ldf。除數據庫名稱之外,該數據庫的其餘參數都使用了默認初始值。


7.2.3 建立指定數據文件的數據庫


    出於某種須要,有時候須要建立一個數據庫,使得它的數據文件名和日誌文件名分別爲給定的名稱。這時須要在CREATE DATABASE語句中指定NAME和FILENAME項的值。


【例7.2】 建立既定數據文件名及其邏輯文件名的數據庫。
      假設數據庫名爲DB2,指定的數據文件的物理文件名和邏輯文件名分別DataFile2.mdf和LogicFile2,相應的CREATE DATABASE語句以下:

CREATE DATABASE DB2
ON PRIMARY(
  -- 設置數據文件的邏輯文件名
NAME='LogicFile2',       
  -- 設置數據文件的物理文件名,注意,指定的目錄D:\datafiles\必須是已經存在的目錄,不然建立失敗。
-- 另外,該目錄下不能存在任何已有的同名文件
FILENAME = 'D:\datafiles\DataFile2.mdf' );

 


     執行上述代碼,當顯示「命令已成功完成。」的提示時,便可完成建立名爲DB2的數據庫。該CREATE DATABASE語句中,沒有指定日誌文件信息,故會產生默認的日誌文件DB2_log.ldf。


 【例7.3】 建立指定數據文件名、日誌文件名及相應邏輯文件名的數據庫。
      假設數據庫名爲DB3,指定的數據文件的物理文件名和邏輯文件名分別爲DataFile3.mdf和LogicFile3,日誌文件的物理文件名及其邏輯文件名分別爲LogFile3.ldf和LogicLog3,則相應CREATE DATABASE語句以下:

CREATE DATABASE DB3
ON PRIMARY(
-- 設置數據文件的邏輯文件名
  NAME='LogicFile3',   
  -- 設置數據文件的物理文件名
  FILENAME = 'D:\datafiles\DataFile3.mdf'
)
LOG ON(
-- 設置日誌文件的邏輯名稱
  NAME = 'LogicLog3',       
  -- 設置日誌文件的物理文件名
FILENAME = 'D:\datafiles\LogFile3.ldf'
);  

 

 


7.2.4 建立指定大小的數據庫


    這裏的「大小」包含數據文件的設置初始大小、最大存儲空間、自動增加幅度等。
  【例7.4】 建立指定數據文件大小的數據庫。
        假設數據庫名爲DB4,指定的數據文件的物理文件名爲DataFile4.mdf,邏輯名稱爲LogicFile4,該數據文件初始大小爲5MB,最大值爲100MB,自動增加幅度爲15MB。相應的Transact-SQL語句以下:

CREATE DATABASE DB4
ON PRIMARY(
-- 設置邏輯文件名
  NAME = ' LogicFile4',  
-- 設置物理文件名
  FILENAME  
='D:\datafiles\DataFile4.mdf',
  SIZE = 5MB ,                        -- 設置初始大小
  MAXSIZE = 100MB,                                 -- 設置數據文件的最大存儲空間
  FILEGROWTH = 15MB);                          -- 設置自動增加幅度

 



    【例7.5】  建立指定數據文件和日誌文件大小的數據庫。
假設數據庫名爲DB5,指定的數據文件和日誌文件的信息以下:
    數據文件:其物理文件名爲DataFile5.mdf,邏輯文件名爲:LogicFile5,初始大小爲10MB,最大值爲200MB,自動增加幅度爲20MB;
    日誌文件:其物理文件名爲LogFile5.ldf,邏輯文件名爲:LogicLog5,日誌文件初始大小爲10MB,最大值爲100MB,自動增加幅度爲初始大小的10%。

--建立此數據庫的代碼以下:
 
CREATE DATABASE DB5
ON PRIMARY( 
-- 設置邏輯名稱
  NAME = ' LogicFile5',  
-- 設置數據文件名
  FILENAME  
='D:\datafiles\DataFile5.mdf',
  SIZE = 10MB ,                     -- 設置初始大小
  MAXSIZE = 200MB,    -- 設置數據文件的最大存儲空間
  FILEGROWTH = 20MB)    -- 設置自動增加幅度

LOG ON( 
-- 設置日誌文件的邏輯名稱
  NAME = 'LogicLog5',       
  -- 設置日誌文件
FILENAME 
= 'D:\datafiles\LogFile5.ldf',
  SIZE = 10MB,     -- 設置初始大小
  MAXSIZE = 100MB, -- 設置數據文件的最大存儲空間
  FILEGROWTH = 10%    -- 設置自動增加幅度
);

 

 

 


7.2.5 建立帶多個數據文件的數據庫


    一個數據庫至少有一個主數據文件,同時可能有多個次要數據文件。
 【例7.6】  建立帶兩個數據文件的數據庫。
       假設待建立的數據庫的名稱爲DB6,包含兩個數據文件,它們的物理名稱分別爲DataFile6.mdf(主數據文件)和DataFile6.ndf(次要數據文件),對應的邏輯名稱分別爲LogicFile6_1和LogicFile6_2。
     相應代碼以下:

CREATE DATABASE DB6
ON PRIMARY
(
  NAME = ' LogicFile6_1',          -- 主數據文件的邏輯名稱
  FILENAME = 'D:\datafiles\DataFile6.mdf'      -- 主數據文件的物理名稱
),
(  
  NAME = ' LogicFile6_2',         -- 次要數據文件的邏輯名稱
  FILENAME = 'D:\datafiles\DataFile6.ndf '      -- 次要數據文件的物理名稱
); 

 



    注意,在建立時,主數據文件和次要數據文件不是根據擴展名來肯定的,而是根據前後順序來肯定。也就是說,緊跟關鍵字ON PRIMARY以後定義的數據文件爲主數據文件,其他的爲次要數據文件。
    【例子】 若是使用下列代碼建立DB6,則DataFile6.ndf將變成主數據文件,DataFile6.mdf爲次要數據文件:

CREATE DATABASE DB6
ON PRIMARY
(  
  NAME = ' LogicFile6_2',             -- 主數據文件的邏輯名稱
  FILENAME = 'D:\datafiles\DataFile6.ndf '                              -- 主數據文件的物理名稱
),
(
  NAME = ' LogicFile6_1',              -- 次要數據文件的邏輯名稱
  FILENAME = 'D:\datafiles\DataFile6.mdf'     -- 次要數據文件的物理名稱
); 

 

 


7.2.6 建立指定文件組的數據庫


    文件組包括主文件組(PRIMARY)和用戶定義文件組。若是不指定文件組,則默認使用主文件組(PRIMARY)建立數據庫,全部的數據文件都將被分到這個文件組中。咱們也能夠將數據文件劃分到指定的用戶定義文件組中,但主數據文件永遠自動被劃分到主文件組(PRIMARY)中。


   【例7.7】  建立帶用戶定義文件組的數據庫,並將相應的數據文件分配到該文件組中。
   假設待建立的數據庫的名稱爲DB7,使之帶有用戶定義文件組UserFG7_2和UserFG7_3,其中:
      數據文件:物理文件名分別爲DataFile7_1.mdf(主數據文件)、DataFile7_2.ndf和DataFile7_3.ndf,它們的邏輯文件名分別爲:LogicFile7_一、LogicFile7_2和LogicFile7_3,初始大小分別爲5MB、2MB和3MB,最大值均爲100MB,自動增加幅度分別爲初始大小的15%、10%和5%,且次要數據文件DataFile7_2.ndf和DataFile7_3.ndf分別分配到文件組UserFG7_2和UserFG7_3中。
      日誌文件:其物理文件名爲LogFile7.ldf,邏輯文件名爲:LogicLog7,日誌文件初始大小爲10MB,最大值爲100MB,自動增加幅度爲1MB。
相應代碼以下:

CREATE DATABASE DB7
ON PRIMARY
(  -- 主數據文件
  NAME = ' LogicFile7_1',  
  FILENAME = 'D:\datafiles\DataFile7_1.mdf',
  SIZE = 5MB ,                      -- 設置初始大小
  MAXSIZE = 100MB,          -- 設置數據文件的最大存儲空間
  FILEGROWTH = 15%      -- 設置自動增加幅度
),
FILEGROUP UserFG7_2
       -- 將數據庫文件DataFile7_2.ndf分配到文件組UserFG7_2中
(  -- 次要數據文件
  NAME = 'LogicFile7_2',
  FILENAME = 'D:\datafiles\DataFile7_2.ndf',
  SIZE = 2MB ,                      -- 設置初始大小
  MAXSIZE = 100MB,          -- 設置數據文件的最大存儲空間
  FILEGROWTH = 10%      -- 設置自動增加幅度
),

FILEGROUP UserFG7_3             
       -- 將數據庫文件DataFile7_3.ndf分配到文件組UserFG7_3中
(  -- 次要數據文件
  NAME = 'LogicFile7_3',
  FILENAME = 'D:\datafiles\DataFile7_3.ndf',
  SIZE = 3MB ,                   -- 設置初始大小
  MAXSIZE = 100MB,       -- 設置數據文件的最大存儲空間
  FILEGROWTH = 5%         -- 設置自動增加幅度
)
LOG ON(
-- 設置日誌文件的邏輯名稱
  NAME = 'LogicLog7',  
  -- 設置日誌文件
FILENAME = 'D:\datafiles\LogFile7.ldf',
  SIZE = 10MB,           -- 設置初始大小
  MAXSIZE = 100MB,           -- 設置數據文件的最大存儲空間
  FILEGROWTH = 1MB    -- 設置自動增加幅度
); 

 

 


•     7.3 查看數據庫    


7.3.1 服務器上的數據庫


    Master數據庫中的目錄視圖sysdatabases保存了服務器上全部的數據庫信息,經過查詢該視圖能夠獲取全部的數據庫信息:

SELECT * FROM sysdatabases; 

 


   執行上面查詢語句,結果如圖7.1所示,這代表筆者機器上一共有16個數據庫。

 



    若是要判斷一個數據庫是否存在,可使用EXISTS函數來實現。

--下面語句能夠判斷數據庫MyDatabase是否存在:
IF EXISTS(select * from sysdatabases where name='MyDatabase') PRINT '存在‘
--也能夠用下列語句判斷該數據庫是否存在:
IF db_id('MyDatabase') is not null PRINT '存在'

 

 


    利用存儲過程sp_helpdb,能夠查看指定數據庫的基本信息或當前數據庫服務器上在運行的全部數據庫的基本信息。

 


7.3.2 數據庫的基本信息


    在SQL Server 2014中,查看數據庫信息最簡便的方法是,在SQL Server Management Studio的對象資源管理器中右擊要查看的數據庫,而後在彈出的菜單中選擇「屬性」項,將打開「數據庫屬性」對話框。在此對話框中能夠看到數據庫全部基本信息。

  【例子】  圖7.2顯示的是數據庫MyDatabase7的基本信息。
    系統存儲過程sp_helpdb也是一種經常使用於查看數據庫信息的工具,其使用方法很簡單,語法格式以下:

sp_helpdb database_name
        --database_name爲待查看信息的數據庫名。

 

 





【例7.8】 查看數據庫DB7的信息。
    該查詢任務的實現代碼以下

sp_helpdb DB7;

 


    執行上述代碼,結果如圖7.3所示。

 



對圖7.3中出現各列的意義說明以下:

    上表:
    name:數據庫名
    db_size:數據庫總的大小
    owner:數據庫擁有者
    dbid:數據庫ID
    created:建立日期
    status:數據庫狀態
    compatibility_level:數據庫兼容等級

    下表:
    name:(數據文件和日誌文件的)邏輯名稱
    fileid:文件ID
    filename:物理文件的位置及名稱
    filegroup:文件組
    size:文件大小(全部文件大小之和等於上面的db_size)
    maxsize:文件的最大存儲空間
    growth:文件的自動增加幅度
    usage:文件用途


7.3.3 數據庫中的數據表


    有時候但願能知道當前數據庫中到底包含了哪些數據表,這時能夠經過查詢信息架構視圖information_schema.tables來得到,該視圖包含了當前數據庫中全部數據表的基本信息。

【例子】 查看數據庫MyDatabase中全部的數據表,相關代碼以下:

USE MyDatabase; -- 打開數據庫MyDatabase
SELECT *
FROM information_schema.tables;

 



在筆者的機器上執行上述代碼,結果如圖7.4所示。

 

 


 •     7.4 修改數據庫


7.4.1 更改數據庫的名稱


    更改數據庫名是最簡單的操做、也是最經常使用的操做之一。其語法以下:

ALTER DATABASE database_name
MODIFY NAME = new_database_name;

 


【例7.9】 更改數據庫名。
     對於已存在的數據庫oldDB,後將之更名爲newDB,相應代碼以下:

ALTER DATABASE oldDB  -- 更名
MODIFY NAME = newDB;

 


    另外,利用SQL Server提供的系統存儲過程sp_renamedb也能夠對數據庫進行更名。其語法以下:

sp_renamedb database_name, new_database_name

 


【例子】 對於例7.9中的改名操做,也能夠用下列語句來實現:

sp_renamedb oldDB, newDB;

 

 


7.4.2 修改數據庫的大小


     數據庫的大小(存儲容量)是由數據文件和日誌文件的大小來決定的,所以數據庫大小的修改是經過修改數據庫文件的相關屬性值來實現的,如初始值、增加幅度、最大容量等。這主要是利用帶MODIFY FILE選項的ALTER DATABASE語句來完成。


【例7.10】 修改數據庫的「容量」,同時修改主數據文件的邏輯名稱和物理名稱。
   對於存在的數據庫testdb,將其數據文件的邏輯名稱和物理名稱分別改成newtestdb和newtestdb.mdf,數據文件的初始大小爲25MB、最大空間爲150MB、數據增加幅度爲10MB。
     相應代碼以下:

USE master
GO
ALTER DATABASE testdb
MODIFY FILE
(
    NAME = testdb,          -- 必需是原來的邏輯文件名
    NEWNAME = newtestdb,        -- 新的邏輯文件名
    FILENAME = 'D:\datafiles\newtestdb.mdf',     -- 新的物理文件名(不須要原來的物理文件名)
    SIZE = 25MB,            -- 初始大小
    MAXSIZE = 150MB,        -- 最大存儲空間
    FILEGROWTH = 10MB        -- 數據增加幅度
);

 




  【例7.11】 更改數據庫的日誌文件。
     更改數據庫DB3的日誌文件,更改後,日誌文件名變爲newlogdb3.ldf,對應的邏輯文件名不變(經過引用邏輯文件名來更改信息的),初始大小爲10MB。相應代碼以下:

USE master
GO
ALTER DATABASE DB3
MODIFY FILE
(
    NAME = LogicLog3,                      -- 必需是原來的邏輯文件名
    FILENAME ='D:\datafiles\newlogdb3.ldf’,                      -- 新的物理文件名
    SIZE = 10MB ,                                        -- 初始大小
    MAXSIZE = 50MB,                              -- 數據文件的最大存儲空間
    FILEGROWTH = 5MB                    -- 自動增加幅度
);

 


        
    注意:對數據文件和日誌文件來講,更改後文件的初始值(SIZE)也必須大於更改前的初始值,不然ALTER語句操做將失敗。


•     7.5 數據庫的分離和附加


    數據庫分離是指將數據庫從服務器實例中分離出來,結果是數據庫文件(包括數據文件和日誌文件)脫離數據庫服務器,獲得靜態的數據庫文件,進而能夠像其餘操做系統文件那樣,對它們進行拷貝、剪切、粘貼等操做。
    數據庫附加是指利用數據庫文件將分離的數據庫加入到數據庫服務器中,造成服務器實例。經過數據庫的分離與附加,能夠一個數據庫從一臺服務器移到另一臺服務器上,這爲數據庫的備份、移動等提供了一種有效的途徑。


7.5.1 用戶數據庫的分離

    
    數據庫分離可視爲是一種特殊的數據庫刪除操做,不一樣的是,分離的結果是造成靜態的數據文件和日誌文件,這些文件分別保存了數據庫中的數據信息和日誌信息。數據庫刪除操做則不但將數據庫從服務器中分離出來,並且相應的數據文件和日誌文件都從磁盤上被刪除,數據是不可恢復的。這是數據庫分離和數據庫刪除的本質區別。
    分離數據庫可用系統存儲過程sp_detach_db來實現,其語法以下:

sp_detach_db [ @dbname= ] 'database_name'
    [ , [ @skipchecks= ] 'skipchecks' ]
    [ , [ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' ] 

 


其參數意義說明以下:
    [ @dbname = ] 'database_name'
指定要分離的數據庫的名稱,默認值爲NULL。
    [ @skipchecks = ] 'skipchecks'
指定是否運行UPDATE STATISTIC。默認值爲NULL。若是設置爲true,則表示要跳過UPDATE STATISTICS;若是指定爲false,則表示要運行UPDATE STATISTICS。運行UPDATE STATISTICS可更新SQL Server數據庫引擎內表和索引中的數據的信息。
    [ @keepfulltextindexfile =] 'KeepFulltextIndexFile'
指定是否在數據庫分離過程當中刪除與所分離的數據庫關聯的全文索引文件。若是KeepFulltextIndexFile被設置爲false,則表示只要數據庫不是隻讀的,就會刪除與數據庫關聯的全部全文索引文件以及全文索引的元數據;若是設置爲NULL或true(默認值),則保留與全文相關的元數據。


【例7.12】 分離數據庫MyDatabase。
     下列代碼將分離數據庫MyDatabase,並保留全文索引文件和全文索引的元數據。

USE master; -- 爲了關閉要分離的數據庫MyDatabase
EXEC sp_detach_db 'MyDatabase', NULL, 'true’;

 


    執行上述語句後,將獲得兩個數據庫文件:MyDatabase.mdf和MyDatabase_log.LDF(它們位於建立數據庫時指定的目錄下),這時咱們能夠對之進行復制、剪切、粘貼等操做(在分離以前是不容許進行這些操做的)。


7.5.2 用戶數據庫的附加

    
    數據庫附加是利用已有的數據庫文件(分離時造成的數據庫文件)來建立數據庫的過程。它使用帶FOR ATTACH子句的

CREATE DATABASE語句來完成,相應的語法以下:
CREATE DATABASE database_name
    ON <filespec> [ ,...n ]
    FOR { ATTACH [ WITH <service_broker_option> ]
        | ATTACH_REBUILD_LOG }
[;]

 


    選項FOR ATTACH表示用指定的操做系統文件來建立數據庫,即建立的數據庫的許多參數將由這些操做系統文件指定的數值來設置,而再也不繼承系統數據庫model的參數設置。其參數意義見7.2.1節。


【例7.13】附加數據庫MyDatabase。
      利用例7.12中分離數據庫MyDatabase而造成的數據庫文件MyDatabase.mdf和MyDatabase_log.LDF來附加該數據庫。假設這兩個數據庫文件位於D:\datafiles\目錄下,則能夠經過            
     下列代碼將數據庫MyDatabase附加到當前的服務器實例中:

CREATE DATABASE MyDatabase
ON (FILENAME = 'D:\datafiles\MyDatabase.mdf')  -- 只利用了MyDatabase.mdf
FOR ATTACH

 


      注意,在數據庫附加過程當中只顯式利用了數據文件MyDatabase.mdf,並無利用日誌文件MyDatabase_log.LDF。但MyDatabase_log.LDF最好與MyDatabase.mdf位於同一目錄下,不然會產生一些警告。


        在SSMS對數據庫進行分離和附加的操做也比較簡單。分離時,在SSMS的對象資源管理器中右擊要分離的數據庫圖片,在彈出的菜單中選擇「任務」|「分離…」,而後在打開的「分離數據庫」對話框中單擊【肯定】按鈕便可,如圖7.5所示。

 



     附加數據庫時,在SSMS的對象資源管理器中右擊「數據庫」節點,在彈出的菜單中選擇「附加…」,而後在彈出的「附加數據庫」對話框中單擊【添加…】按鈕,選擇相應的數據庫文件(.mdf文件)便可,如圖7.6所示。

 

 

 

 

 


•     7.6 刪除數據庫



    當數據庫已經確認再也不須要的時候,應該將之刪除,以釋放服務器資源。須要提醒的是,爲了不沒必要要的損失,在實際應用當中無論刪除哪個數據庫,在刪除以前都應進行備份。
     刪除數據庫是利用DROP DATABASE語句來實現,其語法以下:

DROP DATABASE { database_name | database_snapshot_name } [ ,...n ] [;] 

 


    其參數說明以下:
database_name:指定要刪除的數據庫的名稱
database_snapshot_name:指定要刪除的數據庫快照的名稱


    【例7.14】 刪除單個數據庫
       刪除數據庫MyDatabase,代碼以下:

USE master;
GO
DROP DATABASE MyDatabase;

 





【例7.15】 同時刪除多個數據庫
    刪除數據庫MyDatabase2,MyDatabase3,MyDatabase4,代碼以下:

USE master;
GO
DROP DATABASE MyDatabase2,MyDatabase3,MyDatabase4;

 



    注意:使用DROP DATABASE語句刪除數據庫之後,數據文件和日誌文件都將從磁盤上刪除。一旦使用了DROP DATABASE語句,數據庫中的數據是不可恢復的。若是隻是但願將數據庫從當前服務器中刪除,但不但願從文件系統刪除數據庫文件,則可以使用數據庫分離的方法來操做。

 

 

 

相關文章
相關標籤/搜索