数据库中如何用快照,恢复被误删的数据?

    作者:平凡世界 更新于: 2021-06-21 15:08:03

    SQL中如何用快照,恢复被误删的数据?数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。

    以 内模式为 框架所组成的数据库叫做物理数据库;以 概念模式为框架所组成的数据叫概念数据库;以外模式为框架所组成的数据库叫用户数据库。

    数据库快照是数据库(称为“源数据库”)的只读静态视图。在创建时,每个数据库快照在事务上都与源数据库一致。在创建数据库快照时,源数据库通常会有打开的事务。在快照可以使用之前,打开的事务会回滚以使数据库快照在事务上取得一致。

    数据库中如何用快照,恢复被误删的数据?_MYSQL数据库_关系数据库_oracle数据库_课课家

    什么是快照

    数据库快照是SQL Server 2005的一个新功能。MSDN上对它的定义是:

    数据库快照是数据库(称为“源数据库”)的只读静态视图。在创建时,每个数据库快照在事务上都与源数据库一致。在创建数据库快照时,源数据库通常会有打开的事务。在快照可以使用之前,打开的事务会回滚以使数据库快照在事务上取得一致。

    创建示例数据库

    1. Use MASTER; 
    2. GO 
    3. CREATE DATABASE [Snapshot_Test] ON  PRIMARY 
    4. NAME = N'Snapshot_Test'--数据库名称 
    5. FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL13.MSSQLSERVER\\MSSQL\\DATA\\Snapshot_Test.mdf'
    6. --数据文件存放位置及数据文件名称 
    7. SIZE = 3072KB , 
    8. --初始容量 
    9. MAXSIZE = UNLIMITED, 
    10. --最大容量 
    11. FILEGROWTH = 1024KB 
    12. --增长容量 
    13. LOG ON  
    14. NAME = N'Snapshot_Test_log'
    15. FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL13.MSSQLSERVER\\MSSQL\\DATA\\Snapshot_Test_log.ldf' , 
    16. SIZE = 504KB , 
    17. MAXSIZE = UNLIMITED, 
    18. FILEGROWTH = 10%) 
    19. COLLATE Chinese_PRC_CI_AS 
    20. GO 
    21. EXEC dbo.sp_dbcmptlevel @dbname=N'Snapshot_Test', @new_cmptlevel=130 
    22. GO 
    23. USE [Snapshot_Test] 
    24. GO 
    25. SET ANSI_NULLS ON 
    26. GO 
    27. SET QUOTED_IDENTIFIER ON 
    28. GO 
    29. CREATE TABLE [dbo].[test]( 
    30.  [id] [intNOT NULL
    31.  [name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL 
    32. ON [PRIMARY
    33. GO 

    (提示:可以左右滑动代码)

    也可以直接在SSMS里通过图形化界面创建测试数据库,这里不作赘述。在创建完数据库之后,我们又新建了一个test表,我们先往里面插入测试数据。如下:

    1. use snapshot_Test; 
    2. go 
    3. INSERT INTO TEST (id,name)values(1,'hello 1'); 
    4. INSERT INTO TEST (id,name)values(2,'hello 2'); 
    5. INSERT INTO TEST (id,name)values(3,'hello 3'); 
    6. INSERT INTO TEST (id,name)values(4,'hello 4'); 
    7. GO 
    8. SELECT * FROM dbo.test; 

    结果:

    然后我们马上创建一个快照,创建快照使用的也是CREATE DATABASE语句,如下:

    创建数据库快照

    执行下面的创建快照的语句

    1. create database Snapshot_Test_shot ON 
    2.    --是源数据库的逻辑名 
    3.    Name = Snapshot_Test, 
    4.    --快照文件地址 
    5.    FileName = 'D:\\SqlData\\Snapshot_Test_shot.ss' 
    6. AS SNAPSHOT OF Snapshot_Test; 

    结果:

    现在的快照应该和我们新建的数据库一摸一样,可以通过sql server的对象浏览器查看数据库快照,我们可以通过USE [快照库名]来查询数据库快照

    1. use Snapshot_Test_shot; 
    2. go 
    3. SELECT * FROM dbo.test; 

    结果:

    删除测试库数据

    下面我们删除测试数据库中的数据

    1. use Snapshot_Test; 
    2. go 
    3. DELETE FROM dbo.test; 

    结果:

    使用快照恢复数据库

    上面删除是我们模拟误删了数据库中的数据,但是幸好我们做了数据库的快照。可以通过快照来还原刚才被误删的数据。

    1. --语法 
    2. RESTORE DATABASE DB_NAME 
    3. FROM DATABASE_SNAPSHOT = 'DB_SNAPSHOT_NAME' 

    我们按照上面的语法进行恢复

    1. RESTORE DATABASE Snapshot_test 
    2. FROM DATABASE_SNAPSHOT = 'Snapshot_test_shot' 

    执行完上面的恢复语句后,我们再查询一下测试库中的表

    1. use Snapshot_Test; 
    2. go 
    3. SELECT * FROM test 

    结果:

    数据又回来,证明可以通过创建快照来恢复被误删的数据。

    注意:

    1、快照是只读的,一旦创建不能修改

    2、快照只能恢复数据库,不能恢复指定的表

    3、为防止误删除,必须在数据插入或更新到数据库之后再创建快照,否则在插入或更新之前创建快照,插入或更新的数据被删除是无法恢复的。

    4、快照一般与定时任务一起使用,可以定时创建不同的快照防止数据丢失。

    删除数据库快照

    和删除数据库语法一样

    1. DROP DATABASE Snapshot_Test_shot 

    结果:

    数据库快照下面没有任何快照了,说明已经被删除。

    应用场景

    在MSDN中数据库快照的典型应用是

    1) 维护历史数据以生成报表。

    2) 使用为了实现可用性目标而维护的镜像数据库来卸载报表。

    3) 使数据免受管理失误所带来的影响。

    4) 使数据免受用户失误所带来的影响。

    数据库中的数据是为众多用户所 共享其信息而建立的,已经摆脱了具体 程序的限制和制约。不同的用户可以按各自的用法使用数据库中的数据;多个用户可以同时共享数据库中的数据资源,即不同的用户可以同时存取数据库中的同一个数据。数据共享性不仅满足了各用户对信息内容的要求,同时也满足了各用户之间信息通信的要求。

课课家教育

未登录