[Oracle][ORA-01555] snap shot too old ์—๋Ÿฌ

๋ด„ยท2025๋…„ 9์›” 5์ผ
0

์˜ค๋ผํด ๊ด€๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
98/163

ORA-01555 snap shot too old ์—๋Ÿฌ๋ž€?

drop table mcustsum purge;

create table mcustsum as
select rownum custno,
       '2025' || lpad(ceil(rownum / 100000), 2, '0') salemm,
       decode(mod(rownum, 12), 1, 'A', 'B') salegb,
       round(dbms_random.value(1000, 100000), -2) saleamt
from dual
connect by level <= 120000;

๐Ÿ’ก scott A ์„ธ์…˜์ด select๋ฅผ ํ–ˆ๋Š”๋ฐ 15๋ถ„ ๋„˜๊ฒŒ select๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ์‚ฌ์ด์— scott B ์„ธ์…˜์ด mucustsum์˜ 120๋งŒ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์ธ salegb๋ฅผ B์— K๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด B๋Š” UNDO segment์— ๋“ค์–ด๊ฐ€๊ณ  scott A๋Š” update ๋ณด๋‹ค ๋จผ์ € ํ•œ select๋ฌธ์ด๊ณ  selectํ•˜๊ธฐ ์ง์ „์— ์ตœ์ข…์ ์œผ๋กœ commit ๋œ ๋ฐ์ดํ„ฐ๋Š” B์ด๊ธฐ ๋•Œ๋ฌธ์— B๋ฅผ ๋ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ 15๋ถ„์ด ์ง€๋‚ฌ๊ณ  update ๋ฌธ์€ commit์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— B๊ฐ€ ์žˆ๋˜ undo segment ์ž๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์˜ํ•ด์„œ ๋ฎ์–ด์จ์งˆ ํ•ฉ๋‹นํ•œ ์ด์œ ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฎ์–ด์ ธ๋ฒ„๋ฆฌ๋ฉด scott A ์„ธ์…˜์€ 120๋งŒ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ณ  select๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ๋˜๋Š” ๊ทธ ์—๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ ORA-01555 snap shot too old ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค.


์˜ค๋ผํด์—์„œ ๊ถŒ์žฅํ•˜๋Š” ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์˜ค๋ผํด์—์„œ ๊ฐ€์žฅ ๊ธธ๊ฒŒ ๋„๋Š” ์ฟผ๋ฆฌ๋ฌธ์˜ ์‹œ๊ฐ„์— ๋งž์ถฐ์„œ undo_retention์„ ์ง€์ •ํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Œ


์‹ค์Šต1. ORA-01555 snap shot too old ์—๋Ÿฌ๋ฅผ ๊ฒฝํ—˜ํ•˜์„ธ์š”

์‹ค์Šต.  ORA-01555  snap shot too old ์—๋Ÿฌ๋ฅผ ์ผ์œผ์ผœ ๋ณด์‹œ์˜ค !

  #1.  10m ์งœ๋ฆฌ ์–ธ๋‘ ํ…Œ์ด๋ธ” ์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      create undo tablespace small_undo
      datafile '/home/oracle/small_undo.dbf' size 10m autoextend off;
      
      
 SYS @ ORA19 > show parameter undo_tablespace

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1

 #2. 10m ์–ธ๋‘ ํ…Œ์ด๋ธ” ์ŠคํŽ˜์ด์Šค๋ฅผ ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ undo tablespace ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
      
      alter system set undo_tablespace=small_undo;
      
 SYS @ ORA19 >  show parameter undo_tablespace

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      SMALL_UNDO
SYS @ ORA19 >

      
 #3. ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ 10000 ๊ฑด์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
     
      create table t1(c1 int, c2 char(300));
      
      insert /*+ append */ into t1
      select level, 'dummy'
      from dual
      connect by level <= 10000;
      
      commit;
      
  #4. ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. 

      create index t1_n1 on t1(c1);
      
  #5. ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      
      create or replace function fsleep(v1 int, vsleep int)
      return number
      is
      begin
        dbms_lock.sleep(vsleep);
      
      return 1;
      end;
      /
      
  # 6. ๋ฒ„ํผ ์บ์‰ฌ ์‚ฌ์ด์ฆˆ๋ฅผ 1m ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
      
      alter system set db_cache_size = 1m;
      
      
   #7. ์œ„์™€ ๊ฐ™์ด ํ™˜๊ฒฝ๊ตฌ์„ฑ์„ ํ•˜๊ณ  ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
      
      
      select /*+ index(t1) */ 
      c1, substr(c2,1,10)
      from t1
      where fsleep(c1, 0.01) = 1 
      and c1 > 0;
      


-- session 2 -------
      
# 1. ํ˜„์žฌ ์–ธ๋‘ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๋ญ๊ฐ€์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

#2. t1 ํ…Œ์ด๋ธ”์— update ๋ฅผ ๊ณ„์† ๋ฐ˜๋ณต 

      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;
      /


๋ฌธ์ œ1. ์œ„์˜ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด์„œ ์ฒซ๋ฒˆ์งธ ํ˜„์žฌ database์—์„œ ์‚ฌ์šฉํ•  undo tablespace ๋ฅผ ์›๋ž˜ undo tablespace ์ธ undotbs1 ๋กœ ๋˜๋Œ๋ฆฌ์‹œ์˜ค

SYS @ ORA19 > alter system set undo_tablespace=undotbs1;

์‹œ์Šคํ…œ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SYS @ ORA19 > show parameter undo_tablespace

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1
SYS @ ORA19 >

๋ฌธ์ œ2. ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋ฒ„ํผ ์บ์‰ฌ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ธ db_cache_size ๋ฅผ 50m ๋กœ ๋ณ€๊ฒฝํ•˜์‹œ์˜ค

SYS @ ORA19 > alter system set db_cache_size=50m;

์‹œ์Šคํ…œ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

[๊ณต๊ฐ„์ •๋ฆฌ]

owi_tbs ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค ์‚ญ์ œ

SYS @ ORA19 > drop tablespace owi_tbs including contents and datafiles cascade constraints;

0๊ฐœ์˜ ๋Œ“๊ธ€