搜尋本站文章

2008-09-04

資料庫快照集 (Database Snapshot) 壞了、損毀,對於原本資料庫的影響?



分享一個朋友詢問的問題:
資料庫快照集(Database Snapshot) 壞了、損毀,對於原本資料庫的影響?

參考的答案是:
資料庫快照集若是損毀,原來的資料庫仍是可以正常運作,僅資料庫快照集功能無法使用。

請參考以下的範例:

USE master

--01 檢視原始資料庫的磁碟空間
SELECT name, physical_name, state_desc, size*8.0 AS 'Size(KB)'
FROM DevAdventureWorks.sys.database_files

--02 建立第一份資料庫快照集
CREATE DATABASE DevAdventureWorks_0800
ON ( NAME = N'DevAdventureWorks',
FILENAME = N'C:\mydev\DB\DevAdventureWorks_0800.DS')
AS SNAPSHOT OF DevAdventureWorks

--03 建立第二份資料庫快照集
CREATE DATABASE DevAdventureWorks_1200
ON ( NAME = N'DevAdventureWorks',
FILENAME = N'C:\mydev\DB\DevAdventureWorks_1200.SS')
AS SNAPSHOT OF DevAdventureWorks

--04 檢視第二份資料庫快照集的磁碟空間與實體檔案大小
SELECT DB_NAME(DBID) AS '資料庫', BytesOnDisk/1024.0 AS '實體檔案大小(KB)'
FROM fn_virtualfilestats(DB_ID(N'DevAdventureWorks_1200'), NULL);
GO

--05 檢視原始資料庫的磁碟空間
SELECT name N'邏輯檔案',physical_name N'實體檔案' ,size*8.0/1024 N'檔案大小(MB)'
FROM DevAdventureWorks.sys.database_files

--06 刪除第一份資料庫快照集
DROP DATABASE DevAdventureWorks_0800

--07 檢視資料庫快照集與來源資料庫之關係,使用:source_database_id,資料庫快照集的來源資料庫識別碼
SELECT *
FROM sys.databases
ORDER BY source_database_id DESC

/*************************************************************************************************/
-- Undeleting rows

-- 檢視原始資料庫的資料
SELECT COUNT(*)
FROM DevAdventureWorks.Production.WorkOrderRouting

--
SELECT *
FROM DevAdventureWorks.Production.WorkOrderRouting

-- 發生意外,刪除了全部資料 Accidental
TRUNCATE TABLE DevAdventureWorks.Production.WorkOrderRouting

-- 檢視原始資料庫的資料
SELECT COUNT(*)
FROM DevAdventureWorks.Production.WorkOrderRouting

-- 檢視資料庫快照集,資料表內的資料
SELECT *
FROM DevAdventureWorks_1200.Production.WorkOrderRouting

-- 復原因故被刪除的資料
INSERT INTO DevAdventureWorks.Production.WorkOrderRouting
SELECT *
FROM DevAdventureWorks_1200.Production.WorkOrderRouting

-- 檢視已經復原的資料,Congratulation
SELECT COUNT(*)
FROM DevAdventureWorks.Production.WorkOrderRouting

--
SELECT *
FROM DevAdventureWorks.Production.WorkOrderRouting

/*************************************************************************************************/
--01 停止SQL Server後,請破壞DevAdventureWorks_1200的檔案。

--02 重新啟動SQL Server。

--03 檢視資料庫內的資料,沒有任何影響
SELECT *
FROM DevAdventureWorks.Production.WorkOrderRouting
WHERE WorkOrderID=5281

--04 修改資料,也不受影響
DELETE DevAdventureWorks.Production.WorkOrderRouting
WHERE WorkOrderID=5281

--05 檢視被破壞的資料庫快照集:DevAdventureWorks_1200,無法檢視資料
SELECT *
FROM DevAdventureWorks_1200.Production.WorkOrderRouting

/*
訊息 945,層級 14,狀態 2,行 1
檔案無法存取、記憶體或磁碟空間不足,因此無法開啟資料庫 'DevAdventureWorks_1200'。
詳細資訊請參閱 SQL Server 錯誤記錄檔。
*/

-- 刪除資料庫快照集
DROP DATABASE DevAdventureWorks_1200



請參考下圖:01_SQLServer記錄檔內的資訊



請參考下圖:02_物件總管_無法展開_無法檢視其資料庫物件



請參考下圖:03_檢視被破壞的資料庫快照集的檔案



何謂資料庫快照集?
在 SQL Server 2005 Enterprise Edition 和更新版本中,才能使用資料庫快照集。所有復原模式都支援資料庫快照集。

資料庫快照集是資料庫 (來源資料庫) 的唯讀、靜態檢視。來源資料庫中可以存在多個快照集,而且永遠位於和資料庫相同的伺服器執行個體。每個資料庫快照集會與快照集建立時的來源資料庫維持交易的一致性。快照集會一直保存,直到資料庫擁有者明確卸除為止。

與使用者資料庫的預設行為不同,資料庫快照集建立時,ALLOW_SNAPSHOT_ISOLATION 資料庫選項是設為 ON (不管主要資料庫或模型系統資料庫上這個選項的設定值如何)。

快照集可以用於報表用途。此外,在來源資料庫發生使用者錯誤的情況下,您可以將來源資料庫還原為它在建立快照集時所處於的狀態。您只會失去建立快照集之後的資料庫更新資料。


參考文件:
資料庫快照集

http://technet.microsoft.com/zh-tw/library/ms175158.aspx