一、序言
作为程序开发人员或 DBA,经常会接触到数据库(以 SQL Server 2014 数据库为例)的增、删、改查操作。执行 delete 语句时不小心误删数据表的记录情况,而数据库之前又没有任何备份。
SQL Server 数据库自身的数据库还原数据处理,找回数据不是一件难事,但还原数据有两个前提条件:
- 在删除数据操作之前有做数据库的“完整”备份处理。
- 数据库恢复模式(Recovery Mode)是“完整”模式。
显然目前情况不满足以上条件,不能使用数据库还原来恢复数据。需要借助第三方工具来找回数据。以下介绍如何使用 ApexSQL Log 工具来恢复数据。
以下使用 ApexSQL Log 2016 版本进行说明。
二、ApexSQL Log介绍
ApexSQL Log 是一款优秀的数据库恢复软件,基本支覆盖 SQL Server 主流版本(最新发布说明点击查看,根据当前安装的SQL Server版本来选择对应支持的 ApexSQL Log 版本),能恢复 Delete/Update 等误操作的数据并生成相应的脚本。
官网:
SQL transaction log reader | ApexSQL
下载地址:
https://www.apexsql.com/zips/ApexSQLLog.exe
三、安装工具
下载好文件后,接下来准备安装工具。
双击 ApexSQLLog.exe 文件,打开Setup窗口,只是进行数据恢复的话,选中 “Install ApexSQL Log” 选项,如下图:
点击 “Next”,进入安装处理状态,Setup 窗口显示 “ApexSQL Log 2016 was successfully installed” 的提示表示已成功完成安装,如下:
点击 “Close” 按钮,直接关闭窗口打开ApexSQL Log 工具。
四、准备数据
为了更好实现数据恢复流程,创建一个新数据库(LocalTest)用于进行测试处理。
1. 在 SQL Server 中创建 LocalTest 数据库。
2. 在 LocalTest 数据库里创建一个 Users 表并初始 12 条记录。
注:初始数据自行准备。
3. 模拟误删除数据,执行 delete 语句。
接下来通过 ApexSQL Log 2016 工具对误删除的 12 条数据进行恢复处理。
五、数据恢复
安装好工具,接下来进行数据的恢复处理。
1. 工具恢复数据有个前提条件:数据库的恢复模式(Recovery Mode)必须是“完整”模式,其他模式下很可能是无法恢复。
2. 双击打开 “ApexSQL Log” 工具,提示要设置连接到那个数据库(与连接 SQL Server 的设置是类似),如下图:
Authentication: 有 “Windows authentication” 和 “SQL Server Authentication” 两种认证方式,与 SQL Server 登录认证方式是一样,根据实际情况来选择不同方式。
3. 点击 “Next” 按钮,Windows 会提示用户要对其进行授权控制的处理,授权完成后,会再次进入 ”Database connection“ 窗口,这次点击 “Next“ 可以正常进入。(不知是 Windows 10 系统安全验证问题还是软件自身为了考虑到数据安全问题才需要授权二次进入,具体原因 百度或Google 一下,这里就不深入研究)。
4. ApexSQL Log 是一款商业软件,提供评估版本功能无限制 14天 免费试用。”Next“ 进入软件功能主体时,会提供三个选项(Evaluate、Activate、Purchase),如条件允许的话,可以直接购买软件(正式版本不再显示该窗口)。选择 ”Evaluate“ 进入评估版本。
5. 点击 “Evalute” 进入 “Data Sources” 窗口,自动加载出当前连接数据库(连接时选择的数据库LocalTest)的事务日志文件,也可以点击 “Add file” 按钮手动添加日志文件(*.ldf),如下图:
6. 下一步,提供结果输出方式的选择,如下图:
“Open results in grid”:以表格的形式显示日志文件内满足指定条件的操作日志记录,可以对日志记录进行 “Undo/Redo”、“Create Before-After report” 和 “Export results” 的操作。
“Undo/Redo”:对日志操作进行回滚或者重复处理。
"Create Before-After report":创建前-后操作记录报表,以 SQL、SQL Bulk、XML、HTML 的方式保存或者直接保存到数据库中。
“Export results”:将日志数据导出到 SQL、SQL Bulk、XML、HTML、CSV 或者直接到数据库中。
7. 为了详细查看日志的内容,点击 “Open results in grid”,进入 “Filter setup”,设置加载数据的过滤条件,如下:
Time range:设置过滤日志操作记录的时间范围。
Operations:设置过滤要显示那种操作类型(DML和DDL)的日志。
Tables:选择要输出日志内容的数据表。
8. 设置好日志记录过滤条件后,点击 “Finish” 按钮后,自动读取日志资源,如下图:
注:在表格头上面会注意有一句警告提示语句:“Trial Version: Only details of every 10th row will be available”。当前版本是评估试用版,限制每第10行的记录才显示详细内容以及部分功能的使用。如想查看每行记录的详细和使用完整功能,建议购买正式版本。
9. 读取完日志文件资源后,在表格中可以看到之前执行初始数据(insert)和删除数据(delete)操作的日志记录,如下:
在表格左边可以根据实际情况选择条件(Time、DML、Users和Other)来过滤日志记录,如下:
10. 使用 delete 语句误删了数据,想恢复数据就可以 “Undo delete" 操作,那数据就找回来了。按这思路,找出所有 “delete” 操作的日志记录(通过左边 Grid filter 设置 DML 条件为 delete 筛选出删除操作的日志记录)。全选所有记录,点击 “Undo” 按钮创建回滚处理脚本,如下:
11. 完成处理后,自动打开 “Undo script” 窗口显示回滚处理的SQL脚本
可以直接点击 “Excute” 按钮来执行脚本或者 “Save” 到本地事后执行。
执行完脚本
查询Users数据表,可以看到那 12 条数据已恢复。
数据恢复处理已大功告成!!!!
注:执行 "Truncate Table" 语句清除数据,是没办法做回滚操作。只能通过重做(Redo)删除之前的操作来恢复数据。
六、总结
使用ApexSQL Log工具只作为挽救数据的最后一步,针对误删量级(百万级以上)以上的数据使用工具恢复也是不好处理。平时还是要做好日常的数据库备份,条件允许的话可以做DB镜像或AlwaysOn集群,就免去了误删数据后恢复数据的烦恼。
注意以下几点:
- 要恢复的数据不在一个量级以上的。
- 数据库的恢复模式(Recovery Mode)必须是“完整”模式。
- 工具试用版本部分功能有限制,如需进行完整数据恢复处理使用正式版本。