1. TABLE Tablespace MOVE / INDEX Tablespace MOVE (Rebuild)
-- TABLE Tablespace MOVE
ALTER TABLE ISP.VCT_GOT_I MOVE TABLESPACE TSKG01DT;
-- INDEX Tablespace MOVE(rebuild)
-- TABLE Tablespace MOVE 하면 INDEX 가 invalid 로 바뀜
ALTER INDEX ISP.PK_VCT_GOT_I REBUILD TABLESPACE TSKG01IX;
ALTER TABLE ISP.VCT_GOT_I MOVE PARTITION PT_L202210 TABLESPACE TSKG01DT;
ALTER INDEX ISP.PK_VCT_GOT_I REBUILD PARTITION PT_L202210 TABLESPACE TSKG01IX;
서브파티션 일 경우
ALTER TABLE ISP.ACT_GOT_I MOVE SUBPARTITION P_200801_SP2_000 TABLESPACE TSKG01DT;
▶파티션테이블, 인덱스에서 DESCRIPTION 을 보면 테이블스페이스가 AS-IS 로 보일 때 DEFAULT ATTRIBUTES TABLESPACE 를 수동으로 변경한다.
ALTER TABLE ISP.VCT_GOT_I MODIFY DEFAULT ATTRIBUTES TABLESPACE TSKG01DT;
ALTER INDEX ISP.PK_VCT_GOT_I MODIFY DEFAULT ATTRIBUTES TABLESPACE TSKG01IX;
오늘은 오라클 RAC 특징에 있어서 가장 중요한 cache fusion에 대해서 알아보겠다. 그러면 그 전에 DB Buffer cache에 대해서 알아야 한다.
Node
하나의 DB에 연결된서버를 의미한다. 2 Node RAC는 2대의 물리적인 서버가 하나의 DB에 연결된 경우이다.
Instance
각각의 Node는 각각의 Instance를 가진다. 하나의 Instance는 여러 Node에 중복 존재할 수 없지만 하나의 Node는 여러개의 Instance로 구성할 수 있다.
SGA
하나의 Instance는 반드시 하나의 SGA를 가지며 SGA는 Shared Pool,DB Buffer Cache, Redo Log Buffer 등으로 구성된다.
Cache Fusion과 DB Buffer Cache
DB Buffer Cache는 유저가 요청한 SQL문을 수행하기 위해서 필요한 Data Block을 Disk로부터 메모리로 올리는(Caching) 하는 영역이다. Cache Fusion에서 DB Buffer Cache가 중요한 이유는 Cache Fusion이 서로 다른 Instance의 DB Buffer Cache에서 Block을 이동시키는 부분에서 발생하기 때문이다.
Cache Fusion
Cache Fusion은 OPS(Oracle Parallel Server)의 Block Transformation의 문제를 극복하기 위해 나타난 아키텍쳐이며 이를 통해 Oracle RAC는 성능적으로 안정성을 갖추게 되었다.
*Block Transformation
특정 Instance에 존재하는 Block을 다른 Instance에서 액세스하기 위해서 해당 블럭을 공유 Storage에 write한 후, 그 Block을 호출한 Instance의 DB Buffer Cache로 캐싱하여 Data Block을 다른 Node로 이동시키는 방식이다.
하지만 각각의 Instance에서 많은 작업이 수행되고, 각각의 Instance 사이에서 이동하는 Block이 많으면 성능 저하가 발생한다. 이 이유로 OPS는 사라지게 되었다.
Cache Fusion은 아래와 같은 방식으로 수행된다.
① Instance 2에 접속한 A 프로세스는 Instance 1에 존재하는 1번 Block을 액세스하기 위해 호출한다.
② Instance 1에 존재하는 1번 Block은 Instance 2의 호출에 응답하기 위해 Instance 2의 SGA의 DB Buffer Cache로 이동해야 한다. 이동을 위해 공유 Storage에 존재하는 DB를 이용하지 않고 Instance 사이의 Interconnect를 이용한다.
③ Interconnect를 이용하여 Instance 2로 캐싱된 1번 Block을 A 프로세스가 액세스할 수 있게 된다.
Cache Fusion의 목적
Block이 특정 Node의 DB Buffer Cache에 로드되어 있다면 Disk I/O가 발생하지 않기 때문에 Block 이동을 빠르게 처리할 수 있어서 Oracle RAC의 성능 향상에 가장 중요한 아키텍쳐이다.
Cache Fusion의 구성 요소
•GRD(Global Resource Directory)
RAC에서 Global Resource를 관리한다. Cluster의 동기화를 위해서 Cluster 내의 Resource 정보들(Resource Master, Resource Holder)을 저장한다.
*Resource Master : 특정 Resource의 Master를 지칭한다. 특정 Global Resource는 반드시 하나의 GRD에서 최신 정보를 관리한다.
*Resource Holder : 특정 Resource의 최종 버전을 가지고 있는 Node를 의미한다.
•GCS(Global Cache Service)
Data의 일관성 및 무결성을 유지하는 서비스로, DB Buffer Cache 동기화에 대한 Global 정보를 저장한다. 즉, Block에 대한 Lock 정보를 관리한다.
•GES(Global Enqueue Service)
DB Lock에 대한 정보를 관리하는 서비스로 Block 이외의 Lock 정보를 저장한다. 즉, Enqueue Lock, Library Cache Lock, Row Cache Lock 등의 정보를 관리한다.
Oracle RAC는 여러 개의 Instance가 하나의 Database를 엑세스 할 수 있다. 이는 application에서 접속할 수 있는 통로는 여러 개이며 Database는 하나인 형태이다.
Oracle RAC = N개의 Instance + 1개의 Database
그리고 RAC로 연결된 N개의 Instance에서동일한 Datafile을 공유하여 엑세스한다. 하지만 Database 작업에 사용할 수 있는 CPU나 메모리 등의 Resource는 서로 공유하지 않으며해당 Node의 Resource만을 사용한다.
Cluster
두 개 이상의 독립된 서버들과 Disk를 하나로 연결하는 기법이다. 사용자가 Cluster로 구성된 서버들 중 어느 서버에 접속해도 동일한 Disk를 엑세스하게 되므로 하나의 서버 또는 하나의 Disk에 연결하는 것처럼 인식한다.
Oracle RAC는Oracle Clusterware를 사용하여 어느 Instance에 접속하여도 사용자에게 동일한 data를 실시간으로 조회, 변경할 수 있는 기능을 제공한다. 또한 Oracle Clusterware를 사용하면높은 처리량과 고가용성을 보장할 수 있다.
Clusterware의 자세한 특징은 다음에 설명하도록 하겠다.
단일 Instance vs Oracle RAC
단일 Instance 환경에서와 마찬가지로 Oracle RAC 환경의 각 Instance에는 각자의 SGA와 백그라운드 프로세스가 존재한다. 그러나 모든Datafile과 Control File은 모든 인스턴스에서 동일하게 엑세스할 수 있어야 하므로 공유 Storage에 위치해야 한다.
그리고 각 Instance에는 고유한Online Redo Log File이 존재한다. Online Redo Log File은 자신이 속한 Instance에 의해서만 기록될 수 있다. 그러나 online redo log file도 인스턴스 복구 시에는 다른 인스턴스에서 엑세스할 수 있어야 한다. 따라서 Online Redo log file도 공유 storage에 저장되어야 한다(redo log group을 공유하고, redo log file에 쓰는 것은 개별적으로 쓴다).
*Data 정합성
Oracle RAC 환경의 Instance는 여러 Instance에서 동시에 동일한 data를 엑세스하는 구조로 data를 공유한다. 동일한 data를 여러 인스턴스가 읽어도 문제는 없지만, 동일한 data에 대해 여러 인스턴스가 동시에 수정, 삽입 등을 하는 경우 data 무결성 문제가 발생할 수 있다. 그래서 Oracle RAC은 Cache lock과 Cache Fusion 등을 사용하여 이를 보장한다. 자세한 것은 다음에 설명하겠다.
Oracle RAC 구성요소
Oracle Grid Infrastructure
Oracle RAC는 Grid Infrastructure에서 제공하는 Oracle Clusterware의 기반하에 여러 Database 서버를 묶어서 하나의 시스템처럼 동작하도록 지원한다.
*GI는 Oracle Custerware 및 ASM으로 구성되며 운영체제와 긴밀하게 통합된 소프트웨어 계층이다.
- Clusterware 설치 : RAC 구성을 위해 필요한 소프웨어이며 오라클 설치 계정 이외 별도의 계정을 생성하여 설치하는 것을 권장한다.
- Clusterware의 OS 계정 : 일반적으로 GI와 ASM을 소유하는 전용 OS 계정인 grid 계정을 사용한다.
공유 Storage
각 Instance는 공유 Storage를 통해 물리적인 data를 공유하며 database에서 사용하는 ASM 및 CFS(Cluster File System)를 구성한다.
공유 Storage에서 Database File은 모든 Node에 동등하게 동시에 엑세스할 수 있어야 한다. 물론 Storage에서 생성된 Disk는 공유 모드가 활성화 되어야 한다.
Oracle RAC Network 구성 요소
Public IP
각 Node에 대한 고유한 IP로 서버 주소와 동일하다. 일반적으로 Node 관리 목적으로 사용된다.
Service IP
클라이언트에서 Database 서버의 Public IP를 사용하여 접속할 경우 장애가 발생한 Node에서 세션을 다른 Node로 옮기는데 많은 시간이 걸릴 수 있다. 이때 VIP(Virtual IP)를 사용하여 클라이언트가 node에 장애가 발생했다는 것을 신속하게 인식할 수 있도록 함으로써 다른 Node로 재연결 시간을 향상시킬 수 있다.
SCAN(Single Client Access Name)
GNS 및 DNS를 사용하여 정의할 수 있다. SCAN을 이용할 경우 Cluster 내 서버 수에 관계없이 Load balancing 및 고가용성을 고려하여 3개의 IP 주소를 권장한다.
Private IP(Cluster Interconnect)
Cluster Node 별 통신을 위한 IP로 다음과 같은 목적으로 사용한다.
-Resource 동기화를 위해 Cluster에서 Heartbeat 프로세스를 위해서 사용하는 통신 경로
-Instance에서 다른 Instance로 data를 전송(cache fusion)하는 용도로 사용
Oracle Kernal 구성 요소
오라클 커널의 구성요소는 RAC database의 각 인스턴스에 대한 추가 백그라운드 프로세스의 집합(GRD, GCS, GES)이다. 자세한 설명은 cache fusion에서 설명하겠다.
SELECT a.table_name , TO_NUMBER ( dbms_xmlgen.getxmltype( 'SELECT COUNT(*) c FROM ' || a.table_name ).Extract('//text()') ) * COUNT (*) cnt FROM user_tables a , user_tab_columns b WHERE a.table_name = b.table_name GROUP BY a.table_name;
SELECT TABLE_NAME
, TO_NUMBER(
EXTRACTVALUE(
XMLTYPE(
DBMS_XMLGEN.GETXML('select count(*) c from '||TABLE_NAME))
- RAC DRM Remastering 기능을 끄는게 좋음. Remastering 에 따른 오버헤드가 너무 크다고 알려져 있음. - 1000번이상 다른쪽 노드에서 Writing이 발생하면 Mastering 정보를 옮기는 Remastering이 발생하는데 이때 모든 gc request 가 중단되기 때문에 느려지는 현상이 발생됨.
_optimizer_use_feedback (true) => false
- 11gR2 NF 파라메타 - Optimizer가 정확한 cardinality를 계산하지 않을 경우 새로운 실행계획을 수립하는 기능 - 갑작스런 plan 변경 및 잘못된 실행계획수립으로 인해 false 권고 (MOS 문서 참조 #8521689.8, #13648166.8, #13454409.8)
- Create table 수행시 즉시로 table을 생성할 지를 결정 - true(default)로 설정시 library cache: mutex X, exp/imp에 포함되지 않는 문제, ora-600으로 인해 false 권고 (#1352678.1 , #1590806.1, #1352678.1) - 주의 : false 설정 이전에 만든 table은 parameter변경에도 영향을 받지 않으므로 SQL> alter table "테이블" move 또는 SQL> alter table "테이블" allocate extent; 를 수행해야 함. (#1178343.1)
- 12cR1 NF 파라메타 - 12cR2 의 경우, optimizer_adaptive_plans 파라메타로 제어해야 함. (12cR2에서 optimizer_adaptive_features 는 없어졌음) - Plan 이 매번 바뀔 수 있기 때문에 false 로 권고.. 하지만, 이 기능이 원래 매우 괜찮은 기능이라.. 이 좋은 New Feature를 꺼버리는게 맞을지는 좀 논란의 여지가 있음.
- 12cR2 NF 파라메타 - 12cR1 의 경우, optimizer_adaptive_features 파라메타를 사용함. ( optimizer_adaptive_features = optimizer_adaptive_plans + optimizer_adaptive_statistics ) - Plan 이 매번 바뀔 수 있기 때문에 false 로 권고.. 하지만, 이 기능이 원래 매우 괜찮은 기능이라.. 이 좋은 New Feature를 꺼버리는게 맞을지는 좀 논란의 여지가 있음.
parallel_adaptive_multi_user (true) => false
- 요청된 parallel degree 에 대해서 query startup time 시의 system load 에 근거해서 degree 를 축소하는 기능. - 문제는 이 파라메타로 인해 parallel 프로세스가 의도한대로 충분히 안뜨기 때문에 false 로 권고. - DOP 를 의도한대로 유지하면서 수행되어야 할 Batch Job 등을 운영하는 시스템의 경우 System Resource가 여유가 있다면 False로 운영할 것을 권장함.
parallel_force_local (false) => true
- RAC에서 인스턴스간에 parallel 처리를 허용할지 여부. 과도한 캐시퓨전에 의한 성능저하 방지. - 또한, 미해결된 버그 (#1914119.1)로 인해 false 권고.
shared_pool_size => <적절한 값>
- sga_target, memory_target 등을 사용하는 경우 자동으로 Oracle Memory(SGA)를 조정하기 때문에 이 파라메타를 세팅하지 않는 경우가 있는데, 그래도 세팅하는게 좋습니다. - 초기 shared pool 의 크기를 지정합니다. (디폴트는 0) - memory_target 이나 sga_target 을 지정했더라도 이 파라메타를 사용함으로써 최소 shared pool을 확보하여 데이터베이스를 더 안정적으로 만들어줍니다. - 이 파라메타를 세팅했다고 해서 sga_target 을 없애버릴 필요는 없음. 함께 지정.
large_pool_size => <적절한 값>
- 위 shared_pool_size 와 마찬가지 경우입니다. - 초기 large pool 의 크기를 지정합니다. - memory_target 이나 sga_target 을 지정했더라도 이 파라메타를 사용함으로써 최소 large pool을 확보하여 데이터베이스를 더 안정적으로 만들어줍니다. - large pool은 MTS 또는 병렬처리시에 사용됩니다. (병렬처리가 많은 경우 2GB 정도로 설정)
streams_pool_size => 200M 이상
- Streams 기능을 사용하지 않더라도 Datapump 사용시 error 및 성능저하에 대비해 200M이상 설정을 권고하고 있음. (MOS 문서 참조 #1596645.1)
sga_target, memory_target
- sga_target 은 shared_pool_size, large_pool_size, db_cache_size 등을 자동으로 조절해주는 10g 신기능입니다. - memory_target 은 sga_target 의 기능 + pga_aggregate_target 값까지 자동으로 조절해주는 11g 신기능입니다. - 하지만, 이들 파라메타가 메모리값들을 자동으로 조절하는(resize) 순간에 성능저하가 발생할 수 있다고 하여 사용하지 말라는 얘기가 있습니다. - 또, 어떤 글을 보면 memory_target 만 설정하지 말고, sga_target 은 그냥 사용하는 것을 권장하기도 하고 해서 논란의 여지가 있습니다.
- ASM의 경우, 24G for 2 socket servers (ASM의 경우 소켓에 따라 권고하는 메모리 사이즈가 있음. 아마 디폴트가 이걸로 되어 있을듯...) - DB의 경우는 보통 sga_target 을 적당히 잡는데, 전체 physical memory의 50%가 안넘도록 세팅.
오라클 DB 파라메타는 매우 많습니다. 세어보지는 않았지만 히든파라메타까지 합치면 100개는 족히 넘을겁니다.
그 많은 파라메타들을 다 언급하지 않은 이유는대부분은 디폴트로 놓고 쓰는 것이 좋기 때문입니다.
가끔 어떤 곳은 히든파라메타만 20여개씩 있는 곳도 있습니다. 오래전에 특정 버그로 인해 설정했던 파라메타를 그대로 놔뒀기 때문입니다. 보통 DBMS를 버전업하거나 패치셋을 적용하고 나면 불필요한 히든 파라메타들은 정리해야 하는데, 보통 아무도 안 건들기 때문입니다. 이런 경우에는 설정된 파라메타를 없애도 되는지 쉽게 판단하기 어렵죠~
Oracle ACS 엔지니어 서비스를 받는게 속 편합니다. ACS 서비스 중에 파라메타 진단서비스가 있으니까요~~
[ Oracle Database Enterprise Edition 11g 기준 ]
- 파라메타에 (괄호) 안의 값은 원래 안건드리면 Default로 가지고 있는 값입니다.
_add_col_optim_enabled (true) => false
- column add 시 dictionary만 update 하고 이후 insert시 해당 컬럼이 생성되게 하는 기능 - Wrong result 버그로 인해 false 권고 (MOS 문서 #1492674.1, #19183343.8)
- RAC DRM Remastering 기능을 끄는게 좋음. Remastering 에 따른 오버헤드가 너무 크다고 알려져 있음. - 1000번이상 다른쪽 노드에서 Writing이 발생하면 Mastering 정보를 옮기는 Remastering이 발생하는데 이때 모든 gc request 가 중단되기 때문에 느려지는 현상이 발생됨.
_gc_bypass_readers (true) => false
- ~ 11.2.0.3 버전까지만 해당. 11.2.0.4 는 패치되었음. - 11gR2 NF 파라메타 - RAC에서 디스크에서 데이터를 읽는대신 다른 노드의 Instance에서 데이터를 읽어옮으로써 성능을 개선하는 기능 - Hang 및 ORA-00600 에러가 발생할 수 있으므로 false 로 세팅할 것을 권고 (MOS 문서 참조 #13787307.8, #13718476.8, #13807411.8, #13614906.8) - 각각의 버그에 대해 Interim Patch가 있으며, DB에 이를 적용한 경우는 상관없음.
- bind variable에 따라 Cardinality의 변동이 클 경우, cursor sharing을 사용할 지 결정하는 기능 - 과도한 Mutex Wait 발생으로 인해 false 로 세팅할 것을 권고 (MOS 문서 참조 #11657468.8) - Mutex 문제는 11.2.0.3 에서 패치되었으나, CPU 과다 사용, Memory Leak 문제 등이 여전히 있음. (MOS 문서 참조 #14772891.8, #2118467.1)
_optimizer_use_feedback (true) => false
- 11gR2 NF 파라메타 - Optimizer가 정확한 cardinality를 계산하지 않을 경우 새로운 실행계획을 수립하는 기능 - 갑작스런 plan 변경 및 잘못된 실행계획수립으로 인해 false 권고 (MOS 문서 참조 #8521689.8, #13648166.8, #13454409.8)
_use_adaptive_log_file_sync (true) => false
- ~ 11.2.0.3 버전까지만 해당. 11.2.0.4 는 패치되었음. - 11g New Feature 로 LGWR 성능개선을 위해 발표된 기능이나 log file sync 의 성능저하 유발시킴으로 FALSE 권고 (MOS 문서 참조 #1462942.1, #13707904.8, #13074706.8)
- Create table 수행시 즉시로 table을 생성할 지를 결정 - true(default)로 설정시 library cache: mutex X, exp/imp에 포함되지 않는 문제, ora-600으로 인해 false 권고 (#1352678.1 , #1590806.1, #1352678.1) - 주의 : false 설정 이전에 만든 table은 parameter변경에도 영향을 받지 않으므로 SQL> alter table "테이블" move 또는 SQL> alter table "테이블" allocate extent; 를 수행해야 함. (#1178343.1)
parallel_adaptive_multi_user (true) => false
- 요청된 parallel degree 에 대해서 query startup time 시의 system load 에 근거해서 degree 를 축소하는 기능. - 문제는 이 파라메타로 인해 parallel 프로세스가 의도한대로 충분히 안뜨기 때문에 false 로 권고. - DOP 를 의도한대로 유지하면서 수행되어야 할 Batch Job 등을 운영하는 시스템의 경우 System Resource가 여유가 있다면 False로 운영할 것을 권장함.
parallel_force_local (false) => true
- RAC에서 인스턴스간에 parallel 처리를 허용할지 여부. 과도한 캐시퓨전에 의한 성능저하 방지. - 또한, 미해결된 버그 (#1914119.1)로 인해 false 권고.
shared_pool_size => <적절한 값>
- sga_target, memory_target 등을 사용하는 경우 자동으로 Oracle Memory(SGA)를 조정하기 때문에 이 파라메타를 세팅하지 않는 경우가 있는데, 그래도 세팅하는게 좋습니다. - 초기 shared pool 의 크기를 지정합니다. (디폴트는 0) - memory_target 이나 sga_target 을 지정했더라도 이 파라메타를 사용함으로써 최소 shared pool을 확보하여 데이터베이스를 더 안정적으로 만들어줍니다. - 이 파라메타를 세팅했다고 해서 sga_target 을 없애버릴 필요는 없음. 함께 지정.
large_pool_size => <적절한 값>
- 위 shared_pool_size 와 마찬가지 경우입니다. - 초기 large pool 의 크기를 지정합니다. - memory_target 이나 sga_target 을 지정했더라도 이 파라메타를 사용함으로써 최소 large pool을 확보하여 데이터베이스를 더 안정적으로 만들어줍니다. - large pool은 MTS 또는 병렬처리시에 사용됩니다. (병렬처리가 많은 경우 2GB 정도로 설정)
streams_pool_size => 200M 이상
- Streams 기능을 사용하지 않더라도 Datapump 사용시 error 및 성능저하에 대비해 200M이상 설정을 권고하고 있음. (MOS 문서 참조 #1596645.1)
sga_target, memory_target
- sga_target 은 shared_pool_size, large_pool_size, db_cache_size 등을 자동으로 조절해주는 10g 신기능입니다. - memory_target 은 sga_target 의 기능 + pga_aggregate_target 값까지 자동으로 조절해주는 11g 신기능입니다. - 하지만, 이들 파라메타가 메모리값들을 자동으로 조절하는(resize) 순간에 성능저하가 발생할 수 있다고 하여 사용하지 말라는 얘기가 있습니다. - 또, 어떤 글을 보면 memory_target 만 설정하지 말고, sga_target 은 그냥 사용하는 것을 권장하기도 하고 해서 논란의 여지가 있습니다.
- ASM의 경우, 24G for 2 socket servers (ASM의 경우 소켓에 따라 권고하는 메모리 사이즈가 있음. 아마 디폴트가 이걸로 되어 있을듯...) - DB의 경우는 보통 sga_target 을 적당히 잡는데, 전체 physical memory의 50%가 안넘도록 세팅.