暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

利用python进行数据库自动化巡检中的知识库问题

原创 red_hope 2022-05-12
799

一、前言

在自动化巡检中,要实现知识库,对一个专业DBA来说,是一个很简单的事情,甭管错误千变万化,其实,你负责的那几个局点,异常巡检中发现的错误,99%都是固定的。

二、思路

一、穷尽错误

有的人说穷尽错误是不可能的,因为ORA-00600下面就可能有几十万个错误,不可能穷尽,

这样理解就有点偏颇了,我们当然不能穷尽错误,我们巡检的时候,只要是ORA-00600开头的,全部都算错误!

因此,在穷尽错误的时候,有两点注意:

一、需要一个有经验的DBA来指导

二、“错误指标”定义尽量宽泛,不要过于具体,例如,可以认为只要是  ORA- 开头的,都需要采集即可

当然,还有其他的关注点:

除了关注数据库的各项指标外,主机的错误日志、文件系统使用率、主机参数配置等,同样需要关注及采集。


穷尽错误的过程,我们称之为:

错误发现


二、编写知识库函数

错误发现后,将错误通过关键字对、正则表达式等等PYTHON你喜欢的各种智能化函数(还有AI的),与知识库进行匹配就可以了。

需要注意两点:

1、AI技术在这里面用来玩玩就可以了。

因为复杂的搜索算法,可能将你错误匹配到一个99%相似的知识点上,但可能这个知识点并不是用来解决这个错误的。

2、爬虫技术的应用,也用来研究就可以了

根据错误,上网爬取知识,是一个不错的思路,但爬取的知识和错误的对应,一定要经过人工审核。

3、目前比较靠谱的做法:

(1)就是使用爬虫技术,爬取解决办法,然后人工审核编订入库,实现错误与解决方案的绝对可靠(经过有经验的DBA确认的)。

(2)将有经验的DBA的自有宝典,录入到数据库中(这条路是最好的)

大型公司,或者有研发能力的公司,一般都采用第二种方式。


三、具体实现

第一步:采集日志
一般客户现场需要离线采集,采集日志用我们喜欢的任何方法都可以。

采集的时候,一定要输出两个东西:

采集标题:表示采集的什么内容,例如:表空间,对应下文:title_input

采集详情:采集的具体结果,对应下文:str_input


第二步:问题发现函数
复制
通过对巡检日志中关键字比对或者计算,发现错误。
复制
# 11111111 表示有问题。
复制
# 00000000表示有问题,在精简模式中,没有问题的不输出,有的客户要全部信息,就需要输出这一部分。
复制
def get_error_from_str_input(title_input, str_input):
复制
   str_output = []  # 没发现什么,就先输出巡检正常
复制
   if 'LINUX系统透明大页检查' in title_input:
if '[always]' in str_input:
str_output = [f'Linux未关闭透明大页,根据最佳实践,建议关闭透明大页,提升ORACLE性能.', '11111111']
elif '[never]' in str_input:
str_output = ['巡检正常:Linux已关闭透明大页。', '00000000']
else:
str_output = ['无法自动检查透明大页开启情况,采集信息异常,请注意检查。', '11111111']
复制
   elif '数据库病毒检查' in title_input:
     if 'no rows selected' in str_input:
str_output = ['病毒对象检查(含勒索):无', '00000000']
else:
str_output = [f'数据库中存在勒索病毒对象,请重视', '11111111']
auto_check_title.append(title_input)
auto_check_title.append(title_input)
复制
    #其它巡检内容问题发现
复制
   return str_output
复制
title_input:巡检项,例如上面的是巡检的:LINUX系统透明大页检查。
复制
str_input:对应巡检项目的巡检结果,LINUX系统透明大页检查。
复制

问题发现要根据我们的巡检项目逐一判断。


第二步:知识库匹配

知识库的存储最好使用数据库,mysql操作数据库非常方便,例如操作mysql数据库,pymysql工具包,就非常方便。

当然,前期,可以在python代码里直接写处理措施。

用到的技术:关键字匹配,根据关键字,输出处理措施。关键字匹配,看上去很傻,但是贵在精准。

下面这个函数:get_how_todo,只有有巡检发现错误的时候才需要调用

def get_how_todo(title_input,str_input):
复制
    do_out = ''
复制
    return do_out
复制
title_input:采集标题
复制
str_input:错误日志信息
复制
通过第一步,我们发现哪个巡检项有问题,才会调用get_how_todo。
复制

知识库匹配有两种方式:

  • 根据巡检标题直接匹配
  • 根据巡检标题+错误日志进行匹配

(1)根据巡检标题直接匹配

例如:发现“LINUX系统透明大页检查”是问题项,我们前面认为 [always] 出现在巡检结果中,只要这一巡检项有问题,就可以直接输出解决方案:

if '透明大页检查' in title_input:
do_out = 'REDHAT 6版本:\n' \
'编辑:/etc/grub.conf,找到’kernel /vmlinuz-‘一行,在最后添加 transparent_hugepage=never,然后重启操作系统。\n' \
'REDHAT 7版本:\n' \
'编辑: /etc/default/grub将transparent_hugepage=never添加到GRUB_CMDLINE_LINUX的最后,采取如下措施:\n' \
'当节点使用UEFI安装和启动时,使用如下命令:\n' \
'grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg;\n' \
'当节点使用传统BIOS安装和启动时,使用如下命令:\n' \
'grub2-mkconfig -o /boot/grub2/grub.cfg。 \n' \
'重启操作系统生效。\n' \
'以上均使用root操作。' \
复制
return do_out
复制

(2)根据巡检标题+错误日志进行匹配

在某些巡检项目中,有大量错误,例如日志巡检,就需要str_input也来参与了,通过对巡检日志的逐个判断,然后输出解决方案:

if '数据库日志检查' in title_input:
list_input=str_input.splitlines()
......
# 防止同样的错误及其解决方案被重复输出,增加check_or_not进行校验
check_or_not = []
# wenti_count 问题数量记录
wenti_count = 1
for ora_str in list_input:
if 'ORA-00600:' in ora_str and '[kclgclks_3]' in ora_str:
if 'ORA-00600:[kclgclks_3]' not in check_or_not:
do_out =qian_str+do_out +hou_str+ fenge_str +f'{ora_str}错误信息:\noracle bug: Bug 23128150 ORA-600 [kclgclks_3] ,Patch 26556014 ' \
'可以解决该问题。\n'
check_or_not.append('ORA-00600:'+'[kclgclks_3]')
wenti_count = wenti_count + 1

elif 'ORA-16401: archive log rejected by' in ora_str or 'ORA-16055: FAL request rejected' in ora_str:
do_out = qian_str + do_out + hou_str + fenge_str + 'ADG数据同步发生短暂延迟,一般为日志切换过于频繁或网络短暂中断导致'
wenti_count = wenti_count + 1
elif 'ORA-00700: soft internal error, arguments: [kskvmstatact: excessive swapping observed]' in ora_str:
do_out = qian_str + do_out + hou_str + fenge_str + '该错误时为ORACLE数据库 BUG,在12.2.0.1.191015补丁中被修复,' \
'数据库当前补丁为12.2.0.1.180717,详见 Bug 23104033 - ' \
'False ORA-700 [kskvmstatact: excessive swapping ' \
'observed] errors (Doc ID 23104033.8)'
wenti_count = wenti_count + 1
else:
shot_ora_str = ora_str[0:50]
if shot_ora_str not in check_or_not:
do_out = qian_str+do_out +hou_str+ fenge_str + f'{ora_str}错误信息:\n该错误暂未找到相关处理措施,需要进一步分析\n'
check_or_not.append(shot_ora_str)
wenti_count = wenti_count + 1
ent_count = ent_count + 1
if wenti_count == 1:
do_out = ''
复制


这样,就完成了一个基本的巡检日志知识库匹配了。

下一步,我们讲一下,如何在巡检日志中绘制表格、图片等。




最后修改时间:2022-05-12 13:59:43
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论