참고 자료
SQL> conn sys/sys@erm as sysdba
연결되었습니다.
SQL> drop table test;
테이블이 삭제되었습니다.
SQL> create table test(c1 number, c2 varchar2(10));
테이블이 생성되었습니다.
SQL> create table test(c1 number, c2 varchar2(10));
create table test(c1 number, c2 varchar2(10))
*
1행에 오류:
ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.
SQL> insert into test values( 1, 'AAA');
1 개의 행이 만들어졌습니다.
SQL> select sid, username from v$session where username ='SYS';
SID USERNAME
---------- ------------------------------
145 SYS
SQL> select rowid, dbms_rowid.rowid_relative_fno(rowid) as fno,
2 dbms_rowid.rowid_block_number(rowid)as blkno
3 from test;
ROWID FNO BLKNO
------------------ ---------- ----------
AAAN+EAABAAAPBKAAA 1 61514
SQL> show parameter user;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
license_max_users integer 0
parallel_adaptive_multi_user boolean TRUE
user_dump_dest string C:\ORACLE\PRODUCT\10.2.0\ADMIN
\ERM\UDUMP
SQL> select xidusn, xidslot,xidsqn
2 from v$transaction
3 where addr = (select taddr from v$session where sid =
4 145);
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
6 6 8686
SQL>
SQL> --인서트 커밋전 테스트
SQL> alter system dump datafile 1 block 61514;
시스템이 변경되었습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> delete from test;
1 행이 삭제되었습니다.
SQL> select xidusn, xidslot,xidsqn
2 from v$transaction
3 where addr = (select taddr from v$session where sid =
4 145);
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
8 19 11241
SQL> lter system dump datafile 1 block 61514;
SP2-0734: "lter syste..."(으)로 시작되는 알 수 없는 명령 - 나머지 줄은 무시되었습니다.
SQL> alter system dump datafile 1 block 61514;
시스템이 변경되었습니다.
SQL> alter system dump undo header '_SYSSMU8$';
시스템이 변경되었습니다.
SQL> alter system dump undo block '_SYSSMU8$' xid 8 19 11241;
시스템이 변경되었습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> alter system dump datafile 1 block 61514;
시스템이 변경되었습니다.
SQL> alter system dump undo header '_SYSSMU8$';
시스템이 변경되었습니다.
SQL> alter system dump undo block '_SYSSMU8$' xid 8 19 11241;
시스템이 변경되었습니다.
Start dump data blocks tsn: 0 file#: 1 minblk 61514 maxblk 61514
buffer tsn: 0 rdba: 0x0040f04a (1/61514)
scn: 0x0000.00a6184c seq: 0x04 flg: 0x00 tail: 0x184c0604
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07A18400 to 0x07A1A400
7A18400 0000A206 0040F04A 00A6184C 00040000 [....J.@.L.......]
...
Block header dump: 0x0040f04a
Object id on Block? Y
seg/obj: 0xdf84 csc: 0x00.a62b36 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.006.000021ee 0x008004c0.096a.08 ---- 1 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x7a1845c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x07a1845c
bdba: 0x0040f04a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f96
avsp=0x1f82
tosp=0x1f82
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f96
block_row_dump:
tab 0, row 0, @0x1f96
tl: 10 fb: --H-FL-- lb: 0x1 cc: 2 <--
col 0: [ 2] c1 02
col 1: [ 3] 41 41 41
end_of_block_dump
SQL> select xidusn, xidslot,xidsqn
2 from v$transaction
3 where addr = (select taddr from v$session where sid =
4 145);
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
6 6 8686
Start dump data blocks tsn: 0 file#: 1 minblk 61514 maxblk 61514
buffer tsn: 0 rdba: 0x0040f04a (1/61514)
scn: 0x0000.00a6189f seq: 0x01 flg: 0x02 tail: 0x189f0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07A18400 to 0x07A1A400
7A18400 0000A206 0040F04A 00A6189F 02010000 [....J.@.........]
...
Block header dump: 0x0040f04a
Object id on Block? Y
seg/obj: 0xdf84 csc: 0x00.a62b83 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.006.000021ee 0x008004c0.096a.08 C--- 0 scn 0x0000.00a62b7f
0x02 0x0008.013.00002be9 0x008007ee.06ef.2f ---- 1 fsc 0x0008.00000000
data_block_dump,data header at 0x7a1845c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x07a1845c
bdba: 0x0040f04a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f96
avsp=0x1f82
tosp=0x1f8c
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f96
block_row_dump:
tab 0, row 0, @0x1f96
tl: 2 fb: --HDFL-- lb: 0x2
end_of_block_dump
End dump data blocks tsn: 0 file#: 1 minblk 61514 maxblk 61514
Block header dump: 0x0040f04a
Object id on Block? Y
seg/obj: 0xdf84 csc: 0x00.a62b83 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.006.000021ee 0x008004c0.096a.08 C--- 0 scn 0x0000.00a62b7f
0x02 0x0008.013.00002be9 0x008007ee.06ef.2f --U- 1 fsc 0x0008.00a62cdd
********************************************************************************
Undo Segment: _SYSSMU8$ (8)
********************************************************************************
...
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x12 9 0x00 0x2be7 0x0000 0x0000.00a628f0 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 1268733939
0x13 10 0x80 0x2be9 0x0003 0x0000.00a62b7f 0x008007ee 0x0000.000.00000000 0x00000001 0x00000000 0
0x14 9 0x00 0x2be7 0x0019 0x0000.00a626db 0x008007e8 0x0000.000.00000000 0x00000001 0x00000000 1268733330
...
*******************************************************************************
Undo Segment: _SYSSMU8$ (8)
********************************************************************************
...
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
...
0x12 9 0x00 0x2be7 0x0000 0x0000.00a628f0 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 1268733939
0x13 9 0x00 0x2be9 0x0028 0x0000.00a62cdd 0x008007ee 0x0000.000.00000000 0x00000001 0x00000000 1268735001
0x14 9 0x00 0x2be8 0x0019 0x0000.00a626db 0x008007e8 0x0000.000.00000000 0x00000001 0x00000000 1268735025
********************************************************************************
Undo Segment: _SYSSMU8$ (8)
xid: 0x0008.013.00002be9
Low Blk : (0, 0)
High Blk : (3, 127)
Object Id : ALL
Layer : ALL
Opcode : ALL
Level : 2
********************************************************************************
UNDO BLK: Extent: 3 Block: 101 dba (file#, block#): 2,0x000007ee
xid: 0x0008.013.00002be9 seq: 0x6ef cnt: 0x2f irb: 0x2f icl: 0x0 flg: 0x0000
*-----------------------------
* Rec #0x2f slt: 0x13 objn: 57220(0x0000df84) objd: 57220 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
********************************************************************************
Undo Segment: _SYSSMU8$ (8)
xid: 0x0008.013.00002be9
Low Blk : (0, 0)
High Blk : (3, 127)
Object Id : ALL
Layer : ALL
Opcode : ALL
Level : 2
+++++++++++ XID mismatch. Some records may not belong to specified transaction.
+ WARNING + Block xid: 0x0008.019.00002be8 dba (file#, block#): 2,0x000007ee
+++++++++++ Input xid: 0x0008.013.00002be9
********************************************************************************
UNDO BLK: Extent: 3 Block: 101 dba (file#, block#): 2,0x000007ee
xid: 0x0008.019.00002be8 seq: 0x6ef cnt: 0x38 irb: 0x38 icl: 0x0 flg: 0x0000
*-----------------------------
* Rec #0x2f slt: 0x13 objn: 57220(0x0000df84) objd: 57220 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
다른점 : xid(0x0008.019.00002be8) 에러가 발생하는데.. ㅠ,.ㅠ
1) 트랜잭션이 갱신한 블록 개수가 총 버퍼 캐시 블록 개수의 1/10을 초과할 때 사용하는 방식.
2) 커밋 이후 해당 블록을 액세스하는 첫 번째 쿼리에 의해 클린 아웃이 이루어진다.
일반적으로 알려진 Snapshot Too Old 에러의 원인은 다음과 같다. 아마 이 글을 읽는 분들 대부분이 아래 현상 중 적어도 한가지는 이미 경험했을 것이다.
SQL> create undo tablespace small_undo datafile 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ERM\S_UNDO.DBF' SI
ZE 10M AUTOEXTEND OFF;
테이블스페이스가 생성되었습니다.
SQL> alter system set undo_tablespace = 'SMALL_UNDO';
시스템이 변경되었습니다.
SQL> alter system set db_cache_size=1M scope=both ;
SQL> show parameter cache_size
NAME TYPE VALUE
------------------------------------ ----------- ---------------------
db_16k_cache_size big integer 0
db_2k_cache_size big integer 0
db_32k_cache_size big integer 0
db_4k_cache_size big integer 0
db_8k_cache_size big integer 0
db_cache_size big integer 4M
db_keep_cache_size big integer 0
db_recycle_cache_size big integer 0
SQL> show sga
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 113249156 bytes
Database Buffers 490733568 bytes
Redo Buffers 7135232 bytes
SQL> --Select Query의 속도를 제어하기 위해 Sleep 함수를 만든다.
SQL> create or replace function fsleep(v1 int, vsleep int)
2 return number
3 is
4 begin
5 dbms_lock.sleep(vsleep);
6
7 return 1;
8 end;
9 /
함수가 생성되었습니다.
SQL> drop table t1 purge;
테이블이 삭제되었습니다.
SQL> create table t1(c1 int, c2 varchar2(10));
테이블이 생성되었습니다.
SQL> insert into t1
2 select level, 'AAA'
3 from dual
4 connect by level < 10000
5 ;
9999 개의 행이 만들어졌습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> create index t1_n1 on t1(c1);
인덱스가 생성되었습니다.
SQL> select rowid, dbms_rowid.rowid_relative_fno(rowid) as fno,
2 dbms_rowid.rowid_block_number(rowid)as blkno
3 from t1 where rownum = 1;
ROWID FNO BLKNO
------------------ ---------- ----------
AAAN/eAABAAAPBSAAA 1 61522
SQL> alter system dump datafile 1 block 61522;
시스템이 변경되었습니다.
--SESSION 1 번 실행중에 실행
SQL> alter system dump datafile 1 block 61522;
시스템이 변경되었습니다.
--SESSION 1 번 실행중에 실행
SQL> alter system dump datafile 1 block 61522;
시스템이 변경되었습니다.
select /*+ index(t1) */
c1, c2
from t1
where fsleep(c1,0.01) = 1
and c1 > 0;
...
---------- ----------
3356 AAA
3357 AAA
3358 AAA
3359 AAA
3360 AAA
ERROR:
ORA-01555: 너무 이전 스냅샷:롤백 세그먼트 14 수에 "_SYSSMU14$" 이름으로 된 것이
너무 작습니다
-- get rollback segment name
col rollback_seg new_value v_rollback_seg
select '_SYSSMU'||max(segment_id)||'$' as rollback_seg
from dba_rollback_segs
where segment_name <> 'SYSTEM'
;
-- do very frequent commit on t1
begin
for idx in 1 .. 1000 loop
for idx2 in 1 .. 10000 loop
set transaction use rollback segment "&v_rollback_seg";
update t1 set c2 = 'dummy'||idx
where c1 = idx2;
commit;
end loop;
end loop;
end;
/
첫번째 덤프
Block header dump: 0x0040f052
Object id on Block? Y
seg/obj: 0xdfde csc: 0x00.a750a5 itc: 2 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0010.02e.00000020 0x01400224.000a.10 --U- 1 fsc 0x0000.00a750a8
0x02 0x000d.025.00000020 0x0140020e.0007.18 --U- 1 fsc 0x0000.00a750a6
두번째 덤프
Block header dump: 0x0040f052
Object id on Block? Y
seg/obj: 0xdfde csc: 0x00.a750a5 itc: 2 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0010.02e.00000020 0x01400224.000a.10 --U- 1 fsc 0x0000.00a750a8
0x02 0x000d.025.00000020 0x0140020e.0007.18 --U- 1 fsc 0x0000.00a750a6
세번재 덤프
Block header dump: 0x0040f052
Object id on Block? Y
seg/obj: 0xdfde csc: 0x00.a83265 itc: 2 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000e.02b.0000004d 0x0140003e.000d.36 C--- 0 scn 0x0000.00a83264
0x02 0x000d.023.00000066 0x0140002d.0012.21 --U- 1 fsc 0x0000.00a83266
왜 이런 일이 발생하는가? Delayed Block Cleanout 때문이다.
Table t1에 대해 Commit이 수행될 때 모든 Data Block에 대해 Commit 여부를 지정하지 않고(즉 일부에만 Commit 여부 지정) Undo Segment Header의 Transaction Table에만 Commit 여부를 지정한다. 이 정보가 완전히 덮어써져서 Rollback하지 못하면 ORA-01555 에러가 나게 된다.
Block에 Commit 여부를 저장하는 것을 Block Cleanout이라고 부른다. Delayed Block Cleanout는 Block Cleanout를 Commit 시점에 하지 않고 미루겠다(Delay)는 것을 의미한다.
그렇다면 언제 Block Cleanout이 이루어지는가? 다른 Session이 해당 Block을 Access하는 시점에 이루어진다.
즉 위의 예에서 Session#1은 Delayed Block Cleanout를 수행하기 위해 Transaction Table을 읽을려고 했는데 다른 DML에 의해 해당 정보들이 완전히 덮어써져서 Rollback이 안되기 때문에 ORA-01555 에러를 발생시키는 것이다.
SQL> drop table t1 purge;
테이블이 삭제되었습니다.
SQL> create table t1(c1 int, c2 varchar2(10));
테이블이 생성되었습니다.
SQL> insert into t1
2 select level, 'AAA'
3 from dual
4 connect by level <
5 4;
3 개의 행이 만들어졌습니다.
SQL> select rowid, dbms_rowid.rowid_relative_fno(rowid) as fno,
2 dbms_rowid.rowid_block_number(rowid)as blkno
3 from t1
4 ;
ROWID FNO BLKNO
------------------ ---------- ----------
AAAN/gAABAAAPBSAAA 1 61522
AAAN/gAABAAAPBSAAB 1 61522
AAAN/gAABAAAPBSAAC 1 61522
SQL> --커밋 전 덤프
SQL> alter system dump datafile 1 block 61522;
시스템이 변경되었습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> --커밋 후 덤프
SQL> alter system dump datafile 1 block 61522;
시스템이 변경되었습니다.
SQL> --다른 세션에서 트랜젼선으로 해당 로우 변경 (커밋전)
SQL> alter system dump datafile 1 block 61522;
시스템이 변경되었습니다.
SQL> --다른 세션에서 트랜잭션으로 해당로우 변경 ( 커밋후)
SQL> alter system dump datafile 1 block 61522;
시스템이 변경되었습니다.
SQL>
SQL> conn sys/sys@erm as sysdba
연결되었습니다.
SQL>
SQL> update t1 set c2 = 'BBB'
2 ;
3 행이 갱신되었습니다.
SQL> commit;
SQL>
--session1 에서 인서트 후 커밋전 덤프
Block header dump: 0x0040f052
Object id on Block? Y
seg/obj: 0xdfe0 csc: 0x00.107ca09 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0014.002.0000164a 0x0140028d.0329.2d ---- 3 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
--session1 에서 인서트 후 커밋 후 덤프
Block header dump: 0x0040f052
Object id on Block? Y
seg/obj: 0xdfe0 csc: 0x00.107ca09 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0014.002.0000164a 0x0140028d.0329.2d --U- 3 fsc 0x0000.0107dcfb
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
--session2 에서 업데이트 후 커밋 전 덤프
Block header dump: 0x0040f052
Object id on Block? Y
seg/obj: 0xdfe0 csc: 0x00.107de79 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0014.002.0000164a 0x0140028d.0329.2d C--- 0 scn 0x0000.0107dcfb
0x02 0x000b.029.00001662 0x014003cc.032c.22 ---- 3 fsc 0x0000.00000000
--session2 에서 업데이트 후 커밋 후 덤프
Block header dump: 0x0040f052
Object id on Block? Y
seg/obj: 0xdfe0 csc: 0x00.107de79 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0014.002.0000164a 0x0140028d.0329.2d C--- 0 scn 0x0000.0107dcfb
0x02 0x000b.029.00001662 0x014003cc.032c.22 --U- 3 fsc 0x0000.0107e006