SQL的這個(gè)數(shù)據(jù)恢復(fù)功能你用過(guò)嗎?
今天我們要介紹的這個(gè)數(shù)據(jù)恢復(fù)功能叫快照。
什么是快照
數(shù)據(jù)庫(kù)快照是sql server 2005的一個(gè)新功能。MSDN上對(duì)它的定義是:
數(shù)據(jù)庫(kù)快照是數(shù)據(jù)庫(kù)(稱為“源數(shù)據(jù)庫(kù)”)的只讀靜態(tài)視圖。在創(chuàng)建時(shí),每個(gè)數(shù)據(jù)庫(kù)快照在事務(wù)上都與源數(shù)據(jù)庫(kù)一致。在創(chuàng)建數(shù)據(jù)庫(kù)快照時(shí),源數(shù)據(jù)庫(kù)通常會(huì)有打開(kāi)的事務(wù)。在快照可以使用之前,打開(kāi)的事務(wù)會(huì)回滾以使數(shù)據(jù)庫(kù)快照在事務(wù)上取得一致。
客戶端可以查詢數(shù)據(jù)庫(kù)快照,這對(duì)于基于創(chuàng)建快照時(shí)的數(shù)據(jù)編寫(xiě)報(bào)表是很有用的。而且,如果以后源數(shù)據(jù)庫(kù)損壞了,便可以將源數(shù)據(jù)庫(kù)恢復(fù)到它在創(chuàng)建快照時(shí)的狀態(tài)。
下面我們實(shí)踐一下數(shù)據(jù)庫(kù)快照的創(chuàng)建和使用。
創(chuàng)建示例數(shù)據(jù)庫(kù)
- Use MASTER;
- GO
- CREATE DATABASE [Snapshot_Test] ON PRIMARY
- ( NAME = N'Snapshot_Test', --數(shù)據(jù)庫(kù)名稱
- 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
- --增長(zhǎng)容量
- )
- 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
(提示:可以左右滑動(dòng)代碼)
在創(chuàng)建完數(shù)據(jù)庫(kù)之后,我們馬上創(chuàng)建一個(gè)快照,創(chuàng)建快照使用的也是CREATE DATABASE語(yǔ)句,如下:
創(chuàng)建數(shù)據(jù)庫(kù)快照
- create database Snapshot_Test_shot ON
- (
- --是源數(shù)據(jù)庫(kù)的邏輯名
- Name = Snapshot_Test,
- --快照文件地址
- FileName = 'D:\SqlData\Snapshot_Test_shot.ss'
- )
- AS SNAPSHOT OF Snapshot_Test;
結(jié)果:
現(xiàn)在的快照應(yīng)該和我們新建的數(shù)據(jù)庫(kù)一摸一樣,可以通過(guò)sql server的對(duì)象瀏覽器查看數(shù)據(jù)庫(kù)快照,我們可以通過(guò)USE [快照庫(kù)名]來(lái)查詢數(shù)據(jù)庫(kù)快照
- use Snapshot_Test_shot;
- go
- SELECT * FROM dbo.test;
結(jié)果:
以上語(yǔ)句執(zhí)行后dbo.test中沒(méi)有任何數(shù)據(jù),下一步我們往源數(shù)據(jù)庫(kù)表中插入幾條數(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é)果:
我們?cè)俅尾樵兛煺諗?shù)據(jù)庫(kù)中的數(shù)據(jù)
- use Snapshot_Test_shot;
- go
- SELECT * FROM dbo.test;
結(jié)果:
依舊沒(méi)有數(shù)據(jù),那是因?yàn)榭煺找坏﹦?chuàng)建就不能往里面寫(xiě)數(shù)據(jù)了,是只讀文件。
使用快照恢復(fù)數(shù)據(jù)庫(kù)
從數(shù)據(jù)庫(kù)快照恢復(fù)數(shù)據(jù)庫(kù)
- use master;
- GO
- RESTORE DATABASE Snapshot_Test from
- DATABASE_SNAPSHOT = 'Snapshot_Test_shot';
恢復(fù)后,剛插入的數(shù)據(jù)就沒(méi)有了,我們可以查詢一下。
- use Snapshot_Test;
- SELECT * FROM dbo.test
結(jié)果:
由此可以證明,快照將數(shù)據(jù)庫(kù)恢復(fù)到創(chuàng)建快照的那一刻了。
刪除數(shù)據(jù)庫(kù)快照
和刪除數(shù)據(jù)庫(kù)的語(yǔ)法一樣
DROP DATABASE Snapshot_Test_shot
結(jié)果:
數(shù)據(jù)庫(kù)快照下面沒(méi)有任何快照了,說(shuō)明已經(jīng)被刪除。
應(yīng)用場(chǎng)景
在MSDN中數(shù)據(jù)庫(kù)快照的典型應(yīng)用是
1) 維護(hù)歷史數(shù)據(jù)以生成報(bào)表。
2) 使用為了實(shí)現(xiàn)可用性目標(biāo)而維護(hù)的鏡像數(shù)據(jù)庫(kù)來(lái)卸載報(bào)表。
3) 使數(shù)據(jù)免受管理失誤所帶來(lái)的影響。
4) 使數(shù)據(jù)免受用戶失誤所帶來(lái)的影響。