通过Python收集汇聚MySQL 表信息的实例详解
作者:东山絮柳仔 发布时间:2024-01-18 17:25:20
标签: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()
来源:https://www.cnblogs.com/xuliuzai/archive/2021/10/24/15327808.html
0
投稿
猜你喜欢
- 【原文地址】 Fixes for Common VS 2008 and .NET 3.5 Beta2 Issu
- 有时候在网上办理一些业务时有些需要填写银行卡号码,当胡乱填写时会立即报错,但是并没有发现向后端发送请求,那么这个效果是怎么实现的呢。对于银行
- 本文为大家分享了virtualenv建立多个Python独立虚拟开发环境,供大家参考,具体内容如下1、安装virtualenv:pip in
- 功能: 1、 允许/限制对表的修改 2、 自动生成派生列,比如自增字段 3、 强制数据一致性 4、 提供审计和日志记录 5、 防止无效的事务
- 1. 首先 进入cmd, 输入python,看python是否安装成功说明python安装,没有问题2. 修改注册表第一步window +
- HttpRequest.FILES表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-
- 本文实例讲述了python中二维阵列的变换方法。分享给大家供大家参考。具体方法如下:先看如下代码:arr = [ [1, 2, 3], [4
- 不论什么时候,只要系统带有多个设备,而这些设备的性能又各不相同,就存在从慢速设备到快速设备不断更换工作地点以改善系统性能的可能性,这就是缓存
- 单例模式是一种常见的设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派
- 前言:集合这种数据类型和我们数学中所学的集合很是相似,数学中堆积和的操作也有交集,并集和差集操作,python集合也是一样。一、交集操作1.
- 简单介绍正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如
- 对于值传递和引用传递,书本上的解释比较繁琐,而php面试中总会出现,下面我会通过一个生活的例子带大家理解它们之间区别。第一步假设我们去酒店订
- HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址:http://phpq
- 前面的例子中,点击事件都是通过click()方法实现鼠标的点击事件。其实在WebDriver中,提供了许多鼠标操作的方法,这些操作方法都封装
- print只是为了向用户显示一个字符串,表示计算机内部正在发生的事情。计算机却无法使用该print出现的内容。return是函数的返回值。该
- 比如CUTEEDITOR,虽 然功能比FCKEDITOR还要强大,可是,它本身也够庞大了,至于FREETEXTBOX等,其易用性与FCKED
- 本文实例讲述了JS小游戏的仙剑翻牌源码,是一款非常优秀的游戏源码。分享给大家供大家参考。具体如下:一、游戏介绍:这是一个翻牌配对游戏,共十关
- PyQt5相关安装python 版本 python 3.6.31、安装PyQt5执行命令: pip install pyqt52、安装PyQ
- 数据读取与保存Text文件对于 Text文件的读取和保存 ,其语法和实现是最简单的,因此我只是简单叙述一下这部分相关知识点,大家可以结合de
- 目录一、ACID 特性二、事务控制语法三、事务并发异常1、脏读2、不可重复读3、幻读四、事务隔离级别一、ACID 特性事务处理是一种对必须整