May 2009 Archives

关于10g中的X$KCVFH(续2)

| No Comments

在"关于10g中的X$KCVFH"和"关于10g中的X$KCVFH(续)"这两篇文章里,我介绍了X$KCVFH中各个字段的详细含义,这里我们再进一步来分析一下X$KCVFH的来源。

 

在"关于10g中的X$KCVFH(续)"这篇文章里,我是通过把data file #1X$KCVFH中的记录的内容和data file #1的文件头dump出来的内容做了一个对比从而完善了X$KCVFH中各个字段的含义,这里我们再次定位data file #1

$ bbed parfile=par.txt

Password:

 

BBED: Release 2.0.0.0.0 - Limited Production on Sun May 31 14:23:56 2009

 

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

 

************* !!! For Oracle Internal Use only !!! ***************

 

BBED> set file 1

        FILE#           1

 

BBED> p kcvfh

struct kcvfh, 676 bytes                     @0      

   struct kcvfhbfh, 20 bytes                @0      

      ub1 type_kcbh                         @0        0x0b

      ub1 frmt_kcbh                         @1        0xa2

      ub1 spare1_kcbh                       @2        0x00

      ub1 spare2_kcbh                       @3        0x00

      ub4 rdba_kcbh                         @4        0x00400001

      ub4 bas_kcbh                          @8        0x00000000

      ub2 wrp_kcbh                          @12       0x0000

      ub1 seq_kcbh                          @14       0x01

      ub1 flg_kcbh                          @15       0x04 (KCBHFCKV)

      ub2 chkval_kcbh                       @16       0x339f

      ub2 spare3_kcbh                       @18       0x0000

   struct kcvfhhdr, 76 bytes                @20     

      ub4 kccfhswv                          @20       0x00000000

      ub4 kccfhcvn                          @24       0x0a200100

      ub4 kccfhdbi                          @28       0x5091aeb3

      text kccfhdbn[0]                      @32      I

      text kccfhdbn[1]                      @33      P

      text kccfhdbn[2]                      @34      R

      text kccfhdbn[3]                      @35      A

      text kccfhdbn[4]                      @36      T

      text kccfhdbn[5]                      @37      E

      text kccfhdbn[6]                      @38      S

      text kccfhdbn[7]                      @39      T

      ub4 kccfhcsq                          @40       0x000017b5

      ub4 kccfhfsz                          @44       0x0000f000

      s_blkz kccfhbsz                       @48       0x00

      ub2 kccfhfno                          @52       0x0001

      ub2 kccfhtyp                          @54       0x0003

      ub4 kccfhacid                         @56       0x00000000

      ub4 kccfhcks                          @60       0x00000000

      text kccfhtag[0]                      @64      

      ......省略显示部分内容

      text kccfhtag[31]                     @95      

   ub4 kcvfhrdb                             @96       0x00400179

   struct kcvfhcrs, 8 bytes                 @100    

      ub4 kscnbas                           @100      0x00000008

      ub2 kscnwrp                           @104      0x0000

   ub4 kcvfhcrt                             @108      0x21a23e84

   ub4 kcvfhrlc                             @112      0x28144e35

   struct kcvfhrls, 8 bytes                 @116    

      ub4 kscnbas                           @116      0x00086983

      ub2 kscnwrp                           @120      0x0000

   ub4 kcvfhbti                             @124      0x00000000

   struct kcvfhbsc, 8 bytes                 @128    

      ub4 kscnbas                           @128      0x00000000

      ub2 kscnwrp                           @132      0x0000

   ub2 kcvfhbth                             @136      0x0000

   ub2 kcvfhsta                             @138      0x2004 (KCVFHOFZ)

   struct kcvfhckp, 160 bytes               @484    

      struct kcvcpscn, 8 bytes              @484    

         ub4 kscnbas                        @484      0x1697d667

         ub2 kscnwrp                        @488      0x0009

      ub4 kcvcptim                          @492      0x2904b211

      ub2 kcvcpthr                          @496      0x0001

      union u, 12 bytes                     @500    

         struct kcvcprba, 12 bytes          @500    

            ub4 kcrbaseq                    @500      0x00000049

            ub4 kcrbabno                    @504      0x00065762

            ub2 kcrbabof                    @508      0x0010

      ub1 kcvcpetb[0]                       @512      0x02

      ......省略显示部分内容

      ub1 kcvcpetb[128]                     @640      0x00

   ub4 kcvfhcpc                             @140      0x000000c1

   ub4 kcvfhrts                             @144      0x28144e27

   ub4 kcvfhccc                             @148      0x000000c0

   struct kcvfhbcp, 160 bytes               @152    

      struct kcvcpscn, 8 bytes              @152    

         ub4 kscnbas                        @152      0x00000000

         ub2 kscnwrp                        @156      0x0000

      ub4 kcvcptim                          @160      0x00000000

      ub2 kcvcpthr                          @164      0x0000

      union u, 12 bytes                     @168    

         struct kcvcprba, 12 bytes          @168    

            ub4 kcrbaseq                    @168      0x00000000

            ub4 kcrbabno                    @172      0x00000000

            ub2 kcrbabof                    @176      0x0000

      ub1 kcvcpetb[0]                       @180      0x00

      ......省略显示部分内容

      ub1 kcvcpetb[128]                     @308      0x00

   ub4 kcvfhbhz                             @312      0x00000000

   struct kcvfhxcd, 16 bytes                @316    

      ub4 space_kcvmxcd[0]                  @316      0x00000000

      ub4 space_kcvmxcd[1]                  @320      0x00000000

      ub4 space_kcvmxcd[2]                  @324      0x00000000

      ub4 space_kcvmxcd[3]                  @328      0x00000000

   word kcvfhtsn                            @332      0

   ub2 kcvfhtln                             @336      0x0006

   text kcvfhtnm[0]                         @338     S

   text kcvfhtnm[1]                         @339     Y

   text kcvfhtnm[2]                         @340     S

   text kcvfhtnm[3]                         @341     T

   text kcvfhtnm[4]                         @342     E

   text kcvfhtnm[5]                         @343     M

    ......省略显示部分内容

   text kcvfhtnm[29]                        @367     

   ub4 kcvfhrfn                             @368      0x00000001

   struct kcvfhrfs, 8 bytes                 @372    

      ub4 kscnbas                           @372      0x00000000

      ub2 kscnwrp                           @376      0x0000

   ub4 kcvfhrft                             @380      0x00000000

   struct kcvfhafs, 8 bytes                 @384    

      ub4 kscnbas                           @384      0x00000000

      ub2 kscnwrp                           @388      0x0000

   ub4 kcvfhbbc                             @392      0x00000000

   ub4 kcvfhncb                             @396      0x00000000

   ub4 kcvfhmcb                             @400      0x00000000

   ub4 kcvfhlcb                             @404      0x00000000

   ub4 kcvfhbcs                             @408      0x00000000

   ub2 kcvfhofb                             @412      0x000a

   ub2 kcvfhnfb                             @414      0x000a

   ub4 kcvfhprc                             @416      0x21a23e71

   struct kcvfhprs, 8 bytes                 @420    

      ub4 kscnbas                           @420      0x00000001

      ub2 kscnwrp                           @424      0x0000

   struct kcvfhprfs, 8 bytes                @428    

      ub4 kscnbas                           @428      0x00000000

      ub2 kscnwrp                           @432      0x0000

   ub4 kcvfhtrt                             @444      0x00000000

 

这里我们可以从结果里看到X$KCVFH实际上是来源于kcvfh这个struct

 

有人曾在itpub上问x$kcvfh中的FHRDB是什么意思?其实FHRDB10g里就是代表root dba的意思,Root dba: This field only occurs in data file #1, and is the location of blocks required during bootstrapping the data dictionary (bootstrap$)

 

从上面的结果里我们可以看到现在的root dba0x00400179

SQL> exec sys.cdba('00400179','H');

.

The file is 1

The block is 377

 

PL/SQL procedure successfully completed

 

$ bbed parfile=par.txt

Password:

 

BBED: Release 2.0.0.0.0 - Limited Production on Sun May 31 15:19:56 2009

 

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

 

************* !!! For Oracle Internal Use only !!! ***************

 

BBED> set file 1

        FILE#           1

 

BBED> set block 377

        BLOCK#          377

 

BBED> p ktemh

struct ktemh, 16 bytes                      @92     

   ub4 count_ktemh                          @92       0x00000001

   ub4 next_ktemh                           @96       0x00000000

   ub4 obj_ktemh                            @100      0x00000038

   ub4 flag_ktemh                           @104      0x40000000

 

可以看到这里root dba指向的object实际是0x00000038

SQL> select to_number('38','XX') from dual;

 

TO_NUMBER('38','XX')

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

                  56

 

SQL> select name from sys.obj$ where obj#=56;

 

NAME

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

BOOTSTRAP$

 

这就是10gX$KCVFH中字段FHRDB的含义

关于10g中的X$KCVFH(续)

| No Comments

在"关于10g中的X$KCVFH"这篇文章里,我分析了X$KCVFH的一些基本结构,但在那篇文章里,还有很多字段我当时也不知道其含义,现在我继续分析了一下,如下是继续分析过的X$KCVFH的结构,这下子X$KCVFH的绝大多数字段的含义都可以参考这篇文章了

下文中凡是蓝色标记的地方就是我后续的补充内容:

 

10gX$KCVFH的结构:

Version 10

Column Name Data Type          Description

ADDR RAW(4)                    ADDRESS

INDX NUMBER                   INDEX

INST_ID NUMBER                INSTANCE ID

HXFIL NUMBER                  FILE#Datafile number (from control file)

HXONS NUMBER                 ONLINE | OFFLINE (from control file),HXONS 0表示 'OFFLINE',为其他值表示 'ONLINE'

HXSTS VARCHAR2(16)            

HXERR NUMBER        ERRORdecode(HXERR, 0, NULL, 1,'FILE MISSING',2,'OFFLINE NORMAL', 3,'NOT VERIFIED', 4,'FILE NOT FOUND',5,'CANNOT OPEN FILE', 6,'CANNOT READ HEADER', 7,'CORRUPT HEADER',8,'WRONG FILE TYPE', 9,'WRONG DATABASE', 10,'WRONG FILE NUMBER',11,'WRONG FILE CREATE', 12,'WRONG FILE CREATE', 16,'DELAYED OPEN',14, 'WRONG RESETLOGS', 15,'OLD CONTROLFILE', 'UNKNOWN ERROR')

HXVER NUMBER        FORMATIndicates the format for the header block. The possible values are 6, 7, 8, or 0. 6  - indicates Oracle Version 67 - indicates Oracle Version 78 - indicates Oracle Version 80  - indicates the format could not be determined (for example, the header could not be read)

FHSWV NUMBER                 

FHCVN NUMBER                Compatibility Vsn

FHDBI NUMBER                 DBID

FHDBN VARCHAR2(9)            DB NAME

FHCSQ NUMBER        controlfile sequence number

FHFSZ NUMBER        BLOCKS, Current datafile size in blocks

FHBSZ NUMBER        datafile block size

FHFNO NUMBER        Tablespace datafile number

FHTYP NUMBER         Type:

1 control file

2 redo log file

3 vanilla db file; that is, normal data, index, and undo blocks

4 backup control file

5 backup piece

6 temporary db file

FHRDB NUMBER       Root dba: This field only occurs in data file #1, and is the location of blocks required during bootstrapping the data dictionary (bootstrap$)

FHCRS VARCHAR2(16)  CREATION_CHANGE#Datafile creation change#

FHCRT VARCHAR2(20)  CREATION_TIMEDatafile creation timestamp

FHRLC VARCHAR2(20)  RESETLOGS_TIME, Resetlogs timestamp

FHRLC_I NUMBER      reset logs count

FHRLS VARCHAR2(16)  RESETLOGS_CHANGE#, Resetlogs change#

FHPRC VARCHAR2(20)  prev reset logs timestamp

FHPRC_I NUMBER      prev reset logs count

FHPRS VARCHAR2(16)  prev reset logs SCN

FHBTI VARCHAR2(20)    Time the backup started, Updated when executing BEGIN BACKUP on the tablespace. RMAN does not update this field.

FHBSC VARCHAR2(16)   System change number when backup started, Updated when executing BEGIN BACKUP on the tablespace. RMAN does not update this field.

FHBTH NUMBER        Thread when when backup started, Updated when executing BEGIN BACKUP on the tablespace. RMAN does not update this field.

FHSTA NUMBER          The value for the column X$KCVFH.FHSTA (file header status) for an open database with an online datafiles in versions prior to version 10 were all 4, indicating an online fuzzy status.  With version 10 of Oracle the first system tablespace datafile will have a different status of 8196 if the datafile is online and the database is open and not in backup mode. In Oracle 10g, the X$KCVFH.FHSTA column will show 8196 for system data file if COMPATIBLE is set to 10.0.0.0 or higher.  The value of 8196 is a value of 0x04, as in previous releases, plus an AND'd value of 0x2000 (8192) for internal uses. If COMPATIBLE is set to 9.2.0 (lowest possible value for Oracle 10g), the FHSTA column for system datafile will have a value of 4.   In Oracle10g, the COMPATIBLE value is irreversible if advanced to a higher value. So the value of 8196 for the fhsta (status) column for the first system tablespace datafile is normal.

FHSCN VARCHAR2(16)    CHECKPOINT_CHANGE#, Datafile checkpoint change#, Updated on every checkpoint, but not when in Hot backup state (not online backups). This must remain untouched when you are in hot backup mode, because you might get checkpoints between the BEGIN BACKUP and when you actually start the copying process.

FHTIM VARCHAR2(20)     CHECKPOINT_TIME, Datafile checkpoint timestamp

FHTHR NUMBER          THREAD#

FHRBA_SEQ NUMBER     SEQUENCE,即Redo log sequence number

FHRBA_BNO NUMBER     Block number,即the redo log file block number

FHRBA_BOF NUMBER     Byte offsetthe byte offset into the block at which the redo record starts

FHETB RAW(132)         enable threads byte,这个我不确定,是猜的

FHCPC NUMBER         CHECKPOINT_COUNT, Datafile checkpoint count

FHRTS VARCHAR2(20)    Recoverd timestamp

FHCCC NUMBER        Controlfile Checkpoint Count: Saved copy of the control file record of the checkpoint count. Helps detect old control files.

FHBCP_SCN VARCHAR2(16)  Backup Checkpoint SCN: Updated with the checkpoint done while file in Hot backup

FHBCP_TIM VARCHAR2(20)  Backup Checkpoint TIME: Updated with the checkpoint done while file in Hot backup

FHBCP_THR NUMBER   Backup Checkpoint Thread: Updated with the checkpoint done while file in Hot backup

FHBCP_RBA_SEQ NUMBER  Backup Checkpoint Sequence, Redo log sequence number: Updated with the checkpoint done while file in Hot backup

FHBCP_RBA_BNO NUMBER  the redo log file block number, Updated with the checkpoint done while file in Hot backup

FHBCP_RBA_BOF NUMBER Byte offsetthe byte offset into the block at which the redo record starts, Updated with the checkpoint done while file in Hot backup

FHBCP_ETB RAW(132)     enable threads byte,这个我不确定,是猜的

FHBHZ NUMBER    begin hot backup file size

FHXCD RAW(16)    External cache id: Used to ensure that concurrent instances access data through consistent external cache

FHTSN NUMBER            TS#Tablespace number

FHTNM VARCHAR2(30)      TABLESPACE_NAME, Tablespace name

FHRFN NUMBER            RFILE#, Tablespace relative datafile number

FHAFS VARCHAR2(16)       absolute fuzzy scn, Minimum PITR SCN

FHRFS VARCHAR2(16)       The SCN at which the recovery of this file will be complete (no longer fuzzy). Both above fuzzy SCNs must be zero unless a fuzzy flag is set, and must be greater than the checkpoint SCN

FHRFT VARCHAR2(20)      The time at which the recovery of this file will be complete (no longer fuzzy).

HXIFZ NUMBER            File is fuzzy (YES | NO)decode(hxifz, 0,'NO', 1,'YES', NULL)

HXNRCV NUMBER         File needs media recovery (YES | NO)decode(hxnrcv, 0,'NO', 1,'YES', NULL)

HXFNM VARCHAR2(513)    NAME, Datafile name

FHPOFB NUMBER

FHPNFB NUMBER

FHPRE10 NUMBER

FHFIRSTUNRECSCN VARCHAR2(16)  UNRECOVERABLE_CHANGE#, Last unrecoverable change number made to this datafile. If the database is in ARCHIVELOG mode, then this column is updated when an unrecoverable operation completes. If the database is not in ARCHIVELOG mode, this column does not get updated.

FHFIRSTUNRECTIME VARCHAR2(20)   UNRECOVERABLE_TIME, Timestamp of the last unrecoverable change. This column is updated only if the database is in ARCHIVELOG mode.

HXLMDBA NUMBER        SPACE_HEADER, The amount of space currently being used and the amount that is free, as identified in the space header. decode(hxlmdba, 0, NULL, hxlmdba)

HXLMLD_SCN VARCHAR2(16)  LAST_DEALLOC_SCN, Last deallocated SCN

 

现在我们来看一个实际的例子:

我们现在把DATA FILE #1x$kcvfh中的内容显示出来,如下所示:

SQL> exec p_sys_print_x_kcvfh;

ADDR:00000001104FA580

INDX:0

INST_ID:1

HXFIL:1

HXONS:1

HXSTS:281474976710655

HXERR:0

HXVER:0

FHSWV:0

FHCVN:169869568

FHDBI:1351724723

FHDBN:IPRATEST

FHCSQ:5895

FHFSZ:61440

FHBSZ:8192

FHFNO:1

FHTYP:3

FHRDB:4194681

FHCRS:8

FHCRT:07/22/2005 00:42:44

FHRLC:12/02/2008 15:09:41

FHRLC_I:672419381

FHRLS:551299

FHPRC:07/22/2005 00:42:25

FHPRC_I:564280945

FHPRS:1

FHBTI:

FHBSC:0

FHBTH:0

FHSTA:8196

FHSCN:39033396980

FHTIM:05/26/2009 15:46:18

FHTHR:1

FHRBA_SEQ:71

FHRBA_BNO:2

FHRBA_BOF:16

FHETB:02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

FHCPC:189

FHRTS:12/02/2008 15:09:27

FHCCC:188

FHBCP_SCN:0

FHBCP_TIM:

FHBCP_THR:0

FHBCP_RBA_SEQ:0

FHBCP_RBA_BNO:0

FHBCP_RBA_BOF:0

FHBCP_ETB:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

FHBHZ:0

FHXCD:00000000000000000000000000000000

FHTSN:0

FHTNM:SYSTEM

FHRFN:1

FHAFS:0

FHRFS:

FHRFT:

HXIFZ:1

HXNRCV:0

HXFNM:/iprat02/ipratest/system01.dbf

FHPOFB:10

FHPNFB:10

FHPRE10:0

FHFIRSTUNRECSCN:0

FHFIRSTUNRECTIME:

HXLMDBA:4194306

HXLMLD_SCN:0

 

PL/SQL procedure successfully completed

 

再把DATA FILE #1的文件头给dump出来,如下所示:

DATA FILE #1:

  (name #7) /iprat02/ipratest/system01.dbf

creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1

 tablespace 0, index=1 krfil=1 prev_file=0

 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00

 Checkpoint cnt:189 scn: 0x0009.16925ef4 05/26/2009 15:46:18

 Stop scn: 0xffff.ffffffff 05/22/2009 22:10:41

 Creation Checkpointed at scn:  0x0000.00000008 07/22/2005 00:42:44

 thread:0 rba:(0x0.0.0)

 enabled  threads:  00000000 00000000 00000000 00000000 00000000 00000000

  ......省略显示部分内容

 Offline scn: 0x0000.00086982 prev_range: 0

 Online Checkpointed at scn:  0x0000.00086983 12/02/2008 15:09:41

 thread:1 rba:(0x1.2.0)

 enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000

    ......省略显示部分内容

 Hot Backup end marker scn: 0x0000.00000000

 aux_file is NOT DEFINED

 V10 STYLE FILE HEADER:

       Compatibility Vsn = 169869568=0xa200100

       Db ID=1351724723=0x5091aeb3, Db Name='IPRATEST'

       Activation ID=0=0x0

       Control Seq=5895=0x1707, File size=61440=0xf000

       File Number=1, Blksiz=8192, File Type=3 DATA

Tablespace #0 - SYSTEM  rel_fn:1

Creation   at   scn: 0x0000.00000008 07/22/2005 00:42:44

Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0

 reset logs count:0x28144e35 scn: 0x0000.00086983 reset logs terminal rcv data:0x0 scn: 0x0000.00000000

 prev reset logs count:0x21a23e71 scn: 0x0000.00000001 prev reset logs terminal rcv data:0x0 scn: 0x0000.00000000

 recovered at 12/02/2008 15:09:27

 status:0x2004 root dba:0x00400179 chkpt cnt: 189 ctl cnt:188

begin-hot-backup file size: 0

Checkpointed at scn:  0x0009.16925ef4 05/26/2009 15:46:18

 thread:1 rba:(0x47.2.10)

 enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000

 ......省略显示部分内容

Backup Checkpointed at scn:  0x0000.00000000

 thread:0 rba:(0x0.0.0)

 enabled  threads:  00000000 00000000 00000000 00000000 00000000 00000000

  ......省略显示部分内容

External cache id: 0x0 0x0 0x0 0x0

Absolute fuzzy scn: 0x0000.00000000

Recovery fuzzy scn: 0x0000.00000000 01/01/1988 00:00:00

Terminal Recovery Stamp  01/01/1988 00:00:00

Platform Information:     Creation Platform ID: 6

Current Platform ID: 6    Last Platform ID: 6

 

两边一对比,以前一些怎么也猜不出来含义的字段的含义就很清晰了。

有兴趣的朋友可以根据我这篇文章里的内容自己尝试解析出DATA FILE #1x$kcvfh的那条记录里每一个column的值的含义。

如何看执行计划的执行顺序

| 6 Comments

有同事问我如何看执行计划的执行顺序。这个问题我想很多朋友都会不屑一顾的,这么简单的问题,谁不会看

但是这里我还是想说一说我是怎样看执行计划的执行顺序的。

 

我看执行计划的执行顺序的原则就是先从最开头一直往右看,直到看到最右边的并列的地方,对于不并列的,靠右的先执行;如果见到并列的,就从上往下看,对于并列的,靠上的先执行。

 

好了,我们以上述原则来看一个实例:

SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 5 21 13:09:27 2009

 

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

 

SQL> conn ipra/acca@ipradev;

已连接。

 

SQL> select count(*) from (select o.oatfna,o.oatprf,o.oatfrm,o.oattkt,o.oatcpn,o.oatpst,substr(u.ute

dsp,1,5) as errnum,o.oatcdt,o.oatcid from owbatn o,uplter u where (o.oatcer='Y' and o.oatcpn='0' and

 u.utetkt=o.oattkt and u.rowid= (select max(rowid) from uplter where utetkt = o.oattkt  and utefna=o

.oatfna)) or o.oatpst='D' or o.oatpst='I' or o.oatpst='F');

 

  COUNT(*)

----------

     17809

 

SQL> select * from table(dbms_xplan.display_cursor);

 

PLAN_TABLE_OUTPUT

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

SQL_ID  01nxqdvn71mx5, child number 0

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

select count(*) from (select o.oatfna,o.oatprf,o.oatfrm,o.oattkt,o.oatcpn,o.oatpst,substr(u.u

tedsp,1,5) as errnum,o.oatcdt,o.oatcid from owbatn o,uplter u where (o.oatcer='Y' and

o.oatcpn='0' and u.utetkt=o.oattkt and u.rowid= (select max(rowid) from uplter where utetkt

= o.oattkt  and utefna=o.oatfna)) or o.oatpst='D' or o.oatpst='I' or o.oatpst='F')

 

Plan hash value: 2105702960

 

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

| Id  | Operation                       | Name              | Rows  | Bytes | Cost (%CPU)| Time     |

 

PLAN_TABLE_OUTPUT

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

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

|   0 | SELECT STATEMENT                |                   |       |       |  3082 (100)|          |

|   1 |  SORT AGGREGATE                 |                   |     1 |    54 |            |          |

|   2 |   CONCATENATION                 |                   |       |       |            |          |

|   3 |    MERGE JOIN CARTESIAN         |                   |   470K|    24M|  1969   (4)| 00:00:24 |

|*  4 |     TABLE ACCESS FULL           | OWBATN            |     1 |    34 |   851   (5)| 00:00:11 |

|   5 |     BUFFER SORT                 |                   |   316K|  6175K|  1118   (3)| 00:00:14 |

|   6 |      TABLE ACCESS FULL          | UPLTER            |   316K|  6175K|  1118   (3)| 00:00:14 |

|*  7 |    FILTER                       |                   |       |       |            |          |

|*  8 |     HASH JOIN                   |                   | 37522 |  1978K|  1109   (6)| 00:00:14 |

|*  9 |      TABLE ACCESS FULL          | OWBATN            | 20956 |   695K|   852   (5)| 00:00:11 |

|  10 |      INDEX FAST FULL SCAN       | IDX_UPLTER_UTETKT |   316K|  6175K|   246   (6)| 00:00:03 |

|  11 |     SORT AGGREGATE              |                   |     1 |    38 |            |          |

|* 12 |      TABLE ACCESS BY INDEX ROWID| UPLTER            |     1 |    38 |     4   (0)| 00:00:01 |

|* 13 |       INDEX RANGE SCAN          | IDX_UPLTER_UTETKT |     2 |       |     3   (0)| 00:00:01 |

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

 

Predicate Information (identified by operation id):

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

 

   4 - filter(("O"."OATPST"='D' OR "O"."OATPST"='F' OR "O"."OATPST"='I'))

   7 - filter("U".ROWID=)

 

PLAN_TABLE_OUTPUT

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

   8 - access("U"."UTETKT"="O"."OATTKT")

   9 - filter(("O"."OATCPN"=0 AND "O"."OATCER"='Y' AND LNNVL("O"."OATPST"='I') AND

              LNNVL("O"."OATPST"='F') AND LNNVL("O"."OATPST"='D')))

  12 - filter("UTEFNA"=:B1)

  13 - access("UTETKT"=:B1)

 

 

已选择39行。

 

好了,我们现在根据上述原则来解析一下上述执行计划的执行顺序。

先从最开头一直往右看,直到看到最右边的并列的地方,对于不并列的,靠右的先执行:

从上述执行计划的开头一直往右看,直到找到最右边并列的。也就是从SELECT STATEMENT开始往右找,一直找到TABLE ACCESS FULL,这时候发现BUFFER SORT和它并列。

此时我们已经可以知道TABLE ACCESS FULL一定是比BUFFER SORT(包括其右边的所有语句)先执行,因为对于并列的,靠上的先执行

而对于BUFFER SORT,它右边又有"TABLE ACCESS FULL          | UPLTER",此时根据上述原则我们也可以知道,它比BUFFER SORT先执行。

这样对于上述执行计划里的这三条语句:

|*  4 |     TABLE ACCESS FULL           | OWBATN            |     1 |    34 |   851   (5)| 00:00:11 |

|   5 |     BUFFER SORT                 |                   |   316K|  6175K|  1118   (3)| 00:00:14 |

|   6 |      TABLE ACCESS FULL          | UPLTER            |   316K|  6175K|  1118   (3)| 00:00:14 |

正确的执行顺序是:

先执行TABLE ACCESS FULL           | OWBATN            |     1 |    34 |   851   (5)| 00:00:11 |

再执行TABLE ACCESS FULL          | UPLTER            |   316K|  6175K|  1118   (3)| 00:00:14 |

最后执行BUFFER SORT                 |                   |   316K|  6175K|  1118   (3)| 00:00:14 |

 

这样我们就解析出来了最内层上述三条语句的执行顺序,然后我们再应用上述原则解析其外层语句,一层一层剥离,就很容易得到了整个执行计划的顺序,这里我把按照上述原则解析出来的执行计划的顺序paste出来,如下所示:

第一步:TABLE ACCESS FULL           | OWBATN            |     1 |    34 |   851   (5)| 00:00:11 |

第二步:TABLE ACCESS FULL          | UPLTER            |   316K|  6175K|  1118   (3)| 00:00:14 |

第三步:BUFFER SORT                 |                   |   316K|  6175K|  1118   (3)| 00:00:14 |

第四步:MERGE JOIN CARTESIAN         |                   |   470K|    24M|  1969   (4)| 00:00:24 |

第五步:TABLE ACCESS FULL          | OWBATN            | 20956 |   695K|   852   (5)| 00:00:11 |

第六步:INDEX FAST FULL SCAN       | IDX_UPLTER_UTETKT |   316K|  6175K|   246   (6)| 00:00:03 |

第七步:HASH JOIN                   |                   | 37522 |  1978K|  1109   (6)| 00:00:14 |

第八步:INDEX RANGE SCAN          | IDX_UPLTER_UTETKT |     2 |       |     3   (0)| 00:00:01 |

第九步:TABLE ACCESS BY INDEX ROWID| UPLTER            |     1 |    38 |     4   (0)| 00:00:01 |

第十步:SORT AGGREGATE              |                   |     1 |    38 |            |          |

第十一步:FILTER                       |                   |       |       |            |          |

第十二步:CONCATENATION                 |                   |       |       |            |          |

第十三步:SORT AGGREGATE                 |                   |     1 |    54 |            |          |

第十四步:SELECT STATEMENT                |                   |       |       |  3082 (100)|          |

 

如果把握了上述原则,则无论多复杂的执行计划也能知道其正确的执行顺序。

 

这里给还不知道怎样看执行计划顺序的朋友留一个作业,请应用上述原则,正确解析出下述执行计划的执行顺序:

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                |  Name                       | Rows  | Bytes | Cost  | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |                             |     1 |   220 | 17191 |       |       |
|   1 |  NESTED LOOPS                            |                             |     1 |   220 | 17191 |       |       |
|   2 |   NESTED LOOPS                           |                             |     1 |   199 | 17189 |       |       |
|   3 |    NESTED LOOPS                          |                             |     1 |   169 | 17187 |       |       |
|   4 |     NESTED LOOPS                         |                             |     1 |   155 | 17186 |       |       |
|*  5 |      HASH JOIN SEMI                      |                             |     1 |   116 | 17184 |       |       |
|   6 |       NESTED LOOPS                       |                             |   411 | 42333 | 17017 |       |       |
|   7 |        MERGE JOIN                        |                             |   411 | 27126 | 16195 |       |       |
|   8 |         PARTITION RANGE ALL              |                             |       |       |       |     1 |    14 |
|*  9 |          TABLE ACCESS FULL               | SERV_ACCT                   |  8667K|   223M| 16177 |     1 |    14 |
|* 10 |         SORT JOIN                        |                             |     1 |    39 |    18 |       |       |
|  11 |          TABLE ACCESS BY INDEX ROWID     | SYS_DOMAIN                  |     1 |    39 |     2 |       |       |
|* 12 |           INDEX RANGE SCAN               | IDX_SYS_DOMAIN_1            |     1 |       |     1 |       |       |
|  13 |        PARTITION RANGE ITERATOR          |                             |       |       |       |   KEY |   KEY |
|* 14 |         TABLE ACCESS BY LOCAL INDEX ROWID| SERV                        |     1 |    37 |     2 |   KEY |   KEY |
|* 15 |          INDEX UNIQUE SCAN               | PK_SERV                     |     1 |       |     1 |   KEY |   KEY |
|  16 |       VIEW                               | VW_NSO_1                    |  4977 | 64701 |   166 |       |       |
|  17 |        TABLE ACCESS BY LOCAL INDEX ROWID | SERV_ATTR                   |  1991 | 37829 |    53 |     1 |     1 |
|  18 |         NESTED LOOPS                     |                             |  4977 |   136K|   166 |       |       |
|* 19 |          TABLE ACCESS FULL               | A_QUERY_ACCT_ATTR           |     3 |    27 |     7 |       |       |
|  20 |          PARTITION RANGE ALL             |                             |       |       |       |     1 |    14 |
|* 21 |           INDEX RANGE SCAN               | IDX_SERV_ATTR_INTERNET_NEW  |  1991 |       |    42 |     1 |    14 |
|  22 |      TABLE ACCESS BY INDEX ROWID         | SYS_DOMAIN                  |     1 |    39 |     2 |       |       |
|* 23 |       INDEX RANGE SCAN                   | IDX_SYS_DOMAIN_1            |     1 |       |     1 |       |       |
|  24 |     TABLE ACCESS BY INDEX ROWID          | PRODUCT                     |     1 |    14 |     1 |       |       |
|* 25 |      INDEX UNIQUE SCAN                   | PK_PRODUCT                  |     1 |       |       |       |       |
|* 26 |    TABLE ACCESS BY GLOBAL INDEX ROWID    | ACCT                        |     1 |    30 |     2 | ROWID | ROW L |
|* 27 |     INDEX UNIQUE SCAN                    | PK_ACCT                     |     1 |       |     1 |       |       |
|  28 |   TABLE ACCESS BY GLOBAL INDEX ROWID     | CUST                        |     1 |    21 |     2 | ROWID | ROW L |
|* 29 |    INDEX UNIQUE SCAN                     | PK_CUST                     |     1 |       |     1 |       |       |
------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   5 - access("A"."SERV_ID"="VW_NSO_1″."SERV_ID")
   9 - filter("B"."STATE"='10A')
  10 - access("B"."STATE"="SYS_DOMAIN"."DOMAIN")
       filter("B"."STATE"="SYS_DOMAIN"."DOMAIN")
  12 - access("SYS_DOMAIN"."TABLE_NAME"='SERV_ACCT' AND "SYS_DOMAIN"."FIELD_NAME"='STATE' AND
              "SYS_DOMAIN"."DOMAIN"='10A')
  14 - filter("A"."STATE"='2HA' OR "A"."STATE"='2HC' OR "A"."STATE"='2HD' OR "A"."STATE"='2HE' OR "A"."STATE"='2HH' OR
              "A"."STATE"='2HN' OR "A"."STATE"='2HS')
  15 - access("A"."SERV_ID"="B"."SERV_ID")
  19 - filter("A_QUERY_ACCT_ATTR"."STATE"='A0A' AND "A_QUERY_ACCT_ATTR"."ATTR_TYPE"='ACT')
  21 - access("SERV_ATTR"."ATTR_VAL"='0xx833xxxxx' AND "SERV_ATTR"."ATTR_ID"="A_QUERY_ACCT_ATTR"."ATTR_ID")
  23 - access("SYS_ALIAS_0000″."TABLE_NAME"='SERV' AND "SYS_ALIAS_0000″."FIELD_NAME"='STATE' AND
              "A"."STATE"="SYS_ALIAS_0000″."DOMAIN")
       filter("SYS_ALIAS_0000″."DOMAIN"='2HA' OR "SYS_ALIAS_0000″."DOMAIN"='2HC' OR "SYS_ALIAS_0000″."DOMAIN"='2HD' OR
              "SYS_ALIAS_0000″."DOMAIN"='2HE' OR "SYS_ALIAS_0000″."DOMAIN"='2HH' OR "SYS_ALIAS_0000″."DOMAIN"='2HN' OR
              "SYS_ALIAS_0000″."DOMAIN"='2HS')
  25 - access("A"."PRODUCT_ID"="H"."PRODUCT_ID")
  26 - filter("C"."STATE"='10A')
  27 - access("B"."ACCT_ID"="C"."ACCT_ID")
  29 - access("A"."CUST_ID"="D"."CUST_ID")

 

关于10g中的X$KCVFH

| No Comments

有朋友问我X$KCVFH的详细结构,我找遍了也没有发现任何关于X$KCVFH的现成的资料。只好自己动手来分析一下。

The fixed X$ tables are no real tables; you will not find them in any database schema.

These virtual tables provide a SQL interface to Oracle memory structures; that is, you

can retrieve (real-time) information from memory structures using SQL queries.

X$表在oracle的不同版本里很可能是不一样的,这里是以 10.2.0.1为例来研究一下X$KCVFH的结构,X$KCVFH中各个字段的含义大多数都有据可寻,下文中凡是为空白的地方就代表我也不清楚其含义是什么。

 

10gX$KCVFH的结构:

Version 10

Column Name Data Type          Description

ADDR RAW(4)                    ADDRESS

INDX NUMBER                   INDEX

INST_ID NUMBER                INSTANCE ID

HXFIL NUMBER                  FILE#Datafile number (from control file)

HXONS NUMBER                 ONLINE | OFFLINE (from control file),HXONS 0表示 'OFFLINE',为其他值表示 'ONLINE'

HXSTS VARCHAR2(16)            

HXERR NUMBER        ERRORdecode(HXERR, 0, NULL, 1,'FILE MISSING',2,'OFFLINE NORMAL', 3,'NOT VERIFIED', 4,'FILE NOT FOUND',5,'CANNOT OPEN FILE', 6,'CANNOT READ HEADER', 7,'CORRUPT HEADER',8,'WRONG FILE TYPE', 9,'WRONG DATABASE', 10,'WRONG FILE NUMBER',11,'WRONG FILE CREATE', 12,'WRONG FILE CREATE', 16,'DELAYED OPEN',14, 'WRONG RESETLOGS', 15,'OLD CONTROLFILE', 'UNKNOWN ERROR')

HXVER NUMBER        FORMATIndicates the format for the header block. The possible values are 6, 7, 8, or 0. 6  - indicates Oracle Version 67 - indicates Oracle Version 78 - indicates Oracle Version 80  - indicates the format could not be determined (for example, the header could not be read)

FHSWV NUMBER                 

FHCVN NUMBER

FHDBI NUMBER                 DBID

FHDBN VARCHAR2(9)            DB NAME

FHCSQ NUMBER        controlfile sequence number

FHFSZ NUMBER        BLOCKS, Current datafile size in blocks

FHBSZ NUMBER        datafile block size

FHFNO NUMBER        Tablespace datafile number

FHTYP NUMBER         Type

FHRDB NUMBER

FHCRS VARCHAR2(16)  CREATION_CHANGE#Datafile creation change#

FHCRT VARCHAR2(20)  CREATION_TIMEDatafile creation timestamp

FHRLC VARCHAR2(20)  RESETLOGS_TIME, Resetlogs timestamp

FHRLC_I NUMBER

FHRLS VARCHAR2(16)  RESETLOGS_CHANGE#, Resetlogs change#

FHPRC VARCHAR2(20)  

FHPRC_I NUMBER

FHPRS VARCHAR2(16)

FHBTI VARCHAR2(20)    Time the backup started

FHBSC VARCHAR2(16)   System change number when backup started

FHBTH NUMBER

FHSTA NUMBER          The value for the column X$KCVFH.FHSTA (file header status) for an open database with an online datafiles in versions prior to version 10 were all 4, indicating an online fuzzy status.  With version 10 of Oracle the first system tablespace datafile will have a different status of 8196 if the datafile is online and the database is open and not in backup mode. In Oracle 10g, the X$KCVFH.FHSTA column will show 8196 for system data file if COMPATIBLE is set to 10.0.0.0 or higher.  The value of 8196 is a value of 0x04, as in previous releases, plus an AND'd value of 0x2000 (8192) for internal uses. If COMPATIBLE is set to 9.2.0 (lowest possible value for Oracle 10g), the FHSTA column for system datafile will have a value of 4.   In Oracle10g, the COMPATIBLE value is irreversible if advanced to a higher value. So the value of 8196 for the fhsta (status) column for the first system tablespace datafile is normal.

FHSCN VARCHAR2(16)    CHECKPOINT_CHANGE#, Datafile checkpoint change#

FHTIM VARCHAR2(20)     CHECKPOINT_TIME, Datafile checkpoint timestamp

FHTHR NUMBER          THREAD#

FHRBA_SEQ NUMBER     SEQUENCE,即Redo log sequence number

FHRBA_BNO NUMBER

FHRBA_BOF NUMBER

FHETB RAW(132)

FHCPC NUMBER         CHECKPOINT_COUNT, Datafile checkpoint count

FHRTS VARCHAR2(20)

FHCCC NUMBER

FHBCP_SCN VARCHAR2(16)

FHBCP_TIM VARCHAR2(20)

FHBCP_THR NUMBER

FHBCP_RBA_SEQ NUMBER

FHBCP_RBA_BNO NUMBER

FHBCP_RBA_BOF NUMBER

FHBCP_ETB RAW(132)

FHBHZ NUMBER

FHXCD RAW(16)

FHTSN NUMBER            TS#Tablespace number

FHTNM VARCHAR2(30)      TABLESPACE_NAME, Tablespace name

FHRFN NUMBER            RFILE#, Tablespace relative datafile number

FHAFS VARCHAR2(16)       absolute fuzzy scn, Minimum PITR SCN

FHRFS VARCHAR2(16)

FHRFT VARCHAR2(20)

HXIFZ NUMBER            File is fuzzy (YES | NO)decode(hxifz, 0,'NO', 1,'YES', NULL)

HXNRCV NUMBER         File needs media recovery (YES | NO)decode(hxnrcv, 0,'NO', 1,'YES', NULL)

HXFNM VARCHAR2(513)    NAME, Datafile name

FHPOFB NUMBER

FHPNFB NUMBER

FHPRE10 NUMBER

FHFIRSTUNRECSCN VARCHAR2(16)  UNRECOVERABLE_CHANGE#, Last unrecoverable change number made to this datafile. If the database is in ARCHIVELOG mode, then this column is updated when an unrecoverable operation completes. If the database is not in ARCHIVELOG mode, this column does not get updated.

FHFIRSTUNRECTIME VARCHAR2(20)   UNRECOVERABLE_TIME, Timestamp of the last unrecoverable change. This column is updated only if the database is in ARCHIVELOG mode.

HXLMDBA NUMBER        SPACE_HEADER, The amount of space currently being used and the amount that is free, as identified in the space header. decode(hxlmdba, 0, NULL, hxlmdba)

HXLMLD_SCN VARCHAR2(16)  LAST_DEALLOC_SCN, Last deallocated SCN

 

我们现在来看一下X$KCVFH的常见用法:

1、判断datafile是否需要recover,如果需要recover,那么需要至少需要recover到什么SCN:

即执行如下查询:

SQL> select max(fhafs) from x$kcvfh;

 

MAX(FHAFS)

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

0

如果返回返回结果大于0,则表示数据库处于不一致的状态,需要recover到上述查询结果中的SCN

 

2、判断datafilerecover需要的archive logsequence是多少,也就是说做recover到这个sequence,那么control filedatafile header中的记录就一致了。

即执行如下查询:

SQL> select HXFIL File_num,substr(HXFNM,1,40) File_name, FHSCN SCN, FHRBA_SEQ Sequence from X$KCVFH;

......显示结果省略

人为构造system回滚段错误一例

| No Comments

这个例子是我在了解undo block的结构的时候顺便做的一个例子。

在这个例子里,我通过手工修改ktuxcfbp[0]. kubadba,人为构造出来了ORA-600 [4193]错误

 

如下是整个构造过程:

SQL> conn dras/astca@astcatest;

Connected to Oracle9i Enterprise Edition Release 9.2.0.6.0

Connected as dras

 

SQL> select HEADER_FILE,HEADER_BLOCK from dba_segments where segment_name='SYSTEM';

 

HEADER_FILE HEADER_BLOCK

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

          1            9

 

我们现在dump 1-9这个blockdump出来的内容如下:

Start dump data blocks tsn: 0 file#: 1 minblk 9 maxblk 9

buffer tsn: 0 rdba: 0x00400009 (1/9)

scn: 0x0008.a9f7d8fc seq: 0x01 flg: 0x04 tail: 0xd8fc0e01

frmt: 0x02 chkval: 0x6cf3 type: 0x0e=KTU UNDO HEADER W/UNLIMITED EXTENTS

  Extent Control Header

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

  Extent Header:: spare1: 0      spare2: 0      #extents: 6      #blocks: 47   

                  last map  0x00000000  #maps: 0      offset: 4128 

      Highwater::  0x004001a0  ext#: 5      blk#: 7      ext size: 8    

  #blocks in seg. hdr's freelists: 0     

  #blocks below: 0    

  mapblk  0x00000000  offset: 5    

                   Unlocked

     Map Header:: next  0x00000000  #extents: 6    obj#: 0      flag: 0x40000000

  Extent Map

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

   0x0040000a  length: 7    

   0x00400011  length: 8    

   0x00400181  length: 8    

   0x00400189  length: 8    

   0x00400191  length: 8    

   0x00400199  length: 8    

 

  TRN CTL:: seq: 0x0035 chd: 0x0060 ctl: 0x0002 inc: 0x00000000 nfb: 0x0001

            mgc: 0x8002 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)

            uba: 0x004001a0.0035.15 scn: 0x0008.a9e6062f

Version: 0x01

  FREE BLOCK POOL::

    uba: 0x004001a0.0035.15 ext: 0x5  spc: 0xccc  

    uba: 0x00000000.0032.07 ext: 0x2  spc: 0x1d08 

    uba: 0x00000000.0030.3e ext: 0x0  spc: 0x476  

    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0    

    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0    

  TRN TBL::

  ......后续内容省略

 

我们现在把上述free block pool中的0x004001a0改成0x004001a1

shutdown上述数据库,然后就可以动手改了:

$ bbed parfile=par.bbd

Password:

 

BBED: Release 2.0.0.0.0 - Limited Production on Wed May 6 15:40:46 2009

 

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

 

************* !!! For Oracle Internal Use only !!! ***************

 

BBED> set file 1

        FILE#           1

 

BBED> set block 9

        BLOCK#          9

 

BBED> p ktuxc

struct ktuxc, 104 bytes                     @4148   

   struct ktuxcscn, 8 bytes                 @4148   

      ub4 kscnbas                           @4148     0xa9e60631

      ub2 kscnwrp                           @4152     0x0008

   struct ktuxcuba, 8 bytes                 @4156   

      ub4 kubadba                           @4156     0x004001a0

      ub2 kubaseq                           @4160     0x0035

      ub1 kubarec                           @4162     0x16

   sb2 ktuxcflg                             @4164     1 (KTUXCFSK)

   ub2 ktuxcseq                             @4166     0x0035

   sb2 ktuxcnfb                             @4168     1

   ub4 ktuxcinc                             @4172     0x00000000

   sb2 ktuxcchd                             @4176     81

   sb2 ktuxcctl                             @4178     96

   ub2 ktuxcmgc                             @4180     0x8002

   ub4 ktuxcopt                             @4188     0x7ffffffe

   struct ktuxcfbp[0], 12 bytes             @4192   

      struct ktufbuba, 8 bytes              @4192   

         ub4 kubadba                        @4192     0x004001a0

         ub2 kubaseq                        @4196     0x0035

         ub1 kubarec                        @4198     0x1f

      sb2 ktufbext                          @4200     5

      sb2 ktufbspc                          @4202     1296

   struct ktuxcfbp[1], 12 bytes             @4204   

      struct ktufbuba, 8 bytes              @4204   

         ub4 kubadba                        @4204     0x00000000

         ub2 kubaseq                        @4208     0x0032

         ub1 kubarec                        @4210     0x07

      sb2 ktufbext                          @4212     2

      sb2 ktufbspc                          @4214     7432

   struct ktuxcfbp[2], 12 bytes             @4216   

      struct ktufbuba, 8 bytes              @4216   

         ub4 kubadba                        @4216     0x00000000

         ub2 kubaseq                        @4220     0x0030

         ub1 kubarec                        @4222     0x3e

      sb2 ktufbext                          @4224     0

      sb2 ktufbspc                          @4226     1142

   struct ktuxcfbp[3], 12 bytes             @4228   

      struct ktufbuba, 8 bytes              @4228   

         ub4 kubadba                        @4228     0x00000000

         ub2 kubaseq                        @4232     0x0000

         ub1 kubarec                        @4234     0x00

      sb2 ktufbext                          @4236     0

      sb2 ktufbspc                          @4238     0

   struct ktuxcfbp[4], 12 bytes             @4240    

      struct ktufbuba, 8 bytes              @4240   

         ub4 kubadba                        @4240     0x00000000

         ub2 kubaseq                        @4244     0x0000

         ub1 kubarec                        @4246     0x00

      sb2 ktufbext                          @4248     0

      sb2 ktufbspc                          @4250     0

 

BBED> set offset 4192

        OFFSET          4192

 

BBED> dump

 File: /dras11/oradata/astca/system01.dbf (1)

 Block: 9                Offsets: 4192 to 4703           Dba:0x00400009

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

 004001a0 00351f00 00050510 00000000 00320700 00021d08 00000000 00303e00

 00000476 00000000 00000000 00000000 00000000 00000000 00000000 0000002d

 0040019e a9e7d39a 00085e38 0900001a 00000000 00000000 00000000 00000001

 00000000 0000002d 0040019d a9e7d38a 00085e38 09000005 00000000 00000000

 00000000 00000001 00000000 0000002e 004001a0 a9f7d8fc 00085e38 09000060

 00000000 00000000 00000000 00000001 00000000 0000002d 0040019e a9f46b87

 00085e38 09000012 00000000 00000000 00000000 00000001 00000000 0000002d

 0040019e a9f46b7d 00085e38 09000023 00000000 00000000 00000000 00000001

 00000000 0000002d 0040019d a9e7d38b 00085e38 0900000a 00000000 00000000

 00000000 00000001 00000000 0000002d 0040019d a9e60649 00085e38 09000055

 00000000 00000000 00000000 00000001 00000000 0000002d 0040019f a9f7d754

 00085e38 09000032 00000000 00000000 00000000 00000001 00000000 0000002d

 0040019d a9e7d396 00085e38 09000015 00000000 00000000 00000000 00000001

 00000000 0000002d 0040019d a9e7d387 00085e38 0900005a 00000000 00000000

 00000000 00000001 00000000 0000002d 0040019d a9e7d38c 00085e38 0900004f

 00000000 00000000 00000000 00000001 00000000 0000002d 0040019e a9f46b75

 

 <32 bytes per line>

 

BBED> modify /x 004001a1

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

 File: /dras11/oradata/astca/system01.dbf (1)

 Block: 9                Offsets: 4192 to 4703           Dba:0x00400009

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

 004001a1 00351f00 00050510 00000000 00320700 00021d08 00000000 00303e00

 00000476 00000000 00000000 00000000 00000000 00000000 00000000 0000002d

 0040019e a9e7d39a 00085e38 0900001a 00000000 00000000 00000000 00000001

 00000000 0000002d 0040019d a9e7d38a 00085e38 09000005 00000000 00000000

 00000000 00000001 00000000 0000002e 004001a0 a9f7d8fc 00085e38 09000060

 00000000 00000000 00000000 00000001 00000000 0000002d 0040019e a9f46b87

 00085e38 09000012 00000000 00000000 00000000 00000001 00000000 0000002d

 0040019e a9f46b7d 00085e38 09000023 00000000 00000000 00000000 00000001

 00000000 0000002d 0040019d a9e7d38b 00085e38 0900000a 00000000 00000000

 00000000 00000001 00000000 0000002d 0040019d a9e60649 00085e38 09000055

 00000000 00000000 00000000 00000001 00000000 0000002d 0040019f a9f7d754

 00085e38 09000032 00000000 00000000 00000000 00000001 00000000 0000002d

 0040019d a9e7d396 00085e38 09000015 00000000 00000000 00000000 00000001

 00000000 0000002d 0040019d a9e7d387 00085e38 0900005a 00000000 00000000

 00000000 00000001 00000000 0000002d 0040019d a9e7d38c 00085e38 0900004f

 00000000 00000000 00000000 00000001 00000000 0000002d 0040019e a9f46b75

 

 <32 bytes per line>

 

BBED> sum apply

Check value for File 1, Block 9:

current = 0x758c, required = 0x758c

 

好了,我们已经改完了,现在我们startup上述数据库,来看一下改动后的效果:

$ sqlplus '/ as sysdba';

 

SQL*Plus: Release 9.2.0.6.0 - Production on Wed May 6 15:46:59 2009

 

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

 

Connected to an idle instance.

 

 

SQL_astca>startup

ORACLE instance started.

 

Total System Global Area  824150304 bytes

Fixed Size                   743712 bytes

Variable Size             285212672 bytes

Database Buffers          536870912 bytes

Redo Buffers                1323008 bytes

Database mounted.

ORA-01092: ORACLE instance terminated. Disconnection forced

 

可以看到,上述数据库现在已经起不来了,我们现在去alert log里看一下具体的错误原因:

$ tail -n 10 alert_astca.log

  Mem# 1 errs 0: /dras11/oradata/astca/redo03b.log

Wed May  6 15:47:07 2009

Errors in file /cadrasu01/app/oracle/admin/astca/udump/astca_ora_8933512.trc:

ORA-00604: error occurred at recursive SQL level 1

ORA-00607: Internal error occurred while making a change to a data block

ORA-00600: internal error code, arguments: [4193], [46], [53], [], [], [], [], []

Error 604 happened during db open, shutting down database

USER: terminating instance due to error 604

Instance terminated by USER, pid = 8933512

ORA-1092 signalled during: ALTER DATABASE OPEN...

 

可以看到,我们已经达到了目的,成功构造出了ORA-600 [4193]错误

人为制造数据不一致一例

| 1 Comment

有朋友问我,怎样才能制造出数据不一致的效果,比如要达到如下目的:

SQL> select object_name,object_id from testdrop2 where object_id=21886;

 

OBJECT_NAME                                      OBJECT_ID

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

java/util/jar/JarOutputStream                              19083

这里明明我where条件中指定的object_id21886,但是实际上select出来后object_id却变成了19083

 

在这篇文章里,我们人为构造了上述不一致的情况,这并没有太大的实际意义,只是这篇文章里提到的方法可以作为解决ORA-08102错误的一种手段。

463479.1里提到:

An ORA-08102 indicates that there is a mismatch between the key(s) stored in the index and the values stored in the table. What typically happens is the index is built and at some future time, some type of corruption occurs, either in the table or index, to cause the mismatch.

 

好了,我们来看我如何构造上述例子:

SQL> conn dras/astca@astcatest;

Connected to Oracle9i Enterprise Edition Release 9.2.0.6.0

Connected as dras

 

SQL> create index idx_testdrop2_objid on testdrop2(object_id) tablespace testtbs3;

 

Index created

 

SQL> select object_name,object_id from testdrop2 where object_id=21886;

 

OBJECT_NAME                                      OBJECT_ID

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

sun/io/CharToByteISO8859_4                            21886

 

现在是一切正常的,我们现在要让oracle在执行select object_name,object_id from testdrop2 where object_id=21886的时候返回的查询结果中object_id不等于21886

SQL> select dump(21886,16) from dual;

 

DUMP(21886,16)

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

Typ=2 Len=4: c3,3,13,57

 

SQL> select HEADER_FILE,HEADER_BLOCK from dba_segments where segment_name='IDX_TESTDROP2_OBJID';

 

HEADER_FILE HEADER_BLOCK

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

        137          652

 

我们现在dump 137-653137-781(alter system dump datafile 137 block min 653 block max 781),从产生的trace文件里去查找字符串 C3 03 13 57,可以查到如下内容:

buffer tsn: 88 rdba: 0x224002bd (137/701)

scn: 0x0008.a9f7d12d seq: 0x02 flg: 0x04 tail: 0xd12d0602

frmt: 0x02 chkval: 0xd013 type: 0x06=trans data

Block header dump:  0x224002bd

 Object id on Block? Y

 seg/obj: 0x1507e  csc: 0x08.a9f7d12c  itc: 2  flg: E  typ: 2 - INDEX

     brn: 0  bdba: 0x22400289 ver: 0x01

     inc: 0  exflg: 0

 

......中间内容省略

row#58[7206] flag: -----, lock: 0

col 0; len 4; (4):  c3 03 13 57

col 1; len 6; (6):  22 40 00 8d 00 00

好了,现在我们来将c3 03 13 57所对应的rowid22 40 00 8d 00 00改为22 40 00 8f 00 00

 

SQL> select EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces where tablespace_name='TESTTBS3';

 

EXTENT_MANAGEMENT SEGMENT_SPACE_MANAGEMENT

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

LOCAL             AUTO

 

从上面可以看到,c3 03 13 57所在的行的offset7206,这是一个相对地址,需要加上一个BASEBASE的计算方法为:

对于ASSM76+itc-1)*24

对于MSSM68+itc-1)*24

所以我们这里实际用到的offset7206+76+(2-1)*24=7306

 

shutdown上述数据库,然后用BBED22 40 00 8d 00 00改为22 40 00 8f 00 00

$ bbed parfile=par.bbd

Password:

 

BBED: Release 2.0.0.0.0 - Limited Production on Tue May 5 18:38:07 2009

 

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

 

************* !!! For Oracle Internal Use only !!! ***************

 

BBED> set file 137

        FILE#           137

 

BBED> set block 701

        BLOCK#          701

 

BBED> set offset 7306

        OFFSET          7306

 

BBED> dump

 File: /dras20/astca/testtbs3_01.dbf (137)

 Block: 701              Offsets: 7306 to 7817           Dba:0x224002bd

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

 000004c3 03135706 2240008d 00000000 04c30313 56062240 01310007 000004c3

 03135506 224000c8 00480000 04c30313 54062240 01310006 000004c3 03135306

 224000c8 00470000 04c30313 52062240 01520037 000004c3 03135106 224001c7

 00390000 04c30313 50062240 01310005 000004c3 03134f06 224000c8 00460000

 04c30313 4e062240 01310004 000004c3 03134d06 224000c8 00450000 04c30313

 4c062240 01310003 000004c3 03134b06 224000c8 00440000 04c30313 4a062240

 01310002 000004c3 03134906 224000c8 00430000 04c30313 48062240 01310001

 000004c3 03134706 224000c8 00420000 04c30313 46062240 01310000 000004c3

 03134506 224000c8 00410000 04c30313 44062240 012d0048 000004c3 03134306

 224000c8 00400000 04c30313 42062240 012d0047 000004c3 03134106 224000c8

 003f0000 04c30313 40062240 012d0046 000004c3 03133f06 224000c8 003e0000

 04c30313 3e062240 012d0045 000004c3 03133d06 224000c8 003d0000 04c30313

 3c062240 012d0044 000004c3 03133b06 224000c8 003c0000 04c30313 3a062240

 012d003f 000004c3 03133906 224000c8 00370000 04c30313 38062240 012d003e

 000004c3 03133706 224000c8 00360000 04c30313 36062240 012d003d 000004c3

 03133506 224000c8 00350000 04c30313 34062240 012d003c 000004c3 03133306

 

 <32 bytes per line>

 

BBED> modify /x 000004c3031357062240008f

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

 File: /dras20/astca/testtbs3_01.dbf (137)

 Block: 701              Offsets: 7306 to 7817           Dba:0x224002bd

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

 000004c3 03135706 2240008f 00000000 04c30313 56062240 01310007 000004c3

 03135506 224000c8 00480000 04c30313 54062240 01310006 000004c3 03135306

 224000c8 00470000 04c30313 52062240 01520037 000004c3 03135106 224001c7

 00390000 04c30313 50062240 01310005 000004c3 03134f06 224000c8 00460000

 04c30313 4e062240 01310004 000004c3 03134d06 224000c8 00450000 04c30313

 4c062240 01310003 000004c3 03134b06 224000c8 00440000 04c30313 4a062240

 01310002 000004c3 03134906 224000c8 00430000 04c30313 48062240 01310001

 000004c3 03134706 224000c8 00420000 04c30313 46062240 01310000 000004c3

 03134506 224000c8 00410000 04c30313 44062240 012d0048 000004c3 03134306

 224000c8 00400000 04c30313 42062240 012d0047 000004c3 03134106 224000c8

 003f0000 04c30313 40062240 012d0046 000004c3 03133f06 224000c8 003e0000

 04c30313 3e062240 012d0045 000004c3 03133d06 224000c8 003d0000 04c30313

 3c062240 012d0044 000004c3 03133b06 224000c8 003c0000 04c30313 3a062240

 012d003f 000004c3 03133906 224000c8 00370000 04c30313 38062240 012d003e

 000004c3 03133706 224000c8 00360000 04c30313 36062240 012d003d 000004c3

 03133506 224000c8 00350000 04c30313 34062240 012d003c 000004c3 03133306

 

 <32 bytes per line>

 

BBED> sum apply

Check value for File 137, Block 701:

current = 0xd011, required = 0xd011

 

好了,现在我们已经改完了,最后我们来看一下改过之后的效果:

startup上述数据库,并执行select object_name,object_id from testdrop2 where object_id=21886;

 

SQL> conn dras/astca@astcatest;

Connected to Oracle9i Enterprise Edition Release 9.2.0.6.0

Connected as dras

 

SQL> select object_name,object_id from testdrop2 where object_id=21886;

 

OBJECT_NAME                                      OBJECT_ID

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

java/util/jar/JarOutputStream                              19083

 

可以看到,我们的目的已经实现了。

10gR2里drop一个表的实质

| No Comments

在如下的这个例子里,我先drop掉了表salxbcsalxbc上有一个包含4个字段的主键),然后将salxbc_new重新命名为salxbc,最后执行了purge dba_recyclebin

CON$表是一个系统表,存放约束关系。

 

dropsalxbc的实质:

delete from "SYS"."CON$" where "OWNER#" = '56' and "NAME" = 'PK_SALXBC' and "CON#" = '32599' and "SPARE1" IS NULL and "SPARE2" IS NULL and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAAcAAGAAAAmOAAc';

 

ALTER TABLE "IPRA"."SALXBC" RENAME CONSTRAINT "PK_SALXBC" TO "BIN$aQ3o4LGpYPrgQwoBDzhg+g==$0" ;

 

ALTER TABLE "IPRA"."SALXBC" RENAME CONSTRAINT "SYS_C0032594" TO "BIN$aQ3o4LGqYPrgQwoBDzhg+g==$0" ;

 

ALTER TABLE "IPRA"."SALXBC" RENAME CONSTRAINT "SYS_C0032595" TO "BIN$aQ3o4LGrYPrgQwoBDzhg+g==$0" ;

 

ALTER TABLE "IPRA"."SALXBC" RENAME CONSTRAINT "SYS_C0032596" TO "BIN$aQ3o4LGsYPrgQwoBDzhg+g==$0" ;

 

ALTER TABLE "IPRA"."SALXBC" RENAME CONSTRAINT "SYS_C0032597" TO "BIN$aQ3o4LGtYPrgQwoBDzhg+g==$0" ;

 

insert into "SYS"."RECYCLEBIN$"("OBJ#","OWNER#","ORIGINAL_NAME","OPERATION","TYPE#","TS#","FILE#","BLOCK#","DROPTIME","DROPSCN","PARTITION_NAME","FLAGS","RELATED","BO","PURGEOBJ","BASE_TS#","BASE_OWNER#","SPACE","CON#","SPARE1","SPARE2","SPARE3") values ('101254','56','PK_SALXBC','0','2','9','11','9

740',TO_DATE('04-5 -09', 'DD-MON-RR'),'39011264961',NULL,'82','101252','101252','101254',NULL,NULL,'128','32599',NULL,NULL,NULL);

 

delete from "SYS"."OBJ$" where "OBJ#" = '101254' and "DATAOBJ#" = '101254' and "OWNER#" = '56' and "NAME" = 'PK_SALXBC' and "NAMESPACE" = '4' and "SUBNAME" IS NULL and "TYPE#" = '1' and "CTIME" = TO_DATE('16-4 -09', 'DD-MON-RR') and "MTIME" = TO_DATE('16-4 -09', 'DD-MON-RR') and "STIME" = TO_DAT

E('16-4 -09', 'DD-MON-RR') and "STATUS" = '1' and "REMOTEOWNER" IS NULL and "LINKNAME" IS NULL and "FLAGS" = '0' and "OID$" IS NULL and "SPARE1" = '0' and "SPARE2" = '65535' and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAASAABAAAMT8AA4';

 

ALTER INDEX "IPRA"."PK_SALXBC" RENAME TO "BIN$aQ3o4LGuYPrgQwoBDzhg+g==$0" ;

 

insert into "SYS"."RECYCLEBIN$"("OBJ#","OWNER#","ORIGINAL_NAME","OPERATION","TYPE#","TS#","FILE#","BLOCK#","DROPTIME","DROPSCN","PARTITION_NAME","FLAGS","RELATED","BO","PURGEOBJ","BASE_TS#","BASE_OWNER#","SPACE","CON#","SPARE1","SPARE2","SPARE3") values ('101252','56','SALXBC','0','1','8','21','5900

',TO_DATE('04-5 -09', 'DD-MON-RR'),'39011264967',NULL,'30','101252','101252','101252',NULL,NULL,'128','0',NULL,NULL,NULL);

 

delete from "SYS"."OBJ$" where "OBJ#" = '101252' and "DATAOBJ#" = '101252' and "OWNER#" = '56' and "NAME" = 'SALXBC' and "NAMESPACE" = '1' and "SUBNAME" IS NULL and "TYPE#" = '2' and "CTIME" = TO_DATE('16-4 -09', 'DD-MON-RR') and "MTIME" = TO_DATE('16-4 -09', 'DD-MON-RR') and "STIME" = TO_DATE('

16-4 -09', 'DD-MON-RR') and "STATUS" = '1' and "REMOTEOWNER" IS NULL and "LINKNAME" IS NULL and "FLAGS" = '0' and "OID$" IS NULL and "SPARE1" = '6' and "SPARE2" = '1' and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAASAABAAAMT8AA1';

 

ALTER TABLE "IPRA"."SALXBC" RENAME TO "BIN$aQ3o4LGvYPrgQwoBDzhg+g==$0" ;

drop table SALXBC

 

salxbc_new重新命名为salxbc的实质:

delete from "SYS"."OBJ$" where "OBJ#" = '103604' and "DATAOBJ#" = '103604' and "OWNER#" = '56' and "NAME" = 'SALXBC_NEW' and "NAMESPACE" = '1' and "SUBNAME" IS NULL and "TYPE#" = '2' and "CTIME" = TO_DATE('04-5 -09', 'DD-MON-RR') and "MTIME" = TO_DATE('04-5 -09', 'DD-MON-RR') and "STIME" = TO_DA

TE('04-5 -09', 'DD-MON-RR') and "STATUS" = '1' and "REMOTEOWNER" IS NULL and "LINKNAME" IS NULL and "FLAGS" = '0' and "OID$" IS NULL and "SPARE1" = '6' and "SPARE2" = '1' and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAASAAGAAACWJAA5';

 

rename SALXBC_NEW to SALXBC

insert into "SYS"."OBJ$"("OBJ#","DATAOBJ#","OWNER#","NAME","NAMESPACE","SUBNAME","TYPE#","CTIME","MTIME","STIME","STATUS","REMOTEOWNER","LINKNAME","FLAGS","OID$","SPARE1","SPARE2","SPARE3","SPARE4","SPARE5","SPARE6") values ('103604','103604','56','SALXBC','1',NULL,'2',TO_DATE('04-5 -09', 'DD-MON-

RR'),TO_DATE('04-5 -09', 'DD-MON-RR'),TO_DATE('04-5 -09', 'DD-MON-RR'),'1',NULL,NULL,'0',NULL,'6','2',NULL,NULL,NULL,NULL);

 

insert into "SYS"."OBJ$"("OBJ#","DATAOBJ#","OWNER#","NAME","NAMESPACE","SUBNAME","TYPE#","CTIME","MTIME","STIME","STATUS","REMOTEOWNER","LINKNAME","FLAGS","OID$","SPARE1","SPARE2","SPARE3","SPARE4","SPARE5","SPARE6") values ('103633','103633','56','PK_SALXBC','4',NULL,'1',TO_DATE('04-5 -09', 'DD-M

ON-RR'),TO_DATE('04-5 -09', 'DD-MON-RR'),TO_DATE('04-5 -09', 'DD-MON-RR'),'1',NULL,NULL,'0',NULL,'0','65535',NULL,NULL,NULL,NULL);

 

CREATE UNIQUE INDEX "IPRA"."PK_SALXBC" on "IPRA"."SALXBC"("SXCPRF","SXCFRM","SXCTKT","SXCCPN")tablespace IPRAIDX

alter table SALXBC

insert into "SYS"."CON$"("OWNER#","NAME","CON#","SPARE1","SPARE2","SPARE3","SPARE4","SPARE5","SPARE6") values ('56','PK_SALXBC','33752',NULL,NULL,NULL,NULL,NULL,NULL);

 

purge dba_recyclebin的实质:

drop table "IPRA"." BIN$aQ3o4LGvYPrgQwoBDzhg+g==$0" purge;

 

delete from "SYS"."RECYCLEBIN$" where "OBJ#" = '101254' and "OWNER#" = '56' and "ORIGINAL_NAME" = 'PK_SALXBC' and "OPERATION" = '0' and "TYPE#" = '2' and "TS#" = '9' and "FILE#" = '11' and "BLOCK#" = '9740' and "DROPTIME" = TO_DATE('04-5 -09', 'DD-MON-RR') and "DROPSCN" = '39011264961' and "PARTIT

ION_NAME" IS NULL and "FLAGS" = '82' and "RELATED" = '101252' and "BO" = '101252' and "PURGEOBJ" = '101254' and "BASE_TS#" IS NULL and "BASE_OWNER#" IS NULL and "SPACE" = '128' and "CON#" = '32599' and "SPARE1" IS NULL and "SPARE2" IS NULL and "SPARE3" IS NULL and ROWID = 'AAAAK+AABAAABUTAAA';

 

delete from "SYS"."RECYCLEBIN$" where "OBJ#" = '101252' and "OWNER#" = '56' and "ORIGINAL_NAME" = 'SALXBC' and "OPERATION" = '0' and "TYPE#" = '1' and "TS#" = '8' and "FILE#" = '21' and "BLOCK#" = '5900' and "DROPTIME" = TO_DATE('04-5 -09', 'DD-MON-RR') and "DROPSCN" = '39011264967' and "PARTITION

_NAME" IS NULL and "FLAGS" = '30' and "RELATED" = '101252' and "BO" = '101252' and "PURGEOBJ" = '101252' and "BASE_TS#" IS NULL and "BASE_OWNER#" IS NULL and "SPACE" = '128' and "CON#" = '0' and "SPARE1" IS NULL and "SPARE2" IS NULL and "SPARE3" IS NULL and ROWID = 'AAAAK+AABAAABUTAAB';


delete from "SYS"."CON$" where "OWNER#" = '56' and "NAME" = ' BIN$aQ3o4LGpYPrgQwoBDzhg+g==$0' and "CON#" = '6602' and "SPARE1" IS NULL and "SPARE2" IS NULL and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAAcAAFAAAAIFAAs';

 

delete from "SYS"."CON$" where "OWNER#" = '56' and "NAME" = ' BIN$aQ3o4LGqYPrgQwoBDzhg+g==$0' and "CON#" = '6602' and "SPARE1" IS NULL and "SPARE2" IS NULL and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAAcAAFAAAAIFAAs';

 

delete from "SYS"."CON$" where "OWNER#" = '56' and "NAME" = ' BIN$aQ3o4LGrYPrgQwoBDzhg+g==$0' and "CON#" = '6602' and "SPARE1" IS NULL and "SPARE2" IS NULL and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAAcAAFAAAAIFAAs';

 

delete from "SYS"."CON$" where "OWNER#" = '56' and "NAME" = ' BIN$aQ3o4LGsYPrgQwoBDzhg+g==$0' and "CON#" = '6602' and "SPARE1" IS NULL and "SPARE2" IS NULL and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAAcAAFAAAAIFAAs';

 

delete from "SYS"."CON$" where "OWNER#" = '56' and "NAME" = ' BIN$aQ3o4LGtYPrgQwoBDzhg+g==$0' and "CON#" = '6602' and "SPARE1" IS NULL and "SPARE2" IS NULL and "SPARE3" IS NULL and "SPARE4" IS NULL and "SPARE5" IS NULL and "SPARE6" IS NULL and ROWID = 'AAAAAcAAFAAAAIFAAs';

 

Recent Comments

  • Noma Lauw: Great job for creating such one of a kind collection read more
  • Vina Pagni: Damn, cool website. I actually came across this on Ask read more
  • the diet solution program reviews: By far, one of the best post l have come read more
  • Lose Ten Pounds in Three Days: By a long shot, one of the best post l read more
  • exercises to help lose 15 pounds: Without doubt, one of the best article l have come read more
  • Lose 20 Pounds a Week: I certainly enjoy your post, but having problem subscribing to read more
  • Aiko Potsander: Please continue to keep the good work! Cheers. read more
  • 毕业论文: 学习了。 read more
  • cui hua: 不用改数据,你改row directory里的指针就可以了——这就是我文中提到的update internal。 read more
  • yangjiawei: 领导,不好意思,再请问一下 我现在遇到一个问题,我现在已经将ind$里两个索引的状态改好了,数据库也拉起来了~! 但是在修改obj$里name里为DEPENDENCY$这一行数据的data_object_id时遇到了困难,因为他原先的长度为2个字节,现在由于我move了一下,他的长度变成了4个字节,结果如下: 原先: col 1[2] @906: 0xc1 0x5d ==>92 read more