SQLServer恢复表级数据
最近⼏天,公司的技术维护⼈员频繁让我恢复数据库,因为他们总是少了where条件,导致update、delete出现了⽆法恢复的后果,加上那些库都是⼏⼗G。恢复起来少说也要⼗⼏分钟。为此,了⼀些资料和⼯作总结,给出⼀下⼏个⽅法,⽤于快速恢复表,⽽不是库,但是切记,防范总⽐亡⽺补牢好。
在⽣产环境或者开发环境,往往都有某些⾮常重要的表。这些表存放了核⼼数据。当这些表出现数据损坏时,需要尽快还原。但是,正式环境的数据库往往都是⾮常⼤的,统计数据表明,1T的数据库还原时间接近24⼩时,所以因为⼀个表⽽还原⼀个库,不单空间,甚⾄时间上都是⼀个很⼤的挑战。本⽂介绍如何恢复单表,⽽不需要恢复整个库。
现在假设⼀个表:TEST_TABLE。我们需要尽快恢复这个表,并且把恢复过程中对其他表和⽤户的影响降到最低。
SQLServer(特别是2008以后),具有很多备份及恢复功能:完整、部分、⽂件、差异和事务备份。⽽恢复模式的选择严重影响备份策略和备份类型。
下⾯是⼏个可供参考的⽅案,但是记住,各有好坏,应该按照实际需要选择:
⽅案1:恢复到⼀个不同的数据库:
这对于⼩数据库来说不失为⼀种好的办法,⽤备份还原⼀个新的库,并把新库中的表数据同步回去。你可以做完整恢复,或者时间点恢复。但是对于⼤数据库,是⾮常耗时和耗费磁盘空间的。这个⽅法仅仅⽤于还原数据,在还原数据(就是同步数据)的时候,你要考虑触发器、外键等因素。
sqlserver备份表语句
⽅案2:使⽤STOPAT来还原⽇志:
你可能想恢复最近的数据库备份,并回滚到某个时间点,即发⽣意外前的某个时刻。此时可以使⽤STOPAT⼦句,但是前提是必须为完整或⼤容量⽇志恢复模式。下⾯是例⼦:
[sql]
1. RESTORE DATABASE 需要恢复的数据库
2.  FROM 数据库备份
3.  WITH FILE=3, NORECOVERY ;
4.
5. RESTORE LOG需要恢复的数据库
6.  FROM数据库备份
7.  WITH FILE=4, NORECOVERY, STOPAT = 'Oct 22, 2012 02:00 AM' ;
8.
9. RESTORE DATABASE 需要恢复的数据库 WITH RECOVERY ;
注意:这种⽅法的主要缺点是会覆盖掉从stopat指定时间点之后所修改的所有数据。所以要衡量好得失。
⽅案3:数据库快照:
创建数据库快照。当发⽣意外时,可以从快照中直接获取原来的数据。但是必须是在发⽣意外之前创建的快照。这在核⼼表不经常更新,特别是有规律更新时很有⽤。但是当表经常、不定期被更新,或者很多⽤户在访问时,这种⽅法就不可取了。当需要使⽤这种⽅法时,记得在每次更新前先创建快照。
⽅案4:使⽤视图:
你可以创建⼀个新的数据库,并把TEST_TABLE移动到这个库⾥⾯。当你需要恢复的时候,你只需要恢复这个⾮常⼩的数据库即可。访问源数据库的数据时,最简单的⽅法就是创建⼀个视图,选择TEST_TABLE表中所有列的所有数据。但是注意这个⽅法需要在创建视图前,重命名或者删除源数据库的表:
[sql]
1. USE 需要恢复的数据库 ;
2. GO
3. CREATE VIEW TEST_TABLE
4. AS
5.    SELECT  *
6.    FROM    备份数据库.架构名.TEST_TABLE ;
7. GO
使⽤这种⽅法,可以对视图使⽤SELECT /INSERT/UPDATE/DELETE语句,就像直接操作实体表似得。当TEST_TABLE更改时,要使⽤SP_REFRESHVIEW存储过程来更新元数据。
⽅案5:创建同义词(Synonym):
和⽅案4类似,把表移到另外⼀个数据库,然后对源数据库的这个表创建⼀个同义词:
[sql]
1. USE 需要恢复的数据库 ;
2. GO
3. CREATE SYNONYM TEST_TABLE
4. FOR 新数据库.架构名.TEST_TABLE ;
5. GO
这个⽅法的有点就是你不需要担⼼元数据更新所带来的结构变更不及时。但是这个⽅法的问题就是不能在DDL语句中引⽤同义词,或者不能在链接服务器中到。
⽅案6:使⽤BCP保存数据:
你可以创建⼀个作业,使⽤BCP定期导出数据。但是这种⽅法的缺点和⽅案1类似,需要到哪天的⽂件并导进去,同时要考虑触发器和外键问题。
各种⽅法的对⽐:
⽅法优点缺点
还原数据
快且容易适⽤于⼩库,且要注意触发器和外键等
还原⽇志能指定时间点所有时间点后的新数据会被覆盖
数据库快
照当表不是经常更新时很有⽤当表并⾏更新时,快照容易出现问题
视图把表的数据于库分开,没有数
据丢失
元数据需要周期性更新,并要定期维护新
数据库
同义词把表的数据于库分开,没有数
据丢失
在链接服务器上不能⽤,并要定期维护新
数据库
BCP拥有表的专⽤备份需要额外的空间、还会出现触发器、外键
等问题
总结:
良好的编程习惯和良好的备份机制才是解决问题的根本,以上的措施都仅仅是⼀个亡⽺补牢的办法。可能有⼈说SQLServer 新版本不是有部分还原吗?我们来看看联机丛书的说明:
可以看到,其他这种⽅法很难还原⼀个表,但是当库⼩的时候,倒可以试试。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。