使用python進行Oracle資料庫效能趨勢分析
一、 概述
隨著資訊系統業務需求快速增長,業務系統關聯日益複雜,資訊系統效能問題逐漸突顯,一旦出現資訊系統效能問題及不可用問題,將嚴重影響資訊系統的穩定執行及使用者體驗。
結合運維實踐,資料庫效能問題是造成資訊系統效能下降和非停的重要原因之一,如何進行常態化的資料庫效能趨勢分析,及時發現資料庫效能衰減“病灶”,常態化提升資訊系統效能,避免救火式效能最佳化,成為衡量資訊系統管理部門運營能力的重要指標之一。
二、研究目標
使用python語言進行Oracle資料庫效能趨勢分析。
三、工具介紹
開發語言:python 2.7
資料庫:Oracle 11.2.0.4
Web框架:Django
圖形展示工具:echart
四、演算法介紹
核心演算法由執行可靠率、資源競爭率、程式等待率和SQL穩定率四部分組成,如下圖所示,本文主要以SQL穩定率為例:
Trend =100-100*sum(( c_time-h_time) /h_time)
說明:
Trend: 表示資訊系統效能趨勢(%)
c_time: 前一小時SQL平均執行時間(秒)
h_time: 3個月內SQL平均執行時間(秒)
五、效果展示
(1)、系統效能趨勢:
(2)、TOPSQL效能趨勢分析
(3)、TOPSQL日效能趨勢分析
(4)、TOPSQL月效能趨勢分析
六、核心程式碼
核心程式碼分為資料採集層、資料轉換層、web展示層。
(1)、資料採集層:
點選(此處)摺疊或開啟
-
def get_topsql_info(username,password,ip,port,dbname,c_type,param=0,b_param=0):
-
-
s_top10 = ''
-
-
#s_snap_id = 0
-
-
print oracle_link_target
-
-
-
-
if c_type == 'sql_topsql':
-
-
sql_topsql="
-
-
select round(Elapsed_Time, 2) Elapsed_Time,
-
-
round(cpu_time, 2) cpu_time,
-
-
Executions,
-
-
round(elap_per_exec, 2) elap_per_exec,
-
-
round(total_db_time, 2) total_db_time,
-
-
sql_id,
-
-
substr(nvl(sql_module, ' ** SQL module Not Available ** '), 1, 30) sql_module,
-
-
sql_text
-
-
from (select nvl((sqt.elap / 1000000), to_number(null)) Elapsed_Time,
-
-
nvl((sqt.cput / 1000000), to_number(null)) CPU_Time,
-
-
sqt.exec Executions,
-
-
decode(sqt.exec,
-
-
0,
-
-
to_number(null),
-
-
(sqt.elap / sqt.exec / 1000000)) Elap_per_Exec,
-
-
(100 *
-
-
(sqt.elap /
-
-
(SELECT sum(e.VALUE) - sum(b.value)
-
-
FROM DBA_HIST_SYS_TIME_MODEL e, DBA_HIST_SYS_TIME_MODEL b
-
-
WHERE B.SNAP_ID = "+str(b_param)+"
-
-
AND E.SNAP_ID = "+str(param)+"
-
-
AND B.DBID = (select dbid from v$database)
-
-
AND E.DBID = (select dbid from v$database)
-
-
AND B.INSTANCE_NUMBER =
-
-
(select instance_number from v$instance)
-
-
AND E.INSTANCE_NUMBER =
-
-
(select instance_number from v$instance)
-
-
and e.STAT_NAME = 'DB time'
-
-
and b.stat_name = 'DB time'))) Total_DB_Time,
-
-
sqt.sql_id,
-
-
to_char(decode(sqt.module,
-
-
null,
-
-
null,
-
-
'Module: ' || sqt.module)) SQL_Module,
-
-
nvl(to_char(substr(st.sql_text, 1, 30)),
-
-
' ** SQL Text Not Available ** ') SQL_Text
-
-
from (select sql_id,
-
-
max(module) module,
-
-
sum(elapsed_time_delta) elap,
-
-
sum(cpu_time_delta) cput,
-
-
sum(executions_delta) exec
-
-
from dba_hist_sqlstat
-
-
dba_hist_sqltext st
-
-
where st.sql_id(+) = sqt.sql_id
-
-
order by nvl(sqt.elap, -1) desc, sqt.sql_id)
-
-
where rownum < 100
-
-
"
-
-
elif c_type == 'top10':
-
-
#a list of top10: m_top10
-
-
m_top10=get_hsql_info(t,'top10')
-
-
-
-
#after get top10
-
-
-
-
#end get top10
-
-
for h_sql_id in m_top10:
-
-
l_sql_id = h_sql_id[0]
-
-
s_top10 = s_top10+",'"+l_sql_id+"'"
-
-
s_top10 = s_top10.strip(',')
-
-
sql_hsql_top10="select sql_id,to_char(substr(sql_text,1,2000)) sql_text,length(sql_text) sql_length,command_type from dba_hist_sqltext t where t.sql_id in ("+s_top10+')'
-
-
else:
-
-
cmd=sql_tablespace
-
-
-
-
#print s_top10
-
-
#print log_cmd_i
-
-
-
-
cmd =""
-
-
if c_type == 'sql_topsql':
-
-
cmd=sql_topsql
-
-
elif c_type == 'top10':
-
-
cmd=sql_hsql_top10
-
-
else:
-
-
cmd=sql_tablespace
-
-
#print len(m_top10)
-
-
-
-
print 'before get topsql exe sql: '
-
-
print cmd
-
-
print 'get db shell: '
-
-
conn = cx_Oracle.connect(oracle_link_target)
-
-
cursor = conn.cursor()
-
-
cur = cursor.execute(cmd)
-
-
db_list = cur.fetchall()
-
-
#print 'before return db_list'
-
-
#print db_list
-
-
return db_list
-
-
-
-
cursor.close()
-
- conn.close()
(2)、資料轉換層
點選(此處)摺疊或開啟
-
select row_number() over(partition by ip order by to_number(total_db_time) desc) rn,
-
-
ip,
-
-
db_name,
-
-
sql_id,
-
-
decode(elap_per_exec, '0', 0.01, elap_per_exec) elap_per_exec,
-
-
decode(elap_avg_exec, '0', 0.01, elap_avg_exec) elap_avg_exec,
-
-
decode(sign(decode(elap_avg_exec, '0', 0.01, elap_avg_exec) - decode(elap_per_exec, '0', 0.01, elap_per_exec)),
-
-
1,
-
-
'up',
-
-
-1,
-
-
'down',
-
-
'equ') sql_status,
-
-
round((decode(elap_avg_exec, '0', 0.01, elap_avg_exec) -
-
-
decode(elap_per_exec, '0', 0.01, elap_per_exec)) /
-
-
decode(elap_avg_exec, '0', 0.01, elap_avg_exec),
-
-
2) sql_cont,
-
-
executions,
-
-
total_db_time,
-
-
substr(sql_module, 1, 12) sql_module,
-
-
substr(sql_text, 1, 12) sql_text,
-
-
ch_date
-
-
from (select rownum rn,
-
-
d.ip,
-
-
d.db_name,
-
-
d.sql_id,
-
-
replace(d.elap_per_exec, 'None', 0) elap_per_exec,
-
-
e.elap_avg_exec,
-
-
d.executions,
-
-
d.sql_module,
-
-
d.sql_text,
-
-
d.ch_date,
-
-
d.total_db_time
-
-
from hsql.h_topsql d,
-
-
(select b.ip,
-
-
b.sql_id,
-
-
round(avg(replace(b.elap_per_exec, 'None', 0)),
-
-
2) elap_avg_exec
-
-
from hsql.h_topsql_bak b
-
-
group by b.ip, b.sql_id) e
-
-
where d.sql_id = e.sql_id
-
- and d.ip = e.ip)));
(3)、web展示層
點選(此處)摺疊或開啟
-
def topsql_line_servlet(request):
-
-
cursor = conn.cursor()
-
-
query = "select ip,
-
-
(select service_name
-
-
from hsql.h_instance h
-
-
where h.ip = b.ip
-
-
and rownum = 1) service_name,
-
-
sql_id,
-
-
executions,
-
-
elap_per_exec,
-
-
to_char(ch_date, 'hh24:mi') sj,
-
-
to_char(ch_date, 'yyyy-mm-dd') rq
-
-
from hsql.h_topsql b
-
-
where ch_date > trunc(sysdate)
-
-
order by sj"
-
-
-
-
print query
-
-
cursor.execute(query)
-
-
resultset = cursor.fetchall()
-
-
cursor.close()
-
- conn.close()
七、總結
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31442014/viewspace-2151671/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 Python 進行資料分析:入門指南Python
- 使用python對oracle進行簡單效能測試PythonOracle
- 自動同步整個 MySQL/Oracle 資料庫以進行資料分析MySqlOracle資料庫
- 教程:使用Python進行基本影像資料分析!Python
- 使用pprof進行效能分析
- MySQL使用event等待事件進行資料庫效能診斷MySql事件資料庫
- 使用pandas進行資料分析
- 如何用Python進行資料分析?Python
- 用 Python 進行資料分析 pandas (一)Python
- 薦書 | 《利用Python進行資料分析》Python
- 使用 Dynatrace 對 Node.js 應用的效能資料進行分析Node.js
- Oracle效能優化-資料庫CPU使用率100%Oracle優化資料庫
- 如何使用傳統資料庫思維進行實時資料流分析? – thenewstack資料庫
- oracle表空間增長趨勢分析Oracle
- Python 連線mysql資料庫進行操作PythonMySql資料庫
- 使用python進行合併資料集Python
- 使用 Python 進行資料視覺化Python視覺化
- python使用cx_Oracle連線oracle資料庫獲取常用資訊PythonOracle資料庫
- 使用 XDebug + Webgrind 進行 PHP 程式效能分析WebPHP
- Laravel 使用 Oracle 資料庫LaravelOracle資料庫
- Python 連線 Oracle資料庫PythonOracle資料庫
- 使用Redis和Java進行資料庫快取 - DZone資料庫RedisJava資料庫快取
- 掌握Oracle資料庫效能調優方法Oracle資料庫
- 《利用Python進行資料分析·第2版》 轉Python
- 如何進行Oracle資料庫不完全恢復RBOracle資料庫
- 使用MySQL Workbench進行資料庫備份MySql資料庫
- 使用Spring Data JPA進行資料庫操作Spring資料庫
- Oracle使用資料泵expdp,impdp進行資料匯出匯入Oracle
- 2019資料庫趨勢研究:誰是最受青睞的資料庫?資料庫
- Django資料庫效能優化之 - 使用Python集合操作Django資料庫優化Python
- [譯] 在 Python 中,如何運用 Dask 資料進行並行資料分析Python並行
- 如何使用Python 進行資料視覺化Python視覺化
- 【SQL】Oracle資料庫資料量及效能資訊收集SQLOracle資料庫
- 2021年大資料和分析4大趨勢大資料
- 利用python進行資料分析之準備工作(1)Python
- 【TEST】Oracle19c使用benchmarksql進行效能測試OracleSQL
- 從資料庫發展史看資料庫未來技術趨勢資料庫
- IPIDEA分析資料採集新趨勢,Python爬蟲的應用前景如何?IdeaPython爬蟲