SQL中如何用快照,恢復被誤刪的數據?
什么是快照
數據庫快照是sql server 2005的一個新功能。MSDN上對它的定義是:
數據庫快照是數據庫(稱為“源數據庫”)的只讀靜態(tài)視圖。在創(chuàng)建時,每個數據庫快照在事務上都與源數據庫一致。在創(chuàng)建數據庫快照時,源數據庫通常會有打開的事務。在快照可以使用之前,打開的事務會回滾以使數據庫快照在事務上取得一致。
創(chuàng)建示例數據庫
- Use MASTER;
 - GO
 - CREATE DATABASE [Snapshot_Test] ON PRIMARY
 - ( NAME = N'Snapshot_Test', --數據庫名稱
 - FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Snapshot_Test.mdf',
 - --數據文件存放位置及數據文件名稱
 - SIZE = 3072KB ,
 - --初始容量
 - MAXSIZE = UNLIMITED,
 - --最大容量
 - FILEGROWTH = 1024KB
 - --增長容量
 - )
 - LOG ON
 - ( NAME = N'Snapshot_Test_log',
 - FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Snapshot_Test_log.ldf' ,
 - SIZE = 504KB ,
 - MAXSIZE = UNLIMITED,
 - FILEGROWTH = 10%)
 - COLLATE Chinese_PRC_CI_AS
 - GO
 - EXEC dbo.sp_dbcmptlevel @dbname=N'Snapshot_Test', @new_cmptlevel=130
 - GO
 - USE [Snapshot_Test]
 - GO
 - SET ANSI_NULLS ON
 - GO
 - SET QUOTED_IDENTIFIER ON
 - GO
 - CREATE TABLE [dbo].[test](
 - [id] [int] NOT NULL,
 - [name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL
 - ) ON [PRIMARY]
 - GO
 
(提示:可以左右滑動代碼)
也可以直接在SSMS里通過圖形化界面創(chuàng)建測試數據庫,這里不作贅述。在創(chuàng)建完數據庫之后,我們又新建了一個test表,我們先往里面插入測試數據。如下:
- use snapshot_Test;
 - go
 - INSERT INTO TEST (id,name)values(1,'hello 1');
 - INSERT INTO TEST (id,name)values(2,'hello 2');
 - INSERT INTO TEST (id,name)values(3,'hello 3');
 - INSERT INTO TEST (id,name)values(4,'hello 4');
 - GO
 - SELECT * FROM dbo.test;
 
結果:
然后我們馬上創(chuàng)建一個快照,創(chuàng)建快照使用的也是CREATE DATABASE語句,如下:
創(chuàng)建數據庫快照
執(zhí)行下面的創(chuàng)建快照的語句
- create database Snapshot_Test_shot ON
 - (
 - --是源數據庫的邏輯名
 - Name = Snapshot_Test,
 - --快照文件地址
 - FileName = 'D:\SqlData\Snapshot_Test_shot.ss'
 - )
 - AS SNAPSHOT OF Snapshot_Test;
 
結果:
現在的快照應該和我們新建的數據庫一摸一樣,可以通過sql server的對象瀏覽器查看數據庫快照,我們可以通過USE [快照庫名]來查詢數據庫快照
- use Snapshot_Test_shot;
 - go
 - SELECT * FROM dbo.test;
 
結果:
刪除測試庫數據
下面我們刪除測試數據庫中的數據
- use Snapshot_Test;
 - go
 - DELETE FROM dbo.test;
 
結果:
使用快照恢復數據庫
上面刪除是我們模擬誤刪了數據庫中的數據,但是幸好我們做了數據庫的快照??梢酝ㄟ^快照來還原剛才被誤刪的數據。
- --語法
 - RESTORE DATABASE DB_NAME
 - FROM DATABASE_SNAPSHOT = 'DB_SNAPSHOT_NAME'
 
我們按照上面的語法進行恢復
- RESTORE DATABASE Snapshot_test
 - FROM DATABASE_SNAPSHOT = 'Snapshot_test_shot'
 
執(zhí)行完上面的恢復語句后,我們再查詢一下測試庫中的表
- use Snapshot_Test;
 - go
 - SELECT * FROM test
 
結果:
數據又回來,證明可以通過創(chuàng)建快照來恢復被誤刪的數據。
注意:
1、快照是只讀的,一旦創(chuàng)建不能修改
2、快照只能恢復數據庫,不能恢復指定的表
3、為防止誤刪除,必須在數據插入或更新到數據庫之后再創(chuàng)建快照,否則在插入或更新之前創(chuàng)建快照,插入或更新的數據被刪除是無法恢復的。
4、快照一般與定時任務一起使用,可以定時創(chuàng)建不同的快照防止數據丟失。
刪除數據庫快照
和刪除數據庫語法一樣
- DROP DATABASE Snapshot_Test_shot
 
結果:
數據庫快照下面沒有任何快照了,說明已經被刪除。
應用場景
在MSDN中數據庫快照的典型應用是
1) 維護歷史數據以生成報表。
2) 使用為了實現可用性目標而維護的鏡像數據庫來卸載報表。
3) 使數據免受管理失誤所帶來的影響。
4) 使數據免受用戶失誤所帶來的影響。





















 
 
 







 
 
 
 