python监控达梦数据库

本文档介绍了如何使用dmPython接口连接并操作达梦数据库,包括安装过程、环境配置,以及通过paramiko模块远程登录服务器获取内存使用情况。此外,还展示了如何监控数据库会话使用率,并将数据存储到指定表中,实现了基础的数据库监控功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

dmPython是DM提供的依据Python DB API version 2.0中API使用规定而开发的数据库访问接口。使用API能对DM数据库进行访问。
dmPythonn 接口当前版本号为 2.3,需要对应的DM Server版本为7.0.0.9以上,Python版本为2.6以上。
本次目标任务为获取到服务器与数据库的关键信息后,将结果插入保存数据的数据库中。

库中数据存放规划

IP时间内存使用率会话数使用率

前置条件

  1. 本次使用的Windows 11连接达梦数据库
  2. 已安装python2.6及以上版本(本文使用版本为anaconda虚拟环境3.8)
  3. 已安装DM8数据库中的驱动包

Windows版本 dmPython安装

dmPython路径一般为DM安装路径下的drivers/python/dmPython/目录中。
进入anaconda虚拟环境下执行:

cd /dm/drivers/python/dmPython/
python setup.py install

此时一般会报
Microsoft Visual C++ 14.0 is required
原因是C++包的缺失
此时需要下载Microsoft Visual C++ 14.0的包
提取码:8scp

成功安装后。
输入pip list 会在里面找到dmPython 2.3.0,说明已经安装成功。
dmPython 的运行需要使用 dpi 动态库,用户应将 dpi 所在目录(一般为 DM 安装目录
中的 bin 目录)加入系统环境变量。
在这里插入图片描述

python版本3.8以下

这个是时候执行

import dmPython

将会正常输出结果

python版本3.8及3.8以上

由于python 3.8为了防止出现DLL 劫持之类的安全风险。限制了DLL的加载规则
必须将DLL包导入到文件的路径才能使用DLL。

import sys
sys.path

输出的结果中找到dmpython-2.3-py3.8-win-amd64.egg
在这里插入图片描述
将DM安装路径下的drivers\dpi下所有文件复制到对应的目录下。即可正常打开。

使用paramiko登录远程服务器

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.71.50',port='22',username='dmdba',password='123456')
commandin,commandout,commanderr=ssh.exec_command('free')
commandout=commandout.read().decode('utf-8')
print(commandout)

在这里插入图片描述
将登录参数从其中剥离出来

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ip=['192.168.71.50','22','dmdba','123456']
ssh.connect(hostname=ip[0],port=ip[1],username=ip[2],password=ip[3])
commandin,commandout,commanderr=ssh.exec_command('free')
commandout=commandout.read().decode('utf-8')
print(commandout)

在这里插入图片描述
现在已经可以监控到我们主机的内存,同理只需要将主机的cpu与磁盘繁忙程度放入监控项。即可完成主机的监控。

使用dmPython远程操作数据库

收集信息

可以使用dmPython包进行查询数据库信息与将数据库时间记录。

import dmPython
cursor = dmPython.connect(user='SYSDBA', password='SYSDBA', server='127.0.0.1', port='5236', autoCommit=True).cursor()
cursor.close()#必须加上关闭,否则没执行一次就会多一个无法删除的state为IDLE的会话,当会话数目达到上限值,将无法登录数据库,只能重启实例

构造出了一个cursor,这个时候可以根据cursor进行查询或写入数据库

ACTIVE_SESSIONS_NUM="""
select COUNT(*) from v$sessions where state = 'ACTIVE'
"""
active_sessions_num = cursor.execute(ACTIVE_SESSIONS_NUM).fetchall()#如果之间execute,返回的类型不具有可读性,需要加一个fetchall()转换为list形式。
print(active_seesions_num)

在这里插入图片描述
返回值为元组拼接的列表,仅仅取1值时。参数为int型。
在这里插入图片描述

如果想要获取具体的执行SQL信息,可以使用函数SF_GET_SESSION_SQL(),查询结果为TEXT大字段,使用python的cursor.execute 接口,输出结果为str类型。DM目前大字段最大支持长度为2G,如果超过长度就会报错。

现在已经能够获取到当前的内存、活跃会话数。本文目标为获取的是会话数比例。

select
        round((session_num/max_num*100.00),2)||'%'
from
        (select count(*) as session_num from v$sessions),
        (SELECT PARA_VALUE AS max_num FROM V$DM_INI WHERE PARA_NAME = 'MAX_SESSIONS')

将sql放入代码中即可得到当前的会话使用率

SESSION_RATE="""
select
        round((session_num/max_num*100.00),2)||'%'
from
        (select count(*) as session_num from v$sessions),
        (SELECT PARA_VALUE AS max_num FROM V$DM_INI WHERE PARA_NAME = 'MAX_SESSIONS')"""
session_rate=cursor.execute(SESSION_SQL).fetchall()
print(session_rate)

在这里插入图片描述

监控数据存储

当数据都能正常获取。需要将数据存放到一个专门的表中进行保存。
这个时候需要插入表。但是如果当表不存在时。执行sql语句将会报错。
在这里插入图片描述
由于数据存放库已经不存在,可以选择两种方式

  1. 通过人工手动执行脚本。 新建表

  2. 获取到不存在表后,自动执行create table命令

本文采用方法为第二种创建一个表。

IP='127.0.0.1'
date=datetime.datetime.now()
try:
    DATA_NOW_MONITOR="""
    INSERT INTO DATABASE_MONITOR VALUES ('{}','{}' ,'{}','{}');
    """.format(IP,date,str(round(int(commandout.split()[8])/int(commandout.split()[7])*100.0,2))+'%' ,session_rate[0][0])
    data_now_monitor=cursor.execute(DATA_NOW_MONITOR)
    print('当前状态为:',IP,date,str(round(int(commandout.split()[8])/int(commandout.split()[7])*100.0,2))+'%' ,session_rate[0][0])
except Exception as e:
    error_data=(str(e).split(']')[0].replace('[CODE:',''))
    if error_data=='-2106':
        DATA_CREATE_SHEET="""
        create table DATABASE_MONITOR(IP varchar(20),time datetime, mem varchar(10),sess varchar(10));
        """
        data_create_sheet=cursor.execute(DATA_CREATE_SHEET)
        print('success create table DATABASE_MONITOR')
    else:
        print(e)

监控数据库

现在已经能够正常的获取和将数据写入数据库中。

将执行的命令写入函数打包,并在主函数中添加循环。

import paramiko
import datetime
import dmPython as dm
import time


def get_database_info(ip,ssh_port,ssh_user,ssh_passwd,database_port,database_user,database_passwd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    cursor = dm.connect(user=database_user, password=database_passwd, server=ip, port=database_port, autoCommit=True).cursor()
    ssh.connect(hostname=ip,port=ssh_port,username=ssh_user,password=ssh_passwd)
    commandin,commandout,commanderr=ssh.exec_command('free')
    commandout=commandout.read().decode('utf-8')
    ssh.close()
    date=datetime.datetime.now()
    try:
        DATA_NOW_MONITOR="""
        INSERT INTO DATABASE_MONITOR VALUES ('{}','{}' ,'{}','{}');
        """.format(IP,date,str(round(int(commandout.split()[8])/int(commandout.split()[7])*100.0,2))+'%' ,session_rate[0][0])
        data_now_monitor=cursor.execute(DATA_NOW_MONITOR)
        print('当前状态为:',IP,date,str(round(int(commandout.split()[8])/int(commandout.split()[7])*100.0,2))+'%' ,session_rate[0][0])
    except Exception as e:
        error_data=(str(e).split(']')[0].replace('[CODE:',''))
        if error_data=='-2106':
            DATA_CREATE_SHEET="""
            create table DATABASE_MONITOR(IP varchar(20),time datetime, mem varchar(10),sess varchar(10));
            """
            data_create_sheet=cursor.execute(DATA_CREATE_SHEET)
            print('success create table DATABASE_MONITOR')
        else:
            print(e)
if __name__ == '__main__':
 
    while(1):

        conf=['192.168.71.50','22','dmdba','123456','5236','SYSDBA','SYSDBA']#可以直接写conf,也可以将conf写成一个conf配置文件,方便拓展
        
#         with open('conf.txt',encoding='utf-8') as log_file:
#             for files in log_file:
#                 files=files.replace('\n','')
#                 if files != '':
#                     conf.append(files)
        for i in range(0,len(conf)-1,7):
            get_database_info(conf[i],conf[i+1],conf[i+2],conf[i+3],conf[i+4],conf[i+5],conf[i+6])
        time.sleep(10)#10s查询一次

此时查询已经有结果了
在这里插入图片描述
基础的监控功能已经实现。
如果后续有需求,监测的项目可以自行添加。

### 回答1: Flowable 是一个开源的工作流引擎,提供了一套用于管理业务流程的解决方案。而达梦数据库是国内知名的关系型数据库管理系统。那么,如何将 Flowable 与达梦数据库结合起来呢? 首先,Flowable 提供了丰富的 API 和工具来管理和监控流程定义和实例。在与达梦数据库集成之前,需要在 Flowable 的配置文件中添加达梦数据库的连接信息,包括数据库类型、地址、用户名和密码等。然后,在 Flowable 的流程定义中,可以使用达梦数据库作为数据存储来存储流程实例的状态、任务等信息。 在 Flowable 的数据库配置中,配置达梦数据库之后,可以使用达梦数据库的 SQL 语句来创建 Flowable 所需的表格和索引。这些表格包括流程定义表、任务表、流程实例表等等。通过这些表格,Flowable 将能够在达梦数据库中存储和管理流程相关的数据,包括流程定义、流程实例和任务。同时,也可以使用达梦数据库的高级特性,如事务和索引优化,来提高 Flowable 的性能和可靠性。 在实际应用中,Flowable 可以通过 API 来访问达梦数据库,执行流程操作,比如启动流程实例、完成任务等。同时,Flowable 也提供了一套界面,可以用于管理和监控流程,以及查询和导出相关数据。通过这些功能,可以实现业务流程的可视化和自动化,提高工作效率和质量。 综上所述,Flowable 与达梦数据库的结合能够提供强大的业务流程管理解决方案,实现流程的自动化和优化。通过达梦数据库的支持,Flowable 将能够更好地存储和管理流程相关的数据,并利用达梦数据库的高级特性提高系统的性能和可靠性。 ### 回答2: Flowable是一个开源的工作流引擎,它被广泛应用于业务流程管理系统(BPM)。它能够帮助组织管理业务流程,提高工作效率和流程可视化。 达梦数据库是一个高性能、高可靠性的数据库系统,针对大型企业和机构的数据管理需求进行了优化,拥有丰富的功能和先进的技术。 Flowable与达梦数据库可以结合使用,以满足组织对业务流程管理和数据存储的需求。通过Flowable,用户可以定义和管理复杂的业务流程,将数据存储、处理和流转结合起来,使企业流程更加高效、可控。 Flowable提供了与达梦数据库的集成支持,可以通过配置和插件机制将Flowable的任务、变量、流程定义等数据存储到达梦数据库中。这样可以实现数据的持久化存储,方便流程的管理和监控。 另外,Flowable还提供了灵活的API和丰富的工具,使开发者可以轻松地与达梦数据库进行交互。同时,Flowable还支持与其他数据库系统的集成,如MySQL、Oracle等,能够根据用户的实际需求选择适合的数据库系统来存储和管理数据。 总之,Flowable与达梦数据库的结合,可以为企业和组织提供一套完整的业务流程管理解决方案,帮助提高业务效率和流程可视化,同时能够充分发挥达梦数据库的高性能和高可靠性特点,确保数据的安全和稳定性。 ### 回答3: Flowable是一个开源的业务流程引擎框架,而达梦数据库则是一款面向企业级应用的关系数据库管理系统。两者在功能和应用场景上有着不同的特点。 首先,Flowable是一个轻量级的、可嵌入的流程引擎框架,它提供了流程定义、流程部署、流程实例管理、任务管理等功能,可以帮助企业实现业务流程的自动化。Flowable支持多种编程语言,包括Java、C#和Python等,还提供了丰富的API和扩展点,方便开发人员通过代码灵活定制和集成流程引擎。 达梦数据库则是一款可靠、高性能的关系数据库管理系统,适用于大规模的企业级应用。它支持标准的SQL语言,具备稳定的数据存储和管理能力,同时还提供了高可用、高并发、分布式和灾备等特性,能够满足企业对数据安全和可扩展性的需求。 在实际应用中,Flowable和达梦数据库可以进行集成,形成一个完整的业务流程管理系统。流程定义和实例数据可以存储在达梦数据库中,Flowable通过调用数据库接口完成对流程数据的操作和管理。这种集成能够使企业更好地组织和控制业务流程,提高工作效率和管理水平。 总的来说,Flowable是一个用于业务流程管理的引擎框架,而达梦数据库是一款强大的关系数据库管理系统。它们可以相互配合,为企业提供全面的业务流程管理解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值