Oracle

게시글 보기
작성자 유건데이타 등록일 2015-06-22
제목 ORA-1578 조치를 위한 event 10231 ORA-01578
ORA-1578 조치를 위한 event 10231
========================================================================

table access 시 ora-1578이 발생하는 경우, 이미 다른 bulletin(10062, 11885)에
정리된 것과 같이 corrupt된 block을 제외한 나머지 block의 data를 index
search를 통해 조회하여 다른 table로 copy하는 방법이 사용된다.
그런데, 만약 ora-1578을 만난 table에 index가 전혀 없다면 이 자료에서 설명할
event 10231을 사용할 수 있다.

이 event는 V7, V8 모두 적용 가능하다.

1. event 10231의 효과
~~~~~~~~~~~~~~~~~~~~~

event 10231은 full table scan 시에 corrupt된 block을 skip할 수 있도록
해주는 event이다. block corruption을 나타내는 ora-1578의 조치 방법으로
이용될 수 있으나, 이 event가 효과를 발휘하는 corruption의 형태가 모든 것을
포함하는 것은 아니기 때문에 이 event를 사용하여도 여전히 ora-1578이 발생할 수
있다.
대부분의 ora-1578에 대해서 corrupt된 block을 skip하는 것이 확인되었으나,
적용되지 않는 경우에 대해서 오라클이 보장하지는 않는다.

앞에서 설명한 바와 같이 이 event는 full table scan 시에 효과가 있으므로,
ora-1578이 발생하면 이것을 이용하여 corrupt된 block을 포함하는 table을
export 받아내거나, "create table as select" 구문을 이용하여 다른 table로
data를 copy할 수 있다.

corrupted된 block 내의 data는 잃게 된다.

Oracle 7.1.X version까지는 이 event가 물리적인 corruption을 제외한 'soft
corrupt' block에만 효과가 있었으나, Oracle 7.2 이상부터는 (V8포함) media
corruption을 포함한 다양한 형태의 corruption에 대해서 효과를 가지게 되어
더욱 유용해졌다.
그러나, 여전히 모든 case를 cover하는 보장은 되지 못한다.

[주의] 이 event는 data dictionary table에 대해서는 사용할 수 없다.


2. event 설정 및 사용 방법
~~~~~~~~~~~~~~~~~~~~~~~~~~

이 event는 disk로부터 읽는 block에만 효과가 있다. corrupt된 block이 memory,
즉, cache buffer 내에 이미 올라와 있다면 바라는 효과를 얻을 수 없기 때문에
일단 이 parameter를 사용하기 전에는 db를 shutdown시키는 것이 권고된다.

event를 사용하는 절차를 정리하면 다음과 같다.

(1) database shutdown

(2) cd $ORACLE_HOME/dbs
initSID.ora (SID는 env | grep SID하여 확인) file 내에 다음과 같이
event를 지정하는 parameter를 추가한다. 위치는 관계없다.

event="10231 trace name context forever, level 10"

(3) 다음과 같이 restrict mode로 startup하고, parameter가 설정되었는지
확인한다. startup 시 parameter error가 발생하면 위의 지정에서
콤마와 같은 부분이 문제가 있는지 다시 한번 확인한다.

SVRMGR>startup restrict;
SVRMGR>show parameter event

NAME TYPE VALUE
------------------------- ------- ------------------------------
event string 10231 trace name context forev

(4) full table scan operation을 이용하여 table로 부터 data를 꺼낸다.
예를 들어 scott user의 dept에서 ora-1578이 발생한 것을 가정하고,
다음과 같은 조치가 가능하다.


os> exp scott/tiger file=test.dmp tables=dept

SQL> create table test as select * from dept;


3. data 발췌 후 작업
~~~~~~~~~~~~~~~~~~~~

일단 export나 create table as select 문장의 수행으로 인해 data를 얻었으면,
다음과 같이 작업한다.

(1) initSID.ora 화일에서 event를 지정한 line을 제거한다.

(2) db를 shutdown시키고 다시 startup시킨다.

(3) show parameter event 를 수행하여 제거되었는지 확인한다.

(4) corrupt된 table을 drop시키거나 rename시키고, table을 재생성한다.
즉, 앞에서 예를 든 경우의 후속 작업은 각각 다음과 같다.


SQL> drop table dept; (혹은 SQL>rename table dept to test;)

os> imp scott/tiger file=test.dmp tables=dept

이 때, space에 여유가 있다면 drop보다는 rename한 후 나중에
import 결과를 확인하고 drop하는 것을 권고한다.
단, rename을 하게 되면 index 등은 rename이 안 되므로 import 시
index, constraint 등은 따로 생성하여야 한다.


SQL> drop table dept;
SQL> rename test to dept;

(5) import 전에 rename한 경우나 create table as select를 이용하면,
index, constraint, trigger 등은 재생성하여야 한다.
또한, 필요한 권한을 grant하여 준다.
Comment
등록된 코멘트가 없습니다.