VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > T-SQL >
  • sql语句大全之创建数据库快照

创建数据库快照

数据库快照是源数据库的只读、静态视图。一个源数据库可以有多个数据库快照。数据库快照的主要作用是:维护历史数据以用于制作各种报表,可以使用数据库快照将出现错误的源数据库恢复到创建快照时的状态。例如,在财务年度结束时,通过创建数据库快照可以有效地制作各种财务报表。

3.4.1  数据库快照简介

简单的说,快照就是数据库在某一指定时刻的照片。顾名思义,数据库快照(Database Snapshot)就像是为数据库照了相片一样。相片实际是照相时刻被照对象的静态呈现,而数据库快照则提供了源数据库在创建快照时刻的只读、静态视图。一旦为数据库建立了快照后,这个数据库快照就是创建快照那时刻数据库的情况,虽然数据库还在不断变化,但是这个快照不会再改变。
数据库快照在数据页级别上进行。当创建了某个数据库的数据库快照后,数据库快照使用一种稀疏文件维护源数据页。如果源数据库中的数据页上的数据没有更改,那么对数据库快照的读操作实际上就是读源数据库中的这些未更改的数据页。如果源数据库中的某些数据页上的数据被更改,则更改前的源数据页已经复制到数据快照的稀疏文件中去,对这些数据的读操作实际上就是读取稀疏文件中复制过来的数据页。如果源数据库中的数据更改频繁,会导致数据库快照中稀疏文件的大小增长的很快。为了避免数据库快照中的稀疏文件过大,可以通过创建新的数据库快照来解决这一问题。

3.4.2  创建数据库快照

在Microsoft SQL Server 2008系统中,使用CREATE DATABASE语句创建数据库快照。创建数据库快照的基本语法格式如下所示:
CREATE DATABASE database_snapshot_name
ON
(
NAME=logical_file_name,
FILENAME='os_file_name'
)[,…n]
AS SNAPSHOT OF source_database_name
在上述语法中,database_snapshot_name参数是将要创建的数据库快照的名称,该名称必须符合数据库名称的标识符规范,并且在数据库名称中是惟一的。数据库快照的稀疏文件由NAME和FILENAME两个关键字来指定。AS SNAPSHOT OF子句用于指定该数据库快照的源数据库名称。
下面来对【图书管理系统(BookDateBase)】数据库创建一个名称“BookDAteBase_snapshot”的数据库快照。代码如下所示:
CREATE DATABASE  BookDateBase_snapshot
ON
(
NAME= BookDateBase_DAT,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库 代码\BookDateBase_snapshot.snp'
),
(
NAME=BookDateBase_DAT1,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\章 管理数据库 代码\BookDateBase_snapshot1.snp'
),
(
NAME=BookDateBase_DAT2,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\章 管理数据库 代码\BookDateBase_snapshot2.snp'
),
(
NAME= BookDateBase_DAT3,
FILENAME='E:\张帅\zs SQL2008 shugao\SQL2008\第3章 管理数据库 代码\BookDateBase_snapshot3.snp'
)
AS SNAPSHOT OF  BookDateBAse
上述代码语句中,为【图书管理系统(BookDateBase)】数据库中的数据文件创建数据库快照,在创建数据库快照时,必须对每个数据文件建立快照,否则将提示缺少某个数据文件的快照。语句执行结果如图2-19所示。

图2-19  创建数据库快照
 
  如图3-21所示,创建快照后在【对象资源管理器】窗格的【数据库快照】节点下即可看到刚创建的【BookDateBase_snapshot】数据库快照,展开后可以看到其内容与源数据库完全相同。数据库快照的扩展名为.snp。
 
虽然数据库快照和源数据库的内容完全相同,但他与源数据库相比,数据库快照还是存在着一些限制:
l  必须在与源数据库相同的服务器实例上创建数据库快照。
l  数据库快照捕获开始创建快照的时间点,去掉所有未提交的事务。未提交的事务将在创建数据库快照期间回滚。
l  数据库快照为只读的,不能在数据库中执行修改操作。
l  禁止对model数据库、master数据库和tempdb数据库创建快照。
l  不能从数据库快照中删除文件。
l  不能备份或还原数据库快照。
l  不能附加或分离数据库快照。
l  不能在FAT32文件系统或RAW分区中创建快照。数据库快照所用的稀疏文件由NTFS文件系统提供。
l  数据库快照不支持全文索引,不能从源数据库传播全文目录。
l  数据库快照将继承快照创建时其源数据库的安全约束。由于快照是只读的,因此无法更改继承的权限,对源数据库的更改权限将不反映在现有快照中。
l  快照始终反映创建该快照时的文件组状态,即在线文件组将保持在线状态,离线文件组将保持离线状态。
l  只读文件组和压缩文件组不支持恢复。尝试恢复到这两类文件组将失败。
当源数据库发生损坏或出错时,就可以通过数据库快照来将数据库恢复到创建数据库快照时的状态。此时恢复的数据库会覆盖原来的数据库。执行恢复操作要求对源数据库具有RESTORE DATABASE权限,恢复时的语法格式如下所示:
RESTORE DATABASE database_name FROM DATABASE_SNAPSHOT=database_snapshot_name
代码中,database_name是源数据库的名称,database_snapshot_name是对应源数据库的快照名称。例如,要将【BookDateBase_snapshot】数据库快照恢复到【图书管理系统(BookDateBase)】数据库中,其语句如下所示:
RESTORE DATABASE BookDateBase from DATABASE_SNAPSHOT=' BookDateBase_snapshot '
GO
 
  使用上述命令时,会话中不能使用当前要恢复的数据库,否则会出错,建议在执行时使用master 数据库。也可以在工具栏上的【可用数据库】下拉框( )中选择其他的数据库。
 
接下来来介绍一下如何删除数据库快照,删除数据库快照的方法和其实和删除数据库的方法完全相同,也是使用DROP DATABASE语句。同样,不能删除当前正在使用的数据库快照。下面是删除【BookDateBase_snapshot】数据库快照的语句代码:
DROP DATABASE  BookDateBase_snapshot
GO

相关教程