'Lock'에 해당되는 글 2건

  1. 2015.12.29 statistics lock/unlock
  2. 2013.06.21 롤백이 너무 길어 테이블 lock된 현상

■통계 lock

    자동 수집 방지 목적

예: 매번 동적 샘플링하도록 설정
begin
 dbms_stats.delete_table_stats('oe','orders');
 dbms_stats.lock_table_stats('oe','orders');
end;
/

 

예: 대표 값에 대한 통계가 있는 테이블에 대한 통계 lock
begin
 dbms_stats.gather_table_stats('oe','orders');
 dbms_stats.lock_table_stats('oe','orders');
end;
/

 

■ lock 방법

lock_partition_stats
lock_schema_stats
lock_table_stats

 

■unlock 방법

unlock_partition_stats
unlock_schema_stats
unlock_table_stats

 

■통계 lock 되었는지 확인하는 방법

 

select table_name, stattype_locked from user_tab_statistics
where stattype_locked='ALL';

 

※stattype은 기본값이 ALL이며 아직까진 다른 옵션은 개발되지 않은 것으로 보인다. 매뉴얼에도 없다.

 

■통계가 lock되어있더라도 강제 갱신 방법

통계가 lock된 테이블이나 테이블의 종속(인덱스, 열, 히스토그램)된 객체에 통계 갱신이나 수집, import를 시도하면
아래처럼 ora-20005를 만난다.

 

SQL> exec dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX')
BEGIN dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX'); END;

*
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 10872
ORA-06512: at "SYS.DBMS_STATS", line 10896
ORA-06512: at line 1

 

이때 force 옵션을 사용하면 갱신 가능하다.

SQL> exec dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX', force=>true);
PL/SQL procedure successfully completed.

Posted by neo-orcl
,

꽤 트랜잭션이 컸던 사이트에서 나타난 현상인데 오라클 디비와 연관된 어플 서버가 다운되어 SMON이 롤백을 하는데 6시간이 걸려도 롤백이 되지 않는 현상이 있었다.

롤백이 아직 되지 않았기 때문에 특정 테이블들이 row lock 상태여서 update가 되지 않아 업무를 진행할 수 없다는게 제일 큰 여파였다.

 

그런데 답답하게도 v$lock이나 v$fast_start_recovery 뷰에 참고할만한 정보가 없다는 특징도 있다.

세션이 예기치 못하게 끊겼을 경우 SMON은 OS의 프로세스를 정리하면서 언두 엔트리를 참고해 롤백하게 되는데

v$session에서는 이미 세션이 끊겼기에 정보가 없으나 OS의 process는 보이는 상황이라고 추정된다.

 

RAC 2node 환경이었는데 결국엔 DB를 shutdown abort하고 재시작한 후 lock이 풀렸음을 확인했다.

 

어쨋든 Cleanup이라는 과정을 SMON이나 PMON이 진행하는데 기본값으로 60초에 한번씩 _rollback_cleanup_entreis 라는 파라미터의 값만큼 언두 엔트리를 클린업하게 된다.

기본값이 20이기때문에 만약 1000개의 언두 엔트리를 정리해야 한다면 50분이 걸릴것이다.

문제였던 사이트는 6시간이 지나도 롤백이 완료가 되지 않았으므로 7200개 이상의 언두 엔트리가 롤백되고 있었음을 추측할 수 있다.

 

해결을 위해 _rollback_cleanup_entries 값을 2000정도로 증가시킬 예정이다. 재시작이 필요한 작업. 참고로 다른 사이트중에서 이 값을 10000으로 설정해 사용중인 곳도 있다.

Posted by neo-orcl
,