前几天同事不小心误操作,将SQLServer库的一张表的一个状态字段给刷成了一个统一状态,由于是update执行所以原来的相关状态无法确定。发生这种事情的时候我的小伙伴背后 一凉,估计心里里面想这怕是要删库跑路了。



由于是在开发试运行中的项目,还没来得及进行备份处理,所以从备份恢复宣告失败。就算有备份那么恢复的也是备份时间节点的数据,意味着使用平台做的数据需要从备份时间重新做过,而且有可能有遗漏。

小伙伴问我这咋办,首先没有备份,那么只有从数据库日志查找,然后看能不能通过日志找回之前的数据,再还原到刷状态之前的数据。然后就找到了ApexSQLLog工具,接下来我介绍下这款工具的使用和如何恢复数据。ApexSQLLog有几个版本,我是用的是ApexSQLLog2014支持SqlServer更高的版本,数据库使用的是SqlSerVer2014。

ApexSQLLog2014

提取码: np4f

  • 首先建一个测试库,和一张测试表。

    测试库ApexSQLLogTest和测试用的表TestUser,然后我手动编辑了三条数据进去,保存编辑的数据。

  • 用ApexSQLLog打开测试库日志

    选择要连接的数据库,也可以从最近的session中打开,打开筛选过的记录可以保存未session。

    然后选中要筛选的日志文件,如果有备份数据库文件也会自动查找到并在这里罗列出来,自己按情况选择。



  • 条件筛选

    我们选择日志文件后就进入到筛选条件选择,可以在筛选条件里面自由组合。

    可以选择时间段(Time range)、操作(operations)、表(tables)。





    高级选项(advanced options)里面还有用户、字段条件等可以选择。

  • 查看日志数据

    当我们组合完筛选条件后,就进入到日志分析界面,可以看到我们之前手动插入的三条数据实际已经在日志里面了,分成了三条insert语句。在选中其中一条日志的时候在下面可以看到执行的各字段值的修改情况。



    可以点击 下面的Row history查看记录,Redo script可以生成执行的操作, Undo script可以还原到之前的数据。我们恢复数据就是使用Undo script。



  • 恢复数据测试。

    我们使用update语句将Status状态全都重置为3。

update TestUser set Status=3

然后刷新下日志,会看到多出了三条Update日志记录,点击第一条看到下面的Status字段从0变为了3。



我们选中这三条记录右键或者上面的菜单栏功能,用create undo script 生成恢复sql。

--	This UNDO script was generated with ApexSQL Log 2014.04.1133 on 2020-06-10 11:18:47.601
-- NOTE: Operations in UNDO scripts are always output in descending order.
-- SERVER VIP-966\SQLEXPRESS
-- DATABASE ApexSQLLogTest -- UPDATE (00000024:000000A0:0004) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION
UPDATE [dbo].[TestUser] SET [Status] = 2 WHERE [Id] = 3
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
-- UPDATE (00000024:000000A0:0003) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION
UPDATE [dbo].[TestUser] SET [Status] = 1 WHERE [Id] = 2
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
-- UPDATE (00000024:000000A0:0002) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION
UPDATE [dbo].[TestUser] SET [Status] = 0 WHERE [Id] = 1
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
GO -- FINISHED ON 2020-06-10 11:18:47.697
-- TOTAL OPERATIONS PROCESSED 3
-- END OF FILE

最后我们就可以使用这个脚本去恢复数据了。

注意

我们在使用日志恢复的时候如果表有主键会根据主键生成sql,如上图sql中 where后面的条件。如果表没有主键那么生成的sql后面的where条件会带上所有的字段。在我帮小伙伴恢复数据的时候发现他的表没有设置主键,而且字段有20多个,3万多条数据生成的sql都是100多M,还要拆分执行。

比如我把Id主键去了再更新下Status状态到4,生成的sql如下,会提示没有主键。

以上就是一次数据恢复的分享,如果下次你也遇到这种情况希望能帮到你,不妨来个推荐,让更多人别再删库跑路。

数据误操作,删库跑路?教你使用ApexSQLLog工具从 SQLServer日志恢复数据!的更多相关文章

  1. 教你如何6秒钟往MySQL插入100万条数据!然后删库跑路!

    教你如何6秒钟往MySQL插入100万条数据!然后删库跑路! 由于我用的mysql 8版本,所以增加了Timezone,然后就可以了 前提是要自己建好库和表. 数据库test, 表user, 三个字段 ...

  2. Mysql binlog备份数据及恢复数据,学会这个,我在也不怕删库跑路啦~

    导读 我一直都主张,技多不压身(没有学不会的技术,只有不学习的人),多学一项技能,未来就少求人一次.网上经常听到xxx删库跑路,万一真的遇到了,相信通过今天的学习,也能将数据再恢复回来~~~ 当然啦, ...

  3. Oracle删库跑路

    --10g R2 startup mount exclusive restrict; alter system enable restricted session; drop database; -- ...

  4. P5270 无论怎样神树大人都会删库跑路

    题目地址:P5270 无论怎样神树大人都会删库跑路 第一眼看上去是模拟,似乎是 \(O(n)\) 的 水题 信心满满的写完: #include <bits/stdc++.h> using ...

  5. SQL 从入门到 DBA 删库跑路

    SQL 从入门到 DBA 删库跑路 一.基础 人员信息表: ID 姓名 性别 出生 婚否 学历 工资 工会 35009449 孙xx 男 1978-2-17 未婚 中专 3000 TRUE 35000 ...

  6. 【巨杉数据库SequoiaDB】巨杉Tech | “删库跑路”又出现,如何防范数据安全风险?

    最近,又双叕有企业被“删库”了.来自微盟官网的消息,微盟的业务系统数据库(包括主备)遭遇其公司运维人员的删除,系统将停止运营超48小时. 频发的类似事件也让大家对于数据安全的关注不断提高.数据是一个科 ...

  7. The Data Way Vol.3|做到最后只能删库跑路?DBA 能做的还有很多

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  8. 利用sqlserver日志恢复数据

    如果你已经急的焦头烂额,看到这篇文章的时候,请你换个坐姿,深呼吸几次,静下心来将这篇文章读完,也许你的问题迎刃而解. 我遇 到的情况是这样的,网站被植入木马,盗取了我的web.config文件,web ...

  9. 大数据开发从入门小白到删库跑路(一)- 获取Hadoop

    Hadoop是一个可以通过相对简单编程模型实现跨多台计算机集群分布式处理大型数据集的框架.它不是依赖于高额成本的硬件可靠性来提供高可用性,Hadoop的设计能从单个服务器扩展到数千台机器,每个机器提供 ...

随机推荐

  1. 06 返回静态文件的映射(函数/多线程)web框架

    06 返回静态文件的映射(函数/多线程)web框架 服务器server端python程序(函数版): import socket server = socket.socket() server.bin ...

  2. Django之ORM对象关系模型

    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...

  3. mysql运维入门4:索引、慢查询、优化

    MySQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都是以B-树的形式保存 如果没有索引,执行查询时,MySQL必须从第一个记录开始整表扫描,知道查询到符合要求的记录,记录越大,花费时 ...

  4. Django中的事务与ajax

    一 事务与锁 1.行级锁 行级锁是由存储引擎实现的.如mysql里默认指定的InnoDB存储引擎,由它实现行级锁.InnoDB的行级锁定同样分为两种类型,共享锁(X)和排他锁(S). 对于UPDATE ...

  5. KVM的常用操作

    KVM安装 一.网卡桥接 1.在原网卡上注释掉IP配置,添加一下内容 BRIDGE=br0 2.配置桥接网卡地址 vim ifcfg-br0 DEVICE="br0" NM_CON ...

  6. ATX-UI自动化环境搭建

    基础环境准备(以下都是在Mac机上搭建的) 1.android sdk安装&配置 很完美的一个资源下载网:tools.android-studio.org,下载所需的包(我下的zip包直接解压 ...

  7. JVM系列.JDK演进历史

    Java程序员为什么要了解虚拟机相关的知识 Java程序在设计之初就号称"一次编译,到处运行".Java之所以能做到"一次编译,处处运行"是因为Java虚拟机隐 ...

  8. & Google前沿的AMP技术

    首先要知道什么是AMP以至于为什么要选择AMP? AMP他并不是一门新技术,他只是一种能够让页面更快打开的一种办法.之所以用他是因为AMP能够带来SEO排名优化.另外Google搜索结果对AMP页面有 ...

  9. 【原创】Linux中断子系统(一)-中断控制器及驱动分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  10. jupyter notebook 安装扩展nbextensions

    安装nbextensions可提高jupyter notebook效率,安装步骤如下: 1.pip 方式安装: (gluon) [root@localhost ~]# pip install jupy ...