最近遇到一个误更新数据的问题,使用ApexSQL Log做挖掘事务日志的时候,发现ApexSQL Log生成的Redo Script跟原始SQL是有区别的。它们并不是完全一致的。只是逻辑上等价而已。如下所示,我们做一个测试,如下所示,创建一个表后,并模拟忘记添加条件,出现误删除数据的情况

SELECT * INTO KERRY_TEST FROM SYS.OBJECTS;

 

 

DELETE FROM KERRY_TEST

然后我们用ApexSQL Log挖掘事务日志,你会看到有很多对应的Delete记录,而且对应的Redo Script跟原始SQL是不一样的。如下所示,

下面是其中两个Redo  Script(为了方便查看,对脚本进行了格式化)

--DELETE (0003F73C:000065FC:000D) done at 2019-06-13 10:35:56.876 by xxx\xxxx in transaction 0000:0ADF73EA (Committed)

BEGIN TRANSACTION;

DELETE  FROM [dbo].[KERRY_TEST]

WHERE   /*** WARNING: WHERE CLAUSE FOR THIS STATEMENT WAS GENERATED FOR A TABLE WITH NO PRIMARY KEY AND NO CLUSTERED INDEX ***/

        [name] = N'sysfgfrag' COLLATE Chinese_PRC_CI_AS

        AND [object_id] = 19

        AND [principal_id] IS NULL

        AND [schema_id] = 4

        AND [parent_object_id] = 0

        AND [type] = N'S ' COLLATE Latin1_General_CI_AS_KS_WS

        AND [type_desc] = N'SYSTEM_TABLE' COLLATE Latin1_General_CI_AS_KS_WS

        AND [create_date] = '20160101 10:46:55.060'

        AND [modify_date] = '20160101 10:46:55.100'

        AND [is_ms_shipped] = 1

        AND [is_published] = 0

        AND [is_schema_published] = 0;

IF @@ROWCOUNT <= 1

    COMMIT TRANSACTION;

ELSE

    BEGIN

        ROLLBACK TRANSACTION;

            PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.';

    END;

 

 

 

--DELETE (0003F73C:000065FC:000A) done at 2019-06-13 10:35:56.876 by xxx\xxx in transaction 0000:0ADF73EA (Committed)

BEGIN TRANSACTION;

DELETE  FROM [dbo].[KERRY_TEST]

WHERE   /*** WARNING: WHERE CLAUSE FOR THIS STATEMENT WAS GENERATED FOR A TABLE WITH NO PRIMARY KEY AND NO CLUSTERED INDEX ***/

        [name] = N'sysseobjvalues' COLLATE Chinese_PRC_CI_AS

        AND [object_id] = 9

        AND [principal_id] IS NULL

        AND [schema_id] = 4

        AND [parent_object_id] = 0

        AND [type] = N'S ' COLLATE Latin1_General_CI_AS_KS_WS

        AND [type_desc] = N'SYSTEM_TABLE' COLLATE Latin1_General_CI_AS_KS_WS

        AND [create_date] = '20160101 10:47:02.050'

        AND [modify_date] = '20160101 10:47:02.057'

        AND [is_ms_shipped] = 1

        AND [is_published] = 0

        AND [is_schema_published] = 0;

IF @@ROWCOUNT <= 1

    COMMIT TRANSACTION;

ELSE

    BEGIN

        ROLLBACK TRANSACTION;

            PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.';

    END;

 

如果有聚集索引,你会看到没有WHERE条件的UPDATE、DELETE操作都会生成很多个对应的Redo Script,对应的WHERE条件则是聚集索引字段。如下测试所示:

SELECT  *

INTO    KERRY_TEST2

FROM    sys.objects;

 

CREATE CLUSTERED INDEX PK_KERRY_TEST2 ON KERRY_TEST2(OBJECT_ID);

 

UPDATE  KERRY_TEST2

SET     NAME = 'KERRY';

 

 

DELETE  FROM KERRY_TEST2;

下面是对应的UPDATE、DELETE操作的redo script

--UPDATE (0003F73C:0000700A:001F) done at 2019-06-13 11:27:26.036 by xxx\xxx in transaction 0000:0ADF7404 (Committed)

BEGIN TRANSACTION; 

UPDATE  [dbo].[KERRY_TEST2]

SET     [name] = N'KERRY' COLLATE Chinese_PRC_CI_AS

WHERE   [object_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;

 

 

 

--    DELETE (0003F73C:00007482:00D9) done at 2019-06-13 11:27:35.406 by xxx\xxx in transaction 0000:0ADF7405 (Committed)

BEGIN TRANSACTION;

DELETE  FROM [dbo].[KERRY_TEST2]

WHERE   [object_id] = 836302139;

IF @@ROWCOUNT <= 1

    COMMIT TRANSACTION;

ELSE

    BEGIN

        ROLLBACK TRANSACTION;

            PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.';

    END;

这里只是简单记录一下这个事情,千万不要以为Redo Script跟原始SQL是完全一致的。如果遇到这种问题,如何判断呢?可以查看Transaction ID,以及对应的Begin Time , End Time,如下所示,你会发现它们是一致的

ApexSQL Log中的Redo Script跟原始SQL不一致问题的更多相关文章

  1. 说说MySQL中的Redo log Undo log都在干啥

        在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件.     MySQL中的日志文件, ...

  2. 【转】说说MySQL中的Redo log Undo log都在干啥

    阅读目录(Content) 1 undo 1.1 undo是啥 1.2 undo参数 1.3 undo空间管理 2 redo 2.1 redo是啥 2.2 redo 参数 2.3 redo 空间管理 ...

  3. MySQL中的redo log和undo log

    MySQL中的redo log和undo log MySQL日志系统中最重要的日志为重做日志redo log和归档日志bin log,后者为MySQL Server层的日志,前者为InnoDB存储引擎 ...

  4. ApexSql Log 数据库操作的后悔药

    ApexSQL Log破解版是一款功能强大的SQL数据恢复工具,支持SQL2005/2008/2012.很多时候我们存放在服务器中的SQL数据库会因黑客破坏或误操作造成数据库文件丢失的你问题,当数据库 ...

  5. ApexSQL Log 从意外UPDATE和DELETE操作中恢复SQL Server数据

    下载地址:https://www.apexsql.com/download.aspx 如何从意外UPDATE和DELETE操作中恢复SQL Server数据 ApexSQL Log 从意外UPDATE ...

  6. MySQL中的 redo 日志文件

    MySQL中的 redo 日志文件 MySQL中有三种日志文件,redo log.bin log.undo log.redo log 是 存储引擎层(innodb)生成的日志,主要为了保证数据的可靠性 ...

  7. gradle中的build script详解

    目录 简介 project和task 一个例子 task详细讲解 task脚本 task依赖 动态task 默认task build script的外部依赖 gradle中的build script详 ...

  8. 从log中分析Android wif连接状态的方法

    1.这里是从log中通过搜索关键字wpa_supplicant: wlan0: State过滤之后的log: Line 1: 11-25 20:10:14.968120  1104  1104 D w ...

  9. ApexSql Log 2014.04.1133破解版&补丁

    已上传最新的2016版本,请移步: http://www.cnblogs.com/gsyifan/p/ApexSql_Log_2016_Crack.html 状态不好,鬼使补差的跑到服务器上updat ...

随机推荐

  1. SQLServer 微软团队开源项目 (web 版?)

    http://www.codeplex.com/site/users/view/SQLTeamAdmin

  2. wpf窗口禁止最大化但允许调整大小

    wpf中窗口禁止最大化可以通过属性ResizeMode来设置,但是ResizeMode有一个问题就是如果ResizeMode设置为NoResize的话,是可以禁止最大化的,但是这样同时也就不能拖动调整 ...

  3. hadoop版本与支持的hbase版本对照…

    hadoop版本与支持的hbase版本对照表 分类: hbase2013-05-20 17:19 701人阅读 评论(2) 收藏 举报 HbaseHadoop As of Hive 0.9.0 the ...

  4. linux 下消息队列发送后没有信息

    在使用消息队列时,调用 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...

  5. 利用C++创建DLL并C#调用

    日期:2018年11月26日 环境:window 10,VS2015 community 一.利用C++创建DLL 1.新建项目: 2.打开CreateDLL.cpp文件,并输入测试代码 #inclu ...

  6. ps色彩混合

    http://tieba.baidu.com/p/2032536851?pn=1 HSB 这是一种颜色的表示方法:其中"H"表示色相,"S"表示饱和度,&quo ...

  7. 51nod1241(连续上升子序列)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1241 题意:中文题诶- 思路:通过观察我们不难发现就是找连续 ...

  8. cat命令详解及here doc

    以下内容转自:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文 ...

  9. [Xcode 实际操作]七、文件与数据-(10)NSkeyedArchiver存储和解析数据,Swift对象的归档和恢复归档

    目录:[Swift]Xcode实际操作 本文将演示如何使用归档的方法,对模型对象进行持久化工作. 在项目名称上点击鼠标右键,弹出右键菜单,选择[New File]新建文件命令, 在弹出的模板选项窗口中 ...

  10. IT兄弟连 Java语法教程 Java语言入门 典面试题

    1.请说明JVM.JRE和JDK是什么?它们有什么关系? JVM是Java虚拟机,Java Virtual Machine的缩写,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实 ...