2009-08-20 69 views
0

有谁知道任何工具,可以帮助恢复丢失的表和存储过程?从sql server恢复已删除的对象

没有进行备份,并且此数据库意外地与另一个数据库同步,并且此数据库中创建的新表已被删除。

感谢

+2

http://en.wikipedia.org/wiki/Prayer – cakeforcerberus 2009-08-20 15:32:54

+0

这可能并非如此简单。当你删除某些东西时,你通常会将其保存的资源返回给操作系统,包括磁盘空间(在这种情况下意味着通过操作系统将其返回给文件系统)。我不是内核程序员,但我怀疑大多数内核将允许安全的“取消删除”功能,因为不能保证从删除后资源还没有被使用过。我说的是即使它有效,我也会担心数据的完整性。其他在这方面有经验的人应该随时向我提出这方面的教育。 – 2009-11-16 14:33:14

回答

4

我用Google搜索“SQL Server还原已删除表”,并与一个有用的论坛,回答上来。

http://www.eggheadcafe.com/community/aspnet/13/11519/are-you-sure-you-dont-ha.aspx

“当在SQL Server中创建一个数据库,它被设置为完整备份默认情况下。所以,你的表应该通过恢复事务备份可用。尝试将‘恢复数据库’在企业管理器中右键单击数据库名称,然后选择“所有任务”。

虽然,我会问,如果这会恢复表或只是数据。

RedGate有一些相当低成本的软件,称为“SQL日志抢救”,应该可以帮助解决这个问题。看看这篇SQL Server的中文文章: http://www.sqlservercentral.com/articles/Product+Reviews/sqlrescuereview/2086/

编辑:RedGate软件确实需要完整备份,所以没有任何帮助。我刚刚发现了这一点。

但也许事务日志将帮助您恢复表结构,即使它实际上不能恢复表本身。

+0

不幸的是,如前所述,他应该没有备份!仍然投票的详细研究gj! – 2009-08-20 16:35:45

+0

谢谢。 :)是的 - RedGate软件无法工作,因为它需要备份。但是,如果在数据库中执行了任何事务,那么事务日志仍然很可能包含有助于恢复表结构的数据。如果某些东西没有被备份,那么通常可以假定在创建事物时使用了默认值,所以事务日志就会被记录下来。 – user158017 2009-08-20 17:16:44

3

你的数据库在哪种恢复模式?

简短回答: 没有备份,您丢失了数据。这就是备份的全部要点。

长答案: 如果恢复模式为FULL,并且您从未进行完整备份,实际上它的运行方式与简单恢复模式相同。这意味着你无法进行事务日志备份,更糟糕的是:每个检查点都会截断您的事务日志。这意味着即使您的表格丢失在事务日志中,它现在几乎肯定会被更新的事务覆盖并永远丢失。没有工具可以帮助你。

如果您知道sql db结构的内部结构,可以使用DBCC PAGE进行取证,并希望这些范围尚未被其他对象数据覆盖,但这需要真正的专家知识 - 您可以聘请一个。你也可以检查你的表的事务日志记录是否已经被fn_dblog()覆盖(可能是)。您可以使用服务器端跟踪来确定表格被删除的确切时间。

底线:自动备份是必不可少的。只有完全恢复模式才能实现时间点恢复,您可以使用该恢复时间将恢复表格恢复到drop命令之前的某个点。

8

如果数据库处于完全恢复模式并且存在事务日志备份或事务日志从未被截断,则可以尝试使用第三方日志读取器,如ApexSQL LogSQL Log Rescue(仅限免费但SQL Server 2000)。

用于读取事务日志的其他选项不是很好记录的函数DBCC LOG。

如果存在完整的事务链,这意味着对此表执行的以前的CREATE或ALTER表仍在某处的事务日志中。不幸的是,如果您的交易日志非常大,找到这些信息并不是一件容易的事情,尤其是没有第三方工具。

7

您也可以从SQL Server日志中恢复丢弃的对象,如果您没有备份。

Select Convert(varchar(Max),Substring([RowLog Contents 0] 
,33 
,LEN([RowLog Contents 0]))) as [Script] 
from fn_dblog(NULL,NULL) 
Where [Operation]='LOP_DELETE_ROWS' And [Context]='LCX_MARK_AS_GHOST' 
And [AllocUnitName]='sys.sysobjvalues.clst' 

参考:http://raresql.com/2012/12/04/sql-server-recover-the-dropped-objects-view-stored-procedure-function-trigger/

+0

太棒了!罪犯我刚刚添加了第一票。 – deadcrab 2014-03-12 13:56:30

3

这为我工作:

Select Convert(varchar(Max), Substring([RowLog Contents 0] 
, 33 
, LEN([RowLog Contents 0]))) as [Script] 
from fn_dblog(NULL, NULL) 
Where [Operation] = 'LOP_DELETE_ROWS' And [Context] = 'LCX_MARK_AS_GHOST' 
And [AllocUnitName] = 'sys.sysobjvalues.clst'