1. 程式人生 > >SHAREDPOOL使用率的監控部署及思考

SHAREDPOOL使用率的監控部署及思考

時間段 Coding 任務 們的 監控腳本 使用情況 number ins BE

【系統環境】:

系統環境:Sun Solaris10 U11 + ORACLE 11.2.0.4.0 RAC

【背景描述】:

2016年11月起,生產的數據庫期的出現了兩次m0001進程120秒無法啟動:

主要報錯:waiting for 0x3800fe418 Child shared pool level=7 child#=2,引起數據庫異常的故障。專家分析得出的結論:統計收集作業觸發shared pool空間需求,並出現收縮與擴容操作,先收縮說明shared pool空間容量不足或碎片嚴重導致無法找到可以使用的內存。當shared pool空間不足和存在碎片時會觸發空間收縮與擴容。

由於目前沒有數據去證明專家們的論點,只有在下一次故障重現時收集相關數據,則需要考慮怎麽樣去收集數據去證明專家的論點。

【監控前情況】

統計收集作業觸發shared pool空間需求,並出現收縮與擴容操作,先收縮說明shared pool空間容量不足或碎片嚴重導致無法找到可以使用的內存。當shared pool空間不足和存在碎片時會觸發空間收縮與擴容。則需要對SHAREDPOOL使用情況進行監控。

對於表設計想法:

1,由於該數據庫的SHAREDPOOL使用情況查看方法很多種,怎樣更直觀體現SHAREDPOOL的使用情況,確認用百分比及總空間和剩余空間進行監控SHAREDPOOL;

2,存放數據應該存放監控數據的表空間AUDIT_DATA不影響應用使用的表空間,考慮到該數據庫存儲不足不能擴容,更容易分析時間段的數據,基於該條件情況下對表進行生命周期管理,則應該創建月分區表CHECK_SHAREDPOOL。

創建監控CHECK_SHAREDPOOL分區表:

CREATE TABLE XJ_EXP_DATA. CHECK_SHAREDPOOL

(INST_ID NUMBER,

"Free_Shared_Pool(MB)" NUMBER,

"Total_Shared_Pool(MB)" NUMBER,

FREEPCT VARCHAR2(10),

SAMPLE_TIME DATE DEDAULT SYSDATE)

PARTITION BY RANGE (SAMPLE_TIME)(

PARTITION P201701 VALUES LESS THAN (TIMESTAMP ‘2017-01 00:00:00‘) ,

PARTITION P201702 VALUES LESS THAN (TIMESTAMP ‘2017-02 00:00:00‘) ,

..........----省略其他分區語句

PARTITION PMAX VALUES LESS THAN (MAXVALUE) )

TABLESPACE AUDIT_DATA;

對於部署想法:

1,考慮到SHAREDPOOL的使用情況,數據庫的每個節點都不一樣,則需要每個節點都需要部署任務進行監控SHAREDPOOL;

2,考慮到對數據庫SHAREDPOOL監控數據需要測試監控的可行性,則在對應生產的測試庫進行測試監控三天查看監控情況;

3,考慮到數據的監控需求性,記錄監控數據是否準確,定制采集數據頻率為一小時;

在測試庫測試該監控情況正常後,則謄寫方案,內部審核後,提單對生產庫進行部署SHAREDPOOL監控腳本及定時任務。

【監控優化】

對其生產監控SHAREDPOOL最後生成數據效果如下:

技術分享圖片

中間監控優化步驟如下:

1,SQL的優化:考慮到需要同時對比兩個節點的SHAREDPOOL使用情況。則需要SQL查詢組合多個節點數據;

2,采集數據優化:對於生產庫比較多,需求每天提供監控SHAREDPOOL使用情況數據,有時突然需求SHAREDPOOL的使用情況,則考慮用監控主機使用PYAHON進行采集數據;

3,圖形優化:考慮更加直觀查看SHAREDPOOL的使用情況趨勢,想到南基采數據庫周報數據也是用PYTHON,則用PYTHON直接生成圖形監控數據;

vi sharedpool.py

# -*- coding:UTF-8 -*-

import xlsxwriter, cx_Oracle, sys

reload(sys)

sys.setdefaultencoding(‘utf-8‘)

database_list = {‘DEVDB‘: ‘xj_exp_data/xxxx @172.16.85.1:1521/YYDB‘,

...........-----------添加連接多個數據庫}

for d in database_list:

print(d)

conn = cx_Oracle.connect(database_list[d])

# connect_database

c = conn.cursor() #get cursor

x = c.execute(‘‘‘

SELECT s.SNAP_TIME,s.INST_ID1,s.INST_ID2,d.NAME,s.TOTAL_MB_INST1,s.FREE_MB_INST1,

s.TOTAL_MB_INST2,s.FREE_MB_INST2

FROM (SELECT a.SNAP_TIME,a.PCT INST_ID1,b.PTC INST_ID2,a.TOTAL_MB TOTAL_MB_INST1,a.FREE_MB FREE_MB_INST1,b.TOTAL_MB TOTAL_MB_INST2,b.FREE_MB FREE_MB_INST2 from

(select to_char(trunc(SAMPLE_TIME +10/60/24, ‘hh24‘),‘yyyymmdd_hh24‘) snap_time,INST_ID,"Free_Shared_Pool(MB)" free_mb,"Total_Shared_Pool(MB)" total_mb,to_number(replace(FREEPCT, ‘%‘, ‘‘)) pct

from XJ_EXP_DATA.CHECK_SHAREDPOOL PARTITION (P201703) where INST_ID = 1) a

left join ..............-------添加多個節點內容

left join (select to_char(trunc(SAMPLE_TIME +10/60/24, ‘hh24‘),‘yyyymmdd_hh24‘) snap_time,INST_ID, "Free_Shared_Pool(MB)" free_mb,"Total_Shared_Pool(MB)" total_mb,to_number(replace(FREEPCT, ‘%‘, ‘‘)) pct

from XJ_EXP_DATA.CHECK_SHAREDPOOL PARTITION (P201703) where INST_ID = 2) b

on a.snap_time = b.snap_time(+)order by to_date(a.snap_time, ‘yyyymmdd hh24‘)) s,

(select NAME from v$DATABASE) d ------用以識別多個數據庫

‘‘‘)

dbname = x.fetchone()[3]

row = x.fetchall()

..........--------省略部分內容

# Add a chart title and some axis labels.

chart1.set_title({‘name‘: dbname + ‘一天數據庫sharedpool監控‘})

# Set an Excel chart style. Colors with white outline and shadow.

chart1.set_style(10)

# Insert the chart into the worksheet (with an offset).

worksheet.insert_chart(‘G2‘, chart1, {‘x_offset‘: 25, ‘y_offset‘: 10})

c.close()

conn.close()

workbook.close()

【總結】:

1,監控數據庫的項目時,同時考慮是否多個節點數據一樣。

2,對於多個數據庫監控,PYTHON有非常大的幫助。

SHAREDPOOL使用率的監控部署及思考