SQL中如何用快照,恢復(fù)被誤刪的數(shù)據(jù)?
點擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,
設(shè)為“置頂或星標(biāo)”,第一時間送達(dá)干貨
什么是快照
數(shù)據(jù)庫快照是sql server 2005的一個新功能。MSDN上對它的定義是:
數(shù)據(jù)庫快照是數(shù)據(jù)庫(稱為“源數(shù)據(jù)庫”)的只讀靜態(tài)視圖。在創(chuàng)建時,每個數(shù)據(jù)庫快照在事務(wù)上都與源數(shù)據(jù)庫一致。在創(chuàng)建數(shù)據(jù)庫快照時,源數(shù)據(jù)庫通常會有打開的事務(wù)。在快照可以使用之前,打開的事務(wù)會回滾以使數(shù)據(jù)庫快照在事務(wù)上取得一致。
創(chuàng)建示例數(shù)據(jù)庫
Use MASTER;
GO
CREATE DATABASE [Snapshot_Test] ON PRIMARY
( NAME = N'Snapshot_Test', --數(shù)據(jù)庫名稱
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Snapshot_Test.mdf',
--數(shù)據(jù)文件存放位置及數(shù)據(jù)文件名稱
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)建測試數(shù)據(jù)庫,這里不作贅述。在創(chuàng)建完數(shù)據(jù)庫之后,我們又新建了一個test表,我們先往里面插入測試數(shù)據(jù)。如下:
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;結(jié)果:

然后我們馬上創(chuàng)建一個快照,創(chuàng)建快照使用的也是CREATE DATABASE語句,如下:
創(chuàng)建數(shù)據(jù)庫快照
執(zhí)行下面的創(chuàng)建快照的語句
create database Snapshot_Test_shot ON
(
--是源數(shù)據(jù)庫的邏輯名
Name = Snapshot_Test,
--快照文件地址
FileName = 'D:\SqlData\Snapshot_Test_shot.ss'
)
AS SNAPSHOT OF Snapshot_Test;結(jié)果:

現(xiàn)在的快照應(yīng)該和我們新建的數(shù)據(jù)庫一摸一樣,可以通過sql server的對象瀏覽器查看數(shù)據(jù)庫快照,我們可以通過USE [快照庫名]來查詢數(shù)據(jù)庫快照
use Snapshot_Test_shot;
go
SELECT * FROM dbo.test;結(jié)果:

刪除測試庫數(shù)據(jù)
下面我們刪除測試數(shù)據(jù)庫中的數(shù)據(jù)
use Snapshot_Test;
go
DELETE FROM dbo.test;結(jié)果:

使用快照恢復(fù)數(shù)據(jù)庫
上面刪除是我們模擬誤刪了數(shù)據(jù)庫中的數(shù)據(jù),但是幸好我們做了數(shù)據(jù)庫的快照。可以通過快照來還原剛才被誤刪的數(shù)據(jù)。
--語法
RESTORE DATABASE DB_NAME
FROM DATABASE_SNAPSHOT = 'DB_SNAPSHOT_NAME'我們按照上面的語法進(jìn)行恢復(fù)
RESTORE DATABASE Snapshot_test
FROM DATABASE_SNAPSHOT = 'Snapshot_test_shot'執(zhí)行完上面的恢復(fù)語句后,我們再查詢一下測試庫中的表
use Snapshot_Test;
go
SELECT * FROM test結(jié)果:

數(shù)據(jù)又回來,證明可以通過創(chuàng)建快照來恢復(fù)被誤刪的數(shù)據(jù)。
注意:
1、快照是只讀的,一旦創(chuàng)建不能修改
2、快照只能恢復(fù)數(shù)據(jù)庫,不能恢復(fù)指定的表
3、為防止誤刪除,必須在數(shù)據(jù)插入或更新到數(shù)據(jù)庫之后再創(chuàng)建快照,否則在插入或更新之前創(chuàng)建快照,插入或更新的數(shù)據(jù)被刪除是無法恢復(fù)的。
4、快照一般與定時任務(wù)一起使用,可以定時創(chuàng)建不同的快照防止數(shù)據(jù)丟失。
刪除數(shù)據(jù)庫快照
和刪除數(shù)據(jù)庫的語法一樣
DROP DATABASE Snapshot_Test_shot結(jié)果:

數(shù)據(jù)庫快照下面沒有任何快照了,說明已經(jīng)被刪除。
應(yīng)用場景
在MSDN中數(shù)據(jù)庫快照的典型應(yīng)用是
1) 維護(hù)歷史數(shù)據(jù)以生成報表。
2) 使用為了實現(xiàn)可用性目標(biāo)而維護(hù)的鏡像數(shù)據(jù)庫來卸載報表。
3) 使數(shù)據(jù)免受管理失誤所帶來的影響。
4) 使數(shù)據(jù)免受用戶失誤所帶來的影響。

推薦閱讀
后臺回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
后臺回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群
