iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >通过Python收集汇聚MySQL 表信息
  • 106
分享到

通过Python收集汇聚MySQL 表信息

通过Python收集汇聚MySQL表信息 2017-02-22 22:02:23 106人浏览 绘本
摘要

一.需求 统计收集各个实例上table的信息,主要是表的记录数及大小。 收集的范围是cmdb中所有的数据库实例。 二.公共基础文件说明 1.配置文件 配置文为db_servers_conf.ini,假设cmdb的DBServer为119

通过Python收集汇聚MySQL 表信息

一.需求

统计收集各个实例上table的信息,主要是表的记录数及大小。

收集的范围是cmdb中所有的数据库实例。

二.公共基础文件说明

1.配置文件

配置文为db_servers_conf.ini,假设cmdb的DBServer为119.119.119.119,单独存放收集监控数据的DBserver为110.110.110.110. 这两个DB实例的访问用户名一样,定义在了[uid_Mysql] 部分,需要去收集的各个DB实例,用到的账号密码是另一个,定义在了[collector_mysql]部分。

[uid_mysql]
dbuid = 用*户*名
dbuid_p_w_d = 相*应*密*码

[cmdb_server]
db_host = 119.119.119.119
db_port = 3306


[dbmonitor_server]
db_host = 110.110.110.110
db_port = 3306

[collector_mysql]
collector = DB*实*例*用*户*名
collector_p_w_d = DB*实*例*密*码

 2.定义声明db连接

文件为get_mysql_db_connect.py

# -*- coding: utf-8 -*-

import sys
import os
import configparser
import pymysql

# 获取连接串信息
def mysql_get_db_connect(db_host, db_port):
    db_host = db_host
    db_port = db_port

    db_ps_file = os.path.join(sys.path[0], "db_servers_conf.ini")
    config = configparser.ConfigParser()
    config.read(db_ps_file, encoding="utf-8")
    db_user = config.get("uid_mysql", "dbuid")
    db_pwd = config.get("uid_mysql", "dbuid_p_w_d")

    conn = pymysql.connect(host=db_host, port=db_port, user=db_user, passWord=db_pwd,  connect_timeout=5, read_timeout=5, write_timeout=5)

    return conn

# 获取连接串信息
def mysql_get_collectdb_connect(db_host, db_port):
    db_host = db_host
    db_port = db_port

    db_ps_file = os.path.join(sys.path[0], "db_servers_conf.ini")
    config = configparser.ConfigParser()
    config.read(db_ps_file, encoding="utf-8")
    db_user = config.get("collector_mysql", "collector")
    db_pwd = config.get("collector_mysql", "collector_p_w_d")

    conn = pymysql.connect(host=db_host, port=db_port, user=db_user, password=db_pwd,  connect_timeout=5, read_timeout=5, write_timeout=5)

    return conn

3.定义声明访问db的操作

文件为mysql_exec_sql.py,注意需要导入上面的model。

# -*- coding: utf-8 -*-

import get_mysql_db_connect

def mysql_exec_dml_sql(db_host, db_port, exec_sql):
    conn = mysql_get_db_connect.mysql_get_db_connect(db_host, db_port)
    with conn.cursor() as cursor_db:
        cursor_db.execute(exec_sql)
        conn.commit()
        ##需要显式关闭
        cursor_db.close()
        conn.close()

def mysql_exec_select_sql(db_host, db_port, exec_sql):
    conn = mysql_get_db_connect.mysql_get_db_connect(db_host, db_port)
    with conn.cursor() as cursor_db:
        cursor_db.execute(exec_sql)
        sql_rst = cursor_db.fetchall()
        ##显式关闭conn
        cursor_db.close()
        conn.close()

    return sql_rst

def mysql_exec_select_sql_include_colnames(db_host, db_port, exec_sql):
    conn = mysql_get_db_connect.mysql_get_db_connect(db_host, db_port)
    with conn.cursor() as cursor_db:
        cursor_db.execute(exec_sql)
        sql_rst = cursor_db.fetchall()
        col_names = cursor_db.description
    return sql_rst, col_names

三.主要代码

3.1 创建保存数据的脚本

 用来保存收集表信息的表:table_info

create table `table_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `host_ip` varchar(50) NOT NULL DEFAULT "0",
  `port` varchar(10) NOT NULL DEFAULT "3306",
  `db_name` varchar(100) NOT NULL DEFAULT ""   COMMENT "数据库名字",
  `table_name` varchar(100) NOT NULL DEFAULT "" COMMENT "表名字",
  `table_rows` bigint NOT NULL DEFAULT 0 COMMENT "表行数",
  `table_data_length` bigint,
  `table_index_length` bigint,
  `table_data_free` bigint,
  `table_auto_increment` bigint,
  `creator` varchar(50) NOT NULL DEFAULT "",
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `operator` varchar(50) NOT NULL DEFAULT "",
  `operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
;

收集过程,如果访问某个实例异常时,将失败的信息保存到表 gather_error_info 中,以便跟踪分析。

create table `gather_error_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `app_name` varchar(150) NOT NULL DEFAULT "报错的程序",
  `host_ip` varchar(50) NOT NULL DEFAULT "0",
  `port` varchar(10) NOT NULL DEFAULT "3306",
  `db_name` varchar(60) NOT NULL DEFAULT "0" COMMENT "数据库名字",
  `error_msg` varchar(500) NOT NULL DEFAULT "报错的程序",
  `status` int(11) NOT NULL DEFAULT "2",
  `creator` varchar(50) NOT NULL DEFAULT "",
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `operator` varchar(50) NOT NULL DEFAULT "",
  `operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

3.2 收集的功能脚本

定义收集 DB_info的脚本 collect_tables_info.py

# -*- coding: utf-8 -*-

import sys
import os
import datetime
import configparser
import pymysql
import mysql_get_db_connect
import mysql_exec_sql
import mysql_collect_exec_sql
import pandas as pd


def collect_tables_info():
    db_ps_file = os.path.join(sys.path[0], "db_servers_conf.ini")
    config = configparser.ConfigParser()
    config.read(db_ps_file, encoding="utf-8")

    cmdb_host = config.get("cmdb_server", "db_host")
    cmdb_port = config.getint("cmdb_server", "db_port")

    monitor_db_host = config.get("dbmonitor_server", "db_host")
    monitor_db_port = config.getint("dbmonitor_server", "db_port")

    # 获取需要遍历的DB列表
    exec_sql_1 = """
select  vm_ip_address,port,b.vm_host_name,remark
FROM cmdbdb.mysqldb_instance
 ;
    """

    exec_sql_tablesizeinfo = """
select TABLE_SCHEMA,table_name,table_rows,data_length ,index_length,data_free,auto_increment
from infORMation_schema.tables
where TABLE_SCHEMA not in ("mysql","information_schema","performance_schema","sys")
and TABLE_TYPE ="BASE TABLE";
    """

    exec_sql_insert_tablesize = " insert into monitordb.table_info (host_ip,port,db_name,table_name,table_rows,table_data_length,table_index_length,table_data_free,table_auto_increment) 
VALUES ("%s", "%s","%s","%s", %s ,%s, %s,%s, %s) ;"

    exec_sql_error = " insert into monitordb.gather_db_error (app_name,host_ip,port,error_msg) 
VALUES ("%s", "%s","%s","%s") ;"

    sql_rst_1 = mysql_exec_sql.mysql_exec_select_sql(cmdb_host, cmdb_port, exec_sql_1)
    if len(sql_rst_1):
        for i in range(len(sql_rst_1)):
            rw_host = list(sql_rst_1[i])
            db_host_ip = rw_host[0]
            db_port_s = rw_host[1]
            ##print(type(rw_host))

            ###ValueError: port should be of type int
            db_port = int(db_port_s)
            try:
              sql_rst_tablesize = mysql_collect_exec_sql.mysql_exec_select_sql(db_host_ip, db_port, exec_sql_tablesizeinfo)
              ##print(sql_rst_tablesize)
              if len(sql_rst_tablesize):
                  for i in range(len(sql_rst_tablesize)):
                      rw_tableinfo = list(sql_rst_tablesize[i])
                      rw_db_name = rw_tableinfo[0]
                      rw_table_name = rw_tableinfo[1]
                      rw_table_rows = rw_tableinfo[2]
                      rw_data_length = rw_tableinfo[3]
                      rw_index_length = rw_tableinfo[4]
                      rw_data_free = rw_tableinfo[5]
                      rw_auto_increment = rw_tableinfo[6]

                      ##print(rw_auto_increment)
                      ##python中对变量是否为None的判断
                      if rw_auto_increment is None:
                         rw_auto_increment = 0
                      ###一定要有一个exec_sql_insert_table_com,如果是exec_sql_insert_tablesize = exec_sql_insert_tablesize  %  ( db_host_ip.......
                      ####则提示报错:报错信息是 TypeError: not all arguments converted during string formatting
                      exec_sql_insert_table_com = exec_sql_insert_tablesize  %  ( db_host_ip , db_port_s, rw_db_name, rw_table_name , rw_table_rows , rw_data_length , rw_index_length , rw_data_free , rw_auto_increment)
                      print(exec_sql_insert_table_com)
                      sql_insert_rst_1 = mysql_exec_sql.mysql_exec_dml_sql(monitor_db_host, monitor_db_port, exec_sql_insert_table_com)
                      #print(sql_insert_rst_1)
            except:
              ####print("TypeError的错误信息如下:" + str(TypeError))
              print(db_host_ip +"  "+str(db_port) + "登入异常无法获取table信息,请检查实例和访问账号!")
              exec_sql_error_sql = exec_sql_error  %  ( "collect_tables_info",db_host_ip , str(db_port),"登入异常,获取table信息失败,请检查实例和访问的账号!!!" )
              sql_insert_err_rst_1 = mysql_exec_sql.mysql_exec_dml_sql(monitor_db_host, monitor_db_port, exec_sql_error_sql)
        ##print(sql_rst_1)
    else:
        print("查询无结果集")

collect_tables_info()

 

您可能感兴趣的文档:

--结束END--

本文标题: 通过Python收集汇聚MySQL 表信息

本文链接: https://www.lsjlt.com/news/8841.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 通过Python收集汇聚MySQL 表信息的实例详解
    目录一.需求二.公共基础文件说明1.配置文件2.定义声明db连接3.定义声明访问db的操作三.主要代码3.1 创建保存数据的脚本3.2 收集的功能脚本一.需求 统计收集各个实例上ta...
    99+
    2024-04-02
  • Python:收集IP信息
    下面通过两种方法实现收集IP信息1、通过 ifconfig 命令输出IP信息,并以“\n\n”切片分成不同的网卡块2、通过 ifconfig 命令输出IP信息,并以第一个字符在顶格的方式切片分成不同的网卡块3、通过 ifconfig 命令输...
    99+
    2023-01-31
    信息 Python IP
  • python 收集主机信息
    这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息,熟悉python里的文件读取,字符切割,字典存储等知识。文章结构:(1) 文章目的,需要收集的信息,并逐个分析如何获取信息。(2) 给出实现的python 脚本。(3) 总结。...
    99+
    2023-01-31
    主机 信息 python
  • 如何通过Python收集MySQL MHA 部署及运行状态信息的功能
    目录一. 背景介绍二.实现逻辑2.1 程序调用的MHA工具程序或文件2.2.程序简单的流程图三.主要代码实现3.1.创建保存收集信息的表3.2 .连接DB的模块3.3.功能实现模块3...
    99+
    2024-04-02
  • Python收集主机信息
    Python收集linux主机信息,需要安装dmidecode命令,yum -y install dmidecode#!/usr/bin/env python # coding=utf-8   from subprocess import ...
    99+
    2023-01-31
    主机 信息 Python
  • Python:收集系统信息
    收集主机的以下信息,并以字典形式输出。1、主机名:hostname2、IP地址:ip3、操作系统版本:osver4、服务器厂商:vendor5、服务器型号:product6、服务器序列号:sn7、cpu型号:cpu_model8、cpu核数...
    99+
    2023-01-31
    系统 信息 Python
  • 浅谈AndroidANR的信息收集过程
    目录一. ANR场景二. appNotResponding处理流程三. 总结一. ANR场景 无论是四大组件或者进程等只要发生ANR,最终都会调用AMS.appNotRespondi...
    99+
    2024-04-02
  • MySQL中怎么收集统计信息
    MySQL中怎么收集统计信息,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 一、手动  ...
    99+
    2024-04-02
  • Android ANR的信息收集过程是什么
    本篇内容介绍了“Android ANR的信息收集过程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一. ANR场景无论是四大...
    99+
    2023-06-21
  • 怎么样的Python脚本进行MySQL对所有表收集统计信息
    运用Python脚本进行MySQL对所有表收集统计信息,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。[root@MySQL01 scrip...
    99+
    2024-04-02
  • 数据库中怎么找出未收集统计信息以及统计信息过期的表
    小编给大家分享一下数据库中怎么找出未收集统计信息以及统计信息过期的表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!下面这个查询可以找到从未收集过统计信息或者统计信息过期的表。EXEC&nb...
    99+
    2024-04-02
  • python获取mysql表信息
    使用python获取mysql相关信息,使用python执行mysql相关语句test1 #!/bin/env python #coding=utf-8 #by songry #date 2018-01-09 #time 11:18 #po...
    99+
    2023-01-31
    信息 python mysql
  • python 统计MySQL表信息
    线上有一台MySQL服务器,里面有几十个数据库,每个库有N多表。现在需要将每个表的信息,统计到excel中,格式如下:库名表名表说明建表语句db1users用户表CREATE TABLE `users` (...)怎么做呢?1. 手动录入(...
    99+
    2023-01-30
    信息 python MySQL
  • navicat怎么通过命令查找表信息
    通过 navicat 命令行查找表信息:使用 show tables 命令,可选指定数据库名称。输出包含 tables_in_database_name 列,其中列出表名。示例:show...
    99+
    2024-04-24
    navicat
  • 渗透测试信息收集查询真实IP过程
    查找真实IP 如果目标服务器不存在CDN可以直接通过 http://tools.jb51.net/aideddesign/ipcha 获取目标的一些IP及域名信息。 目标服...
    99+
    2024-04-02
  • python通过SNMP协议收集服务器监
    安装snmp和启用python模块[root@test ~]# wget http://nchc.dl.sourceforge.net/project/net-snmp/net-snmp/5.7.3/net-snmp-5.7.3.tar....
    99+
    2023-01-31
    协议 服务器 python
  • 怎么通过PHP查询两个表的信息
    这篇“怎么通过PHP查询两个表的信息”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么通过PHP查询两个表的信息”文章吧。在...
    99+
    2023-07-05
  • 通过shell脚本检测MySQL服务信息
    今天改了一版脚本,对于MySQL的基本信息的获取有了一个相对比较清晰的收集方式。我简单解释下脚本。整体是分为两部分第一部分是通过系统层面来解析MySQL的基本信息,方式是通过ps -ef|grep mysql得到的信息来解析。第二部分是通过...
    99+
    2023-06-05
  • 如何通过 MySQL DESCRIBE 语句获取表中特定列的信息?
    众所周知,DESCRIBE 语句将提供整个表的信息/结构。借助 DESCRIBE 语句以及表名和列名,我们可以获得有关该列的信息。语法DESCRIBE table_name col_name;示例1mysql> Describe em...
    99+
    2023-10-22
  • ​Python学习教程_Python学习路线:python—收集系统信息
    Python学习教程(Python学习路线):python—收集系统信息1.1 hashlib模块使用获取文件的MD5值,和shell下的MD5sum一样方法一:先实例化一个对象,再使用update做校验,最后十六进制查看hexdigest...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作