数据库管理-第144期 深入使用EMCC-01(20240204)

数据库管理144期 2024-02-04

  • 数据库管理-第144期 深入使用EMCC-01(20240204)
    • 1 用户管理
    • 2 配置告警动作
    • 3 配置意外事件规则
    • 总结

数据库管理-第144期 深入使用EMCC-01(20240204)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Associate: Database(Oracle与MySQL)
网思科技 DBA总监
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、认证技术专家,ITPUB认证专家,OCM讲师
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭。

之前写过不少和EMCC相关的内容,包括安装升级及部分使用案例,但是比较零散,这里先汇总一下:

  • 数据库管理-第八十一期 保姆级EMCC搭建教程(20230606)(https://www.modb.pro/db/640868)
  • 数据库管理-第八十二期 EMCC升级教程(20230607)(https://www.modb.pro/db/641402)
  • Oracle数据库管理每周一例-第十五期 一些工具和小技巧(https://blog.csdn.net/yhw1809/article/details/108702252)
  • 数据库管理-第五十六期 监控(20230210)(https://blog.csdn.net/yhw1809/article/details/128974630)

这里准备使用若干期来讲讲EMCC的深入点的配置与使用,所有内容都源自于实际生产。

1 用户管理

这里指的是EMCC本身的用户,在生产过程中除了我们长期使用的超级管理员sysman,也可以给其他EMCC使用者配置对应权限的用户,我们这里配置的最多的就是针对某个PDB的全部权限,不能打开其他的数据库:
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
这里不建议配置其他权限,也不需要配置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 Method(https://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 occured>sysdate-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与通知操作进行关联:
image.png
image.png
image.png
可以通过“测试PL/SQL过程”来测试,这里还需要注意一点,使用中可能会出现PL/SQL无法正常调用的情况,可以在EMCC或直接到资料库中重新编译该PL/SQL即可。
通知操作完成之后,我们仍然无法在表中获取告警信息,这里还需要配置意外事件规则。

3 配置意外事件规则

image.png
image.png
image.png
这里可以以各种方式配置告警的目标内容。
image.png
这里默认选项即可。
image.png
这里我们一般配置“度量告警”和“目标可用性”两种规则即可。
image.png
image.png
image.png
image.png
如果有其他类型告警动作,继续添加即可。
image.png
可以根据自己喜好改名。
image.png
image.png
完成创建后,对应的告警信息就会通过前面配置的PL/SQL正常实时刷入对应表中。
image.png

总结

本篇文章,讲解了如何配置EMCC用户和如何实现基于PL/SQL的告警。
老规矩,知道写了些啥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大创项目推荐 题目:基于深度学习的人脸表情识别 - 卷积神经网络 大创项目推荐 代码

文章目录 0 简介1 项目说明2 数据集介绍:3 思路分析及代码实现3.1 数据可视化3.2 数据分离3.3 数据可视化3.4 在pytorch下创建数据集3.4.1 创建data-label对照表3.4.2 重写Dataset类3.4.3 数据集的使用 4 网络模型搭建4.1 训练模型4.2 模型的保存与加载 5 相关源码6…

vscode1.86无法远程连接waiting the server log

问题 vscode升级到最新的1.86版本后,无法远程连接服务器Remote SSH,在log中提示如下: 观察下面的log提示可得: glibc的版本好像不符合vscode1.86版本的要求。你可以在你的服务器上运行下面的指令查看glibc的版本: …

Chrome扩展开发纪要

1. 开发人员模式 以Edge(Chromium)为例, 可在管理扩展页, 在左侧开发人员模式打开, 只有此项开启后才能加载未压缩的扩展, 虽然也可以打包扩展, 但是浏览器会检测, 未上线的crx包是无法被安装的. 所以不打算上架的crx只能使用 加载解压缩的扩展 安装 2. 创建扩展 2.1 建立文…

【计算机网络】物理层概述|通信基础|奈氏准则|香农定理|信道复用技术

目录 一、思维导图 二、 物理层概述 1.物理层概述 2.四大特性(巧记"械气功程") 三、通信基础 1.数据通信基础 2.趁热打铁☞习题训练 3.信号の变身:编码与调制 4.极限数据传输率 5.趁热打铁☞习题训练 6.信道复用技术 推荐 前些天发…

服务器端会话技术-Session

一、Session 1.1 概述和快速入门 概述:Session 是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中 快速入门 获取 HttpSession 对象使用 HttpSession 对象 常用方法 方法作用HttpSession request.getSe…

图像处理常用算法介绍

此篇简单回顾下图像处理领域常用到的一些算法,这边只对每个知识点重要的点做一些记录,便于快速的知其形,会其意。 一. SIFT(Scale-Invariant feature transform)特征 重点是了解DOG(Difference of Gaussian)高斯差分图像是如何生…

ubuntu离线安装k8s

目录 一、前期准备 二、安装前配置 三、安装docker 四、安装cri-dockerd 五、部署k8s master节点 六、整合kubectl与cri-dockerd 七、网络等插件安装 八、常见问题及解决方法 一、前期准备 ①ubuntu系统 本地已安装ubuntu系统,lsb_release -a命令查看版本信…

2024网络安全学习路线,最全保姆级教程,学完直接拿捏!

关键词: 网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊,学习网络安全方向通常会有哪些问题 前排提示:文末有CSDN独家网络安全资料包! 1、打基础时间太长 学基础花费很长时间,光语言都…

Windows10安装PCL1.14.0及点云配准

一、下载visual studio2022 下载网址:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 安装的时候选择"使用C的桌面开发“,同时可以修改文件路径,可以放在D盘。修改文件路径的时候,共享组件、…

Open CASCADE学习|拉伸

目录 1、沿方向拉伸 2、沿路径拉伸 3、变形拉伸 1、沿方向拉伸 #include <Geom_CylindricalSurface.hxx> #include <gp_Ax3.hxx> #include <GeomAPI_Interpolate.hxx> #include <BRepAdaptor_Curve.hxx> #include <BRepBuilderAPI_MakeEdge.hxx&…

追觅发布多款旗舰新品,双机械臂扫地机器人X40领衔登场

2月2日&#xff0c;追觅科技全球首创仿生“双”机械臂新品发布会在苏州举行。会上&#xff0c;追觅科技中国区总裁郭人杰分享了追觅科技全球化发展的业绩成果。郭人杰称&#xff0c;2019-2023年&#xff0c;追觅科技5年复合年增长率超过100%&#xff0c;增速领跑智能清洁行业&a…

LeetCode、746. 使用最小花费爬楼梯【简单,动态规划 线性DP】

文章目录 前言LeetCode、746. 使用最小花费爬楼梯【简单&#xff0c;动态规划 线性DP】题目与分类思路 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。…

C语言——教师信息管理系统

1.教师信息添加.h void InputTeacher() {int c 0;system("cls");printf("\t\t*************************************************\n");printf("\t\t******** 欢迎来到教师信息添加系统 **********\n");printf("\t\t***************…

python的进程,线程、协程

python进程的实现 #coding:utf-8 from multiprocessing import Process import timedef run(name):print(%s is running % name)time.sleep(3)print(%s finished his run % name)if __name__ __main__:p Process(targetrun, args(XWenXiang,)) # 创建一个进程对象p.start()…

Luogu P3388 【模板】割点(割顶) 题解 Tarjan/割点

题目链接&#xff1a;Luogu P3388 【模板】割点&#xff08;割顶&#xff09; 题目描述&#xff1a; 给定一张无向图&#xff0c;输出割点个数以及割点编号。 割点的定义&#xff1a;删除一个点及其连接的边后&#xff0c;若能使图的联通块数量增加&#xff0c;那么被删除的这个…

怎么在bash shell中操作复杂json对象

怎么在bash shell中操作复杂json对象 在bash shell中操作复杂JSON对象&#xff0c;jq可以帮助我们在bash环境下轻松地处理这类数据&#xff0c;本文将详细介绍如何使用jq在bash中操作复杂的JSON对象。 jq是一个轻量级且灵活的命令行JSON处理器&#xff0c;它允许你以非常高效的…

学习数据结构和算法的第3天

常数循环的复杂度 计算Func4的时间复杂度 voidFunc4(int N) { int count 0; for (int k 0; k < 100; k) { count; } printf("%d\n", count); }O&#xff08;1&#xff09; 不是代表算法运行一次&#xff0c;是常数次 strchar的时间复杂度 #include<stdi…

k8s版本升级到1.24.x

每个版本升级都有对应的文档,以1.23升级到1.24为例。 1.24.6版本后,k8s不再依赖于docker。需要先切换到使用containerd。 可以查看栏目的k8s安装文档。 确定要升级到哪个版本 使用操作系统的包管理器找到最新的补丁版本 Kubernetes 1.24: yum list --showduplicates kub…

Redis(十二)Bigkey

文章目录 游标案例生成100万测试数据key生产上限制keys */flushdb/flushall等危险命令不使用keys *&#xff1a;scan Biigkey案例多大算大发现bigkey渐进式删除生产调优示例问题 游标案例 生成100万测试数据key shell: for((i1;i<100*10000;i)); do echo "set k$i v…

Nicn的刷题日常之调整奇数偶数顺序

目录 1.题目描述 2.解题思路 3.解题 1.题目描述 输入一个整数数组&#xff0c;实现一个函数&#xff0c; 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c; 所有偶数位于数组的后半部分。 2.解题思路 1. 给定两个下标left和right&#xff…