SHAREDPOOL使用率的監控部署及思考
【系統環境】:
系統環境: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使用率的監控部署及思考