介紹
這里我們介紹SQL Sever內部的系統數據庫的作用和用戶數據庫之間聯系,關於SQL Sever如何管理用戶數據庫的原理,對於每個數據庫開發人員和DBA都是必須掌握的。
SQL Sever系統數據庫是用來存儲系統級的數據和元數據。
SQL Sever包含了6個系統數據庫:Master 、Model 、MSDB 、TempDB 、Resource 、Distribution 。
Master數據庫
對於Master數據庫來說,數據文件和日子文件分別是在該路徑下的master.mdf和mastlog.ldf。
但是操作Master數據庫會有些限制,下面列舉一些case(為了說明原意還是寫了英文),
Adding files or filegroups.
Changing collation. The default collation is the server collation.
Changing the database owner. Master is owned by dbo.
Creating a full-text catalog or full-text index.
Creating triggers on system tables in the database.
Dropping the database.
Dropping the guest user from the database.
Enabling change data capture.
Participating in database mirroring.
Removing the primary filegroup, primary data file, or log file.
Renaming the database or primary filegroup.
Setting the database to OFFLINE.
Setting the database or primary filegroup to READ_ONLY.
值得注意的是,我們操作Master數據庫時,會對當前Master數據庫做一個備份,而且他的備份工作一般在以下一些操作時執行:
Creating, modifying, or dropping any database
Changing server or database configuration values
Modifying or adding logon accounts
因此不要在Master數據里創建對象,否則Master數據庫會經常被做備份。而且也不要對Master數據庫的'TRUSTWORTHY'選項設置為'ON'。
Model數據庫
Model數據庫是一個模板數據庫。每當創建一個新的數據庫(包括系統數據庫的TempDB),會創建一個以Model數據庫為副本數據庫,並更改成你創建數據庫時所用的名稱。這樣的的優點是可以通過模板數據庫先前創建好基本對象,然后創建新數據庫,這樣新建立的數據庫就有了該基本對象。
舉個例子,下面是怎么樣用Model數據庫來創建一個自己的數據實例。
USE Model
GO
CREATE FUNCTION dbo.Msg (@String VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
SET @String='Running this from Model for '+@String+' Database'
RETURN @String
END
CREATE DATABASE MyDB;
USE MyDB
GO
SELECT dbo.Msg('MyDB');
-----------------------------------------
Running this from Model for MyDB Database
(1 row(s) affected)
CREATE DATABASE DEMO;
USE DEMO
GO
SELECT dbo.Msg('DEMO');
-----------------------------------------
Running this from Model for DEMO Database
(1 row(s) affected)
MSDB數據庫
MSDB數據庫是SQL Server代理的數據庫。這是因為SQL Server代理是通過使用MSDB數據庫來做存儲自動化作業定義,作業調度,操作定義,觸發提醒定義。代理是負責幾乎所有自動化操作和調度操作。MSDB還包含了所有的工作准備,比如對於開始任何工作,得到了狀態或停止作業命令,這些都是運行在MSDB數據庫中。
Use msdb
GO
sp_help_job
sp_start_job
sp_stop_job
MSDB數據庫不僅僅是SQL Server代理來大量使用的唯一服務,比如Broker服務,數據庫郵件服務和Reporting服務也是使用MSDB數據庫來保存調度信息。除了之外,SQL Server集成服務(SSIS)也利用了MSDB數據庫為SSIS包存儲。
TempDB數據庫
TempDB數據庫是由SQL Server用於暫時存儲數據的。TempDB數據庫被經常使用的在SQL Server操作中,所以認真的計划和評價它的大小和位置是至關重要的,以確保有效的SQL Server數據庫操作。TempDB數據庫被數據庫引擎用來保存和存儲臨時對象(如臨時表,視圖,游標和表值變量),這些當然也可以由由數據庫程序員創建使用。
此外,TempDB數據庫被SQL Server數據庫引擎用來保存中間查詢結果,用於排序操作前或操作其他數據。例如,如果你寫一個查詢,返回100行,你想通過一個結果的日期值排序時,SQL Server可能首先把未排序的結果發送到一個臨時工作表中,然后將執行排序操作,然后返回排序你的結果。如果聯機索引操作執行中,tempdb數據庫會保存這個索引。
另一個需要牢記的一點是,對於TempDB數據庫,是所有用戶可以訪問的,可以創建和創造和修改臨時對象。這種訪問有可能會帶來死鎖和大小限制的問題,因此就像任何其他SQL Server數據庫,對tempdb數據庫的監測是很重要的。
Resource數據庫
接着介紹下Resource系統數據庫。Resource數據庫是一個只讀數據庫,包含所有的SQL Server實例使用的系統對象。Resource數據庫是無法訪問作為一個正常的數據庫,也不能像正常數據庫那樣操作。它在邏輯上被看作是系統模式上的。它不包含任何用戶數據或元數據。然而,它包含了所有的系統對象的結構和說明。
這種設計使得能夠快速建立一個新的服務包應用,只要更換一個新的現有Resource數據庫的。而且,假如要恢復一個服務包,你也只要把舊的Resource數據庫更換成新的Resource數據庫。這樣極大的方面了數據庫服務要求刪除或增加了新的系統對象后簡單安全運行。Resource數據庫的物理文件名是mssqlsystemresource.mdf和mssqlsystemresource.ldf。默認情況下,這些文件位於 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\下。每個SQL Server實例都只有一個關聯的mssqlsystemresource.mdf文件,和其它實例不共享此文件。資源數據庫依賴於master數據庫的位置。注意,如果你移動master數據庫,則必須同時移動資源數據庫到相同的位置。
下面的代碼可以來確定Resource數據庫的版本號:
SELECT SERVERPROPERTY('ResourceVersion');
GO
----------
10.00.1600To determine when the Resource database was last updated, use:
Collapse | Copy Code
SELECT SERVERPROPERTY('ResourceLastUpdateDateTime');
GO
-----------------------
Distribution數據庫
最后講的是Distribution系統數據庫。一旦服務器實例配置成一個復制的分布數據庫,Distribution數據庫被創建在目錄中。分發數據庫存儲元數據和歷史數據的所有類型的復制和事務復制的事務。
結束語
對於在MS SQL Server數據庫開發的初學者,我覺得有必要得到很好的了解系統數據庫的基礎知識,每一個是什么用途。希望這篇文章能夠給你們帶來幫助。
參考:http://www.codeproject.com/KB/database/Understanding_SysDatabase.aspx
在Sqlserver數據庫歷代版本當中,系統數據庫有四個,master,model,msdb,tempdb
master----記錄 SQL Server 系統的所有系統級信息。這包括實例范圍的元數據(例如登錄帳戶)、端點、鏈接服務器和系統配置設置。此外,master 數據庫還記錄了所有其他數據庫的存在、數據庫文件的位置以及 SQL Server 的初始化信息。因此,如果 master 數據庫不可用,則 SQL Server 無法啟動。在 SQL Server 中,系統對象不再存儲在 master 數據庫中,而是存儲在 Resource 數據庫中。
http://msdn.microsoft.com/zh-cn/library/ms187837.aspx
SA的密碼存儲在這個數據庫里哦哦哦,暴力破解吧,少年!
model----在 SQL Server 實例上創建的所有數據庫的模板。因為每次啟動 SQL Server 時都會創建 tempdb,所以 model 數據庫必須始終存在於 SQL Server 系統中。
http://msdn.microsoft.com/zh-cn/library/ms186388.aspx
因為是模板數據庫,所以你懂的,很多繼承類的模板,如安全模板都在這里。
msdb----由 SQL Server 代理用於計划警報和作業,也可以由其他功能(如 Service Broker 和數據庫郵件)使用。
http://msdn.microsoft.com/zh-cn/library/ms187112.aspx
應該是仆從數據庫,存儲一些輔助工作的數據庫的信息,如備份,郵件日志。
tempdb----臨時存儲數據庫,這里是存儲一些緩存類的操作,如臨時表。
http://msdn.microsoft.com/zh-cn/library/ms190768.aspx
百度了之后,在MSDN發現Sqlserver數據庫里其實還有個隱藏的系統數據庫
Resource 數據庫是只讀數據庫,它包含了 SQL Server 中的所有系統對象。SQL Server 系統對象(例如 sys.objects)在物理上持續存在於 Resource 數據庫中,但在邏輯上,它們出現在每個數據庫的 sys 架構中。Resource 數據庫不包含用戶數據或用戶元數據。
Resource 數據庫可比較輕松快捷地升級到新的 SQL Server 版本。在早期版本的 SQL Server 中,進行升級需要刪除和創建系統對象。由於 Resource 數據庫文件包含所有系統對象,因此,現在僅通過將單個 Resource 數據庫文件復制到本地服務器便可完成升級。
一些系統表以及Sqlserver每個數據庫所有的一些常識,只介紹一些常用的
sys.objects 包含很多信息如Sqlserver2005里用處最大的object_id,存儲過程是否是用戶創建的等信息,在Sqlserver2005之前的版本是sysobjects,從Sqlserver2005開始每個用戶數據庫(你自己建立的數據庫)都含有這個系統表,表示不知道Sqlserver2000是否是,具體分析見sys.objects (Transact-SQL)。 我用在動態表頭上,利用這個表的object_id配合另外一些系統表,就可以實現動態表頭。
sys.all_columns 和sys.columns區別在於一個是列出所有的,一個是只列出當前用戶數據庫的鍵值,數據字典表很需要這區別出來這兩個表,不然取出的東西會不准確。
還有其他的系統表,可以見對象目錄視圖 (Transact-SQL)
轉載:http://www.cnblogs.com/yzb305070/archive/2011/07/17/2108682.html
