我错误地删除了一些行 b ,我可以使用日志或 SSMS 恢复它们吗
2 回答
SQL Server 为每个删除的记录保留日志。您可以通过 fn_dblog sql server 函数查询这些日志。
Select [RowLog Contents 0]
FROM sys.fn_dblog(NULL, NULL)
WHERE AllocUnitName = 'dbo.TableName'
AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )
AND Operation in ( 'LOP_DELETE_ROWS' )
但是这个日志是十六进制格式的。您需要将此十六进制格式转换为您的实际数据。
下面给出的文章将帮助您以与上面定义的相同方式恢复已删除的记录。
http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/
如果您的数据库处于简单恢复模式,那么您可能不走运。您可以恢复到最近的备份,但如果它是很久以前的,它可能不包含您删除并希望重新插入的行的副本。同时也很可能插入了其他数据。你可以恢复到一个新的数据库,然后做 SQL 手术来恢复消失的数据。
如果您的数据库处于完全恢复模式,则:
查找上一次完整备份、此后的任何增量备份以及自上一次增量或完整备份以来的所有日志备份文件,并将它们还原到正确的时间点。如果可以接受,您可以覆盖您的数据库,或者您可以恢复到新数据库并执行 SQL 手术。
恢复过程将如下所示:
BACKUP DATABASE YourDB TO DISK = 'D:\MSSQL\Data\YourDB\YourDB Pre-Repair.bak' -- It is CRUCIAL you take a new backup before doing ANYTHING so you don't -- make another mistake you can't reverse. RESTORE DATABASE YourDB FROM DISK = 'D:\MSSQL\Data\YourDB\YourDB 20121208 110000.bak' WITH REPLACE, NORECOVERY; -- be very careful with REPLACE as needing it proves there is un-backed-up data RESTORE LOG YourDB FROM DISK = 'D:\MSSQL\Data\YourDB\YourDB 20121208 111500.log' WITH NORECOVERY; RESTORE LOG YourDB FROM DISK = 'D:\MSSQL\Data\YourDB\YourDB 20121208 113000.log' WITH NORECOVERY; -- restore more log files, all of them, in order, with none skipped RESTORE LOG YourDB FROM DISK = 'D:\MSSQL\Data\YourDB\YourDB 20121209 020000.log' WITH STOPAT = '20121209 01:57:00', RECOVERY;
请注意,我
WITH STOPAT
在这里使用了它,它允许您将数据库恢复到特定的时间点。在我的示例中,每 15 分钟进行一次日志备份,并在 2012 年 12 月 9 日凌晨 1:57:15 发出致命查询。
如果要将数据库恢复到新数据库,则必须执行以下操作:
RESTORE DATABASE NewDB FROM DISK
= 'D:\MSSQL\Data\YourDB\YourDB 20121208 110000.bak'
WITH
MOVE 'YourDBLogicalName' TO 'D:\MSSQL\Data\NewDB.mdf',
MOVE 'YourDBLogicalName_Log' TO 'L:\MSSQL\Logs\NewDB.ldf';
用于RESTORE FILELISTONLY
找出备份中的内容。如果同一个文件中有多个备份,则有更多的语法可以读出该信息,然后指定要使用的备份。用于sp_helpdb 'YourDB'
找出放置 NewDB 数据库和日志文件的位置。
如果需要,还有更多脚本可以重命名逻辑文件(我总是这样做)。
当然,愚蠢的我,我现在才意识到您可以使用 SSMS GUI 来完成大部分工作。但是,如果您想开始理解所有这些内容并变得非常擅长它,我建议您编写脚本。我是一名开发人员,但无需寻求“官方”DBA 的帮助就可以恢复数据库 lickety-split。