OS환경 : Oracle Linux6.8(64bit)
DB 환경 : Oracle Database 11.2.0.4
쿼리 : 테이블 SELECT, UPDATE 도중 파티션 exchange 변경 시 발생하는 현상 확인
ALTER TABLE EXCHANGE PARTITION은 파티션 테이블을 일반 테이블로,
또는 파티션 되어있지 않은 테이블을 파티션 테이블로 변경시킬 때 사용함
테스트 시나리오
일반 테이블 생성
1 2 3 | SQL> DROP TABLE TEST PURGE; CREATE TABLE TEST(ID NUMBER, COL1 VARCHAR2(10), COL2 VARCHAR2(10)); |
파티션 테이블 생성
1 2 3 4 5 6 7 8 9 | SQL> DROP TABLE PART_TEST PURGE; CREATE TABLE PART_TEST (ID NUMBER, COL1 VARCHAR2(10), COL2 VARCHAR2(10)) PARTITION BY RANGE(ID) (PARTITION TEST_P1 VALUES LESS THAN (1000000), PARTITION TEST_P2 VALUES LESS THAN (2000000), PARTITION TEST_P3 VALUES LESS THAN (3000000) ); |
첫번째 파티션에 들어갈 데이터 생성(999999건)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SQL> DECLARE TYPE tbl_ins IS TABLE OF TEST%ROWTYPE INDEX BY BINARY_INTEGER; w_ins tbl_ins; BEGIN FOR i IN 1..999999 LOOP w_ins(i).ID :=i; w_ins(i).COL1 :=300000; w_ins(i).COL2 :=99; END LOOP; FORALL i in 1..999999 INSERT INTO TEST VALUES w_ins(i); COMMIT; END; / |
데이터 확인
1 2 3 4 5 | SQL> SELECT MAX(ID) FROM TEST; MAX(ID) ---------- 999999 |
통계정보 수집
1 2 | EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','TEST'); EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','PART_TEST'); |
SELECT 시 EXCHANGE 테스트
세션1
select.sh 파일 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $ vi select.sh sqlplus "scott/tiger"<< EOF select * from TEST; union select * from TEST; union select * from TEST; union select * from TEST; union select * from TEST; union select * from TEST; union select * from TEST; union select * from TEST; union select * from TEST; union select * from TEST; exit EOF |
실행 권한 부여
1 | $ chmod +x select.sh |
아래 while 문 실행과 동시에 세션 2, 3구문 실행
select 반복 쉘 실행
1 | $ while true; do sleep 1; nohup ./select.sh; done |
세션2
EXCHANGE 실행
1 2 3 | SQL> ALTER TABLE PART_TEST EXCHANGE PARTITION TEST_P1 WITH TABLE TEST; |
정상수행됨.
세션3
lock 모니터링
lock 없음
세션4
alert log
이상 없음
다음 테스트를 위해 테이블 초기화
EXCHANGE 실행
1 2 3 | SQL> ALTER TABLE PART_TEST EXCHANGE PARTITION TEST_P1 WITH TABLE TEST; |
UPDATE 시 EXCHANGE 테스트
세션1
update 구문 실행
1 | SQL> update test set COL2 = 300000; |
세션2
EXCHANGE 실행
1 2 3 4 5 | SQL> ALTER TABLE PART_TEST EXCHANGE PARTITION TEST_P1 WITH TABLE TEST; * ERROR at line 1: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired |
에러 발생함
세션3
lock 모니터링
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | set pages 1000 set lines 200 col object_name for a10 col machine for a10 col TERMINAL for a20 col PROGRAM for a30 select distinct x.session_id, a.serial#,d.object_name,a.machine,a.terminal,a.program, a.logon_time from gv$locked_object x, gv$session a, dba_objects d where x.session_id = a.sid and x.object_id = d.object_id order by logon_time; SESSION_ID SERIAL# OBJECT_NAM MACHINE TERMINAL PROGRAM LOGON_TIM ---------- ---------- ---------- ---------- -------------------- ------------------------------ --------- 55 151 TEST orcldb pts/2 sqlplus@orcldb (TNS V1-V3) 08-JAN-19 |
세션 하나 확인됨
세션4
alert log 확인
1 2 3 4 5 6 7 8 9 10 | Tue Jan 08 16:22:23 2019 Thread 2 advanced to log sequence 220 (LGWR switch) Current log# 4 seq# 220 mem# 0: /dev/raw/raw15 Tue Jan 08 16:22:25 2019 Archived Log entry 487 added for thread 2 sequence 219 ID 0x2712c937 dest 1: Tue Jan 08 16:22:41 2019 Thread 2 advanced to log sequence 221 (LGWR switch) Current log# 5 seq# 221 mem# 0: /dev/raw/raw16 Tue Jan 08 16:22:43 2019 Archived Log entry 488 added for thread 2 sequence 220 ID 0x2712c937 dest 1: |
log switch 발생하는것 외에는 특이사항 없음
세션1에서 commit 후 바로 세션2 재실행 시 exchange됨
결론 : select 도중 exchange 시 특이사항 없음, update 도중 exchange 시 ORA-00054 발생
참조 : http://kosate.tistory.com/83
'ORACLE > Admin' 카테고리의 다른 글
오라클 ATP 접속하기(Autonomous Transaction Processing) (7) | 2019.01.10 |
---|---|
VIEW를 만들어도 원본테이블의 INDEX를 제대로 탈까? (0) | 2019.01.10 |
오라클 bdump 로그 정리 방법 (0) | 2019.01.07 |
asmca silent mode 디스크 생성, 추가, 삭제 (0) | 2018.12.27 |
ASM 디스크 추가 및 삭제하기 (0) | 2018.12.27 |