在SQL Server 2005中,它的另外一個(gè)強(qiáng)大的新特點(diǎn)是數(shù)據(jù)庫快照。數(shù)據(jù)庫快照是一個(gè)數(shù)據(jù)庫的只讀副本,它是數(shù)據(jù)庫所有數(shù)據(jù)的映射,由快照被執(zhí)行的時(shí)間點(diǎn)來決定它的內(nèi)容。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比凌河網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式凌河網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋凌河地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。
這些數(shù)據(jù)庫快照在報(bào)表方面是非常有價(jià)值,因?yàn)樵诳煺諗?shù)據(jù)庫中或者在原數(shù)據(jù)庫中,對(duì)于任何查詢而言沒有鎖就將被執(zhí)行??煺找部梢允褂迷跒?zāi)難恢復(fù)中,因?yàn)槟憧梢詫F(xiàn)有的數(shù)據(jù)恢復(fù)到現(xiàn)有的快照中,或者還可以在有害數(shù)據(jù)操作聲明的事件中存儲(chǔ)個(gè)別必要的表和數(shù)據(jù)。
數(shù)據(jù)庫快照是如何工作的?
可以使用典型的數(shù)據(jù)庫命令CREATE DATABASE語句來生成一個(gè)數(shù)據(jù)庫快照,在聲明中有一個(gè)源數(shù)據(jù)庫快照的附加說明。當(dāng)快照被建立時(shí),同時(shí)生成一個(gè)稀疏文件。這個(gè)文件(只能使用在NTFS卷中)在初始化的時(shí)候并沒有磁盤空間分配給它——盡管你可能在WINDOWS資源管理器中看到了文件的大小,它會(huì)看上去與原始的源數(shù)據(jù)庫文件的大小相同。對(duì)磁盤來說其實(shí)這個(gè)文件的大小接近于零。
數(shù)據(jù)庫快照在初始化時(shí)讀的數(shù)據(jù)文件是來自于源數(shù)據(jù)庫的。當(dāng)源數(shù)據(jù)庫的數(shù)據(jù)發(fā)生變化時(shí),數(shù)據(jù)引擎就會(huì)將原始數(shù)據(jù)從源數(shù)據(jù)庫拷貝到快照數(shù)據(jù)庫中。這個(gè)技術(shù)確??煺諗?shù)據(jù)庫只反映快照被執(zhí)行時(shí)數(shù)據(jù)的狀態(tài)。當(dāng)SELECT命令被用來發(fā)布反對(duì)數(shù)據(jù)庫快照時(shí),不管數(shù)據(jù)頁的讀取是否被定位在源數(shù)據(jù)庫數(shù)據(jù)文件中還是在快照數(shù)據(jù)庫數(shù)據(jù)文件中都是沒有鎖被發(fā)布的。因?yàn)樵谥蛔x數(shù)據(jù)庫快照中是沒有鎖被發(fā)布,數(shù)據(jù)庫快照對(duì)于報(bào)表解決方案是一個(gè)重要的解決方案。
一個(gè)快照的實(shí)例
現(xiàn)在,讓我們來看看數(shù)據(jù)庫快照在SQL Server 2005中是如何工作的。為此,首先我需要一個(gè)源數(shù)據(jù)庫作為快照的來源。下面的腳本將創(chuàng)建一個(gè)源數(shù)據(jù)庫:
以下為引用的內(nèi)容:
USE master
GO
IF EXISTS(SELECT name from sysdatabases where [name] = 'SourceDatabase')
DROP DATABASE SourceDatabase
GO
CREATE DATABASE SourceDatabaseON PRIMARY
(
NAME = SourceDatabase_Data,
FILENAME = 'C:SQLServerSourceDatabase_Data.mdf'
) LOG ON
(
NAME = SourceDatabase_Log,
FILENAME = 'C:SQLServerSourceDatabase_Log.ldf'
)
GO
注意這里產(chǎn)品區(qū)域的大小。我定義它的大小為CHAR(150)來強(qiáng)調(diào)數(shù)據(jù)文件的增長級(jí)數(shù),這樣在我接下來的實(shí)例中將更容易解釋清楚快照是如何工作的。
現(xiàn)在既然我已經(jīng)有了一個(gè)源數(shù)據(jù)庫,現(xiàn)在我裝載一些數(shù)據(jù)來擴(kuò)展數(shù)據(jù)文件的大小位。如此,使用列表1中的腳本來創(chuàng)建銷售歷史表。
以下為引用的內(nèi)容:
USE SourceDatabase
GO
IF OBJECT_ID('SalesHistory')0 DROP TABLE SalesHistory
GO
CREATE TABLE SalesHistory
( SaleID INT IDENTITY(1,1),
Product CHAR(150), SaleDate DATETIME,
SalePrice MONEY
)
DECLARE @i INT
SET @i = 1
WHILE (@i =10000)
BEGIN INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('Computer', DATEADD(mm, @i, '3/11/1919'),
DATEPART(ms, GETDATE()) + (@i + 57) )
INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('BigScreen', DATEADD(mm, @i, '3/11/1927'),
DATEPART(ms, GETDATE()) + (@i + 13) )
INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('PoolTable', DATEADD(mm, @i, '3/11/1908'),
DATEPART(ms, GETDATE()) + (@i + 29) )
SET @i = @i + 1
END
GO
1、查詢SQL中的所有表: Select TABLE_NAME FROM 數(shù)據(jù)庫名稱.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 執(zhí)行之后,就可以看到數(shù)據(jù)庫中所有屬于自己建的表的名稱 2、查詢SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.name AS Column_name FROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id Where (dbo.sysobjects.xtype = 'u') AND (NOT (dbo.sysobjects.name LIKE 'dtproperties')) 3、在Sql查詢分析器,還有一個(gè)簡單的查詢方法: EXEC sp_MSforeachtable @command1="sp_spaceused '?'" 執(zhí)行完之后,就可以看到數(shù)據(jù)庫中所有用戶表的信息 4、查詢總存儲(chǔ)過程數(shù):select count(*) 總存儲(chǔ)過程數(shù) from sysobjects where xtype='p' 附:xtype類型D = 默認(rèn)值或 DEFAULT 約束
F = FOREIGN KEY 約束L = 日志FN = 標(biāo)量函數(shù)
IF = 內(nèi)嵌表函數(shù)
P = 存儲(chǔ)過程
PK = PRIMARY KEY 約束(類型是 K)
RF = 復(fù)制篩選存儲(chǔ)過程S = 系統(tǒng)表TF = 表函數(shù)
TR = 觸發(fā)器U = 用戶表UQ = UNIQUE 約束(類型是 K)V = 視圖X = 擴(kuò)展存儲(chǔ)過程 另:在sqlserver中取得某個(gè)數(shù)據(jù)庫中所有表名的sql語句 select sysobjects.name from sysobjects.xtype ='U';SELECT name
WHERE (xtype = 'U') 在數(shù)據(jù)庫的sysobjects表里有這個(gè)數(shù)據(jù)庫全部表的信息, xtype值為'U'的就是表名 注意:一般通過上述方法獲得全部用戶表示都會(huì)有一個(gè)dtproperties表,SQLSERVER 默認(rèn)它也是用戶表,想要從用戶表中排出,需要加上限定條件 status0,即:select * from sysobjects where xtype='U' and status0
SQLServer數(shù)據(jù)庫的快照只能通過SQL語句創(chuàng)建,以msdb數(shù)據(jù)庫為例進(jìn)行說明:
1、執(zhí)行以下代碼,看看MSDB數(shù)據(jù)庫有多少數(shù)據(jù)文件
EXEC SP_HELPDB msdb
2、為每一個(gè)數(shù)據(jù)文件創(chuàng)建快照,代碼如下:
create database snap_MSDBData_1811221202
ON ( NAME = MSDBData, FILENAME= 'D:\userdata\temp\Snap_MSDBData.snap')
AS SNAPSHOT OF MSDB
3、在“數(shù)據(jù)庫快照”那里就可以看到剛剛創(chuàng)建snap_MSDBData_1811221202這個(gè)快照了,對(duì)比一下快照和原庫,內(nèi)容是一樣的
4、數(shù)據(jù)庫快照其實(shí)也是一個(gè)數(shù)據(jù)庫,可以在上面執(zhí)行任何SQL語句,我們執(zhí)行一個(gè)查詢語句看看效果
SELECT *? FROM [MSDB].[dbo].[MSdbms]
SELECT *? FROM [snap_MSDBData_1811221202].[dbo].[MSdbms]
查詢結(jié)果是完全一樣的。
(如有幫助,請采納,謝謝)