ORACLE 11g R2 (11201) Data Guard Rename Problem v1.0
|
|
|
|
|
|
|
|
|
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 가 불가능한 경우가 있다.
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