Database초보우낙

예제22. 테이블 스페이스의 사용량 시각화 구현하기 (미완성) 본문

파이썬

예제22. 테이블 스페이스의 사용량 시각화 구현하기 (미완성)

오운학 2024. 4. 22. 10:12

예제22. 테이블 스페이스의 사용량 시각화 구현하기

sys 유져로 접속해서 테이블 스페이스의 사용량을 확인합니다.

SELECT
    df.tablespace_name AS "Tablespace",
    ROUND((SUM(df.bytes) - SUM(fs.bytes)) / SUM(df.bytes) * 100, 2) AS "Used Percentage"
FROM
    (SELECT tablespace_name, SUM(bytes) AS bytes
     FROM dba_data_files
     GROUP BY tablespace_name) df
LEFT JOIN
    (SELECT tablespace_name, SUM(bytes) AS bytes
     FROM dba_free_space
     GROUP BY tablespace_name) fs
ON
    df.tablespace_name = fs.tablespace_name
GROUP BY
    df.tablespace_name
ORDER BY
    "Used Percentage" DESC;

위의 쿼리문의 결과가 출력될 수 있도록 쉘 스크립트를 작성하시오!

#!/bin/bash   

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl

sql_query="SET PAGESIZE 60;
SET LINESIZE 300;
SELECT
    df.tablespace_name AS \\"Tablespace\\",
    ROUND((SUM(df.bytes) - SUM(fs.bytes)) / SUM(df.bytes) * 100, 2) AS \\"Used Percentage\\"
FROM
    (SELECT tablespace_name, SUM(bytes) AS bytes
     FROM dba_data_files
     GROUP BY tablespace_name) df
LEFT JOIN
    (SELECT tablespace_name, SUM(bytes) AS bytes
     FROM dba_free_space
     GROUP BY tablespace_name) fs
ON
    df.tablespace_name = fs.tablespace_name
GROUP BY
    df.tablespace_name
ORDER BY
    \\"Used Percentage\\" DESC;
EXIT;"

# SQLPLUS 실행
echo "$sql_query" | sqlplus -s  system/oracle_4U

위의 코드 실행

파이썬에서 위의 쉘스크립트를 호출하여 출력합니다

import paramiko
import matplotlib.pyplot as plt

# 리눅스 서버 정보
hostname = '192.168.56.104'
username = 'oracle'
password = 'oracle'

# bash 스크립트의 경로
script_path = "/home/oracle/ts.sh"

# SSH 클라이언트 객체 생성
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname, username=username, password=password)

# bash 스크립트를 실행
stdin, stdout, stderr = ssh.exec_command(f'sh {script_path}')

# 결과 읽기
output = stdout.read().decode('utf-8')
print(output)

SQL —> 리눅스 쉘 —> 파이썬 코드 —> 시각화 —> 홈페이지 생성

OUTPUT 변수 담긴 위의 데이터를 파이썬 리스트에 담아내기

문자열에서 양쪽 공백을 제거합니다

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
print(output.strip() )

output 변수에서 출력되는 문자열을 엔터(\n) 로 구분해서 리스트의 요소로 구성해

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
print(output.strip().split('\\n') )

위의 코드의 결과에서 컬럼명을 제거하는 코드

 

a = [ 'kkk','bbb','ccc','ddd']
a[2:]

컬럼명과 점선을 빼고 출력합니다. 컬럼명은 a 리스트의 첫번째 요소이고 점선은 a 리스트의 두번째 요소이므로 다음과 같이 작성합니다.

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
print(a[2:])

위의 결과를 a2 라는 변수에 담고 출력합니다.

 

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
a2 = a[2:]  # a 리스트 변수의 인덱스번호 2번째부터 끝가지 잃어서 a2 변수를 구성합니다.
print(a2)

a2 리스트 변수의 요소들을 for loop문으로 하나씩 출력하시오

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
a2 = a[2:]  # a 리스트 변수의 인덱스번호 2번째부터 끝가지 잃어서 a2 변수를 구성합니다.
for i  in  a2:
    print(i)

출력되는 결과에서 테이블 스페이스 이름만 출력하기

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
a2 = a[2:]  # a 리스트 변수의 인덱스번호 2번째부터 끝가지 잃어서 a2 변수를 구성합니다.
for i  in  a2:
    print(i.split()[0])

두번째 컬럼만 가져오게 하시오

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
a2 = a[2:]  # a 리스트 변수의 인덱스번호 2번째부터 끝가지 잃어서 a2 변수를 구성합니다.
for i  in  a2:
    print(i.split()[1])

두개를 같이 출력합니다.

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
a2 = a[2:]  # a 리스트 변수의 인덱스번호 2번째부터 끝가지 잃어서 a2 변수를 구성합니다.
for i  in  a2:
    print(i.split()[0], i.split()[1] )

위의 결과는 둘다 문자로 출력됩니다. 숫자 부문만 숫자형으로 출력되게합니다.

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
a2 = a[2:]  # a 리스트 변수의 인덱스번호 2번째부터 끝가지 잃어서 a2 변수를 구성합니다.
for i  in  a2:
    print(i.split()[0], float(i.split()[1]) )

위의 결과를 소괄호로 묶어서 data 라는 비어있는 리스트에 추가합니다.

 

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
a2 = a[2:]  # a 리스트 변수의 인덱스번호 2번째부터 끝가지 잃어서 a2 변수를 구성합니다.

data = [ ]  # data 라는 비어있는 리스트를 생성합니다.
for i  in  a2:
    data.append( (i.split()[0], float(i.split()[1])) )  # data 리스트에 추가합니다.

print(data)    

원형 그래프를 하나의 화면에 5개를 동시에 띄우기 위한 코드를 작성합니다.

import matplotlib.pyplot as plt

fig, axes = plt.subplots( 1, len(data), figsize=(10,3) ) # 여러 그래프를 동시에 생성

다음의 코드를 구현하기 위한 파이썬 함수 enumerate 함수 이해하기

enumerate 함수는 리스트의 요소의 인덱스 번호를 출력해줄 수 있는 함수

for k, i  in  enumerate(data):
    print(k, i)

위의 data 를 이용해서 원형 그래프를 생성합니다.

output = """
Tablespace                     Used Percentage
------------------------------ ---------------
SYSTEM                                   99.72
SYSAUX                                   94.68
USERS                                    81.25
EXAMPLE                                  78.75
UNDOTBS1                                  6.44
"""
a=output.strip().split('\\n')
a2 = a[2:]  # a 리스트 변수의 인덱스번호 2번째부터 끝가지 잃어서 a2 변수를 구성합니다.

data = [ ]  # data 라는 비어있는 리스트를 생성합니다.
for i  in  a2:
    data.append( (i.split()[0], float(i.split()[1])) )  # data 리스트에 추가합니다.

print(data)    

원형 그래프를 하나의 화면에 5개를 동시에 띄우기 위한 코드를 작성합니다.

import matplotlib.pyplot as plt

fig, axes = plt.subplots( 1, len(data), figsize=(10,3) ) # 여러 그래프를 동시에 생성

다음의 코드를 구현하기 위한 파이썬 함수 enumerate 함수 이해하기

enumerate 함수는 리스트의 요소의 인덱스 번호를 출력해줄 수 있는 함수

for k, i  in  enumerate(data):
    print(k, i)

위의 data 를 이용해서 원형 그래프를 생성합니다.

import matplotlib.pyplot as plt

fig, axes = plt.subplots( 1, len(data), figsize=(10,3) )

for  i, (name, percent) in enumerate(data):
    axes[i].pie([percent, 100-percent] )

각각의 그래프에 라벨과 사용율을 표시 합니다.

import matplotlib.pyplot as plt

fig, axes = plt.subplots( 1, len(data), figsize=(10,3) )

for  i, (name, percent) in enumerate(data):
    axes[i].pie([percent, 100-percent], labels=['Used','Free'], autopct='%1.1f%%' )

위의 원형 그래프에 각각의 제목을 해당 테이블 스페이스 이름으로 붙이시오

import matplotlib.pyplot as plt

fig, axes = plt.subplots( 1, len(data), figsize=(10,3) )

for  i, (name, percent) in enumerate(data):
    axes[i].pie([percent, 100-percent], labels=['Used','Free'], autopct='%1.1f%%' )
    axes[i].set_title(name)

 

출력되는 그래프를 더 보기 좋게 하는데 그래프들끼리 서로 겹치지 않도록 적절하게 레이아웃을 조정합니다.

import matplotlib.pyplot as plt

fig, axes = plt.subplots( 1, len(data), figsize=(10,3) )

for  i, (name, percent) in enumerate(data):
    axes[i].pie([percent, 100-percent], labels=['Used','Free'], autopct='%1.1f%%' )
    axes[i].set_title(name)

plt.tight_layout()

그래프를 화면에 표시하는 코드를 맨 아래에 추가하시오 !