# 테이블 스페이스 사용량 시각화
def ts_space_bar():
import cx_Oracle # 오라클과 파이썬을 연동하기 위한 모듈
dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe')
db = cx_Oracle.connect('c##scott','tiger', dsn)
cursor = db.cursor()
v_result = cursor.var( cx_Oracle.CURSOR) #데이터 많이 받을거면 cursor / 하나 받을거면 string
cursor.callproc( 'get_ts_data', [v_result] )
result = v_result.getvalue()
a = []
for i in result:
a.append([i[0], i[1]])
import pandas as pd
df = pd.DataFrame(a, columns=['tablespace_name', 'usedspace'])
import matplotlib.pyplot as plt
plt.figure(figsize = (10,6)) # 그래프 사이즈 (가로 10, 세로 6)
df['freespace'] = 100 - df['usedspace'] #여유 공간
plt.bar(df['tablespace_name'], df['usedspace'], color = 'black', label = 'used space') # plt.bar(x축 데이터, y축 데이터)
plt.bar(df['tablespace_name'], df['freespace'], bottom = df['usedspace'], color = 'orange', label = 'freespace')
plt.title("Tablespace Used Space") # 그래프 제목
plt.xlabel("Tablespace Name") #x축제목
plt.ylabel("Space(%)") #y축 제목
plt.legend()
plt.xticks(rotation = 45)
plt.show()
# 오라클 연동 함수
def connect_oracle(table_name):
import cx_Oracle
import pandas as pd
dsn = cx_Oracle.makedsn('localhost', 1521, 'xe')
db = cx_Oracle.connect('c##scott', 'tiger', dsn)
cursor = db.cursor()
query = f"SELECT * FROM {table_name}"
cursor.execute(query )
row = cursor.fetchall()
colnames = cursor.description
col = [ ]
for i in colnames:
col.append( i[0].lower() )
df = pd.DataFrame(row , columns = col )
print(' 잘 연동되었습니다')
return ( df )
# 슬랙이랑 연동하는 함수
def slack_bot(lock_num):
import requests
# 슬랙 API 토큰
slack_token = '토큰토큰'
# 메시지를 보낼 채널 이름
channel = 'oracle_test'
# 보낼 메시지 내용
message = f'현재 오라클 데이터베이스에 락 waiting 세션이 {lock_num}개 발견되었습니다'
# 슬랙 API 엔드포인트 URL
url = f'https://slack.com/api/chat.postMessage'
# API 호출을 위한 헤더 설정
headers = {
'Authorization': f'Bearer {slack_token}',
'Content-Type': 'application/json'
}
# API 호출 데이터
data = {
'channel': channel,
'text': message
}
# 슬랙 API 호출
response = requests.post(url, headers=headers, json=data)
# API 응답 확인
if response.status_code == 200:
print('메시지가 성공적으로 전송되었습니다.')
else:
print('메시지 전송에 실패하였습니다.')
print('응답:', response.text)
#lock 발견 함수
def find_lock():
import cx_Oracle
dsn = cx_Oracle.makedsn('localhost', 1521, 'xe')
db = cx_Oracle.connect('c##scott', 'tiger', dsn)
cursor = db.cursor()
v_result = cursor.var(cx_Oracle.STRING)
cursor.callproc('lock_find', [v_result])
result = v_result.getvalue()
return str(result) + '개의 lock waiting session이 발견되었습니다'
# lock 발생 시 True 리턴 함수
def lock_is_trigger():
message = find_lock()
lock_num = int(message[0])
if lock_num >= 1:
return True, lock_num
def alert_analyst():
jobs = open("C:\\app\\itwill\\product\\18.0.0\\diag\\rdbms\\xe\\xe\\trace\\alert_xe.log", encoding='cp949', errors='ignore')
data = jobs.read()
data2= data.split()
k = [ ]
for i in data2:
if 'ora-' in i.lower():
k.append(i)
import pandas as pd
df = pd.DataFrame( k, columns=['col1'] )
from pandasql import sqldf
q = """ select col1, count(*)
from df
group by col1
order by 2 desc; """
print(sqldf(q) )
#2. dba 자동화 스크립트
def easy_dba():
while True:
print( """ === dba 작업을 편하게 수행하기 위한 스크립트 총모음 ====
0. 프로그램을 종료하려면 0번을 누르세요.
1. 테이블 스페이스 사용량을 확인하려면 1번을 누르세요
2. 현재 데이터베이스 락(lock) 발생했는지 확인하려면 2번을 누르세요
3. 오라클와 연동하게 싶으면 3번을 누르세요
4. alert log file 을 분석하고 싶다면 4번을 누르세요
5. slack과 연동하여 락 메세지 보내기
""")
num = int( input('원하는 번호를 입력하세요 ~ ' ) )
if num == 0:
break
elif num == 1:
ts_space_bar()
break
elif num == 2:
print(find_lock())
break;
elif num ==3:
table_name = input('연동할 테이블명 입력 : ')
print(connect_oracle(table_name))
break
elif num == 4:
alert_analyst()
break
elif num == 5:
import time
while True:
check, lock_num = lock_is_trigger()
if check:
slack_bot(lock_num)
time.sleep(5) # 5초마다 락상태 확인
break;