Oracle中如何使用bbed手动提交事务

有时候数据库挂掉,起库会出现ORA-00704错误,而导致ORA-00704错误的根本原因是访问OBJ$的时候,ORACLE需要回滚段中的数据,而访问回滚段的时候需要的undo数据已经被覆盖,此时我们可以通过bbed工具手工提交事务,从而解决这个问题。

使用bbed提交事务测试过程如下:

JP@ORCL>create table JP_BBED_TEST as select * from hr.employees where rownum<=10;

Table created.

JP@ORCL>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 jp_bbed_test;  2    3    4  

ROWID                 REL_FNO    BLOCKNO      ROWNO

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

AAAM7wAAEAAAAGcAAA          4        412          0

AAAM7wAAEAAAAGcAAB          4        412          1

AAAM7wAAEAAAAGcAAC          4        412          2

AAAM7wAAEAAAAGcAAD          4        412          3

AAAM7wAAEAAAAGcAAE          4        412          4

AAAM7wAAEAAAAGcAAF          4        412          5

AAAM7wAAEAAAAGcAAG          4        412          6

AAAM7wAAEAAAAGcAAH          4        412          7

AAAM7wAAEAAAAGcAAI          4        412          8

AAAM7wAAEAAAAGcAAJ          4        412          9

10 rows selected.

JP@ORCL>select last_name from jp_bbed_test;

LAST_NAME

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

OConnell

Grant

Whalen

Hartstein

Fay

Mavris

Baer

Higgins

Gietz

King

10 rows selected.

JP@ORCL>update jp_bbed_test set LAST_NAME='BADLY9';

10 rows updated.

此时事务没有提交,其他的session是无法查看此时的修改的。

另开一个窗口

[oracle@jp bbed]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Jun 6 06:56:52 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

SYS@ORCL>alter system checkpoint;

System altered.

SYS@ORCL>alter system dump datafile 4 block 412;

System altered.

SYS@ORCL>oradebug setmypid

Statement processed.

SYS@ORCL>oradebug tracefile_name

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

查看/u01/app/oracle/admin/ORCL/udump/orcl_ora_17715.trc文件

我们可以看到以下内容:

Block header dump:  0x0100019c

Object id on Block? Y

seg/obj: 0xcef0  csc: 0x00.c3cf8  itc: 3  flg: E  typ: 1 - DATA

  brn: 0  bdba: 0x1000199 ver: 0x01 opc: 0

  inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn 0x0000.000c3cf8

0x02   0x0006.02b.000001a1  0x008000d0.00f6.2a  ----   10  fsc 0x0000.00000000

0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

这里可以看到我们LCK了10条表中记录

这时候我们使用bbed将事务提交:

首先使用session2 flush buffer_pool,如果不清空buffer pool,再次读取该block时将不会进行物理读,无法看到修改后的结果而且会覆盖我们的修改:

SYS@ORCL>alter system flush buffer_cache;

System altered.

使用bbed工具进行修改:

BBED> set dba 4,412

 DBA             0x0100019c (16777628 4,412)

BBED> map

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

Block: 412                                   Dba:0x0100019c

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

KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes                      @0

struct ktbbh, 96 bytes                     @20

struct kdbh, 14 bytes                      @124

struct kdbt[1], 4 bytes                    @138

sb2 kdbr[10]                               @142

ub1 freespace[6794]                        @162

ub1 rowdata[1232]                          @6956

ub4 tailchk                                @8188

BBED> p ktbbh

struct ktbbh, 96 bytes                      @20

ub1 ktbbhtyp                             @20       0x01 (KDDBTDATA)

union ktbbhsid, 4 bytes                  @24

ub4 ktbbhsg1                          @24       0x0000cef0

ub4 ktbbhod1                          @24       0x0000cef0

struct ktbbhcsc, 8 bytes                 @28

ub4 kscnbas                           @28       0x000c3cf8

ub2 kscnwrp                           @32       0x0000

b2 ktbbhict                              @36       3

ub1 ktbbhflg                             @38       0x32 (NONE)

ub1 ktbbhfsl                             @39       0x00

ub4 ktbbhfnx                             @40       0x01000199

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       0x000c3cf8

struct ktbbhitl[1], 24 bytes             @68

struct ktbitxid, 8 bytes              @68

ub2 kxidusn                        @68       0x0006

ub2 kxidslt                        @70       0x002b

ub4 kxidsqn                        @72       0x000001a1

struct ktbituba, 8 bytes              @76

ub4 kubadba                        @76       0x008000d0

ub2 kubaseq                        @80       0x00f6

ub1 kubarec                        @82       0x2a

ub2 ktbitflg                          @84       0x000a (NONE)

union _ktbitun, 2 bytes               @86

b2 _ktbitfsc                       @86       0

ub2 _ktbitwrp                      @86       0x0000

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

时间: 2024-11-16 13:40:12

Oracle中如何使用bbed手动提交事务的相关文章

Oracle中如何使用bbed恢复delete的数据

表中的数据被delete之后并不会真正删除数据,而是打了一个删除标记,只要还没有被覆盖就可以恢复回来. 实验过程如下: SYS@ORCL>create table bbed_test(x varchar2(20)); Table created. SYS@ORCL>insert into bbed_test values('BADLY9'); 1 row created. SYS@ORCL>insert into bbed_test values('JP'); 1 row created

Oracle中如何使用BBED跳过丢失的归档

在recover datafile的过程当中如果丢失了需要的归档将使得recover无法进行,使用bbed工具可以跳过丢失的归档进行recover datafile. 实验过程如下: SYS@ORCL>select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.

Oracle中手动删除数据库教程_oracle

在很多情况下,或无法使用dbca工具的时候,我们需要手动来删除数据库.对此,可以借助drop database命令来实现,下面的描述中给出手动删除数据库. 的具体步骤,包含文件系统数据库以及ASM数据库.环境:Oracle Enterprise Linux 5.4 + Oracle 10g R2 .  一.手动删除文件系统数据库      1.停止监听与OEM       复制代码 代码如下:         $ lsnrctl stop listener_name         $ emct

Oracle中通过bbed模拟和修复corrupted block

使用bbed需要注意: 1.win下oracle不提供 2.随oracle软件一起发布 3.在unix/linux下使用时需要事先relink 4.oracle最初使用bbed用来修复坏block,从9i开始可以通过rman的blockrecover来恢复,不过前提是事先做过备份 [oracle@xys oracle]$ bbed Password: BBED: Release 2.0.0.0.0 - Limited Production on Tue Jun 9 13:13:04 2009 C

oracle中bbed恢复与找回删除数据

恢复己删除数据 一.创建模拟环境  代码如下 复制代码 SQL> create table hr.xifenfei (id number,name varchar2(20)) tablespace xff; Table created. SQL> insert into hr.xifenfei values(1,'xifenfei'); 1 row created. SQL> insert into hr.xifenfei values(2,'xff'); 1 row created.

Oracle中在没有备份的情况下undo损坏怎么办

如果Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,不过如果没有备 份,可以采用一种非常规的手段(利用Oracle的隐藏参数),如果此时undo包含未提交的事 务,会造成一点点的数据丢失(一般都是可忍受的),如果没有未提交的事务,则不会有数 据丢失.其主要步骤有: 1. 修改undo表空间管理为手动: 2. 设置隐藏参数 (_offline_rollback_segments或_corrupted_rollback_segments)标识受影响的回滚段,使 Oracle忽略

DML需手动提交事务,DCL和DDL自动提交事务

我们知道oracle中是以事务为单位进行数据库的更改操作的.那么oracle是在什么时机来提交的呢?对于DML语句,oracle不会自动提交事务,直到有一条commit或者rollback命令来处理时才会将改动反应到数据库里.而对于DDL和DCL,oracle会马上提交,也就是说一执行完这两类语句,就会反应到数据库中,还有一种情况是,前面执行的DML没有被手动提交,执行完DDL或者DCL后,oracle也会将DML对与数据的改动提交到数据库中去. oralce的事务开始于第一条DML语句,结束于

Oracle中临时表的深入研究

oracle|临时表 最近考虑到我们的数据库端写存储过程关于临时表使用的情况,由于我们   现在还不清楚数据库端到底是怎么处理的,是否和Sql Server的处理方式相   同,是否会存在隐患等等一些问题,为了避免将来不必要的麻烦我做了深   入的研究和查看了一些权威的资料,现在和大家共享,希望大家在处理   Oracle临时表是注意一下:   首先是创建临时表的语法: CREATE GLOBAL TEMPORARY TABLE table "(" column datatype [D

oracle中如何增加和扩展表空间

Oracle中增加表空间大小的四种方法 1:给表空间增加数据文件 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF' SIZE 50M; 2:新增数据文件,并且允许数据文件自动增长 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP04.DBF' S