SQL的這個數據恢復功能你用過嗎?
今天我們要介紹的這個數據恢復功能叫快照。
什么是快照
數據庫快照是sql server 2005的一個新功能。MSDN上對它的定義是:
數據庫快照是數據庫(稱為“源數據庫”)的只讀靜態視圖。在創建時,每個數據庫快照在事務上都與源數據庫一致。在創建數據庫快照時,源數據庫通常會有打開的事務。在快照可以使用之前,打開的事務會回滾以使數據庫快照在事務上取得一致。
客戶端可以查詢數據庫快照,這對于基于創建快照時的數據編寫報表是很有用的。而且,如果以后源數據庫損壞了,便可以將源數據庫恢復到它在創建快照時的狀態。
下面我們實踐一下數據庫快照的創建和使用。
創建示例數據庫
- 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
(提示:可以左右滑動代碼)
在創建完數據庫之后,我們馬上創建一個快照,創建快照使用的也是CREATE DATABASE語句,如下:
創建數據庫快照
- 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;
結果:
以上語句執行后dbo.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;
結果:
我們再次查詢快照數據庫中的數據
- use Snapshot_Test_shot;
- go
- SELECT * FROM dbo.test;
結果:
依舊沒有數據,那是因為快照一旦創建就不能往里面寫數據了,是只讀文件。
使用快照恢復數據庫
從數據庫快照恢復數據庫
- use master;
- GO
- RESTORE DATABASE Snapshot_Test from
- DATABASE_SNAPSHOT = 'Snapshot_Test_shot';
恢復后,剛插入的數據就沒有了,我們可以查詢一下。
- use Snapshot_Test;
- SELECT * FROM dbo.test
結果:
由此可以證明,快照將數據庫恢復到創建快照的那一刻了。
刪除數據庫快照
和刪除數據庫的語法一樣
DROP DATABASE Snapshot_Test_shot
結果:
數據庫快照下面沒有任何快照了,說明已經被刪除。
應用場景
在MSDN中數據庫快照的典型應用是
1) 維護歷史數據以生成報表。
2) 使用為了實現可用性目標而維護的鏡像數據庫來卸載報表。
3) 使數據免受管理失誤所帶來的影響。
4) 使數據免受用戶失誤所帶來的影響。