SQL专栏
SQL数据库基础知识汇总
SQL数据库高级知识汇总
之前我们写了一篇用工具Log explorer还原误删除的教程,但是由于工具的版本限制,只能处理SQL Server 2000和2005版本的。今天我们来教大家如何还原SQL Server 2008版本及以上被误删除的数据。(PS:被误更新的也适用)
SQL Server如何恢复被误删除(Delete)的数据-工具篇
背景
我们使用的SQL Server 2017作操作平台,在数据库AdventureWorks中新建一张表并插入部分数据,然后将这些数据删除,再通过一系列的操作看是否能将这些数据恢复成我们最开始插入的数据。
一 、前期准备
1、需要保证数据库的恢复模式为【大容量日志】或【完整】,不能为【简单】。具体操作如下:
选中需要还原数据的数据库,右键【属性】——【选项】——将右侧的恢复模式选为【完整】或【大容量日志】(建议选为【完整】),点击确认即可。如下图1,图2
图1
图2
同时也可以用脚本查看当前数据库的恢复模式:
SELECT recovery_model,recovery_model_desc
FROM sys.databases
WHERE name ='AdventureWorks'
结果如图3:
图3
其中的FULL就代表【完整】恢复模式的意思。
2、至少完整备份一次数据库。因为所有类型的备份都基于完整备份,如果没有一次完整备份,其他类型的备份都是多余的,所以在这里强调一下,在创建完一个新数据库之后,强烈建议甚至做一次完整备份,这里我们先演示一次完整备份。
将已打开的页面全部关闭,右键AdventureWorks——【任务】——【备份】,在弹出的对话框中进行配置,如图4:
图4
点击确定即可开始备份,待备份完成弹出备份成功我们就完成了一次完整备份。
注意:如果有用户在使用当前数据库AdventureWorks,则会一直卡在备份界面,所以在操作前请务必将所有查询页面关闭。
备份完成后可以查询刚才备份的文件
SELECT database_name,recovery_model,name,backup_finishi_date
FROM msdb.dbo.backupset
结果如图5:
图5
二、建立测试数据
我们在AdventureWorks下新建一个TEST表,并插入一些测试数据。
USE AdventureWorks
GO
IF OBJECT_ID('TEST') IS NOT NULL
DROP TABLE TEST
GO
CREATE TABLE TEST
(
ID VARCHAR(10),
TNAME NVARCHAR(20),
AGE INT
)
INSERT INTO dbo.TEST
VALUES ('1001',N'张三',20),
('1002',N'李四',23),
('1003',N'王五',21),
('1004',N'马六',22),
('1005',N'赵七',20),
('1006',N'宋一',19),
('1007',N'刘二',22)
查看一下表TEST里的内容,如图6:
图6
然后来做个删除操作,为了定位是什么时候发生的,我加了一个WAITFOR 命令,让它在某个具体时间发生,这样恢复的时候就有准确性:
USE AdventureWorks
GO
WAITFOR TIME '16:09'
DELETE FROM dbo.TEST
然后再来看TEST表中的数据,如图7:
图7
三、备份事务日志
我们用【备份日志尾部】的方法来恢复刚才被删除的数据。在操作前同样需要关闭当前所有连接。
具体步骤如下:选中数据库AdventureWorks——右键【任务】——【备份】,在弹出的对话框中将备份类型选为【事务日志】,如图8:
图8
点击左侧菜单栏的【介质选项】,做如图9的配置,在点击确定之前请再次确认是否有用户连接当前数据库,本地用户请将所有使用到该数据库的页面都关闭。
图9
待提示备份完成后,数据库会出现【正在还原...】字样,如图10:
图10
四、开始还原
首先我们要还原最近完整备份的那个备份文件,由于日志备份的特性,只认最后一次备份,所以要选择最新的那次,否则还原不了。具体操作如下:
右键AdventureWorks——【任务】——【还原】——【数据库】,在弹出的界面中做如图11的配置,只勾选组件为数据库的那个备份文件。
图11
点击左侧菜单栏【选项】做图12的配置,将恢复状态改完【RESTORE WITH NORECOVERY】:
图12
点击确定后待数据库还原成功即可进行下一步操作。
刚才我们已经还原了数据文件,下面我们继续还原日志文件。操作如下:
右键AdventureWorks——【任务】——【还原】——【事务日志】,按图13作如下配置:
图13
我们是在16:09分删除数据的,将时间点提前一分钟到16:08分。这里不用太在意,只要把时间点指定到你误删除的时间之前即可。
由于日志尾部备份都是最后一个备份文件,所以这里菜单栏的【选项】部分请按如图14做配置:
图14
待一切检查就绪后,点击确定即可开始回滚未提交的事务日志了。
五、检查是否恢复成功
输入查询语句,查询TEST中的数据。
USE AdventureWorks
GO
SELECT * FROM TEST
结果如图15
图15
可以看到正是我们刚才删除前的数据。至此,整个被删除的数据即完全恢复了。
六、方法局限性
此方法有一定的局限性
首先,就是要求数据的恢复模式是【完整】的,如果之前一直是【简单】模式,此方法不适用
其次,需要有一次完整的备份文件,如果你是管理数据库的,请做好每周一次完整备份的策略。
再次,如果你发现误操作以后还有很多人做了操作,那么你还原成功后,别人的操作就会冲掉,所以发生误操作后,要马上停止别人对数据库的操作。
最后,这个方法要对数据库独占,所以你想偷偷恢复是不行的了,勇敢承认错误吧。
PS:以上操作均是实验截图,请严格按照指引操作!
技术交流请加QQ群:875156894
看完本文有收获?请转发分享给更多人