DB

[Database] Oracle Shared memory 사용률 확인

파주상남자의 오답노트 ㅣ 2025. 4. 17. 13:11

반응형

1. Oracle 접속 후 SGA 조회 하여 Shared memory 조회 

SELECT round((total_size - free_size) / total_size * 100, 2) AS used_percentage
FROM (
    SELECT SUM(bytes) AS total_size,
           SUM(CASE WHEN name = 'free memory' THEN bytes ELSE 0 END) AS free_size
    FROM v$sgastat
    WHERE pool = 'shared pool'
);

✅ 쿼리 설명

항목설명
v$sgastat SGA의 각 컴포넌트 메모리 상태를 확인할 수 있는 Oracle 뷰
pool = 'shared pool' 공유 풀 영역만 대상으로 조회
name = 'free memory' 현재 남아있는(할당되지 않은) 메모리
SUM(bytes) 공유 풀 전체 크기
(total_size - free_size) 사용 중인 메모리
ROUND(..., 2) 소수점 2자리까지 반올림

📈 출력 예시

USED_PERCENTAGE
74.63

2. Python 스크립트 작성하여 log로 기록 (check_sga_usage.py)

python

import cx_Oracle
from datetime import datetime
import os

# Oracle 접속 정보
USERNAME = "DB접속계정"
PASSWORD = "패스워드입력"  # 실제 패스워드로 교체
DSN = "localhost/orcl"     # 필요 시 변경

# 로그 디렉토리 및 파일 경로 설정
log_dir = "/var/log/sga_usage"
os.makedirs(log_dir, exist_ok=True)
log_file = os.path.join(log_dir, f"sga_usage_{datetime.now().strftime('%Y%m%d')}.log")

# 쿼리문
query = """
SELECT round((total_size - free_size) / total_size * 100, 2) AS used_percentage
FROM (
    SELECT SUM(bytes) AS total_size,
           SUM(CASE WHEN name = 'free memory' THEN bytes ELSE 0 END) AS free_size
    FROM v$sgastat
    WHERE pool = 'shared pool'
)
"""

def main():
    try:
        conn = cx_Oracle.connect(USERNAME, PASSWORD, DSN)
        cur = conn.cursor()
        cur.execute(query)
        result = cur.fetchone()

        current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

        if result:
            used_pct = result[0]
            log_line = f"{current_time} Used SGA: {used_pct}%"
        else:
            log_line = f"{current_time} Query returned no result"

    except Exception as e:
        log_line = f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} Failed: {str(e)}"
    
    finally:
        if 'cur' in locals():
            cur.close()
        if 'conn' in locals():
            conn.close()

    with open(log_file, "a") as f:
        f.write(log_line + "\n")
    
    print(log_line)

if __name__ == "__main__":
    main()
반응형

'DB' 카테고리의 다른 글

[Database] shared memory 정리하는 법  (0) 2025.04.17
[Database] PGA, SGA 란?  (1) 2025.03.19
[Database] shared memory 란?  (1) 2025.03.19
[Database] UNDO, REDO 란?  (0) 2025.03.19
[Database] SYSDBA 란?  (0) 2025.03.19