使用BBED手工提交事务

测试数据准备:

SQL> create user sunhailong identifiedby abcd;

User created.

SQL> alter user sunhailong defaulttablespace users;

User altered.

SQL> grant dba to sunhailong;

Grant succeeded.

SQL> conn sunhailong

Enter password:

Connected.

SQL>

SQL>

SQL> drop table t_trans purge;

Table dropped.

SQL> create table tt_trans as select *from dba_objects where rownum<400;

Table created.

SQL> select count(*) from tt_trans;

COUNT(*)

----------

399

SQL> select distinctdbms_rowid.rowid_block_number(rowid) blk# from tt_trans;

BLK#

----------

70

72

68

69

71

SQL> COL OBJECT_NAME FOR A50

SQL> SET LINES 200 PAGES 999

select dbms_rowid.ROWID_BLOCK_NUMBER(rowid)BLK,

dbms_rowid.ROWID_RELATIVE_FNO(rowid) FNO,

dbms_rowid.ROWID_ROW_NUMBER(rowid) RNO,

object_id,

object_name

--dump(object_name)

from tt_trans

where object_id=22;

BLK        FNO        RNO OBJECT_ID OBJECT_NAME

---------- ---------- ---------- ------------------------------------------------------------

68          4         40         22 USER$

SQL> delete from tt_trans whereobject_id=22;

1 row deleted.

这里不提交

alter system flush buffer_cache;

BBED> set dba 4,68

DBA             0x0100003f(16777279 4,63)

--看ITL

BBED> p ktbbhitl

struct ktbbhitl[0], 24 bytes                @44

struct ktbitxid, 8 bytes                @44

ub2 kxidusn                          @44       0xffff

ub2 kxidslt                          @46       0x0000

ub4 kxidsqn                          @48       0x00000000

struct ktbituba, 8 bytes                @52

ub4 kubadba                           @52       0x00000000

ub2 kubaseq                          @56       0x0000

ub1 kubarec                          @58       0x00

ub2 ktbitflg                            @60       0x8000 (KTBFCOM)

union _ktbitun, 2 bytes                  @62

b2 _ktbitfsc                         @62       0

ub2 _ktbitwrp                        @62       0x0000

ub4 ktbitbas                            @64       0x0309e7c2

struct ktbbhitl[1], 24 bytes                @68

struct ktbitxid, 8 bytes                @68

ub2 kxidusn                          @68       0x0009

ub2 kxidslt                          @70       0x0008

ub4 kxidsqn                          @72       0x00000139

struct ktbituba, 8 bytes                @76

ub4 kubadba                          @76       0x00800062

ub2 kubaseq                          @80       0x00d3

ub1 kubarec                          @82       0x08

ub2 ktbitflg                             @84       0x0001 (NONE)

union _ktbitun, 2 bytes                 @86

b2 _ktbitfsc                         @86       72

ub2 _ktbitwrp                        @86       0x0048

ub4 ktbitbas                            @88       0x00000000

struct ktbbhitl[2], 24 bytes                @92

struct ktbitxid, 8 bytes                @92

ub2 kxidusn                          @92       0x0000

ub2 kxidslt                          @94       0x0000

ub4 kxidsqn                          @96       0x00000000

struct ktbituba, 8 bytes                @100

ub4 kubadba                          @100      0x00000000

ub2 kubaseq                          @104      0x0000

ub1 kubarec                          @106      0x00

ub2 ktbitflg                            @108      0x0000 (NONE)

union _ktbitun, 2 bytes                 @110

b2 _ktbitfsc                         @110      0

ub2 _ktbitwrp                         @110      0x0000

ub4 ktbitbas                            @112      0x00000000

BBED> modify /x 0080 offset 84

File: /data/orcl/orcl/users01.dbf (4)

Block: 68               Offsets:   84 to 8191           Dba:0x01000044

------------------------------------------------------------------------

00804800 00000000 00000000 00000000 0000000000000000 00000000 00000000

BBED> dump offset 86 count 8

File: /data/orcl/orcl/users01.dbf (4)

Block: 68               Offsets:   86 to  93           Dba:0x01000044

------------------------------------------------------------------------

48000000 00000000

<32 bytes per line>

BBED> modify /x 0000 offset 86

File: /data/orcl/orcl/users01.dbf (4)

Block: 68               Offsets:   86 to  93           Dba:0x01000044

------------------------------------------------------------------------

00000000 00000000

<32 bytes per line>

BBED> sum apply

Check value for File 4, Block 68:

current = 0xfb97, required = 0xfb97

BBED> verify

DBVERIFY - Verification starting

FILE = /data/orcl/orcl/users01.dbf

BLOCK = 68

Block Checking: DBA = 16777284, Block Type= KTB-managed data block

data header at 0x2af82f9c327c

kdbchk: row locked by non-existenttransaction             ---事务不一致,原因是行头的锁标记没有清理

table=0   slot=40

lockid=2   ktbbhitc=3

Block 68 failed with check code 6101

DBVERIFY - Verification complete

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 1

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0

根据dump找到行号:

tab 0, row 40, @0x134c

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 41, @0x1301

tl: 75 fb: --H-FL-- lb: 0x0  cc: 13

col 0: [ 3]  53 59 53

col 1: [ 6]  49 5f 43 4f 4e 32

col 2: *NULL*

col 3: [ 2]  c1 32

col 4: [ 2]  c1 32

col 5: [ 5]  49 4e 44 45 58

col 6: [ 7]  78 6c 03 0c 01 28 31

col 7: [ 7]  78 6c 03 0c 01 28 31

col 8: [19]  32 30 30 38 2d 30 33 2d31 32 3a 30 30 3a 33 39 3a 34 38

col 9: [ 5]  56 41 4c 49 44

col 10: [ 1]  4e

col 11: [ 1]  4e

清理锁标记:

BBED> p *kdbr[40]

rowdata[3866]

-------------

ub1 rowdata[3866]                           @5064     0x3c

BBED> x /rccccccccccc

rowdata[3866]                               @5064

-------------

[email protected]: 0x3c (KDRHFL, KDRHFF, KDRHFD,KDRHFH)

[email protected]: 0x02

[email protected]:    0

BBED> modify /x 3c00 offset 5064

File: /data/orcl/orcl/users01.dbf (4)

Block: 68               Offsets: 5064 to 5071           Dba:0x01000044

------------------------------------------------------------------------

3c000d03 53595305

<32 bytes per line>

BBED> sum apply

Check value for File 4, Block 68:

current = 0xf997, required = 0xf997

BBED> verify

DBVERIFY - Verification starting

FILE = /data/orcl/orcl/users01.dbf

BLOCK = 68

Block Checking: DBA = 16777284, Block Type= KTB-managed data block

data header at 0x1070fa7c

kdbchk: the amount of space used is notequal to block size

used=7118 fsc=0 avsp=874 dtl=8064                             ---看报错变为kdbchk:the amount of space used is not equal to block size

Block 68 failed with check code 6110

DBVERIFY - Verification complete

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 1

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0

7118+874=7992  < dtl 8064

avsp=8064-7118=946

BBED> p kdbhavsp

b2 kdbhavsp                                 @134      874

BBED> p kdbhtosp

b2 kdbhtosp                                 @136      948

小技巧这里就不用计算了,根据kdbhtosp的16进制改就可以了。

BBED> dump offset 134 count 8

File: /data/orcl/orcl/users01.dbf (4)

Block: 68               Offsets:  134 to 141           Dba:0x01000044

------------------------------------------------------------------------

6a03b403 00005b00

kdbhtosp的值为b403   字节序反转后-2,为03b2,再反转回去b203

BBED> modify /x b203 offset 134

File: /data/orcl/orcl/users01.dbf (4)

Block: 68               Offsets:  134 to 141           Dba:0x01000044

------------------------------------------------------------------------

b203b403 00005b00

<32 bytes per line>

BBED> p kdbhavsp

b2 kdbhavsp                                 @134      946

BBED> p kdbhtosp

b2 kdbhtosp                                 @136      948

BBED> sum apply

Check value for File 4, Block 68:

current = 0xf94f, required = 0xf94f

BBED> verify

DBVERIFY - Verification starting

FILE = /data/orcl/orcl/users01.dbf

BLOCK = 68

DBVERIFY - Verification complete

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 0

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0

修改完毕。

总结:

手工提交未提交事务需要修改4个地方

1.数据块对应事务ITL槽的ktbitflg

2.清空数据块对应事务ITL槽的_ktbitwrp

3.清理行头锁标记为00

4.重新计算kdbhavsp值,并依据kdbhtosp值进行修改(其实kdbhtosp值也可以改为与kdbhavsp一致,如果不改在这里也是可以校验通过的)

时间: 2024-11-10 15:10:01

使用BBED手工提交事务的相关文章

【Oracle】使用bbed手动提交事务

文件输入输出 使用文件流对象 创建文件流对象时,我们可以提供文件名(可选).如果提供了一个文件名,则open会自动被调用: ifstream in(ifile); //构造一个ifstream并打开给定文件 ofstream out; //输出文件流未关联到任何文件 用fstream代替iostream& 首先这里有一个头文件和一个定义的文件要使用 Sales_data.h #ifndef SALES_DATA_H_INCLUDED #define SALES_DATA_H_INCLUDED #

使用BBED恢复DELETE的数据

测试环境请参见 使用BBED手工提交事务 尝试恢复delete的数据: BBED> modify /x 2c offset 5064 File: /data/orcl/orcl/users01.dbf (4) Block: 68               Offsets: 5064 to 5071           Dba:0x01000044 ------------------------------------------------------------------------ 2

hibernate单表映射

什么是Hibernate? ORM:object relationship mapping对象关系映射 hibernate是java领域的一款开源的ORM框架技术. hibernate是对jdbc进行了非常轻量级的对象封装. 1.开发工具:Eclipse Standard Kepler Hibernate Tools for eclipse Plugins Hibernate Tools是由JBoss推出的一个Eclipse综合开发工具插件,该插件可以简化ORM框架Hibernate,以及JBo

Hibernate学习汇总

一.Hibernate的基本原理 1.什么是Hibernate Hibernate,翻译过来是冬眠的意思,正好现在已经进入秋季,世间万物开始准备冬眠了.其实对于对象来说就是持久化. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的

【Hibernate】(2)Hibernate配置与session、transaction

1. Hibernate经常使用配置 使用hibernate.default_schema属性能够让全部生成的表都带一个指定的前缀. 2. session简单介绍 不建议直接使用jdbc的connection操作数据库,而是通过使用session操作数据库. session能够理解为操作数据库的对象.session与connection是多对一的关系.每一个session都有一个与之相应的connection.一个connection不同一时候刻能够供多个session使用.把对象保存在关系数据

quartz定时器在运营商的使用

定时任务在长流程的业务中应该还是比较多的,一种是非实时接口文件接口,这类一般用shell的crontab定时执行脚本,但shell中处理复杂逻辑比较吃力,一般会放到java或c/c++中实现,用nohup后台运行命令启用一个调java的守护线程. #!/bin/sh ACTION="$1" PROCNAME="$2" EXE_USER=`whoami` run_RECK=com.linkage.qyw.main.SchedulerStart mem_min=&quo

构建并修复逻辑损坏块和物理损坏块

Oracle数据块的损坏可以分为物理损坏和逻辑损坏,参照 http://blog.csdn.net/yidian815/article/details/39990803 物理损坏和逻辑损坏发生的场景不同,因此处理的方式方法也就不同.在很多情况下,相同的损坏块处理方法对于物理损坏和逻辑损坏会产生不同的结果.对于物理损坏的模拟是比较容易的,而对逻辑损坏的模拟却不常见. 物理损坏: 要模拟物理损坏,我们只需直接手工编辑物理块既可(通过UTRAEDIT\BBED等),如 SQL> select obje

Hibernate进阶篇(三)——transaction简介

转载请注明:http://blog.csdn.net/uniquewonderq 上次在说session的时候,要执行session方法的时候要把它方法事务当中,也就是说Hibernate对数据进行的操作都是封装在书屋当中,并且默认是非自动提交方式.所以用session保存对象时,如果不开启事务,并且手工提交事务,这个对象并不会真正的保存在数据库中. 我们知道jdbc是自动提交事务的.如果你想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法, 获得

JDBC浅谈(二)

JDBC中的事务 简单来说,事务就是要保证一组DAO方法的操作,要么一起成功要么一起失败. 1.事务控制的位置 在Service中的业务方法内进行事务控制. 2.事务控制的代码 a.注意:JDBC会自动把一条增.删.改的操作加入事务.(这样非常不好,因为有些情况是不需要添加事务的,容易产生问题). b.推荐:手工控制事务: 1 connection.setAutoCommit(false); //将JDBC的自动事务关闭 2 connection.commit(); //手工提交事务 3 con