【Oracle】使用bbed提交事务(二)

在上一篇的基础上,本篇实现修改undo segment header中的相关事务槽信息,从而屏蔽数据库在重启或者进程异常的时候,smon的回滚操作,从而比较完美的实现了手工提交数据库事务

实验过程如下

Session 1中

[email protected]>select last_name from bbed_test;

LAST_NAME

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

OConnell

Grant

Whalen

Hartstein

Fay

Mavris

Baer

Higgins

Gietz

King

10 rows selected.

[email protected]>update bbed_test set last_name=‘BADLY9‘;

10 rows updated.

事务未提交

Session 2中:

[email protected]>select rowid, dbms_rowid.rowid_relative_fno(rowid)rel_fno,

dbms_rowid.rowid_block_number(rowid)blockno,

dbms_rowid.rowid_row_number(rowid) rowno

from   2    3    4

5  JP.BBED_TEST;

ROWID                 REL_FNO    BLOCKNO      ROWNO

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

AAAM8CAAEAAAAG8AAA          4        444          0

AAAM8CAAEAAAAG8AAB          4        444          1

AAAM8CAAEAAAAG8AAC          4        444          2

AAAM8CAAEAAAAG8AAD          4        444          3

AAAM8CAAEAAAAG8AAE          4        444          4

AAAM8CAAEAAAAG8AAF          4        444          5

AAAM8CAAEAAAAG8AAG          4        444          6

AAAM8CAAEAAAAG8AAH          4        444          7

AAAM8CAAEAAAAG8AAI          4        444          8

AAAM8CAAEAAAAG8AAJ          4        444          9

10 rows selected.

[email protected]>SELECT XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBASQN,UBAREC FROM v$transaction;

XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC

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

7         38        369          2        786        302         16

[email protected]>select segment_name,header_file,header_block

2  from dba_segments where segment_name=(

3  select name from v$rollname where usn=(select xidusn from v$transaction));

SEGMENT_NAME  HEADER_FILE  HEADER_BLOCK

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

_SYSSMU7$      2          105

[email protected]>alter system dump undo header "_SYSSMU7$";

System altered.

[email protected]>oradebug setmypid

Statement processed.

[email protected]>oradebug tracefile_name

/u01/app/oracle/admin/ORCL/udump/orcl_ora_8512.trc

查看/u01/app/oracle/admin/ORCL/udump/orcl_ora_8512.trc文件,在其中可以看到

0x25    9    0x00  0x0171  0x001d  0x0000.000ee92e  0x00000000  0x0000.000.00000000  0x00000000   0x00000000  1402237152

0x26   10    0x80  0x0171  0x0001  0x0000.000f3981  0x00800312  0x0000.000.00000000  0x00000001   0x00000000  0

0x27    9    0x00  0x0171  0x0022  0x0000.000f38cc  0x00800311  0x0000.000.00000000  0x00000001   0x00000000  1402238227

通过结合dump undo header 中的TRN TBL的state为10的为active事务,然后结合scn/dba等信息来确定是哪条记录是需要我们修改.然后通过find命令快速定位到0x0b这条记录,然后进行修改

通过结合bbed的dump命令得出16进制数据分析得出如下结论

--index 0x26

7101 wrap#  0000 12038000 dba 81390f00 00000000  scn  0a s tate  80  cflags  0100  uel 00000000 00000000 parent-xid 00000000 stmt_num 01000000 nub 00000000 cmt

BBED> f /x 0a80

File: /u01/app/oracle/oradata/ORCL/undotbs01.dbf (2)

Block: 105              Offsets: 7736 to 8191           Dba:0x00800069

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

0a800100 00000000 00000000 00000000 01000000 00000000 71010000 11038000

<32 bytes per line>

BBED>  m /x 0900

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y

File: /u01/app/oracle/oradata/ORCL/undotbs01.dbf (2)

Block: 105              Offsets: 7736 to 8191           Dba:0x00800069

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

09000100 00000000 00000000 00000000 01000000 00000000 71010000 11038000

<32 bytes per line>

BBED> sum apply

Check value for File 2, Block 105:

current = 0x8e65, required = 0x8e65

接下来修改itl

struct ktbbhitl[1], 24 bytes             @68

struct ktbitxid, 8 bytes              @68

ub2 kxidusn                        @68       0x0007

ub2 kxidslt                        @70       0x0026

ub4 kxidsqn                        @72       0x00000171

struct ktbituba, 8 bytes              @76

ub4 kubadba                        @76       0x00800312

ub2 kubaseq                        @80       0x012e

ub1 kubarec                        @82       0x10

ub2 ktbitflg                          @84       0x000a (NONE)

union _ktbitun, 2 bytes               @86

b2 _ktbitfsc                       @86       0

ub2 _ktbitwrp                      @86       0x0000

ub4 ktbitbas                          @88       0x00000000

BBED> m /x 0080 offset 84

File: /u01/app/oracle/oradata/ORCL/users01.dbf (4)

Block: 444              Offsets:   84 to  595           Dba:0x010001bc

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

00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

<32 bytes per line>

BBED> sum apply

Check value for File 4, Block 444:

current = 0x17c1, required = 0x17c1

Session3重启数据库查询数据:

[email protected]>shutdown abort

ORACLE instance shut down.

[email protected]>startup

ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size                  1218992 bytes

Variable Size              75499088 bytes

Database Buffers          205520896 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

[email protected]>select last_name from jp.bbed_test;

LAST_NAME

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

BADLY9

BADLY9

BADLY9

BADLY9

BADLY9

BADLY9

BADLY9

BADLY9

BADLY9

BADLY9

10 rows selected.

实验过程参考飞总的文章:http://www.orasos.com/4194.html

【Oracle】使用bbed提交事务(二)

时间: 2024-08-16 05:24:39

【Oracle】使用bbed提交事务(二)的相关文章

探索Oracle之数据库升级二 11.2.0.3升级到11.2.0.4完整步骤

探索Oracle之数据库升级二  11.2.0.3升级到11.2.0.4完整步骤 说明:         这篇文章主要是记录下单实例环境下Oracle 11.2.0.1升级到11.2.0.3的过程,当然RAC的升级是会有所不同.但是他们每个版本之间升级步骤都是差不多的,先升级Database Software,再升级Oracle Instance. Oracle 11.2.0.4的Patchset No:19852360下载需要有Oracle Support才可以.  Patchset包含有7个

oracle学习笔记(二)

设置归档模式(mount状态) ALTER database ARCHIVELOG; //关闭数据库 shutdown immediate //启动数据库到mount状态 startup mount alter database archivelog; //查看归档状态 archive log list; SQL> archive log list; 数据库日志模式 存档模式 自动存档 启用 存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 1 下一个存档日志序列

【我的Oracle学习笔记(二)】----- select语句补充

一.多表查询 多表查询是指从多个有关联的表中查询数据,其语法与单表查询类似.一般来说,多表查询的表要用连接联系起来,如果没连接,则查询结果是这多个查询表的笛卡尔积(注释1). 模拟查询雇员姓名和所在部门名称: select [雇员姓名],[部门名称] from [雇员表] a,scott,[部门表] b where a.[部门编号]=b.[部门编号]; 上例中,为每一个查询表指定了别名,便于SQL语句的书写. 模拟查询在”sales“部门工作的雇员其雇员姓名 select [雇员姓名] from

Oracle内存管理理论篇二

目标 了解oracle内存管理方式 掌握ASMM管理方式 掌握AMM管理方式 监控内存使用 学习一个知识点时,最好先了解其历史.ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGREGATE_TARGET参数实现PGA的自动管理,10g通过Automatic Shared Memory Management(ASMM)实现SGA的自动管理,到11g通过Automatic Memory Management(AMM)实现内存(SGA+PGA)的自动管理.目前的11G版本,DBA只

Oracle笔记(十二) 集合、序列

Oracle笔记(十二) 集合.序列 一.集合 在数学的操作之中存在交.差.并.补的概念,而在数据的查询中也存在此概念,有如下几个连接符号: UNION:连接两个查询,相同的部分不显示: UNION ALL:连接两个查询,相同的部分显示: INTERSECT:返回两个查询中的相同部分: MINUS:返回两个查询中的不同部分: 为了验证以上的操作,下面创建一张只包含20部门雇员信息的表: CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20

ORACLE百例试炼二

Oracle系列<二>:多表复杂查询和事务处理 多表查询应该注意去除笛卡尔积,一般多个表时会为表起个别名 [1]要求查询雇员的编号.姓名.部门编号.部门名称及部门位置 SQL> SELECT   e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno = d.deptno; [2]要求查询每个雇员的姓名.工作.雇员的直接上级领导的姓名(表自关联) SQL> SELECT e.ename,e.jo

oracle sql 基础(二):select 语句

为了从数据库中查询数据,你需要用SQL语言中使用最多的SELECT语句.我们分别介绍SELECT语句的基础语法.子查询.从多表中查询数据,然后再进行实例解析. 一.SELECT语句的基础语法 SELECT语句就像叠加在数据库表上的过滤器,即选择查询用于定位数据库特定的列和行.下面是SELECT语句的基础语法.  SELECT [ALL|DISTINCT SELECT_LIST FROM {table_name|view_name} [WHERE search_condition] [GROUP

Oracle分析函数用法(二)

Oracle分析函数--函数用法 Oracle分析函数实际上操作对象是查询出的数据集,也就是说不需二次查询数据库,实际上就是oracle实现了一些我们自身需要编码实现的统计功能,对于简化开发工作量有很大的帮助,特别在开发第三方报表软件时是非常有帮助的.Oracle从8.1.6开始提供分析函数. oracle分析函数的语法: function_name(arg1,arg2,...) over (<partition-clause> <order-by-clause ><wind

oracle——基础知识(二)

1.select 查询 单独的一条 select 语句 在PL/SQL中通过SELECT从数据库中检索数据: 语法: <1> 必须使用INTO子句 <2> 查询必须并且只能返回一行 <3> 可以使用完整的SELECT 语法 使用SELECT 命令,可以从数据库中取出单行数据   使用DML命令,修改数据库中的行     使用COMMIT 或ROLLBACK 命令控制事务     通过EXECUTE IMMEDIATE,执行DDL     1.查看字段类型 select