SQL Server之體系結構

SQL Server 體系結構

SQL Server 實例

SQL Server 實例是指安裝的一個 SQL Server 數據庫引擎/服務。在同一臺計算機上能夠安裝 SQL Server 的多個實例。從安全性、實例管理的數據以及其它方面來講,每一個實例是徹底彼此獨立的。在邏輯層面,位於同一計算機上的兩個不一樣實例和位於兩臺不一樣計算機上的實例相差無幾。固然,它們會共享服務器的物力資源(如 CPU、內存、磁盤空間)。數據庫

能夠將計算機上安裝的實例之一設置爲默認實例,而其它實例則必須爲命名實例。在安裝期間能夠決定是將一個實例安裝爲默認實例,仍是命名實例:安裝好之後就不能對此進行修改了。若是一個客戶端應用程序要鏈接到默認實例,只需指明實例所在計算機的名稱或 IP 地址。要鏈接到一個命名實例,客戶端要指明計算機的名稱或 IP 地址,接着再寫一個反斜槓字符(「\」),後面指明實例名稱(在安裝期間提供的)。例如,假設在名爲 Server1 的計算機上安裝了兩個 SQL Server 實例,其中一個安裝爲默認實例,而另外一個則安裝爲命名實例 Inst1。要鏈接到默認實例,就只要指定服務器名稱 Server1;而要鏈接到命名實例,則要將其指定爲 Server1\Inst1。安全

在同一臺計算機上安裝多個 SQL Server 的實例,可能會有各類緣由,這裏只列舉幾個。服務器

一個例子是像咱們普通的開發者,有時候要測試不一樣版本之間的區別,就能夠很方便的在同一個筆記本上安裝多個版本的 SQL Server 實例。架構

另外一個例子是數據庫供應商可能擁有很是強大的數據中心,可以容納多個 SQL Server 的安裝實例,而沒必要維護多臺性能較低的計算機,在每臺這樣的機器上安裝不一樣的實例。佈局

數據庫

能夠將數據庫認爲是各類對象的容器,這些對象能夠是表(table)、視圖(view)、存儲過程(stored procedure)等等。每一個 SQL Server 實例能夠包含多個數據庫,如圖 1-1 所示。性能

圖 1-1 數據庫測試

當安裝 SQLServer 時,安裝程序會建立幾個系統數據庫,用於保存系統數據和服務與內部目的。安裝好以後,就能夠建立本身的用戶數據庫,以保存應用程序數據。spa

安裝程序建立的系統數據庫包括 master、Resource、model、tempdb 以及 msdb。它們各自的做用分別描述以下:版本控制

  • master    master 數據庫保存 SQL Server 實例範圍內的元數據信息、服務器配置、示例中全部數據庫的信息,以及初始化信息。
  • Resource    Resource 數據庫是 SQL Server 2005 中增長的,用於保存全部系統對象。當查詢數據庫中的元數據信息時,這種信息表面上使位於數據庫中,但其實是保存在 Resource 數據庫中。
  • model    model 數據庫是新數據庫的模板。每一個新建立的數據庫最初都是 model 的一個副本(copy)。因此,若是想在全部新建立的數據庫中都包含特定的對象(好比數據類型),或者是在全部新建立的數據庫中都以特定的方式來配置某些數據庫屬性,就能夠先把這些對象或配置屬性放在 model 數據庫中。注意:對 model 數據庫作出的修改不會影響現有的數據庫,隻影響此後新建立的數據庫。
  • tempdb    tempdb 數據庫是 SQL Server 保存臨時數據的地方,這些臨時數據包括工做表(work table)、排序空間(sort space)、行版本控制(row versioning)信息等等。SQL Server 容許用戶本身建立臨時表,這些臨時表的物理保存位置就是 tempdb。注意,每次重啓 SQL Server 實例時,會刪除這個數據庫的內容,並將其從新建立爲 model 的一個副本。所以,當須要爲測試目的而建立一些對象,並且在測試完成後不想將這些對象繼續保存在數據庫中時,一般能夠在 tempdb 中建立它們。即便忘記清除這些對象,在從新啓動後也會自動清除它們。
  • msdb    msdb 是稱爲 SQL Server Agent 的一種服務保存其數據的地方。SQL Server Agent 負責自動化處理,包括記錄有關做業(job)、計劃(schedule)和警報等實體的信息。SQL Server Agent 也是負責複製(replication)的服務。msdb 還用於保存一些有關其它 SQL Server 功能的信息,例如 Database mail 和 Service Broker。

在 SQL Server 實例中能夠建立須要的任意數量的用戶數據庫。用戶數據庫內能夠保存應用程序須要的各類對象和數據。日誌

能夠在數據庫級上定義一個成爲 collation(排序規則)的屬性,由它肯定數據庫中字符數據使用的排序規則信息(包括支持的語言、區分大小寫和排序規則等)。若是在建立數據庫時不爲其指定 collation 屬性,將使用實例默認的排序規則設置。

爲了對數據庫運行 T-SQL 代碼,客戶端應用程序需鏈接到 SQL Server 實例,要位於相關數據庫的上下文(context)中,或者可以使用相關數據庫。

在安全性方面,爲了可以鏈接到 SQL Server 實例,必須讓 DBA(數據庫管理員)爲用戶建立一個登陸帳號。登陸帳號能夠關聯到 Windows 憑據(credentials),在這種狀況下,它會調用 Windows 憑據進行身份驗證。使用 Windows 驗證的登陸,當鏈接到 SQL Server 時就無需提供登陸用戶名和密碼信息,由於當登陸到 Windows 時已經提供了這些信息。登陸帳號能夠關聯到 Windows 憑據(credentials),須要時,它會調用 Windows 憑據進行身份驗證。當使用 SQL Server 驗證登陸來鏈接 SQL Server 時,就必須提供登陸的用戶名和密碼。

DBA 要將你的登陸帳號映射到有權訪問的任何數據庫中的數據庫用戶(database user)。數據庫用戶是將被受權訪問數據庫對象的實體。

到目前爲止,已經主要介紹了數據庫的邏輯層面。圖 1-2 演示了數據庫的物理佈局圖。

圖 1-2 數據佈局

數據庫在物理上由數據文件和事務日誌文件組成。當建立數據庫時,可以定義每一個文件的各類屬性,包括文件名、保存位置,以及文件自動擴展的增量(autogrowth 屬性)。每一個數據庫必須至少有一個數據文件和一個日誌文件(SQL Server 的默認狀況)。數據文件用於保存數據庫對象數據,日誌文件則保存 SQL Server 爲了維護事務而須要的信息。

雖然 SQL Server 能夠同時寫多個數據文件,但某一時刻只能順序方式寫一個日誌文件。所以與數據文件不一樣,使用多個日誌文件並不能提高系統的性能。若是原來的日誌文件所在的磁盤空間耗盡了,就可能要增長新的日誌文件。

多個數據文件在邏輯上按照文件組(FileGroup)的形式進行分組管理。建立數據庫對象(例如表或索引)時,就會將其保存在目標文件組中。對象數據可能會保存在屬於目標文件組的多個文件中。經過文件組能夠控制數據庫對象的物理存儲位置。數據庫必須至少要有一個主文件組(PRIMARY),而用戶定義的文件組則是可選的。PRIMARY 文件組包含主數據文件(擴展名爲 .MDF),以及數據庫的系統目錄(catalog)。能夠選擇性地爲 PRIMARY 增長多個輔助數據文件(secondary data file),擴展名爲 .NDF。用戶定義的文件組只能包含輔助數據文件。能夠指定將哪一個文件組做爲默認文件組。當對象建立語句沒有明確指定目標文件組時,就將它建立在默認文件組中。

文件擴展名 .mdf、.ldf 和 .ndf
數據庫文件擴展名 .mdf 和 .ldf 的含義很明確。擴展名 .mdf 表明 Master Data File(主要數據文件,不要與 master 數據庫混淆),ldf 表明 Log Data File(日誌數據文件)。當討論輔助數據文件的擴展名時,一種有趣的說法是,.ndf 表明 Not Master Data File(非主要數據文件),某位開發人員提出了這種開玩笑式的說法,業界也就這麼接受了。

架構(Schema)和對象

前面曾經說過數據庫是一種對象的容器,這樣說只是爲了簡單而已。如圖 1-3 所示,一個數據庫能夠包含多個架構,而每一個架構又包含多個對象。能夠將架構看作是各類對象的容器,這些對象能夠是表(table)、視圖(view)、存儲過程(stored procedure)等。

圖 1-3 數據庫、架構和數據庫對象

能夠在架構級別上控制對象的訪問權限。例如,能夠爲一個用戶授予某個架構上的 SELECT 權限,讓這個用戶可以查詢該架構中的全部對象的數據。因此,對於決定在架構中如何組織對象,安全性是應該考慮的因素之一。

此外,架構也是一個命名空間,用做對象名稱的前綴。例如,假設在架構 Sales 中有一個 Orders 表,架構限定(schema-qualified)的對象名稱是 Sales.Orders,也稱爲兩部分對象名稱(two-part name)。若是在引用對象時省略架構名稱,SQL Server 將採用必定的辦法來分析出架構名稱是什麼,例如,檢查對象是否在用戶的默認架構中,若是不在,再繼續檢查對象是否在 dbo 架構中。當在代碼中引用對象時,推薦老是使用這種由兩部分構成的對象名稱。有時,若是不顯式指定架構,那麼在解析對象名稱時,就會要付出一些沒有意義的額外代價。既然這樣的額外代價是沒有意義的,爲何還要爲它付出?並且,在不一樣的架構中可能存在名稱相同的多個對象,若是這時還不顯式指定架構,那麼最終獲得的對象可能並非你本來想要的。

相關文章
相關標籤/搜索