事务脚本(Transaction Script)

根据过程组织业务逻辑,每个过程处理来自表现层的一个单一请求。

 

大多数应用程序可以想象成一系列事务。一个事务可以查看以一定方式组织的信息。另一个会修改数据库。每一个客户端系统和服务器系统之间的交互都包含着一定的逻辑。在某些情况下,这可能如显示数据库中的某些信息一样简单。在另外的情况下,可能包含进行验证和计算的很多步骤。

一个事务脚本主要是将逻辑组织成一个过程,这个过程直接调用数据库或通过一个thin database wrapper。虽然常用的子任务可以分解成子事务,每一个事务都有它自己的事务脚本。每一个事务脚本都是一个类的公共方法。

它如何工作

在事务脚本中,逻辑根据你的系统中事务进行组织。如果你的需要是预订一个宾馆房间,逻辑就是在预订宾馆房间过程中检查房间是否可用,计算价格,更新数据库。

对于简单的情况,对于如何组织实在没什么好说的。当然,就像其它的程序,你应该以一种有意义的方式将代码组织入模块中。这种方式的一个好处是你不需要担心其它事务在做什么。你的任务就是取得输入、查询数据库、处理、保存结果到数据库。

放置事务脚本的地方取决于你如何组织你的层。它可能在server page,CGI script,distributed session object中。我喜欢尽可能地分解事务脚本。至少把它们放到不同的过程中,更好的方法是,将它们放到与处理表现和数据源相分离的类中。另外,在事务脚本中不要调用任何表现逻辑,这样会使得修改代码和测试事务脚本变得更容易。

你可以通过两种方式将事务脚本组织入类中:最常用的方法是在一个类中放置多个事务脚本,每一个类都定义一个相关的事务脚本的主题区域。对于大多数情况,这是最直接的方式。另一种方法是将每一个事务脚本放到它自己的类中,使用Command模式。在这情况下你需要为你的命令定义一个超类,这个干超类指定了在事务脚本逻辑符合的一些可执行方法。这种方法的好处是允许你在运行时把脚本实例作为对象进行操作,虽然我很少看到使用事务脚本组织域逻辑的系统需要这样做。当然,你可以在很多语言中你可以完全不使用类而只是使用全局方法。然而,你会常常发现创建一个新对象有助于线程问题,因为他使得隔离数据变得更加容易。

我使用术语事务脚本(Transaction Script)因为多数情况下,你会每个数据库事务创建一个事务脚本。这不是百分百的规则,但却是第一个最接近的术语。

何时使用它

事务脚本最大的优势就是简单。以这种方法组织逻辑拥有少量逻辑的应用程序是最自然的方式,它只会带来很少的性能和理解上的损耗。

然而,当业务逻辑变得更加复杂时,它将很难保持处在一个良好设计的状态。一个问题就是对事务间重复代码的控制。因为,它的着眼点就是处理一个事务,任何通用的代码都有可能重复。

小心的构建可以减轻很多这种问题,但是,更复杂的业务域需要创建域模型(Domain Model)。域模型可以给你构建代码的很多选择,增加可读性和减少重复。

 收入计算问题

对于这个问题,和其它对于域逻辑的讨论,我将会使用同一个问题进行演示。

收入计算问题在业务系统中是一个经常遇到的问题。它是一个关于何时可以在你的账本上真正计算你收到的钱的问题。如果我卖给你一杯咖啡,它是一个简单的问题:我给你一杯咖啡,我收了你的钱,我就可以将钱计入账本。甚而,对于很多情况,它会变得更加复杂。例如,你付给我了在年底可以兑付的retainer。即使你今天付给我一些费用,我也不能立即将它计入我的账本,因为这个服务会在一年以后才会执行。一个方案可能是在一年的每个月只计算费用的十二分之一。

收入计算问题是多种多样并且是不稳定的。一些是根据规章,一些根据专业标准,一些根据公司政策。收入跟踪最后变成一个非常复杂的问题。

现在我不想讨论过于复杂的问题,所以,我们想象一个只卖三种产品的公司:文字处理程序、数据库和电子表格。根据规则,当你签署了一个文字处理程序合同,你就可以立即计入收入。如果是电子表格,你今天可以计入三分之一,六十天后计入三分之一,九十天后计入三分之一。如果是数据库,你今天可以计入三分之一,三十天后计入三分之一,六十后计入三分之一。

 实例:收入确认(Java)

这个例子使用两个事务脚本:一个计算合同的收入确认数,一个返回对于一个合同给定一个日期已确认的收入。数据库结构有三张表:产品、合同和收入确认。

CREATE TABLE products (ID int primary key, name varchar, type varchar)
CREATE TABLE contracts (ID int primary key, product int, revenue decimal, dateSigned date)
CREATE TABLE revenueRecognitions (contract int, amount decimal, recognizedOn date,
                                  PRIMARY KEY (contract, recognizedOn))

第一个脚本根据一个日期计算确认总数。我可以用两步完成这个操作:第一步从收入确认表中选出合适的记录;第二步累加总数。

很多事务脚本设计都有直接操作数据库的脚本,将SQL代码放入过程中。在这里,我使用一个简单的Table Data Gateway封装SQL查询。因为这个例子如此简单,我只使用了一个网关而不是为每个表创建一个网关,我可以在网关中定义一个恰当的查找方法。

 

class  Gateway... 

   
public  ResultSet findRecognitionsFor( long  contractID, MfDate asof)  throws  SQLException {
      PreparedStatement stmt 
= db.prepareStatement(findRecognitionsStatement);
      stmt 
= db.prepareStatement(findRecognitionsStatement);
      stmt.setLong(
1, contractID);
      stmt.setDate(
2, asof.toSqlDate());
      ResultSet result 
= stmt.executeQuery();
      
return result;
   }

   
private   static   final  String findRecognitionsStatement  =
      
" SELECT amount  "   +
      
" FROM revenueRecognitions  "   +
      
" WHERE contract = ? AND recognizedOn <= ? " ;
   
private  Connection db;

然后,使用脚本网关返回的结果集进行累加。

 

class  RecognitionService... 

   
public  Money recognizedRevenue( long  contractNumber, MfDate asOf)  {
      Money result 
= Money.dollars(0);
      
try {
         ResultSet rs 
= db.findRecognitionsFor(contractNumber, asOf);
         
while (rs.next()) {
            result 
= result.add(Money.dollars(rs.getBigDecimal("amount")));
         }

         
return result;
      }
catch (SQLException e) {throw new ApplicationException (e);
      }

   }


如果计算像这个例子一样简单,你可以使用调用SQL语句替代脚本,这个SQL语句使用聚集函数计算总数。

对于计算一个已存在合同的收入确认额,我使用相似的方法。

class  RecognitionService... 

   
public   void  calculateRevenueRecognitions( long  contractNumber)  {
      
try {
         ResultSet contracts 
= db.findContract(contractNumber);
         contracts.next();
         Money totalRevenue 
= Money.dollars(contracts.getBigDecimal("revenue"));
         MfDate recognitionDate 
= new MfDate(contracts.getDate("dateSigned"));
         String type 
= contracts.getString("type");
         
if (type.equals("S")){
            Money[] allocation 
= totalRevenue.allocate(3);
            db.insertRecognition
               (contractNumber, allocation[
0], recognitionDate);
            db.insertRecognition
               (contractNumber, allocation[
1], recognitionDate.addDays(60));
            db.insertRecognition
          (contractNumber, allocation[
2], recognitionDate.addDays(90));
         }
else if (type.equals("W")){
            db.insertRecognition(contractNumber, totalRevenue, recognitionDate);
         }
else if (type.equals("D")) {
            Money[] allocation 
= totalRevenue.allocate(3);
            db.insertRecognition
                (contractNumber, allocation[
0], recognitionDate);
            db.insertRecognition
               (contractNumber, allocation[
1], recognitionDate.addDays(30));
            db.insertRecognition
               (contractNumber, allocation[
2], recognitionDate.addDays(60));
         }

      }
catch (SQLException e) {throw new ApplicationException (e);
      }

   }


Table Data Gateway提供了对SQL的支持。首先是一个合同查找类。

 

class  Gateway... 

   
public  ResultSet findContract ( long  contractID)  throws  SQLException {
      PreparedStatement stmt 
= db.prepareStatement(findContractStatement);
      stmt.setLong(
1, contractID);
      ResultSet result 
= stmt.executeQuery();
      
return result;
   }

   
private   static   final  String findContractStatement  =
      
" SELECT *  "   +
      
" FROM contracts c, products p  "   +
      
" WHERE ID = ? AND c.product = p.ID " ;

第二个是对插入操作的封闭。

class  Gateway... 

public   void  insertRecognition ( long  contractID, Money amount, MfDate asof)  throws  
SQLException 
{
      PreparedStatement stmt 
= db.prepareStatement(insertRecognitionStatement);
      stmt.setLong(
1, contractID);
      stmt.setBigDecimal(
2, amount.amount());
      stmt.setDate(
3, asof.toSqlDate());
      stmt.executeUpdate();
   }

   
private   static   final  String insertRecognitionStatement  =
      
" INSERT INTO revenueRecognitions VALUES (?, ?, ?) " ;

在Java系统中确认服务可能是一个常规类或一个session bean。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
目录 第1章 软件性能测试 1 1.1 什么是软件的性能 1 1.1.1 软件 1 1.1.2 软件性能的产生 4 1.1.3 功能与性能的关系 4 1.1.4 用户眼里的软件性能 6 1.1.5 软件人员眼里的软件性能 12 1.2 软件性能测试 16 1.2.1 性能测试在软件测试的周期位置 16 1.2.2 性能测试策略揭秘 20 1.3 如何做性能测试 23 1.3.1 Goal(定义目标) 26 1.3.2 Analysis(分析) 28 1.3.3 Metrics(度量) 29 1.3.4 Execution(执行) 30 1.3.5 Adjust(调整) 31 1.4 性能测试工具的评估和选择 32 1.4.1 测试预算VS工具价格 33 1.4.2 协议、开发技术、平台、中间件VS工具的支持 33 1.4.3 工具可使用的复杂程度VS项目计划的影响 34 第2章 第一次亲密接触LoadRunner 35 2.1 从性能测试到LoadRunner的映射 35 2.2 LoadRunner工作原理 38 2.3 安装LoadRunner 41 2.4 揭开License的神秘面纱 42 第3章 走近LoadRunner 44 3.1 LoadRunner的运行原理 45 3.1.1 LoadRunner三大高手 45 3.1.2 三大高手联手的一场性能测试盛大演出 48 3.2 LoadRunner的录制原理 50 3.2.1 网络协议与LoadRunner的Vuser 50 3.2.2 选择LoadRunner Protocol的两大定律 55 3.2.3 LoadRunner录制技术 56 第4章 LoadRunner脚本语言基础 62 4.1 C语言与LoadRunner脚本 66 4.1.1 看不见的main 67 4.1.2 全局变量与局部变量 71 4.1.3 在LoadRunner脚本里灵活使用C语言 74 4.1.4 高级--用户自定义函数 78 4.2 通用VU函数 81 4.2.1 事务事务控制函数 82 4.2.2 命令行分析函数 83 4.2.3 系统信息函数 83 4.2.4 字符串函数 83 4.2.5 消息函数 84 4.2.6 运行时(run-time)函数 84 4.3 协议相关函数 85 4.3.1 HTTP协议原理 85 4.3.2 HTTP在LoadRunner的实现 86 第5章 VU--用户行为的模拟器 89 5.1 图灵试验与LoadRunner VU模拟奥秘 90 5.1.1 图灵试验场景 90 5.1.2 LoadRunner模拟揭秘 91 5.2 录制脚本 94 5.2.1 选择协议 94 5.2.2 规划脚本结构 96 5.2.3 HTTP Vuser中的URL mode和HTML mode 96 5.2.4 查看日志 99 5.3 回放脚本 101 5.4 关联 102 5.4.1 录制前Correlation(关联) 103 5.4.2 录制后关联 106 5.4.3 手动关联 109 5.5 脚本视图和树视图 113 5.5.1 树视图(Tree View) 113 5.5.2 脚本视图(Script View) 114 5.5.3 理解Snapshot 115 5.6 事务、同步点和思考时间 115 5.6.1 Transaction事务) 115 5.6.2 Rendezvous Point(同步点) 118 5.6.3 注释 119 5.6.4 Think Time(思考时间) 119 5.7 数据驱动--参数化(Parameters) 121 5.7.1 为什么需要参数化 121 5.7.2 参数的创建 123 5.7.3 定义参数的属性 130 5.7.4 高级--从已存在的数据库中导入参数数据 136 5.8 检查点(Check point) 142 5.8.1 为什么需要检查点 142 5.8.2 检查点实施之一:ContentCheck定义 144 5.8.3 检查点实施之二:检查函数 144 5.8.4 检查点设置技巧 147 5.9 高级--多Action 147 5.10 高级--脚本错误处理机制 150 5.11 高级--脚本调试技巧 152 5.11.1 动态运行(Animated run)与非动态运行(Non-Animated run) 152 5.11.2 日志设置 153 5.12 高级--编写脚本的最佳实践 156 5.13 VU脚本运行成功后 157 第6章 Controller--性能测试的指挥中心 158 6.1 得到细化后的性能需求 159 6.2 设计性能测试场景 162 6.2.1 创建手工场景 164 6.2.2 百分比模式创建手工场景 173 6.2.3 创建面向目标场景 174 6.2.4 多IP的实现原理以及模拟 180 6.3 运行场景 183 6.3.1 场景控制 183 6.3.2 执行期间查看场景 191 6.3.3 监视场景 196 6.3.4 高级--用户自定义数据采集点 201 6.3.5 主要的计数器 203 6.3.6 实例--分析实时监视图表 211 6.4 场景运行后 213 6.5 高级--如何合理规划性能测试拓扑 213 6.5.1 选择最优的测试机配置 215 6.5.2 客户端CPU瓶颈估算 216 6.5.3 客户端网络瓶颈估算 217 6.5.4 客户端内存瓶颈估算 219 6.5.5 总评估 221 第7章 Analysis--寻找系统瓶颈的得力助手 222 7.1 Analysis报告概要(Summary) 223 7.1.1 概要部分 223 7.1.2 统计部分 224 7.1.3 事务统计 225 7.1.4 HTTP响应统计 227 7.2 Analysis标准图 227 7.2.1 Vuser图 227 7.2.2 事务图 228 7.2.3 网页细分图 230 7.3 交叉结果和合并图 233 7.3.1 叠加 235 7.3.2 平铺 236 7.3.3 关联 236 7.4 生成测试报告 237 7.4.1 创建HTML格式报告 237 7.4.2 创建Word格式报告 238 7.4.3 高级--数据点报告 239 第8章 欲善其事先利其器--VU脚本开发实战 240 8.1 邮件服务SMTP/IMAP协议介绍 241 8.1.1 电子邮件的工作原理 241 8.1.2 SMTP协议介绍 241 8.1.3 POP3协议介绍 243 8.1.4 IMAP协议介绍 244 8.2 VU的SMTP Vuser对SMTP协议的封装及实现 244 8.2.1 使用SMTP Vuser录制Outlook 2003发送邮件 247 8.2.2 对SMTP Vuser录制生成的脚本进行分析 251 8.2.3 回放SMTP Vuser脚本并分析网络日志 253 8.3 VU Java Vuser自开发SMTP程序 255 8.3.1 VU创建Java模板虚拟用户 255 8.3.2 设置Java环境 257 8.3.3 在Java Vuser中开发SMTP发送mail脚本 258 8.3.4 参数化增强脚本 260 第9章 学以致用--一步一步做Web系统性能测试 264 9.1 软件系统背景及架构设计介绍 264 9.2 性能要求和性能指标分析(Goal阶段) 267 9.2.1 性能指标 267 9.2.2 业务模型分析和需求细化 268 9.3 性能测试方案和用例设计(Analysis阶段) 268 9.4 性能测试各种度量的建立(Metrics阶段) 273 9.4.1 性能脚本的生成 273 9.4.2 定义用户行为 274 9.4.3 场景的设置与运行 274 9.4.4 计数器的设置与性能数据收集 276 9.5 运行场景,得到测试结果和相关数据(Execution阶段) 277 9.5.1 脚本的开发 277 9.5.2 数据的生成 278 9.5.3 并发登录测试 279 9.5.4 负载测试 279 9.6 分析测试瓶颈(Adjust阶段) 280 9.6.1 并发测试结果分析 280 9.6.2 交易流程测试结果分析及性能评价 281 9.6.3 查询流程测试结果分析 281 第10章 循序渐进--进阶LoadRunner高手 282 10.1 性能测试用例的设计策略 282 10.1.1 "普遍撒网,重点查看"的原则 282 10.1.2 保证数据的有效性 284 10.2 LoadRunner高级功能的使用--Web Click Vuser 286 10.2.1 Web Click Vuser的产生背景 286 10.2.2 Web Click Vuser与传统Vuser的差别 286 10.2.3 使用Web Click Vuser 286 第11章 定量分析及诊断--建立性能度量模型 291 11.1 实现性能度量的准备工作 292 11.1.1 性能度量 292 11.1.2 度量方式 294 11.2 案例实践--性能测试第一阶段Ajax页面基准性能分析 298 11.2.1 页面基准分析目标 298 11.2.2 分析所使用的工具 299 11.2.3 术语揭示 299 11.2.4 基准测试案例设计及运行 300 11.2.5 结果分析 305 11.2.6 优化建议 306 11.2.7 预测 306 11.3 案例实践:性能测试第二阶段Ajax系统负载测试 307 11.3.1 本轮测试目的 307 11.3.2 测试场景规划 307 11.3.3 负载测试案例分析 309 11.3.4 性能结果量化分析 312 11.4 总结 315 第12章 测试也开发--自开发性能测试框架 316 12.1 性能测试框架架构设计 317 12.1.1 技术考虑的准备 317 12.1.2 Automation Center性能测试框架设计实例 319 12.1.3 定义XML格式的性能测试任务文件 325 12.1.4 Automation Center性能测试调度运行 329 12.1.5 性能测试报告诊断系统 330 12.2 核心技术及具体实现方法 332 12.2.1 性能测试数据源格式定义 332 12.2.2 测试程序与性能测试框架的接口实现 336 12.2.3 测试任务克隆技术 339 12.2.4 多任务通信技术 340 12.2.5 Observer性能监控技术 341 12.2.6 基于XSL技术的性能测试报告构建 344 12.3 总结 346 附录A 有关LoadRunner的常见问题解答 347
介绍 Log Explorer主要用于对MSSQLServer的事物分析和数据恢复。你可以浏览日志、导出数据、恢复被修改或者删除的数据(包括执行过update,delete,drop和truncate语句的表格)。一旦由于系统故障或者人为因素导致数据丢失,它能够提供在线快速的数据恢复,最大程度上保证恢复期间的其他事物不间断执行。 他可以支持SQLServer7.0和SQLServer2000,提取标准数据库的日志文件或者备份文件中的信息。 其中提供两个强大的工具:日志分析浏览,对象恢复。具体功能如下: l 日志文件浏览 l 数据库变更审查 l 计划和授权变更审查 l 将日志记录导出到文件或者数据库表 l 实时监控数据库事物 l 计算并统计负荷 l 通过有选择性的取消或者重做事物来恢复数据 l 恢复被截断或者删除表中的数据 l 运行SQL脚本 产品 LogExplore包含两部分 l 客户端软件 l 服务器代理 服务器端代理是保存在SQLServer主机中的一个只读存储过程,他的作用是接受客户端请求,读取在线事物日志块并通过网络传给客户端软件,由客户端软件来读取这些原始的数据块来完成Log Explore所提供的所有功能。 他依赖来的网络协议包括: l Named Pipe:局域网中适用 l Tcp/Ip:广域网中适用 数据库相关介绍 事物日志(Transaction Log) SQLServer的每个数据库都包含事物日志,它以文件的形式存储,可以记录数据库的任何变化。发生故障时SQLServer就是通过它来保证数据的完整性。 操作(Operation) 操作是数据库中定义的"原子行为",每个操作都在日志文件中保存为一条记录。它可以是用户直接输入的SQL语句,比如标准的insert命令,日志文件中便会记录一条操作代码来标志这个insert操作。 事物(Transaction) 事物是一系列操作组成的序列。他可以理解为直观的不可分割的一笔业务,可以执行成功或者失败。典型的事物比如由应用程序发出的具有开启-提交功能的一组SQL语句。不同的事物靠事物Id号(transaction ID)来区分,具有相同ID的事物记录的日志也相同。 在线事物日志(Online Transaction Log) 在线事物日志是指当前活动数据库所用的日志。可以通过如下命令来确定其对应文件 Select * from SYSFILES 他的文件后缀名一般是.LDF 离线事物日志(Offline Transaction Log) 离线事物日志是指非活动数据库所用的日志。当其数据库处于关闭(ShutDown)才状态下可以进行复制备份操作。他的结果同在线事物日志完全相同。 备份文件 备份文件是保存食物日志备份的文件,通常管理员通过运行SQL语句或者企业管理器来生成该文件。备份文件的内部结构和事物日志不同,他采用称为MTF的格式来保存数据。一个备份文件可以包含一个日志的多组备份,甚至包括多个数据库的混合备份. 设置为自动收缩 企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩" 强烈要求该项不要选中.否则SQLServer将已循环的方式来覆盖先前的日志记录,将会导致LogExplore无法恢复错误. 数据恢复介绍 LogExplore允许你恢复应为误操作或者程序错误而导致的数据丢失或者更改.比如执行update/Delete语句时丢失了where子句,或者错误使用了Dts功能. LogExplore不支持直接修改数据库.他可以生成事物的逆操作脚本. 如果log是delete table where ...的话,生成的文件代码就是insert table .... 你可以通过SQL查询分析器,或者LogExplore的Run SQL Script功能来执行生成脚本. 关于Undo Undo功能可以逆操作一组指定的用户事物。包括insert,delete和update,其局限性如下: l 事物类别:LogExplore只能undo用户事物。用户事物是指在用户表上定义的事物,不支持系统表的更新恢复。同时,他也不支持计划变更的回滚。 l Blob类型:包括text,ntext,image类型。LogExplore只支持这些类型的insert和delete恢复,不支持update语句恢复。 关于redo Redo功能可以再次运行一组指定事物。它可以在以下情况中用到: 丢失数据库而且没有任何备份文件。 l 如果原始日志文件没有丢失可以通过Redo来实现恢复。 l 通过完整备份文件来把数据库恢复到某指定时间点,再通过redo功能完整恢复。它可以重放Create Table和Create Index命令,来重新生成被删掉的表,同时也受blob字段的限制。 拯救Dropped/Truncate命令导致的数据丢失 执行Drop Table和Truncate Table命令虽然会被SQLServer记录到日志文件中,但是并不记录被删除的数据。你可以使用LogExplore提供的功能来恢复这些数据。LogExplore提供两种机制来恢复被Drop或者Truncate的数据。 1、如果你有备份文件可以直接通过备份文件恢复。 2、通过LogExplore提供的方法来恢复。 当执行如上命令时,SQLServer会将保存数据的页面放入空闲页面列表中。如果此页没有被再次使用则将一直保存原始数据。恢复时,LogExplore将从空闲页面列表中搜寻没有被再次使用的页面,然后生成一个SQL脚本来从这些页面重组原始数据。LogExplore可以确定被删掉的原始数据行,并在完成时显示原始行数和实际恢复的行数,由此可以断定是否全部恢复。 SQL逆操作 1、Insert--Delete 2、Delete--Insert 3、Update 注意:如果你选中了'Do not restore column values that have been changed by subsequent modifications'项,只对事物1逆转将不会产生任何结果。 自增序列(IDENTITY Property) 如果被删除数据与有IDENTITY Property属性,恢复时LogExlpore可以通过SET IDENTITY_INSERT ON 命令来对插入的数据设置Identity属性,并保留原数据不变,也可以对该列付与新值。 数据导出: 浏览日志时可将数据导出为xml,html,或者其他有分隔符的文件.也可以指定到一个SQL的表中. 操作指南 Attaching to a Log:在所有操作之前必须添加日志文件, l 可以用普通的SQL登录方式添加在线日志(Online Log), l 直接选择LDF文件来添加离线日志(OffLine Log) l 添加备份文件 登录之后界 功能介绍: 1、 Log Summary 日志文件的概要信息。 2、 Load Analysis 列出指定时间范围内的一些事物,用户和表载入的概要信息。 3、 Filter Log Record 日志过滤设置。支持过滤条件包括:时间、操作类型、表、用户、SPID、搜索深度、Dropped表项以及登录设置和应用程序设置 4、Browse 日志浏览,核心模块。 1、 View Log功能: 列表如图,可以用TransID来区分事物并用不同颜色标识。工具栏的按钮是一些基本查询操作。鼠标右键弹出菜单中有Undo Transaction和UndoOperation可以恢复黑色箭头选中的事物或者操作项。 Real-Time Monitor: 实时监控事物日志,通过轮询来实现。可以暂停或者停止监控,可以更改轮询周期。 相关DML语言和DDL语言可以在Row Revision History、Row Transaction History以及View DDL Commands来查询。 2、 Export Log Report 包括Export To SQL和Export To File,根据向导即可完成。 3、 其余菜单:Undo,Redo,Salvage Dropped/Truncated data,Restore 以及Run SQL Script前面已经叙述过,可以根据其向导完成。 log explorer使用的几个问题 1)对数据库做了完全 差异 和日志备份 备份时选用了删除事务日志中不活动的条目 再用Log explorer打试图看日志时 提示No log recorders found that match the filter,would you like to view unfiltered data 选择yes 就看不到刚才的记录了 如果不选用了删除事务日志中不活动的条目 再用Log explorer打试图看日志时,就能看到原来的日志 2)修改了其中一个表中的部分数据,此时用Log explorer看日志,可以作日志恢复 3)然后恢复备份,(注意:恢复是断开log explorer与数据库的连接,或连接到其他数据上, 否则会出现数据库正在使用无法恢复) 恢复完后,再打开log explorer 提示No log recorders found that match the filter,would you like to view unfiltered data 选择yes 就看不到刚才在2中修改的日志记录,所以无法做恢复. 3) 不要用SQL的备份功能备份,搞不好你的日志就破坏了. 正确的备份方法是: 停止SQL服务,复制数据文件及日志文件进行文件备份. 然后启动SQL服务,用log explorer恢复数据 请注意如果数据库采用简单日志,Log Explorer就没用了。 Log Explorer For SQL SERVER帮助翻译(Log Operation Codes) 日志操作代码 每个日志记录包含一个操作代码,操作代码表示日志的操作 FORMAT_PAGE 写新分配数据页的表头 INSET_ROWS 在用户表或系统表插入行 DELETE_ROWS 从表里删除行 MODIFY_ROW 使用Update命令更新行 MODIFY_HEADER SQLSERVER分配新数据页,初始化页表头 MODIFY_COLUMNS 使用Update命令更新行 DELTA_SYSIND SYSINDEXES系统表被修改 DELETE_SPLIT 行移动到新物理页,并从原物理页删除这些行 FILE_HDR_MODIF SQLSERVER增长数据文件大小 BEGIN_XACT 启动一个事务 COMMIT_XACT 提交一个事务 ABORT_XACT 回滚一个事务 MARK_SAVEPOINT 程序发布'SAVE TRANSACTION'命令 MARK_DLL 表结构被修改 BEGIN_CKPT 启动一个检查点 XACT_CKPT 在执行检查点时打开事务 END_CKPT 执行完检查点 SORT_BEGIN 创建索引时执行排序 SORT_END 创建索引时排序完成 CREATE_INDEX 创建一个索引 DROP_INDEX 删除一个索引

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值