Profilo di haiOracle & StarcraftBlogElenchi Strumenti Guida
14 febbraio

ora_rowscn

10g里面有了一项新功能,我们可以查看某个表的某一行最后一次改动的scn,这个就是由ora_rowscn来提供。
 
SQL 10G>create table test (a number);
Table created.
 
SQL 10G>select ora_rowscn from test;
no rows selected
 
SQL 10G>insert into test values(1);
1 row created.
 
SQL 10G>column ora_rowscn format 999999999999999999999
 
insert 完成后我们可以查询到ora_rowscn

SQL 10G>select ora_rowscn from test;
            ORA_ROWSCN
----------------------
           21749185488
 
SQL 10G>commit;
Commit complete.
 
当事务递交,ora_rowscn发生变化
 
SQL 10G>select ora_rowscn from test;
            ORA_ROWSCN
----------------------
           21749185507
 
SQL 10G>insert into test values(2);
1 row created.
 
再插入一条记录,查看ora_rowscn,发现两条记录的ora_rowscn相同
 
SQL 10G>select ora_rowscn from test;
            ORA_ROWSCN
----------------------
           21749185507
           21749185507
 
SQL 10G>commit;
Commit complete.
 
事务递交后再次发现ora_rowscn发生变化
 
SQL 10G>select ora_rowscn from test;
            ORA_ROWSCN
----------------------
           21749186216
           21749186216
 
SQL 10G>select dbms_rowid.ROWID_RELATIVE_FNO(rowid),dbms_rowid.ROWID_BLOCK_NUMBER(rowid) from test;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                   1                                69650
                                   1                                69650
 
SQL 10G>alter system dump datafile 1 block 69650;
System altered.
 
SQL 10G>exit
 
 
Start dump data blocks tsn: 0 file#: 1 minblk 69650 maxblk 69650
buffer tsn: 0 rdba: 0x00411012 (1/69650)
scn: 0x0005.105a3ea8 seq: 0x02 flg: 0x02 tail: 0x3ea80602
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Block header dump:  0x00411012
 Object id on Block? Y
 seg/obj: 0xff72  csc: 0x05.105a3bd0  itc: 2  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000d.026.000004da  0x01c01470.0184.2c  --U-    1  fsc 0x0000.105a3be3
0x02   0x000e.008.000004e7  0x01c018a1.017d.17  --U-    1  fsc 0x0000.105a3ea8
 
data_block_dump,data header at 0xb72f845c
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0xb72f845c
bdba: 0x00411012
     76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f94
avsp=0x1f78
tosp=0x1f78
0xe:pti[0]      nrow=2  offs=0
0x12:pri[0]     offs=0x1f9a
0x14:pri[1]     offs=0x1f94
block_row_dump:
tab 0, row 0, @0x1f9a
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f94
tl: 6 fb: --H-FL-- lb: 0x2  cc: 1
col  0: [ 2]  c1 03
end_of_block_dump
 
 
 
SQL 10G>select to_number('5105a3ea8','xxxxxxxxxxxxxxxxxx') ora_rowscn from dual;
        ORA_ROWSCN
------------------
       21749186216
从上面的实验中可以发现,当表以常规方式创建的时候,ora_rowscn取自data block header的scn,而每行数据并没保存自己的rowscn,下面来看一下以rowdependencies创建的表是什么情况。
 
 
SQL 10G>create table test (a number) rowdependencies;
Table created.
 
SQL 10G>select ora_rowscn from test;
no rows selected
 
SQL 10G>insert into test values(1);
1 row created.
 
insert后查询ora_rowscn ,发现ora_rowscn为空
 
SQL 10G>select ora_rowscn from test;
        ORA_ROWSCN
------------------

SQL 10G>commit;
Commit complete.
 
事务递交后,可以查询到ora_rowscn
 
 
SQL 10G>select ora_rowscn from test;
        ORA_ROWSCN
------------------
       21749198001
 
SQL 10G>insert into test values(2);
1 row created.
 
插入第2条数据,依然发现有一个ora_rowscn为空
 
SQL 10G>select ora_rowscn from test;
        ORA_ROWSCN
------------------
       21749198001

SQL 10G>commit;
Commit complete.
 
递交后查询ora_rowscn,发现2条记录的ora_rowscn并不一样,这和上面的情况不一样,我们知道这是因为ora_rowscn被保存在行内的缘故
 
SQL 10G>select ora_rowscn from test;
        ORA_ROWSCN
------------------
       21749198001
       21749198017
 
 
 
SQL 10G>alter system dump datafile 1 block 69650;
System altered.
 
SQL 10G>exit
 
Start dump data blocks tsn: 0 file#: 1 minblk 69650 maxblk 69650
buffer tsn: 0 rdba: 0x00411012 (1/69650)
scn: 0x0005.105a6cc1 seq: 0x02 flg: 0x02 tail: 0x6cc10602
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
seg/obj: 0xff73  csc: 0x05.105a687c  itc: 2  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0010.005.000004e5  0x01c02e78.01c5.1e  --U-    1  fsc 0x0000.105a6cb1
0x02   0x000c.02c.000004d4  0x01c00feb.01a5.24  --U-    1  fsc 0x0000.105a6cc1
 
data_block_dump,data header at 0xc70e45c
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0c70e45c
bdba: 0x00411012
     76543210
flag=--R-----
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f88
avsp=0x1f6c
tosp=0x1f6c
0xe:pti[0]      nrow=2  offs=0
0x12:pri[0]     offs=0x1f94
0x14:pri[1]     offs=0x1f88
block_row_dump:
tab 0, row 0, @0x1f94
tl: 12 fb: --H-FL-- lb: 0x1  cc: 1
dscn 0x0000.00000000
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f88
tl: 12 fb: --H-FL-- lb: 0x2  cc: 1
dscn 0x0000.00000000
col  0: [ 2]  c1 03
end_of_block_dump 
 
 
dump block后发现,现在dscn还是0,我们查询出来的ora_rowscn实际上是从Scn/Fsc
中获得的,真正ora_rowscn被保存在行内是在itl发生cleanout时会把Scn/Fsc刷到dscn
 
SQL 10G>update test set a=1 where a=1;
1 row updated.
 
SQL 10G>commit;
Commit complete.
 
 
SQL 10G>update test set a=1 where a=1;
1 row updated.
 
SQL 10G>commit;
Commit complete.
 
SQL 10G>alter system dump datafile 1 block 69650;
System altered.
 
SQL 10G>exit
 
Start dump data blocks tsn: 0 file#: 1 minblk 69650 maxblk 69650
buffer tsn: 0 rdba: 0x00411012 (1/69650)
scn: 0x0005.105a6dff seq: 0x02 flg: 0x02 tail: 0x6dff0602
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
 Object id on Block? Y
 seg/obj: 0xff73  csc: 0x05.105a6dfd  itc: 2  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0012.024.000004db  0x01c024fd.016a.08  C---    0  scn 0x0005.105a6df8
0x02   0x000d.00f.000004dc  0x01c031b3.0194.28  --U-    1  fsc 0x0000.105a6dff
 
data_block_dump,data header at 0xc70e45c
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0c70e45c
bdba: 0x00411012
     76543210
flag=--R-----
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f88
avsp=0x1f6c
tosp=0x1f6c
0xe:pti[0]      nrow=2  offs=0
0x12:pri[0]     offs=0x1f94
0x14:pri[1]     offs=0x1f88
block_row_dump:
tab 0, row 0, @0x1f94
tl: 12 fb: --H-FL-- lb: 0x2  cc: 1
dscn 0x0005.105a6df8
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f88
tl: 12 fb: --H-FL-- lb: 0x0  cc: 1
dscn 0x0005.105a6cc1
col  0: [ 2]  c1 03
end_of_block_dump
 
 
另外,oracle还提供了ora_rowscn到timestamp的转换
 
 
SQL 10G>select scn_to_timestamp(ora_rowscn) from test;
SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------------------------------------------------------------------------
14-FEB-06 03.55.05.000000000 PM
14-FEB-06 03.44.05.000000000 PM
 
更多ora_rowscn的用途请各位自己去摸索吧。

Commenti (5)

Attendere...
Il commento immesso è troppo lungo. Immetti un commento più breve.
Immissione non effettuata. Riprova.
Impossibile aggiungere il commento al momento. Riprova più tardi.
Per aggiungere un commento è necessaria l'autorizzazione di un genitore. Chiedi autorizzazione
I tuoi genitori hanno disattivato i commenti.
Impossibile eliminare il commento al momento. Riprova più tardi.
Hai raggiunto il numero massimo di commenti pubblicabili giornalmente. Riprova tra 24 ore.
Impossibile lasciare commenti. La funzionalità è stata disattivata perché i sistemi hanno rilevato una possibile attività di spamming dal tuo account. Se ritieni che il tuo account è stato disattivato per errore, contatta il supporto tecnico di Windows Live.
Esegui il seguente controllo di protezione per completare la pubblicazione del commento.
I caratteri digitati nel controllo di protezione devono corrispondere ai caratteri dell'immagine o della riproduzione audio.

Per aggiungere un commento, accedi con il tuo Windows Live ID (se utilizzi Hotmail, Messenger o Xbox LIVE possiedi già un Windows Live ID). Accedi


Non hai ancora un Windows Live ID? Registrati

28 Ago.
Senza nomeha scritto:

Hi,Do you need advertising displays, digital signages, mp4 advertisement players, SD card players and advertisement LCD displays? Please go Here:www.amberdigital.com.hk(Amberdigital).we have explored and developed the international market with professionalism. We have built a widespread marketing network, and set up a capable management team dedicated to provide beyond-expectation services to our customers.

amberdigital Contact Us

website:www.amberdigital.com.hk
alibaba:amberdigital.en.alibaba.com[hghhfhgcifjigh]

23 Set.
Senza nomeha scritto:

Amberdigital Branch,Southern Stars Enterprises Co is specializing in the development and manufacturing of advertising displays, advertising player and LCD displays. Established in 1996, we have explored and developed the international market with professionalism. We have built a widespread marketing network, and set up a capable management team dedicated to provide beyond-expectation services to our customers.

amberdigital Contact Us
Southern Stars Enterprises Co (Hong Kong Office)
Add:3 Fl, No.2, Lane 2, Kam Tsin Tsuen, Sheung Shui, Hong Kong
Tel:+852 2681 4099
Fax:+852 2681 4586

Southern Stars Enterprises Co (Shenzhen Office)
Add:DE, 16/F, Building 2, Nanguo Tower, Sungang Road, Shenzhen, China
Tel:+86 755 2592 9100
Fax:+86 755 2592 7171

E-mail:sstar@netvigator.com
website:www.amberdigital.com.hk
alibaba:amberdigital.en.alibaba.com[chhgeabe

28 Ago.
9 Ago.
30 Lug.

Riferimenti

L'URL di riferimento per questo intervento è:
http://wzwanghai.spaces.live.com/blog/cns!56626E237AFBD116!300.trak
Blog che fanno riferimento a questo intervento
  • Nessuno