Rem drv: Rem Rem $Header: emdb/source/oracle/sysman/emdrep/sql/db/latest/ha/hapage_pkgbodys.sql /st_emdbsa_11.2/2 2009/02/18 14:05:26 gallison Exp $ Rem Rem Copyright (c) 2002, 2009, Oracle and/or its affiliates. Rem All rights reserved. Rem Rem NAME Rem hapage_pkgbodys.sql Rem Rem DESCRIPTION Rem PL/SQL procedures for the HA Page Rem Rem NOTES Rem Rem Rem MODIFIED (MM/DD/YY) Rem gallison 02/12/09 - Bug 8248153 Rem gallison 01/10/09 - Port to emdbsa (acknowledged is not supported). Rem gallison 12/08/08 - Use string_value from mgmt_current_metrics Rem gallison 02/14/08 - Add adrAlertLogDataFailure Rem gallison 01/17/08 - Fix sql Rem gallison 11/21/07 - Add events Rem sjconnol 11/05/07 - Add next backup Rem gallison 08/30/07 - Add supplementalLogging Rem sjconnol 08/02/07 - Use new mgmt_ha_dg_target_summary info Rem sjconnol 04/10/07 - Fix availability pct Rem sjconnol 03/15/07 - Fix flashback time Rem sjconnol 08/20/06 - Creation Rem CREATE OR REPLACE PACKAGE body hapage_database AS -- Procedure get_br_values -- -- PURPOSE: Get summary info for B/R section of HA page. -- IN parameters: -- targetName: The target name -- targetType: The target type -- OUT parameters: -- brSummary: Output structure containing summary info procedure get_br_values( targetName IN VARCHAR2, targetType IN VARCHAR2, brSummary OUT MGMT_HAPAGE_BR_OBJ ) IS flashbackEnd VARCHAR2(4000); flashbackEndDate DATE; backupStart DATE; backupEnd DATE; nextSchedBackup DATE; backupTime VARCHAR2(4000); inputSize VARCHAR2(4000); outputSize VARCHAR2(4000); backupRate VARCHAR2(4000); backupStatus VARCHAR2(30); inputType VARCHAR2(13); estMTTR NUMBER; begin BEGIN SELECT status, start_time, end_time, time_taken_display, input_bytes_display, output_bytes_display, output_bytes_per_sec_display, input_type INTO backupStatus, backupStart, backupEnd, backupTime, inputSize, outputSize, backupRate, inputType FROM mgmt_ha_backup WHERE target_guid = (select target_guid from mgmt_targets where target_name = targetName and target_type = targetType); EXCEPTION WHEN OTHERS THEN NULL; END; BEGIN SELECT estimated_mttr INTO estMTTR FROM mgmt_ha_mttr WHERE target_guid = (select target_guid from mgmt_targets where target_name = targetName and target_type = targetType); EXCEPTION WHEN OTHERS THEN NULL; END; BEGIN SELECT b.string_value into flashbackEnd FROM mgmt_metrics a, mgmt_current_metrics b, mgmt_targets c WHERE c.target_name = targetName and c.target_type = targetType AND a.metric_guid = b.metric_guid AND a.metric_name='ha_flashrecovery' AND a.metric_column= 'oldest_flashback_time' AND b.target_guid = c.target_guid AND a.type_meta_ver = c.type_meta_ver AND (a.category_prop_1 = c.category_prop_1 OR a.category_prop_1 = ' ') AND (a.category_prop_2 = c.category_prop_2 OR a.category_prop_2 = ' ') AND (a.category_prop_3 = c.category_prop_3 OR a.category_prop_3 = ' ') AND (a.category_prop_4 = c.category_prop_4 OR a.category_prop_4 = ' ') AND (a.category_prop_5 = c.category_prop_5 OR a.category_prop_5 = ' '); EXCEPTION WHEN OTHERS THEN NULL; END; BEGIN SELECT scheduled_time INTO nextSchedBackup FROM MGMT_JOB_EXEC_SUMMARY jes, MGMT_JOB_TYPE_INFO jti, MGMT_JOB_TARGET jt, MGMT_TARGETS t WHERE jes.job_id = jt.job_id AND jes.target_list_index = jt.target_list_index AND jt.target_guid = t.target_guid AND t.target_name = targetName AND t.target_type = targetType AND jes.job_type_id = jti.job_type_id AND jti.job_type = 'Backup' AND jes.status = MGMT_JOBS.SCHEDULED_STATUS AND rownum = 1 ORDER BY scheduled_time; EXCEPTION WHEN OTHERS THEN NULL; END; flashbackEndDate := getDate(targetName, targetType, flashbackEnd); brSummary := MGMT_HAPAGE_BR_OBJ(backupStart, backupEnd, backupTime, inputSize, outputSize, backupRate, inputType, flashbackEndDate, estMTTR, nextSchedBackup, backupStatus); END get_br_values; -- Procedure get_ecm_values -- -- PURPOSE: Get summary info for B/R section of HA page. -- IN parameters: -- targetName: The target name -- targetType: The target type -- OUT parameters: -- ecmSummary: Output structure containing summary info procedure get_ecm_values( targetName IN VARCHAR2, targetType IN VARCHAR2, ecmSummary OUT MGMT_HAPAGE_ECM_OBJ ) IS logMode VARCHAR2(12); forceLogging VARCHAR2(3); flashbackOn VARCHAR2(18); supplementalLogging VARCHAR2(8) := 'NONE'; begin BEGIN SELECT log_mode, force_logging, flashback_on INTO logMode, forceLogging, flashbackOn -- SELECT log_mode, force_logging, flashback_on, supplemental_logging -- INTO logMode, forceLogging, flashbackOn, supplementalLogging FROM mgmt_ha_info_ecm WHERE ecm_snapshot_id in (select ecm_snapshot_id from mgmt$ecm_current_snapshots where target_name = targetName and target_type = targetType); EXCEPTION WHEN OTHERS THEN NULL; END; ecmSummary := MGMT_HAPAGE_ECM_OBJ(logMode, forceLogging, flashbackOn, supplementalLogging); END get_ecm_values; -- Procedure get_dg_prmy_values -- -- PURPOSE: Get summary info for Data Guard primary section of HA page. -- IN parameters: -- targetName: The target name -- targetType: The target type -- OUT parameters: -- dgPrmySummary: Output structure containing summary info. -- Procedure get_dg_stby_values -- -- PURPOSE: Get summary info for Data Guard primary section of HA page. -- IN parameters: -- targetName: The target name -- targetType: The target type -- OUT parameters: -- dgPrmySummary: Output table of MGMT_HAPAGE_STBY_OBJ objects, one for each stby procedure get_dg_prmy_values( targetName IN VARCHAR2, targetType IN VARCHAR2, dgPrmySummary OUT MGMT_HAPAGE_PRMY_OBJ ) IS targetGuid VARCHAR2(32); status VARCHAR2(1024); stby_list VARCHAR2(1024); host VARCHAR2(256); name VARCHAR2(64); prmy_name VARCHAR2(64); prmy_id NUMBER; prot_mode VARCHAR2(256); fsfo_status VARCHAR2(256); role VARCHAR2(64); using_broker VARCHAR2(4); p_target_name VARCHAR2(256); p_target_type VARCHAR2(64); coll_timestamp DATE; begin BEGIN SELECT ROLE, PRMY_DB_UNIQUE_NAME, PRMY_DB_ID INTO role, prmy_name, prmy_id from MGMT_HA_DG_TARGET_SUMMARY WHERE target_guid = (select target_guid from mgmt_targets where target_name = targetName and target_type = targetType); -- If this is a primary, get the primary summary information from this row IF role = 'PRIMARY' THEN SELECT a.target_guid, a.STATUS, a.DB_UNIQUE_NAME, a.PROTECTION_MODE, a.FSFO_STATUS, a.using_broker, a.COLLECTION_TIMESTAMP, b.host_name, a.stby_list INTO targetGuid, status, name, prot_mode, fsfo_status, using_broker, coll_timestamp, host, stby_list FROM MGMT_HA_DG_TARGET_SUMMARY a, MGMT_TARGETS b WHERE b.target_name = targetName AND b.target_type = targetType AND a.target_guid = b.target_guid; p_target_name := targetName; p_target_type := targetType; -- If this is a standby, get the primary information from row that matches -- this standby's PRMY_DB_UNIQUE_NAME and PRMY_DB_ID ELSE SELECT b.target_name, b.target_type, a.STATUS, a.DB_UNIQUE_NAME, a.COLLECTION_TIMESTAMP, a.using_broker, b.host_name, a.PROTECTION_MODE, a.FSFO_STATUS, a.stby_list INTO p_target_name, p_target_type, status, name, coll_timestamp, using_broker, host, prot_mode, fsfo_status, stby_list FROM MGMT_HA_DG_TARGET_SUMMARY a, MGMT_TARGETS b WHERE a.DB_UNIQUE_NAME = prmy_name AND a.DB_ID = prmy_id AND a.target_guid = b.target_guid order by target_type desc; END IF; IF targetType = 'rac_database' THEN SELECT property_value INTO host FROM MGMT_TARGET_PROPERTIES WHERE property_name = 'ClusterName' AND target_guid = (select target_guid from mgmt_targets where target_name = targetName and target_type = targetType); END IF; EXCEPTION WHEN OTHERS THEN NULL; END; dgPrmySummary := MGMT_HAPAGE_PRMY_OBJ(status, name, host, prot_mode, fsfo_status, using_broker, coll_timestamp, p_target_name, p_target_type, stby_list); END get_dg_prmy_values; -- Procedure get_dg_stby_values -- -- PURPOSE: Get summary info for Data Guard primary section of HA page. -- IN parameters: -- targetName: The target name -- targetType: The target type -- OUT parameters: -- dgPrmySummary: Output table of MGMT_HAPAGE_STBY_OBJ objects, one for each stby procedure get_dg_stby_values( targetName IN VARCHAR2, targetType IN VARCHAR2, dgStbySummary OUT MGMT_HAPAGE_STBY_LIST ) IS name VARCHAR2(64); prmy_name VARCHAR2(64); mname VARCHAR2(64); role VARCHAR2(64); db_id NUMBER; prmy_db_id NUMBER; m_id NUMBER; begin BEGIN SELECT ROLE, DB_UNIQUE_NAME, DB_ID, PRMY_DB_UNIQUE_NAME, PRMY_DB_ID INTO role, name, db_id, prmy_name, prmy_db_id from MGMT_HA_DG_TARGET_SUMMARY WHERE target_guid = (select target_guid from mgmt_targets where target_name = targetName and target_type = targetType); -- If this is a primary, assemble standby table from rows w/matching prmy_db_unique_name and prmy_db_id IF role = 'PRIMARY' THEN mname := name; m_id := db_id; -- If this is a standby, assemble standby table from rows that match -- this standby's PRMY_DB_UNIQUE_NAME and prmy_db_id ELSE mname := prmy_name; m_id := prmy_db_id; END IF; SELECT MGMT_HAPAGE_STBY_OBJ ( a.db_unique_name, b.host_name, a.role, a.status, a.transport_lag, a.apply_lag, p.property_value, b.target_name, b.target_type, a.collection_timestamp, a.stby_list ) BULK COLLECT INTO dgStbySummary FROM MGMT_HA_DG_TARGET_SUMMARY a, MGMT_TARGETS b, MGMT_TARGET_PROPERTIES p WHERE a.prmy_db_unique_name = mname AND a.prmy_db_id = m_id AND a.active_stby = 'YES' AND a.target_guid = b.target_guid AND a.target_guid = p.target_guid AND p.property_name = (case when b.target_type = 'rac_database' then 'ClusterName' else 'MachineName' end); FOR i IN 1 .. dgStbySummary.count LOOP SELECT b.value into dgStbySummary(i).apply_lag FROM mgmt_metrics a, mgmt_current_metrics b, mgmt_targets c WHERE c.target_name = dgStbySummary(i).target_name AND c.target_type = dgStbySummary(i).target_type AND a.metric_guid = b.metric_guid AND a.metric_name='dataguard_sperf' AND a.metric_column= 'dg_lag' AND b.target_guid = c.target_guid AND a.type_meta_ver = c.type_meta_ver AND (a.category_prop_1 = c.category_prop_1 OR a.category_prop_1 = ' ') AND (a.category_prop_2 = c.category_prop_2 OR a.category_prop_2 = ' ') AND (a.category_prop_3 = c.category_prop_3 OR a.category_prop_3 = ' ') AND (a.category_prop_4 = c.category_prop_4 OR a.category_prop_4 = ' ') AND (a.category_prop_5 = c.category_prop_5 OR a.category_prop_5 = ' '); SELECT b.value,b.collection_timestamp into dgStbySummary(i).trans_lag, dgStbySummary(i).coll_timestamp FROM mgmt_metrics a, mgmt_current_metrics b, mgmt_targets c WHERE c.target_name = dgStbySummary(i).target_name AND c.target_type = dgStbySummary(i).target_type AND a.metric_guid = b.metric_guid AND a.metric_name='dataguard_sperf' AND a.metric_column= 'dg_pdl' AND b.target_guid = c.target_guid AND a.type_meta_ver = c.type_meta_ver AND (a.category_prop_1 = c.category_prop_1 OR a.category_prop_1 = ' ') AND (a.category_prop_2 = c.category_prop_2 OR a.category_prop_2 = ' ') AND (a.category_prop_3 = c.category_prop_3 OR a.category_prop_3 = ' ') AND (a.category_prop_4 = c.category_prop_4 OR a.category_prop_4 = ' ') AND (a.category_prop_5 = c.category_prop_5 OR a.category_prop_5 = ' '); END LOOP; EXCEPTION WHEN OTHERS THEN NULL; END; END get_dg_stby_values; procedure get_avail_info(targetName IN VARCHAR2, targetType IN VARCHAR2, availInfo OUT MGMT_HAPAGE_AVAIL_OBJ) IS k_error_msg_prefix CONSTANT VARCHAR2(128) := 'Oracle Enterprise Manager: ERROR in hapage_database.getAvailInfo('; ---------------- -- variables ---------------- typeDisplayName VARCHAR2(256); lastUpdatedTime DATE; currentStatus INTEGER; availPct NUMBER; availPctDay NUMBER; availPctWeek NUMBER; availPctMonth NUMBER; startTimestamp DATE; timeZone VARCHAR2(64); instanceName VARCHAR2(4000); instanceStartTime DATE; instanceVersion VARCHAR2(4000); oracleHome VARCHAR2(4000); cpuCount NUMBER; openMode VARCHAR2(64); targetGuid VARCHAR2(32); racInstGuid VARCHAR2(32); estMTTR NUMBER; meta_ver VARCHAR2(8); cat_prop_1 VARCHAR2(64); cat_prop_2 VARCHAR2(64); cat_prop_3 VARCHAR2(64); cat_prop_4 VARCHAR2(64); cat_prop_5 VARCHAR2(64); BEGIN BEGIN SELECT mt.target_guid, type_display_name, TYPE_META_VER, CATEGORY_PROP_1, CATEGORY_PROP_2, CATEGORY_PROP_3, CATEGORY_PROP_4, CATEGORY_PROP_5 INTO targetGuid, typeDisplayName, meta_ver, cat_prop_1, cat_prop_2, cat_prop_3, cat_prop_4, cat_prop_5 FROM mgmt_targets mt WHERE target_name = targetName AND target_type = targetType; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE mgmt_global.target_does_not_exist; END; ---------------- -- get current status information ---------------- BEGIN currentStatus := mgmt_target.get_avail_current_status(targetGuid); startTimestamp := mgmt_target.get_current_status_timestamp(targetGuid); -- TODO... lastUpdatedTime := mgmt_target.get_current_status_timestamp(targetGuid); EXCEPTION WHEN OTHERS THEN currentStatus := mgmt_global.g_status_unknown; startTimestamp := NULL; dbms_output.put_line(k_error_msg_prefix || targetName || ') -- unable to get current status.'); END; BEGIN ---------------- -- availability percentage ---------------- availPct := ROUND(mgmt_target.get_avail_pct_value(targetGuid, 10000), 2); EXCEPTION WHEN OTHERS THEN availPct := k_metric_status_inaccessible; dbms_output.put_line(k_error_msg_prefix || targetName || ') -- unable to get availability pct.'); END; BEGIN ---------------- -- availability percentage ---------------- availPctDay := ROUND(mgmt_target.get_avail_pct_value(targetGuid, 1), 2); EXCEPTION WHEN OTHERS THEN availPctDay := k_metric_status_inaccessible; dbms_output.put_line(k_error_msg_prefix || targetName || ') -- unable to get availability pct.'); END; BEGIN ---------------- -- availability percentage ---------------- availPctWeek := ROUND(mgmt_target.get_avail_pct_value(targetGuid, 7), 2); EXCEPTION WHEN OTHERS THEN availPctWeek := k_metric_status_inaccessible; dbms_output.put_line(k_error_msg_prefix || targetName || ') -- unable to get availability pct.'); END; BEGIN ---------------- -- availability percentage ---------------- availPctMonth := ROUND(mgmt_target.get_avail_pct_value(targetGuid, 31), 2); EXCEPTION WHEN OTHERS THEN availPctMonth := k_metric_status_inaccessible; dbms_output.put_line(k_error_msg_prefix || targetName || ') -- unable to get availability pct.'); END; ---------------- -- get database meta-information ---------------- BEGIN getDbStringValues(targetGuid, instanceName, instanceStartTime, instanceVersion, oracleHome, cpuCount, openMode); EXCEPTION WHEN OTHERS THEN instanceName := NULL; instanceStartTime := NULL; instanceVersion := NULL; oracleHome := NULL; cpuCount := 1; openMode := NULL; dbms_output.put_line(k_error_msg_prefix || targetName || ') -- unable to get instance attributes.'); END; ---------------- -- get database MTTR ---------------- BEGIN SELECT estimated_mttr INTO estMTTR FROM mgmt_ha_mttr WHERE target_guid = (select target_guid from mgmt_targets where target_name = targetName and target_type = targetType); EXCEPTION WHEN OTHERS THEN NULL; END; ---------------- -- get RAC instance start time and other props for earliest started inst ---------------- BEGIN IF targetType = 'rac_database' THEN select m.member_target_guid INTO racInstGuid from mgmt_target_properties p, mgmt_target_memberships m where p.target_guid = m.member_target_guid and m.composite_target_name = targetName and m.composite_target_type = targetType and p.property_name = 'StartTime' and p.property_value = (select min(p.property_value) from mgmt_target_properties p, mgmt_target_memberships m where p.target_guid = m.member_target_guid and m.composite_target_name = targetName and m.composite_target_type = targetType and p.property_name = 'StartTime'); IF racInstGuid IS NOT NULL THEN getDbStringValues(racInstGuid, instanceName, instanceStartTime, instanceVersion, oracleHome, cpuCount, openMode); END IF; END IF; EXCEPTION WHEN OTHERS THEN NULL; END; ---------------- -- return information ---------------- availInfo := MGMT_HAPAGE_AVAIL_OBJ(lastUpdatedTime, currentStatus, availPct, availPctDay, availPctWeek, availPctMonth, startTimestamp, instanceName, instanceStartTime, estMTTR, instanceVersion, oracleHome, cpuCount, openMode); END; /* getDbStringValues */ procedure getDbStringValues(targetGuid IN VARCHAR2, instanceName OUT VARCHAR2, instanceStartTime OUT DATE, instanceVersion OUT VARCHAR2, oracleHome OUT VARCHAR2, cpuCount OUT NUMBER, openMode OUT VARCHAR2) IS text_start_time VARCHAR2(1024) := NULL; property_time_format VARCHAR2(1024) := NULL; CURSOR aCursor (tg IN VARCHAR2) IS SELECT property_name, NVL(property_value, ' ') FROM mgmt_target_properties WHERE target_guid = HEXTORAW(tg) AND property_type IN ('INSTANCE', 'DYNAMICINSTANCE') AND property_name IN ('InstanceName', 'StartTime', 'Version', 'OracleHome', 'OpenMode', 'TimeFormat', 'CPUCount'); property_name VARCHAR2(64); property_value VARCHAR2(1024); begin instanceName := ' '; instanceStartTime := NULL; instanceVersion := ' '; oracleHome := ' '; cpuCount := 1; openMode := ' '; OPEN aCursor (targetGuid); LOOP FETCH aCursor INTO property_name, property_value; exit when aCursor%NOTFOUND; IF property_name = 'InstanceName' THEN instanceName := property_value; ELSIF property_name = 'StartTime' THEN text_start_time := property_value; ELSIF property_name = 'TimeFormat' THEN property_time_format := property_value; ELSIF property_name = 'Version' THEN instanceVersion := property_value; ELSIF property_name = 'OracleHome' THEN oracleHome := property_value; ELSIF property_name = 'CPUCount' THEN cpuCount := property_value; ELSIF property_name = 'OpenMode' THEN openMode := property_value; END IF; END LOOP; CLOSE aCursor; IF (text_start_time IS NOT NULL AND property_time_format IS NOT NULL) THEN instanceStartTime := TO_DATE(text_start_time, property_time_format); END IF; end; function getDate(targetName IN VARCHAR2, targetType IN VARCHAR2, datestr IN VARCHAR2) return DATE IS property_time_format VARCHAR2(1024) := NULL; BEGIN SELECT property_value INTO property_time_format FROM mgmt_target_properties WHERE target_guid = (select target_guid from mgmt_targets where target_name = targetName and target_type = targetType) AND property_name = 'TimeFormat'; IF (datestr IS NOT NULL AND property_time_format IS NOT NULL) THEN return TO_DATE(datestr, property_time_format); END IF; return TO_DATE(datestr, 'DY MON DD HH24:MI:SS YYYY'); EXCEPTION WHEN OTHERS THEN RETURN NULL; END; PROCEDURE get_ha_events_guids( mgmt_guids IN MGMT_USER_GUID_ARRAY, critical_sev IN NUMBER DEFAULT NULL, warning_sev IN NUMBER DEFAULT NULL, info_sev IN NUMBER DEFAULT NULL, days IN NUMBER DEFAULT NULL, ha_mgmt_events OUT MGMT_HAPAGE_EVENT_LIST ) IS begin BEGIN SELECT MGMT_HAPAGE_EVENT_OBJ ( h.target_name, h.target_type, h.severity_code, h.message, h.collection_timestamp, h.message_nlsid, h.message_params, 0) BULK COLLECT INTO ha_mgmt_events from ( select /*+CARDINALITY(guids 5)*/ distinct a.target_name, a.target_type,b.severity_code,b.message, b.collection_timestamp,b.message_nlsid, b.message_params from TABLE(CAST(mgmt_guids AS MGMT_USER_GUID_ARRAY)) guids, mgmt_targets a, mgmt_current_severity b, mgmt_metrics c, mgmt_current_metrics d, mgmt_current_violation v WHERE a.target_guid = guids.column_value and a.target_guid = b.target_guid and b.metric_guid = c.metric_guid and b.metric_guid = d.metric_guid(+) and b.target_guid = d.target_guid(+) and a.target_guid = v.target_guid and b.metric_guid = v.policy_guid and b.key_value = v.key_value(+) and b.key_value = d.key_value(+) AND (c.metric_name like 'dataguard%' OR c.metric_name like 'observer%' OR c.metric_name like 'ha_%' OR c.metric_name = 'Response' OR c.metric_name = 'Availability' OR c.metric_name = 'health_check' OR c.metric_name = 'Recovery_Area' OR c.metric_name = 'session_wait_chains' OR c.metric_name = 'UserBlock' OR c.metric_name = 'cardinality' OR c.metric_name = 'suspended_session' OR c.metric_name = 'wait_bottlenecks' OR c.metric_name = 'service' OR c.metric_name = 'service_performance') AND (c.category_prop_1 = a.category_prop_1 OR c.category_prop_1 = ' ') AND (c.category_prop_2 = a.category_prop_2 OR c.category_prop_2 = ' ') AND (c.category_prop_3 = a.category_prop_3 OR c.category_prop_3 = ' ') AND (c.category_prop_4 = a.category_prop_4 OR c.category_prop_4 = ' ') AND (c.category_prop_5 = a.category_prop_5 OR c.category_prop_5 = ' ') and b.load_timestamp > (SYSDATE - days) and b.severity_code IN (critical_sev,warning_sev,info_sev)) h ; EXCEPTION WHEN OTHERS THEN NULL; END; end get_ha_events_guids; procedure get_ha_events_targets( targetName IN VARCHAR2, targetType IN VARCHAR2, critical_sev IN NUMBER DEFAULT NULL, warn_sev IN NUMBER DEFAULT NULL, info_sev IN NUMBER DEFAULT NULL, days IN NUMBER DEFAULT NULL, haguids_out OUT MGMT_USER_GUID_ARRAY, ha_mgmt_events OUT MGMT_HAPAGE_EVENT_LIST ) AS l_target_guid mgmt_targets.target_guid%TYPE; l_guid_list EMD_MNTR_USER.cursorType; l_guid_counter INTEGER := 1; prmy_name VARCHAR2(64); db_name VARCHAR2(64); m_name VARCHAR2(64); role VARCHAR2(64); db_id NUMBER; prmy_db_id NUMBER; m_id NUMBER; BEGIN haguids_out := MGMT_USER_GUID_ARRAY(); BEGIN SELECT target_guid INTO l_target_guid FROM mgmt_targets tgt WHERE tgt.target_name=targetName AND tgt.target_type=targetType; EXCEPTION WHEN NO_DATA_FOUND THEN l_target_guid := NULL; END; BEGIN SELECT ROLE, DB_UNIQUE_NAME, DB_ID, PRMY_DB_UNIQUE_NAME, PRMY_DB_ID INTO role, db_name, db_id, prmy_name, prmy_db_id FROM MGMT_HA_DG_TARGET_SUMMARY WHERE target_guid = l_target_guid; IF role = 'PRIMARY' THEN m_name := db_name; m_id := db_id; -- Add the primary guid here. If standby, the guid will be added by the -- standby query haguids_out.extend(1); haguids_out(l_guid_counter) := l_target_guid; l_guid_counter := l_guid_counter + 1; OPEN l_guid_list FOR SELECT a.target_guid FROM MGMT_HA_DG_TARGET_SUMMARY a, MGMT_TARGETS b WHERE a.prmy_db_unique_name = m_name AND a.prmy_db_id = m_id AND a.active_stby = 'YES' AND a.target_guid = b.target_guid; -- If this is a standby, assemble standby table from rows that match -- this standby's PRMY_DB_UNIQUE_NAME and prmy_db_id ELSIF (instr(role,'STANDBY') > 0) THEN m_name := prmy_name; m_id := prmy_db_id; OPEN l_guid_list FOR SELECT UNIQUE a.target_guid FROM MGMT_HA_DG_TARGET_SUMMARY a, MGMT_TARGETS b WHERE ((a.DB_UNIQUE_NAME = m_name AND a.DB_ID = m_id) OR (a.prmy_db_unique_name = m_name AND a.prmy_db_id = m_id AND a.active_stby = 'YES')) AND a.target_guid = b.target_guid; END IF; LOOP FETCH l_guid_list INTO l_target_guid; EXIT WHEN l_guid_list%NOTFOUND; haguids_out.extend(1); haguids_out(l_guid_counter) := l_target_guid; l_guid_counter := l_guid_counter + 1; END LOOP; CLOSE l_guid_list; EXCEPTION WHEN OTHERS THEN NULL; END; -- make sure the initial guid has been added if (haguids_out.count < 1) then haguids_out.extend(1); haguids_out(l_guid_counter) := l_target_guid; l_guid_counter := l_guid_counter + 1; end if; OPEN l_guid_list FOR select /*+CARDINALITY(guids 5)*/ unique t.ASSOC_TARGET_GUID from table(cast(haguids_out as mgmt_user_guid_array)) guids, mgmt_target_assocs t where t.SOURCE_TARGET_GUID = guids.column_value ; -- Not support in EMDBSA... -- and t.assoc_guid = mgmt_assoc.g_contains_guid ; -- Note: to get the host/agent guids, remove the assoc_guid = 'contains'... LOOP FETCH l_guid_list INTO l_target_guid; EXIT WHEN l_guid_list%NOTFOUND; haguids_out.extend(1); haguids_out(l_guid_counter) := l_target_guid; l_guid_counter := l_guid_counter + 1; END LOOP; CLOSE l_guid_list; OPEN l_guid_list FOR select /*+CARDINALITY(guids 5) INDEX(t) */ t.target_guid from TABLE(CAST(haguids_out AS MGMT_USER_GUID_ARRAY)) guids, mgmt_targets t, mgmt_target_properties p where t.target_type = 'osm_instance' and p.property_name = 'SID' and t.target_guid = p.target_guid and upper(p.property_value) in (select upper(property_value) from mgmt$target_properties tp where tp.property_name = 'OSMInstance' AND tp.target_guid = guids.column_value AND tp.property_value != ' ') and t.host_name in (select host_name from mgmt_targets where target_guid = guids.column_value); LOOP FETCH l_guid_list INTO l_target_guid; EXIT WHEN l_guid_list%NOTFOUND; haguids_out.extend(1); haguids_out(l_guid_counter) := l_target_guid; l_guid_counter := l_guid_counter + 1; END LOOP; CLOSE l_guid_list; get_ha_events_guids(haguids_out, critical_sev, warn_sev, info_sev, days, ha_mgmt_events); end get_ha_events_targets; procedure get_ha_events( targetName IN VARCHAR2, targetType IN VARCHAR2, haguids_out OUT MGMT_USER_GUID_ARRAY, ha_mgmt_events OUT MGMT_HAPAGE_EVENT_LIST ) AS begin get_ha_events_targets(targetName,targetType,25,20,18,9999, haguids_out, ha_mgmt_events); end; procedure dump_ha_info( haguids MGMT_USER_GUID_ARRAY, events mgmt_hapage_event_list ) IS l_target_name varchar2(256); l_target_type varchar2(256); maxCount number; ha_targets EMD_MNTR_USER.cursorType; BEGIN DBMS_OUTPUT.PUT_LINE(' ********************** '); DBMS_OUTPUT.PUT_LINE('----'); DBMS_OUTPUT.PUT_LINE('---- GOT ' || haguids.COUNT || ' targets -----'); DBMS_OUTPUT.PUT_LINE(' '); open ha_targets for select /*+CARDINALITY(guids 5)*/ t.target_name,t.target_type from TABLE(CAST(haguids AS MGMT_USER_GUID_ARRAY)) guids, mgmt_targets t WHERE t.target_guid = guids.column_value; LOOP FETCH ha_targets INTO l_target_name, l_target_type; EXIT WHEN ha_targets%NOTFOUND; DBMS_OUTPUT.PUT_LINE(l_target_name || ':' || l_target_type); END LOOP; CLOSE ha_targets; if events is not null then DBMS_OUTPUT.PUT_LINE(' ********************** '); DBMS_OUTPUT.PUT_LINE('---- GOT ' || events.COUNT || ' events ----'); DBMS_OUTPUT.PUT_LINE(' '); maxCount := 5; if (events.count < 5) then maxCount := events.count; end if; FOR i IN 1 .. maxCount LOOP DBMS_OUTPUT.PUT_LINE('event:' || events(i).target_name || ', ' || events(i).msg || ' : ' || events(i).creation_date || ' sev: ' || events(i).severity || ' ack: ' || events(i).acknowledged); END LOOP; end if; end; end hapage_database; /