본문 바로가기

카테고리 없음

ORACLE 11g R2 (11201) Data Guard Rename Problem v1.0

ORACLE 11g R2 (11201) Data Guard Rename Problem v1.0

 

Date

Ver

Etc.

 

 

 

 

 

 

 

 

 

 

 

1.    Rename Problems on Data Guard (11.2.0.1.0)

Data Guard 11.2.0.1.0 (11g R2) Data Guard Rename 문제가 있다.

이 문제는 Active Standard Database 에서 문제가 된다.

 

문제의 내용은 수정된 Object Name Dictionary 에는 존재하지만 실제 사용시에는 존재하지 않는 것으로 판단해 발생한다.

 

해당 문제는 11.2.0.2.0 에서 수정되었다.

 

2.    Cases of Problem

DataGuard 환경에서 Rename 을 사용하는 경우 Standby 에 제대로 적용되지 않는 문제가 있다.

 

이런현상은 a 에서 b rename 을 했을 때 Primary 에는 b 만 존재하지만 Standby 에는 a, b 둘다 존재하는 경우도 있으며 a 에서 b rename 했을 때 Standby 에는 a access 가능하고 b 가 불가능한 경우가 있다.

 

3.    SCENARIO

SAMP 라는 테이블을 생성한다.

SAMP 테이블은 ID 라는 컬럼을 가지고 Number 타입이다.

SAMP 테이블의 데이터로 1,2,3 데이터를 가진다.

SAMP 테이블은 ID 컬럼에 대해 SAMP_IX 라는 Index 를 가진다.

 

위 구성에 대해 SAMP -> SAMP1 으로 RENAME 수행 후 다음의 내용을 PRIMARY / STANDBY 둘다 확인한다.

 

A.     Primay, Standby Alert log 상의 특이사항

B.     SAMP, SAMP1 의 테이블 존재여부

C.     DBA_TABLES, DBA_INDEXES, DBA_OBJECTS, DBA_SEGMENTS 에서 SAMP, SAMP1 의 존재여부

 

추가로 구성을 초기화 한 후 다음의 내용을 확인해보았다.

 

4.    Practice

SCENARIO 파트에서 이야기 한 대로 사전작업을 진행한다. ( in Primary Database )

 

SQL> desc samp             

ERROR:

ORA-04043: object samp does not exist

 

 

SQL> desc samp1

ERROR:

ORA-04043: object samp1 does not exist

 

 

SQL> create table samp(id number);

 

Table created.

 

SQL> insert into samp         

  2  select 1 from dual

  3  union all

  4  select 2 from dual

  5  union all

  6  select 3 from dual;

 

3 rows created.

 

SQL> commit;

 

Commit complete.

 

SQL> create index samp_ix on samp(id);

 

Index created.

 

SQL> select * from samp;

 

        ID

----------

         1

         2

         3

 

사전준비는 되었고 이제 Rename 하는 경우 발생하는 문제를 확인하겠다.

(그전에 standby 에 변경내역이 적용된 것을 확인하였다.)

 

SQL> alter table samp rename to samp1;

 

Table altered.

 

 

A.     Primay, Standby Alert log 상의 특이사항

아무런 특이 메시지가 없었다.

 

B.     SAMP, SAMP1 의 테이블 존재여부

<in Primary>

 

SQL> alter table samp rename to samp1;

 

Table altered.

 

SQL> desc samp

ERROR:

ORA-04043: object samp does not exist

 

 

SQL> desc samp1

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER

 

SQL> select * from samp;

select * from samp

              *

ERROR at line 1:

ORA-00942: table or view does not exist

 

 

SQL> select * from samp1;

 

        ID

----------

         1

         2

         3

 

<in Standby>

 

SQL> desc samp1

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER

 

SQL> desc samp

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER

 

SQL> select * from samp;

 

        ID

----------

         1

         2

         3

 

SQL> select * from samp1;

 

        ID

----------

         1

         2

         3

 

Rename 이후 desc / select 를 사용하여 객체를 확인하였다. 확인한 결과 Primary 는 아무 이상이 없지만 Standby 에는 old / new name 이 같이 존재하는 것을 알 수 있었다. 적어도 10분동안 이 현상에 대해서는 변화가 없었다.

 

C.     DBA_INDEXES, DBA_OBJECTS, DBA_SEGMENTS 에서 SAMP, SAMP1 의 존재여부

이 내용은 앞서 진행한 RENAME 작업 이후에 단순히 Dictionary 정보만 조회한 결과다.

<DBA_TABLES>

 

PRIMARY / STANDBY 에서 다음의 내용을 확인

 

SQL> select table_name from dba_tables

  2  where table_name like 'SAMP%';

 

TABLE_NAME

------------------------------

SAMP1

 

<DBA_INDEXES>

 

PRIMARY / STANDBY 에서 다음의 내용을 확인

 

SQL> select table_name,index_name from dba_indexes

  2  where table_name like 'SAMP%';

 

TABLE_NAME                     INDEX_NAME

------------------------------ ------------------------------

SAMP1                          SAMP_IX

 

 

<DBA_OBJECTS>

 

OBJECT_NAME               OBJECT_TYPE

------------------------- -------------------

SAMP1                     TABLE

SAMP_IX                   INDEX

 

 

SQL> desc samp;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER

 

SQL> desc samp1;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER

 

 

SQL> alter system flush shared_pool;

 

System altered.

 

SQL> desc samp;

ERROR:

ORA-04043: object samp does not exist

 

 

SQL> desc samp1;

 Name                                      Null?    Type

 ----------------------------------------- -------- --------------

ID                                                 NUMBER

 

<DBA_SEGMENTS>

 

SEGMENT_NAME         SEGMENT_TYPE

-------------------- ------------------

SAMP1                TABLE

SAMP_IX              INDEX

 

 

위 내용을 통해 얻어진 내용은 다음과 같다.

 

Rename 을 통해 Dictionary 상에 정보가 올바르게 수정된 것을 확인하였다.

하지만 실제 객체에 대해 접근을 시도하는 경우 새로 지정만든 이름을 사용못하였다. 그리고 이 같은 증상은 Shared pool Flush 할 때까지 유지되었다.

 

이는 Flush Shared pool 하기 전까지는 Active Standby Database 에서는 새로운 이름의 객체에 접근하지 못하는 상황이 벌어진다는 것이다.

 

그렇다고 해서 이를 해결하기 위해 Rename 을 할 때마다 flush shared pool 을 할 수도 없다.

 

Shared Pool 에는 Library Cache, Dictionary 영역이 있는데 이 영역을 초기화 한다는 것은 Dictionary 정보에 대해 latch 가 발생하며 SQL 파싱 정보가 모두 사라짐으로써 일시적인 Hard Parsing 증가를 유발한다.

 

쉽게 말해 순간적인 자원경합이 발생한다는 것이며 이는 원활한 서비스 운영과는 거리가 있다.

 

5.     Conclusion

결과적으로 Rename 과 관련해 문제가 있다는 것이고 이로 인해 같은 테이블에 접근하는 테이블을 가정했을 때 Primary Database 에서는 멀쩡히 수행되는 것이 Standby Database 에서는 에러가 발생할 수 있다.

 

Flush Shared Pool 은 득보다 실이 많을 수 있다. (메모리 단편화와 관련해 사용하는 경우는 예외가 될 수 있다.) 때문에 이 방법은 사용하지 않는다고 보며 근본적인 해결은 11.2.0.2 로의 패치 적용이다.

 

6.     References