最近几天,公司的技术保护人员频繁让我恢复数据库,由于他们总是少了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 新版本不是有部份还原吗?我们来看看联机丛书的说明:
可以看到,其他这类方法很难还原一个表,但是当库小的时候,倒可以试试。
本文来源:https://www.yuntue.com/post/235249.html | 云服务器网,转载请注明出处!