一、前言
在自动化巡检中,要实现知识库,对一个专业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:auto_check_title.append(title_input)
str_output = ['病毒对象检查(含勒索):无', '00000000']
else:
str_output = [f'数据库中存在勒索病毒对象,请重视', '11111111']
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 = ''复制
这样,就完成了一个基本的巡检日志知识库匹配了。
下一步,我们讲一下,如何在巡检日志中绘制表格、图片等。