SQLServer恢复表级数据详解

最近几天,公司的技术维护人员频繁让我恢复数据库,因为他们总是少了where条件,导致update、delete出现了无法恢复的后果,加上那些库都是几十G。恢复起来少说也要十几分钟。为此,找了一些资料和工作总结,给出一下几个方法,用于快速恢复表,而不是库,但是切记,防范总比亡羊补牢好。

在生产环境或者开发环境,往往都有某些非常重要的表。这些表存放了核心数据。当这些表出现数据损坏时,需要尽快还原。但是,正式环境的数据库往往都是非 常大的,统计数据表明,1T的数据库还原时间接近24小时,所以因为一个表而还原一个库,不单空间,甚至时间上都是一个很大的挑战。本文介绍如何恢复单 表,而不需要恢复整个库。

现在假设一个表:TEST_TABLE。我们需要尽快恢复这个表,并且把恢复过程中对其他表和用户的影响降到最低。

SQLServer(特别是2008以后),具有很多备份及恢复功能:完整、部分、文件、差异和事务备份。而恢复模式的选择严重影响备份策略和备份类型。

下面是几个可供参考的方案,但是记住,各有好坏,应该按照实际需要选择:

方案1:恢复到一个不同的数据库:

对于小数据库来说不失为一种好的办法,用备份还原一个新的库,并把新库中的表数据同步回去。你可以做完整恢复,或者时间点恢复。但是对于大数据库,是非常耗时和耗费磁盘空间的。这个方法仅仅用于还原数据,在还原数据(就是同步数据)的时候,你要考虑触发器、外键等因素。

方案2:使用STOPAT来还原日志:

你可能想恢复最近的数据库备份,并回滚到某个时间点,即发生意外前的某个时刻。此时可以使用STOPAT子句,但是前提是必须为完整或大容量日志恢复模式。下面是例子:

RESTORE DATABASE 需要恢复的数据库 FROM 数据库备份 WITH FILE=3, NORECOVERY ; RESTORE LOG需要恢复的数据库 FROM数据库备份 WITH FILE=4, NORECOVERY, STOPAT = 'Oct 22, 2012 02:00 AM' ; RESTORE DATABASE 需要恢复的数据库 WITH RECOVERY ;

注意:这种方法的主要缺点是会覆盖掉从stopat指定时间点之后所修改的所有数据。所以要衡量好得失。

方案3:数据库快照:

创建数据库快照。当发生意外时,可以从快照中直接获取原来的数据。但是必须是在发生意外之前创建的快照。这在核心表不经常更新,特别是有规律更新时很有用。但是当表经常、不定期被更新,或者很多用户在访问时,这种方法就不可取了。当需要使用这种方法时,记得在每次更新前先创建快照。

方案4:使用视图:

你可以创建一个新的数据库,并把TEST_TABLE移动到这个库里面。当你需要恢复的时候,你只需要恢复这个非常小的数据库即可。访问源数据库的数据时,最简单的方法就是创建一个视图,选择TEST_TABLE表中所有列的所有数据。但是注意这个方法需要在创建视图前,重命名或者删除源数据库的表:

USE 需要恢复的数据库 ; GO CREATE VIEW TEST_TABLE AS SELECT * FROM 备份数据库.架构名.TEST_TABLE ; GO

使用这种方法,可以对视图使用SELECT /INSERT/UPDATE/DELETE语句,就像直接操作实体表似得。当TEST_TABLE更改时,要使用SP_REFRESHVIEW存储过程来更新元数据。

方案5:创建同义词(Synonym):

和方案4类似,把表移到另外一个数据库,然后对源数据库的这个表创建一个同义词:

USE 需要恢复的数据库 ; GO CREATE SYNONYM TEST_TABLE FOR 新数据库.架构名.TEST_TABLE ; GO

方案6:使用BCP保存数据:

你可以创建一个作业,使用BCP定期导出数据。但是这种方法的缺点和方案1类似,需要找到哪天的文件并导进去,同时要考虑触发器和外键问题。

各种方法的对比:这个方法的有点就是你不需要担心元数据更新所带来的结构变更不及时。但是这个方法的问题就是不能在DDL语句中引用同义词,或者不能在链接服务器中找到。

方法 优点 缺点 还原数据库 快且容易 适用于小库,且要注意触发器和外键等 还原日志 能指定时间点 所有时间点后的新数据会被覆盖 数据库快照 当表不是经常更新时很有用 当表并行更新时,快照容易出现问题 视图 把表的数据于库分开,没有数据丢失 元数据需要周期性更新,并要定期维护新数据库 同义词 把表的数据于库分开,没有数据丢失 在链接服务器上不能用,并要定期维护新数据库 BCP 拥有表的专用备份 需要额外的空间、还会出现触发器、外键等问题

总结:

良好的编程习惯和良好的备份机制才是解决问题的根本,以上的措施都仅仅是一个亡羊补牢的办法。可能有人说SQLServer 新版本不是有部分还原吗?我们来看看联机丛书的说明:

可以看到,其他这种方法很难还原一个表,但是当库小的时候,倒可以试试。

时间: 2024-11-10 07:40:54

SQLServer恢复表级数据详解的相关文章

SQLServer恢复表级数据

原文:SQLServer恢复表级数据        最近几天,公司的技术维护人员频繁让我恢复数据库,因为他们总是少了where条件,导致update.delete出现了无法恢复的后果,加上那些库都是几十G.恢复起来少说也要十几分钟.为此,找了一些资料和工作总结,给出一下几个方法,用于快速恢复表,而不是库,但是切记,防范总比亡羊补牢好.        在生产环境或者开发环境,往往都有某些非常重要的表.这些表存放了核心数据.当这些表出现数据损坏时,需要尽快还原.但是,正式环境的数据库往往都是非常大的

WordPress数据库表及字段详解

今天熊哥在朋友的博客看到关于wordpress数据库的介绍,感觉很有用,相信对同样在使用wordpress的同学也很有用,所以就拿过来分享一下.希望对自己和大家有所帮助. [废话] 记得刚接触网站时对数据库一点概念也没有,那时公司网站要换服务器,于是就单纯的转移了网站文件,结果可想而知.一翻折腾,在糊里糊涂中按网上的教程终于搞定,享受成就感时也第一次接触了数据库.那时感觉数据库高端深奥遥远,从没想过自己以后会跟数据库再有交集:而后,自己成为一名数据库工程师时也没想起当年数据库曾给自己带来困扰.现

jQuery validate+artdialog+jquery form实现弹出表单思路详解_jquery

功能描述: 在页面弹出一个form表单,ajax无刷新提交表单,表单需通过验证. 适用范围: 适用于在列表页面新增,修改记录. 需要加载的js文件: jquery.min.js artDialog.js iframeTools.js jquery.form.js jquery.validate.js 实现思路: 在页面中将表单放到一个隐藏的容器中,用artdialog弹出该form并对form加上jqueryvalidate验证,提交采用jqueryform ajax提交,由于都是用现成的插件写

JS中artdialog弹出框控件之提交表单思路详解_javascript技巧

artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口. 前言: 自适应内容 artDialog的特殊UI框架能够适应内容变化,甚至连外部程序动态插入的内容它仍然能自适应,因此你不必去考虑消息内容尺寸使用它.它的消息容器甚至能够根据宽度让文本居中或居左对齐--这一切全是XHTML+CSS原生实现. 完善的接口 它的接口完善,可以轻易与外部程序配合使用.如异步写入消息.控制位置.尺寸.显示与隐藏.关闭等. 细致的体验 如果不是在输入状态,它支持Esc快捷键关

DB2表空间管理详解(原创)

create tablespace语法树 >>-CREATE --+-----------------------+---------------------------->            +-LARGE-----------------+               +-REGULAR---------------+               | .-SYSTEM-.            |               '-+--------+--TEMPORARY-'  

SQLServer中merge函数用法详解_MsSql

Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:"根据与源表联接的结果,对目标表执行插入.更新或删除操作. MERGE 目标表 USING 源表 ON 匹配条件 WHEN MATCHED THEN 语句 WHEN NOT MATCHED THEN 语句; 其中最后语句分号不可以省略,且源表既可以是一个表也可以是一个子查询语句 WHEN NOT MATCHE

网络传输中的MAC地址表、ARP缓存表以及路由表详解

一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的. 交换机的工作原理 交换机在接收到数据帧以后,首先.会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着.会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数

C++Builder注册表编程实例详解

一.注册表编程详解 Windows 注册表中包含了系统配置.机器硬件配置. Win32 应用程序和用户的其他配置信息.许多高级一些的功能都要通过对注册表的操作来实现.在 WinAPI 中提供了 RegCgreateKey() . RegOpenKey() . RegQueryValue() 等函数操作注册表,但是用这些函数来操作注册表使用起来非常麻烦.而利用 C ++ Builder 的 TREGISTRY 类,我们则可以轻松实现对注册表的操作.下面我先介绍一下 TRegistry 类使用方法.

mysql alter table命令修改表结构实例详解_php实例

mysql alter table语句可以修改表的基本结构,例如添加字段.删除字段.添加主键.添加索引.修改字段数据类型.对表重命名等等操作,本文章通过两个简单的实例向大家介绍mysql alter table的使用方法.  实例一:使用ALTER TABLE命令向表中添加字段.修改字段类型以及设置主键. 首先创建一个表,SQL语句如下: mysql> CREATE TABLE myTable( -> ID SMALLINT -> ); 使用desc命令查看表结构: mysql>