일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- bash
- perl + 정규표현식
- fdisk
- 연산자
- sqlplus
- oracle install
- rac
- grid
- perl string
- Unix
- RHEL4
- perl one-liner
- solaris
- dba
- Oracle RAC
- oracle
- Network
- 오라클
- Linux
- SQL
- mariaDB
- memory
- PERL
- MySQL
- prompt
- patch
- solaris network
- php5
- command & perl
- cygwin
- Today
- Total
DATA 전문가로 가는 길
[Admin] Oralce 파라미터 설정 자동 가이드(audit_trail, processes, archive log directory, _diag_daemon, memory_target) 본문
[Admin] Oralce 파라미터 설정 자동 가이드(audit_trail, processes, archive log directory, _diag_daemon, memory_target)
EstenPark 2019. 8. 16. 12:13오라클을 구축 후 운영단계에서 퍼포먼스 튜닝을 진행해야 합니다.
Oracle 11g 이상 또는 Single 설치에서만 진행 하시기 바라며, 파라미터는 반드시 백업 받고 진행 해주시기 바랍니다.
파라미터 적용 시 DB 종료가 필요하니 DB 종료 가능 여부도 같이 확인 하시기 바랍니다.
1. 주요 변경 사항
audit_trail
- 주로 감사(Audition)에서 활용되며, 데이터베이스 작업을 모니터링, 기록을 수집하는 기능입니다.
- 모든 추척 내용을 감사 로그로 기록하기 때문에 시스템의 속도를 저하 시킵니다.
processes
- 프로세스를 변경하기 위해서 일반적으로 "processes" 파라미터 값을 변경 합니다.
- 프로세스는 기본적으로 150으로 되어있지만, 운영 하다보면 점점 늘어나기 때문에 표준을 1000 기준으로 합니다.
log_archive_dest_1
- archive log mode를 확인해서 Default Directory일 경우 변경 합니다.
_diag_daemon
- 분석 데몬의 자동 시작 유무 결정하는 것이며, Diagnosability Daemon은 process와 instance failure에 관련한 진단 정보를 포착해서 systemstate dump를 생성하는 역할을 합니다.
memory_target
- 총 메모리 량을 지정하는 파라미터 입니다.
- memory_target PGA 및 SGA 메모리를 자동으로 조정 해주는 역할 합니다.(11g 부터 가능)
- memory_target, memory_max_target 동일하게 사이즈를 설정하는 게 좋습니다.
2. Oracle Parameter check PL/SQL
- 전체 운영체제에 존재하는 메모리 사이즈를 확인 후 최소 40~60% 오라클 메모리 사이즈를 지정해주시기 바라며, 해당 사이즈에 맞게 변경된 출력 결과를 얻게 됩니다.
SPOOL /tmp/Parameter_Result.txt /* 경로는 운영체제 환경에 맞게 조정 해주시기 바랍니다. */ SET LINE 100 SET SERVEROUTPUT ON DECLARE IN_DB_MEMORY NUMBER; V_DB_MEMORY NUMBER; V_VERSION VARCHAR2(100); V_PAM_FILE VARCHAR2(100); V_AUDIT_RS VARCHAR2(100); V_PROCESS_RS NUMBER; V_AR_RS VARCHAR2(100); V_AR_DIR_RS VARCHAR2(100); V_MR_RS NUMBER; V_MR_REC NUMBER; V_DIAG_DAEMON VARCHAR2(100); V_MR_RT_10 NUMBER := 0.7; V_MR_RT_11 NUMBER := 0.8; /*SGA_MAX_TARGET 비율*/ BEGIN DBMS_OUTPUT.PUT_LINE('/*********DB가 사용할 수 있는 메모리를 입력하시기 바랍니다.[단위 G](ex. 8G -> 8)*********/'); IN_DB_MEMORY := &in_memory; /*[입력]G 단위로 입력*/ V_DB_MEMORY := IN_DB_MEMORY * 1024; DBMS_OUTPUT.PUT_LINE(' - DB Memory : '||V_DB_MEMORY||'MB'); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE('/****************************************************************************************/'); DBMS_OUTPUT.PUT_LINE(' 파라미터 변경 시 DB 종료가 필요합니다.'); DBMS_OUTPUT.PUT_LINE(' DB 종료 가능 여부를 파악한 후에 진행하시고'); DBMS_OUTPUT.PUT_LINE(' 권고 작업 진행 전, Parameter file(spfile[SID].ora)을 백업하시기 바랍니다.'); DBMS_OUTPUT.PUT_LINE('/****************************************************************************************/'); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE(' '); /*Oracle Version 확인*/ DBMS_OUTPUT.PUT_LINE('/*************************************Oracle Version*************************************/'); DECLARE CURSOR ORACLE_VERSION IS SELECT A.BANNER FROM V$VERSION A; BEGIN FOR ORACLE_VERSION_LIST IN ORACLE_VERSION LOOP DBMS_OUTPUT.PUT_LINE(ORACLE_VERSION_LIST.BANNER); END LOOP; END; DBMS_OUTPUT.PUT_LINE('/****************************************************************************************/'); DBMS_OUTPUT.PUT_LINE(' '); /*Oracle Version 확인*/ SELECT TO_NUMBER(REGEXP_SUBSTR(A.VERSION,'[^.]+',1,1)) AS VERSION INTO V_VERSION FROM V$INSTANCE A; IF V_VERSION < 10 THEN DBMS_OUTPUT.PUT_LINE('Oracle Version 10g 이상부터 사용할 수 있습니다.'); RETURN; END IF; /*Parameter File 확인*/ DBMS_OUTPUT.PUT_LINE('Check Parameter File'); SELECT A.VALUE INTO V_PAM_FILE FROM V$PARAMETER A WHERE A.NAME = 'spfile'; IF V_PAM_FILE IS NULL THEN DBMS_OUTPUT.PUT_LINE(' - Parameter File을 spfile로 변경하신 후 재작업하시기 바랍니다.'); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE(' [권고 작업] '); DBMS_OUTPUT.PUT_LINE(' CREATE SPFILE FROM PFILE;'); DBMS_OUTPUT.PUT_LINE(' DB 종료'); DBMS_OUTPUT.PUT_LINE(' PFILE(INIT[SID].ORA) 파일 제거'); DBMS_OUTPUT.PUT_LINE(' DB 시작'); RETURN; ELSE DBMS_OUTPUT.PUT_LINE(' - Pass'); END IF; DBMS_OUTPUT.PUT_LINE(' '); /*audit_trail 확인*/ DBMS_OUTPUT.PUT_LINE('Check audit_trail'); SELECT A.VALUE INTO V_AUDIT_RS FROM V$PARAMETER A WHERE A.NAME = 'audit_trail'; IF V_AUDIT_RS != 'NONE' THEN DBMS_OUTPUT.PUT_LINE(' - audit_trail을 NONE으로 변경하시기 바랍니다.'); DBMS_OUTPUT.PUT_LINE(' [현재 audit_trail 설정값]'); DBMS_OUTPUT.PUT_LINE(' - '||V_AUDIT_RS); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE(' [권고 audit_trail 설정값]'); DBMS_OUTPUT.PUT_LINE(' ALTER SYSTEM SET audit_trail=NONE SCOPE=SPFILE;'); DBMS_OUTPUT.PUT_LINE(' DB 종료'); DBMS_OUTPUT.PUT_LINE(' DB 시작'); ELSE DBMS_OUTPUT.PUT_LINE(' - Pass'); END IF; DBMS_OUTPUT.PUT_LINE(' '); /*processes 확인*/ DBMS_OUTPUT.PUT_LINE('Check processes'); SELECT A.VALUE INTO V_PROCESS_RS FROM V$PARAMETER A WHERE A.NAME = 'processes'; IF V_PROCESS_RS < 1000 THEN DBMS_OUTPUT.PUT_LINE(' - processes 개수를 1000개로 변경하시기 바랍니다.'); DBMS_OUTPUT.PUT_LINE(' [현재 processes 설정값]'); DBMS_OUTPUT.PUT_LINE(' '||V_PROCESS_RS); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE(' [권고 작업] '); DBMS_OUTPUT.PUT_LINE(' ALTER SYSTEM SET processes=1000 SCOPE=SPFILE;'); DBMS_OUTPUT.PUT_LINE(' DB 종료'); DBMS_OUTPUT.PUT_LINE(' DB 시작'); ELSE DBMS_OUTPUT.PUT_LINE(' - Pass'); END IF; DBMS_OUTPUT.PUT_LINE(' '); /*archive log mode 확인 - Default Directory일 경우, 변경문구출력*/ SELECT A.LOG_MODE INTO V_AR_RS FROM V$DATABASE A; IF V_AR_RS = 'ARCHIVELOG' THEN DBMS_OUTPUT.PUT_LINE('Check archive log directory'); SELECT A.VALUE INTO V_AR_DIR_RS FROM V$PARAMETER A WHERE A.NAME = 'log_archive_dest_1'; IF V_AR_DIR_RS IS NULL THEN DBMS_OUTPUT.PUT_LINE(' - archive log 위치를 변경해주시기 바랍니다.'); DBMS_OUTPUT.PUT_LINE(' [현재 Archive log 디렉토리 설정값]'); DBMS_OUTPUT.PUT_LINE(' db_recovery_file_dest'); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE(' [권고 작업] '); DBMS_OUTPUT.PUT_LINE(' ALTER SYSTEM SET LOG_ARCHIVE_DEST_1=''location=[directory 경로]'' ; /*directory 경로 변경*/'); ELSE DBMS_OUTPUT.PUT_LINE(' - Pass'); END IF; DBMS_OUTPUT.PUT_LINE(' '); END IF; /*diag_daemon 확인*/ DBMS_OUTPUT.PUT_LINE('Check _diag_daemon'); SELECT Y.KSPPSTVL INTO V_DIAG_DAEMON FROM X$KSPPI X ,X$KSPPCV Y WHERE X.INDX = Y.INDX AND X.KSPPINM = '_diag_daemon'; IF V_DIAG_DAEMON = 'TRUE' THEN DBMS_OUTPUT.PUT_LINE(' - 파라미터를 FALSE로 변경하시기 바랍니다.'); DBMS_OUTPUT.PUT_LINE(' [현재 _diag_daemon 설정값]'); DBMS_OUTPUT.PUT_LINE(' '||V_DIAG_DAEMON); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE(' [권고 작업] '); DBMS_OUTPUT.PUT_LINE(' ALTER SYSTEM SET "_diag_daemon"=FALSE SCOPE=SPFILE;'); DBMS_OUTPUT.PUT_LINE(' DB 종료'); DBMS_OUTPUT.PUT_LINE(' DB 시작'); ELSE DBMS_OUTPUT.PUT_LINE(' - Pass'); END IF; DBMS_OUTPUT.PUT_LINE(' '); /*Oracle Memory 확인*/ DBMS_OUTPUT.PUT_LINE('Check Oracle Memory'); SELECT A.BYTE_VALUE / 1024 / 1024, V_DB_MEMORY AS VALUE INTO V_MR_RS, V_MR_REC FROM (SELECT CASE WHEN V_VERSION = 10 THEN SUM(CASE WHEN A.NAME IN ('sga_target', 'pga_aggregate_target') THEN TO_NUMBER(A.VALUE) ELSE 0 END) ELSE MAX(CASE WHEN A.NAME = 'memory_target' THEN TO_NUMBER(A.VALUE) ELSE 0 END) END AS BYTE_VALUE FROM V$PARAMETER A WHERE A.NAME IN ('memory_target', 'sga_target', 'pga_aggregate_target')) A; IF V_MR_RS = 0 OR V_MR_RS < V_MR_REC THEN DBMS_OUTPUT.PUT_LINE(' - 파라미터를 재설정하시기 바랍니다.'); DBMS_OUTPUT.PUT_LINE(' [현재 메모리 설정값]'); DECLARE CURSOR ORACLE_MEMORY IS SELECT A.NAME AS PARAMETER_NAME, A.VALUE AS BYTE_VALUE, ROUND(A.VALUE / 1024 / 1024, 2) || 'MB' AS MB_VALUE FROM V$PARAMETER A WHERE A.NAME IN ('sga_max_size' ,'sga_target' ,'java_pool_size' ,'streams_pool_size' ,'large_pool_size' ,'shared_pool_size' ,'shared_pool_reserved_size' ,'db_cache_size' ,'pga_aggregate_target' ,'memory_target' ,'memory_max_target') ORDER BY A.NAME; BEGIN FOR ORACLE_MEMORY_LIST IN ORACLE_MEMORY LOOP DBMS_OUTPUT.PUT_LINE(' - '||RPAD(ORACLE_MEMORY_LIST.PARAMETER_NAME,25,' ')||' : '||ORACLE_MEMORY_LIST.MB_VALUE); END LOOP; END; DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE(' [권고 작업] '); IF V_VERSION = 10 THEN DECLARE CURSOR ORACLE_MEMORY_RT IS SELECT 'ALTER SYSTEM SET '|| A.PARAMETER_NAME ||' = '||A.VALUE||'M SCOPE=SPFILE;' AS STMT FROM (SELECT 'sga_max_size' AS PARAMETER_NAME, TRUNC(V_DB_MEMORY * V_MR_RT_10) AS VALUE FROM DUAL UNION ALL SELECT 'sga_target' AS PARAMETER_NAME, TRUNC(V_DB_MEMORY * V_MR_RT_10) AS VALUE FROM DUAL UNION ALL SELECT 'pga_aggregate_target' AS PARAMETER_NAME, V_DB_MEMORY - TRUNC(V_DB_MEMORY * V_MR_RT_10) AS VALUE FROM DUAL UNION ALL SELECT 'java_pool_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'streams_pool_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'large_pool_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'shared_pool_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'shared_pool_reserved_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL ) A ; BEGIN FOR ORACLE_MEMORY_STMT IN ORACLE_MEMORY_RT LOOP DBMS_OUTPUT.PUT_LINE(' '||ORACLE_MEMORY_STMT.STMT); END LOOP; END; DBMS_OUTPUT.PUT_LINE(' DB 종료'); DBMS_OUTPUT.PUT_LINE(' DB 시작'); DBMS_OUTPUT.PUT_LINE(' ALTER SYSTEM SET db_cache_size = 0M ;'); ELSIF V_VERSION >= 11 THEN DECLARE CURSOR ORACLE_MEMORY_RT IS SELECT 'ALTER SYSTEM SET '|| A.PARAMETER_NAME ||' = '||A.VALUE||'M SCOPE=SPFILE;' AS STMT FROM (SELECT 'memory_max_target' AS PARAMETER_NAME, V_DB_MEMORY AS VALUE FROM DUAL UNION ALL SELECT 'memory_target' AS PARAMETER_NAME, V_DB_MEMORY AS VALUE FROM DUAL UNION ALL SELECT 'sga_max_size' AS PARAMETER_NAME, TRUNC(V_DB_MEMORY * V_MR_RT_11) AS VALUE FROM DUAL UNION ALL SELECT 'sga_target' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'pga_aggregate_target' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'java_pool_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'streams_pool_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'large_pool_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'shared_pool_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL UNION ALL SELECT 'shared_pool_reserved_size' AS PARAMETER_NAME, 0 AS VALUE FROM DUAL ) A ; BEGIN FOR ORACLE_MEMORY_STMT IN ORACLE_MEMORY_RT LOOP DBMS_OUTPUT.PUT_LINE(' '||ORACLE_MEMORY_STMT.STMT); END LOOP; END; DBMS_OUTPUT.PUT_LINE(' DB 종료'); DBMS_OUTPUT.PUT_LINE(' DB 시작'); DBMS_OUTPUT.PUT_LINE(' ALTER SYSTEM SET db_cache_size = 0M ;'); END IF; ELSE DBMS_OUTPUT.PUT_LINE(' - Pass'); END IF; END; / SPOOL OFF SET SERVEROUTPUT OFF
3. Oracle Parameter check 결과
Check audit_trail - audit_trail을 NONE으로 변경하시기 바랍니다. [현재 audit_trail 설정값] - DB [권고 audit_trail 설정값] ALTER SYSTEM SET audit_trail=NONE SCOPE=SPFILE; DB 종료 DB 시작 Check processes - processes 개수를 1000개로 변경하시기 바랍니다. [현재 processes 설정값] 150 [권고 작업] ALTER SYSTEM SET processes=1000 SCOPE=SPFILE; Check archive log directory - archive log 위치를 변경해주시기 바랍니다. [현재 Archive log 디렉토리 설정값] db_recovery_file_dest [권고 작업] ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='location=[directory 경로]'; Check _diag_daemon - 파라미터를 FALSE로 변경하시기 바랍니다. [현재 _diag_daemon 설정값] TRUE [권고 작업] ALTER SYSTEM SET "_diag_daemon"=FALSE SCOPE=SPFILE; DB 종료 DB 시작 Check Oracle Memory - 파라미터를 재설정하시기 바랍니다. [현재 메모리 설정값] - db_cache_size : 0MB - java_pool_size : 0MB - large_pool_size : 0MB - memory_max_target : 616MB - memory_target : 616MB - pga_aggregate_target : 0MB - sga_max_size : 412MB - sga_target : 0MB - shared_pool_reserved_size : 13.6MB - shared_pool_size : 0MB - streams_pool_size : 0MB [권고 작업] ALTER SYSTEM SET memory_max_target = 26M SCOPE=SPFILE; ALTER SYSTEM SET memory_target = 26M SCOPE=SPFILE; ALTER SYSTEM SET sga_max_size = 20M SCOPE=SPFILE; ALTER SYSTEM SET sga_target = 0M SCOPE=SPFILE; ALTER SYSTEM SET pga_aggregate_target = 0M SCOPE=SPFILE; ALTER SYSTEM SET java_pool_size = 0M SCOPE=SPFILE; ALTER SYSTEM SET streams_pool_size = 0M SCOPE=SPFILE; ALTER SYSTEM SET large_pool_size = 0M SCOPE=SPFILE; ALTER SYSTEM SET shared_pool_size = 0M SCOPE=SPFILE; ALTER SYSTEM SET shared_pool_reserved_size = 0M SCOPE=SPFILE; DB 종료 DB 시작 ALTER SYSTEM SET db_cache_size = 0M ;
해당 내용은 자체적으로 테스트하고 운영하면서 변경된 최적화 내용을 토대로 전달해드립니다.
운영 환경과 오라클 버전에 따라서 조금씩 차이가 날 수 있습니다. 반드시 내부 테스트를 거쳐서 반영하시기 바랍니다.
메모리에 대한 변경은 11G 이상부터 적용가능 합니다.
'Data Architecture > Admin' 카테고리의 다른 글
[Admin] MySQL/MariaDB Clustered vs Non-Clustered Index (0) | 2020.07.01 |
---|---|
[Admin] ORA-30556 함수 기반 인덱스, 컬럼(타입) 사이즈 변경 에러 (0) | 2019.09.20 |
[Admin] MariaDB/MySQL Linux Filesystem Cache(unmap) 메모리 초기화 (0) | 2019.08.09 |
[Admin] MariaDB/MySQL InnoDB 테이블 압축(Compression) (0) | 2019.08.07 |
[Admin][MariaDB] DB 생성 과 테이블 조작(DDL, DML) (0) | 2016.08.04 |