怎么样做好网站建设,投教网站建设,网站建设实施流程图,广西冶金建设公司网站数据库管理144期 2024-02-04 数据库管理-第144期 深入使用EMCC-01#xff08;20240204#xff09;1 用户管理2 配置告警动作3 配置意外事件规则总结 数据库管理-第144期 深入使用EMCC-01#xff08;20240204#xff09; 作者#xff1a;胖头鱼的鱼缸#xff08;尹海文202402041 用户管理2 配置告警动作3 配置意外事件规则总结 数据库管理-第144期 深入使用EMCC-0120240204 作者胖头鱼的鱼缸尹海文 Oracle ACE Associate: DatabaseOracle与MySQL 网思科技 DBA总监 10年数据库行业经验现主要从事数据库服务工作 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVP、认证技术专家ITPUB认证专家OCM讲师 圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号非著名社恐社交恐怖分子 公众号胖头鱼的鱼缸CSDN胖头鱼的鱼缸尹海文墨天轮胖头鱼的鱼缸ITPUByhw1809。 除授权转载并标明出处外均为“非法”抄袭。 之前写过不少和EMCC相关的内容包括安装升级及部分使用案例但是比较零散这里先汇总一下
数据库管理-第八十一期 保姆级EMCC搭建教程20230606https://www.modb.pro/db/640868数据库管理-第八十二期 EMCC升级教程20230607https://www.modb.pro/db/641402Oracle数据库管理每周一例-第十五期 一些工具和小技巧https://blog.csdn.net/yhw1809/article/details/108702252数据库管理-第五十六期 监控20230210https://blog.csdn.net/yhw1809/article/details/128974630
这里准备使用若干期来讲讲EMCC的深入点的配置与使用所有内容都源自于实际生产。
1 用户管理
这里指的是EMCC本身的用户在生产过程中除了我们长期使用的超级管理员sysman也可以给其他EMCC使用者配置对应权限的用户我们这里配置的最多的就是针对某个PDB的全部权限不能打开其他的数据库 这里不建议配置其他权限也不需要配置Role主要是为了精细化权限控制。至此用户创建完成该用户仅对wgbak这个数据库集群下的PDB_TEST有所有权限。 这里在说明一下这里创建的用户和sysman用户一样在EMCC的资料库也会同步创建数据库用户。
2 配置告警动作
首先EMCC是支持SNMP的v1和v3都可以还有email和webhook等这些配置过程是图形化的而且要外部对接这里就不做演示了。但是这里也要说明一点一些email和webhook的接口标准与咱们使用的不一定能对接的上而且EMCC一般用于内网是无法直接连接到对应外部接口的即使打通也有安全风险。 所以我的方式是自己写了个Python定期刷EMCC资料库中的一张表然后将表中最近N分钟的内容发送到客户内网自建的短信接口上。但是这里有一点比较麻烦的是EMCC资料库内部记录告警的表比较分散而且并非所有内容都会记录在表中。EMCC官方文档给了一个解决方案Cloud Control Monitoring Guide-6 Using Notifications在Defining a PL/SQL-based Notification Methodhttps://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/13.5/emmon/using-notifications.html#GUID-FE309CE0-2ED3-460A-AA95-71A062DCC125章节中可以通过下面的PL/SQL来实现告警内容的实时汇总至一张表
-- 使用sysman用户创建
CREATE TABLE event_log (notification_type VARCHAR2(32),repeat_count NUMBER,ruleset_name VARCHAR2(256),rule_owner VARCHAR2(256),rule_name VARCHAR2(256),message VARCHAR2(4000),message_url VARCHAR2(4000),event_instance_guid RAW(16),event_type VARCHAR2(20),event_name VARCHAR2(512),event_msg VARCHAR2(4000),categories VARCHAR2(4000),source_obj_type VARCHAR2(120),source_obj_name VARCHAR2(256),source_obj_url VARCHAR2(4000),severity VARCHAR2(128),severity_code VARCHAR2(32),target_name VARCHAR2(256),target_type VARCHAR2(128),target_url VARCHAR2(4000),host_name VARCHAR2(256),timezone VARCHAR2(64),occured DATE,ca_guid RAW(16),ca_name VARCHAR2(128),ca_owner VARCHAR2(256),ca_type VARCHAR2(256),ca_status VARCHAR2(64),ca_status_code NUMBER,ca_job_step_output VARCHAR2(4000),ca_execution_guid RAW(16),ca_stage_change_guid RAW(16)
)
;CREATE OR REPLACE PROCEDURE log_event(s IN GC$NOTIF_EVENT_MSG)
ISl_categories gc$category_string_array;l_ca_obj gc$notif_corrective_action_job;l_categories_new VARCHAR2(1000);
BEGIN-- save event categoriesl_categories : s.event_payload.categories;IF l_categories IS NOT NULLTHENFOR c IN 1..l_categories.COUNTLOOPl_categories_new : (l_categories_new|| c || - || l_categories(c)||,);END LOOP;END IF;-- save event messageIF s.msg_info.notification_type NOTIF_CA AND s.event_payload.corrective_action IS NOT NULLTHENl_ca_obj : s.event_payload.corrective_action;INSERT INTO event_log (notification_type, repeat_count, ruleset_name, rule_name, rule_owner, message, message_url, event_instance_guid, event_type, event_name, event_msg, categories, source_obj_type, source_obj_name, source_obj_url, severity, severity_code, target_name, target_type, target_url, host_name, timezone, occured, ca_guid, ca_name, ca_owner, ca_type, ca_status, ca_status_code, ca_job_step_output, ca_execution_guid, ca_stage_change_guid)VALUES (s.msg_info.notification_type, s.msg_info.repeat_count, s.msg_info.ruleset_name, s.msg_info.rule_name,s.msg_info.rule_owner, s.msg_info.message, s.msg_info.message_url, s.event_payload.event_instance_guid, s.event_payload.event_type, s.event_payload.event_name, s.event_payload.event_msg, l_categories_new, s.event_payload.source.source_type, s.event_payload.source.source_name, s.event_payload.source.source_url, s.event_payload.severity, s.event_payload.severity_code, s.event_payload.target.target_name, s.event_payload.target.target_type, s.event_payload.target.target_url, s.event_payload.target.host_name, s.event_payload.target.target_timezone, s.event_payload.occurrence_date, l_ca_obj.JOB_GUID, l_ca_obj.JOB_NAME, l_ca_obj.JOB_OWNER, l_ca_obj.JOB_TYPE, l_ca_obj.JOB_STATUS, l_ca_obj.JOB_STATUS_CODE, l_ca_obj.JOB_STEP_OUTPUT, l_ca_obj.JOB_EXECUTION_GUID, l_ca_obj.JOB_STATE_CHANGE_GUID); ELSEINSERT INTO event_log (notification_type, repeat_count, ruleset_name, rule_name, rule_owner, message, message_url, event_instance_guid, event_type, event_name, event_msg, categories, source_obj_type, source_obj_name, source_obj_url, severity, severity_code, target_name, target_type, target_url, host_name, timezone, occured, ca_guid, ca_name, ca_owner, ca_type, ca_status, ca_status_code, ca_job_step_output, ca_execution_guid, ca_stage_change_guid)VALUES (s.msg_info.notification_type, s.msg_info.repeat_count, s.msg_info.ruleset_name, s.msg_info.rule_name, s.msg_info.rule_owner, s.msg_info.message, s.msg_info.message_url, s.event_payload.event_instance_guid, s.event_payload.event_type, s.event_payload.event_name, s.event_payload.event_msg, l_categories_new, s.event_payload.source.source_type, s.event_payload.source.source_name, s.event_payload.source.source_url, s.event_payload.severity, s.event_payload.severity_code, s.event_payload.target.target_name, s.event_payload.target.target_type, s.event_payload.target.target_url, s.event_payload.target.host_name, s.event_payload.target.target_timezone, s.event_payload.occurrence_date, null,null,null,null,null,null,null,null,null);END IF;COMMIT;
END log_event;
/--这里由于时间记录会包含时区信息可能会出现记录异常的现象因此需要调整调整后PL/SQL如下
CREATE OR REPLACE PROCEDURE log_event(s IN GC$NOTIF_EVENT_MSG)
ISl_categories gc$category_string_array;l_ca_obj gc$notif_corrective_action_job;l_categories_new VARCHAR2(1000);
BEGIN-- save event categoriesl_categories : s.event_payload.categories;IF l_categories IS NOT NULLTHENFOR c IN 1..l_categories.COUNTLOOPl_categories_new : (l_categories_new|| c || - || l_categories(c)||,);END LOOP;END IF;-- save event messageIF s.msg_info.notification_type NOTIF_CA AND s.event_payload.corrective_action IS NOT NULLTHENl_ca_obj : s.event_payload.corrective_action;INSERT INTO event_log (notification_type, repeat_count, ruleset_name, rule_name, rule_owner, message, message_url, event_instance_guid, event_type, event_name, event_msg, categories, source_obj_type, source_obj_name, source_obj_url, severity, severity_code, target_name, target_type, target_url, host_name, timezone, occured, ca_guid, ca_name, ca_owner, ca_type, ca_status, ca_status_code, ca_job_step_output, ca_execution_guid, ca_stage_change_guid)VALUES (s.msg_info.notification_type, s.msg_info.repeat_count, s.msg_info.ruleset_name, s.msg_info.rule_name,s.msg_info.rule_owner, s.msg_info.message, s.msg_info.message_url, s.event_payload.event_instance_guid, s.event_payload.event_type, s.event_payload.event_name, s.event_payload.event_msg, l_categories_new, s.event_payload.source.source_type, s.event_payload.source.source_name, s.event_payload.source.source_url, s.event_payload.severity, s.event_payload.severity_code, s.event_payload.target.target_name, s.event_payload.target.target_type, s.event_payload.target.target_url, s.event_payload.target.host_name, s.event_payload.target.target_timezone, sysdate, l_ca_obj.JOB_GUID, l_ca_obj.JOB_NAME, l_ca_obj.JOB_OWNER, l_ca_obj.JOB_TYPE, l_ca_obj.JOB_STATUS, l_ca_obj.JOB_STATUS_CODE, l_ca_obj.JOB_STEP_OUTPUT, l_ca_obj.JOB_EXECUTION_GUID, l_ca_obj.JOB_STATE_CHANGE_GUID); ELSEINSERT INTO event_log (notification_type, repeat_count, ruleset_name, rule_name, rule_owner, message, message_url, event_instance_guid, event_type, event_name, event_msg, categories, source_obj_type, source_obj_name, source_obj_url, severity, severity_code, target_name, target_type, target_url, host_name, timezone, occured, ca_guid, ca_name, ca_owner, ca_type, ca_status, ca_status_code, ca_job_step_output, ca_execution_guid, ca_stage_change_guid)VALUES (s.msg_info.notification_type, s.msg_info.repeat_count, s.msg_info.ruleset_name, s.msg_info.rule_name, s.msg_info.rule_owner, s.msg_info.message, s.msg_info.message_url, s.event_payload.event_instance_guid, s.event_payload.event_type, s.event_payload.event_name, s.event_payload.event_msg, l_categories_new, s.event_payload.source.source_type, s.event_payload.source.source_name, s.event_payload.source.source_url, s.event_payload.severity, s.event_payload.severity_code, s.event_payload.target.target_name, s.event_payload.target.target_type, s.event_payload.target.target_url, s.event_payload.target.host_name, s.event_payload.target.target_timezone, sysdate, null,null,null,null,null,null,null,null,null);END IF;COMMIT;
END log_event;这里还需要注意一下在完成升级包括大版本和补丁或其他操作后查询表名或视图可能会产生变化变为event_log_e。
-- 每5分钟读一次该表信息然后将查出来的内容发给外部接口
select event_type:||event_type||,severity:||severity||,target_name:||target_name||,message:||message||,occured:||to_char(occured,yyyy-mm-dd hh24:mi:ss) from sysman.event_log(_e) where id 0 and occuredsysdate-5/(24*60);-- 这里一般还会根据实际情况排除一些内容比如
host_name like xxx.xxx.xxx%
message not like Metrics Global Cache Blocks Lost%
message not like %job%
message not like %CHA%
message not like %Memory%
message not like %SYS%
-- 根据自身情况进行调整接下来还需要在EMCC里面将这个PL/SQL与通知操作进行关联 可以通过“测试PL/SQL过程”来测试这里还需要注意一点使用中可能会出现PL/SQL无法正常调用的情况可以在EMCC或直接到资料库中重新编译该PL/SQL即可。 通知操作完成之后我们仍然无法在表中获取告警信息这里还需要配置意外事件规则。
3 配置意外事件规则 这里可以以各种方式配置告警的目标内容。 这里默认选项即可。 这里我们一般配置“度量告警”和“目标可用性”两种规则即可。 如果有其他类型告警动作继续添加即可。 可以根据自己喜好改名。 完成创建后对应的告警信息就会通过前面配置的PL/SQL正常实时刷入对应表中。
总结
本篇文章讲解了如何配置EMCC用户和如何实现基于PL/SQL的告警。 老规矩知道写了些啥。