最近几天,该公司的维修人员经常让我恢复数据库,因为他们总是缺乏约束条件,从而导致不可挽回的后果的更新和删除,再加上那些图书馆几十G这将超过十分钟的时间来恢复少。因此,寻找一些信息和工作总结,为快速恢复的一些方法,而不是图书馆,但请记住,这是比好更好的预防。

在生产环境或开发环境中,常常有一些非常重要的表,这些表存储核心数据,当这些表有数据损坏时,需要尽快恢复,但是,正式环境的数据库通常是非常大的。统计数据表明,即1T的数据库恢复时间接近24小时,所以恢复数据库的一个表不仅是时间和空间上都面临的一大挑战。本文介绍了如何在不需要恢复整个库恢复单个表。

现在假设有一个表:test_table.we需要恢复表尽快和尽量减少对其他表和用户的恢复过程的影响。

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

下面是几个供参考的选项,但请记住,每一个都是好的或坏的,应该根据实际需要来选择:

方案1:还原到不同的数据库:

这是一个小型的数据库恢复与备份的新图书馆的一个好办法,并同步在新库表数据。你可以做一个完全的恢复,或恢复的时间。但对于大型数据库,这是非常耗时和消耗磁盘空间。这种方法只用于恢复数据,当你恢复数据(即数据同步),你要考虑的因素,如触发器、外键,等等。

方案2:使用STOPAT恢复日志:

你可能想恢复最近的数据库备份和回滚到一个时间点,即事故发生前一段时间,在从句中可以用在这个时间,但前提是完整或大容量日志恢复模式是必需的。下面是一个例子:




恢复数据库需要恢复的数据库
从数据库备份
文件= 3,恢复;

恢复日志需要恢复的数据库
从数据库备份
文件= 4,22, 2012 = 'oct NORECOVERY,在凌晨02:00;

还原数据库需要恢复数据库;


注意:这种方法的主要缺点是覆盖所有的数据是一个指定的时间点从在改性后的。所以我们必须衡量得失。

方案3:数据库快照:

创建数据库快照。事故发生时,原始数据可以直接从快照中获得。但它必须是一个快照之前创建的事故。这不是经常在核心表更新,尤其是当提供定期更新。但这种方法是不可取的,表不定期更新,定期或很多用户访问。当你需要使用这个方法,记得要在每次更新创建快照。

方案4:使用视图:

你可以创建一个新的数据库和移动test_table进入图书馆。当你需要恢复,你只需要恢复这个非常小的数据库访问源数据库的数据的最简单的方法是创建一个视图并选择在test_table表的所有列的数据。但是请注意,这方法需要重命名或删除源数据库表前视图创建:




使用需要还原数据库;

创建视图test_table
作为
*选择
从备份数据库。建筑name.test_table;




使用这种方法,你可以使用选择/插入/更新/删除视图的语句,好像是直接操作的实体表。当test_table变化的sp_refreshview使用存储过程来更新元数据。

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

与方案4类似,将表移动到另一个数据库,然后为源数据库表创建同义词:




使用需要还原数据库;

test_table创建同义词
新数据库。建筑name.test_table;





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





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

各种方法的比较:这种方法的要点是,你不需要担心的元数据更新引起的结构变化不及时。但这种方法的问题是,你不能是指在DDL语句的同义词,或找不到服务器的连接。







方法
优势
缺点


恢复数据库
快速和容易的
适合Xiaoku,以及应该注意的触发器和外键等


恢复日志
可以指定时间点
所有时间点后的新数据将被覆盖。


数据库快照
当表不定期更新时,它是有用的。
快照在并行更新表时容易出现问题。


看法
表的数据与库分离,并且没有数据丢失。
需要定期更新元数据,并定期维护新数据库。


同义词
表的数据与库分离,并且没有数据丢失。
它在链接服务器上不可用,并且定期维护一个新数据库。


BCP
表的专用备份
额外的空格、触发器、外键等





总结:

良好的编程习惯和良好的备份机制是解决问题的根本,以上措施只是一种补救措施。可能有人说,SQLServer新版本不是部分恢复让我们来看看在线系列的解释:



正如您所看到的,其他方法很难恢复一个表,但是当库很小时,您可以尝试一下。