如何通过Python收集汇聚MySQL表信息
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,本篇内容主要讲解"如何通过Python收集汇聚MySQL表信息",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何通过Python收集汇聚MySQL表信息"
千家信息网最后更新 2025年02月03日如何通过Python收集汇聚MySQL表信息
本篇内容主要讲解"如何通过Python收集汇聚MySQL表信息",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何通过Python收集汇聚MySQL表信息"吧!
目录
一.需求
二.公共基础文件说明
1.配置文件
2.定义声明db连接
3.定义声明访问db的操作
三.主要代码
3.1 创建保存数据的脚本
3.2 收集的功能脚本
一.需求
统计收集各个实例上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.119db_port = 3306[dbmonitor_server]db_host = 110.110.110.110db_port = 3306[collector_mysql]collector = DB*实*例*用*户*名collector_p_w_d = DB*实*例*密*码
2.定义声明db连接
文件为get_mysql_db_connect.py
# -*- coding: utf-8 -*-import sysimport osimport configparserimport 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_connectdef 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_rstdef 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 sysimport osimport datetimeimport configparserimport pymysqlimport mysql_get_db_connectimport mysql_exec_sqlimport mysql_collect_exec_sqlimport pandas as pddef 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,remarkFROM cmdbdb.mysqldb_instance ; """ exec_sql_tablesizeinfo = """select TABLE_SCHEMA,table_name,table_rows,data_length ,index_length,data_free,auto_incrementfrom information_schema.tableswhere 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()
到此,相信大家对"如何通过Python收集汇聚MySQL表信息"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
信息
实例
数据
文件
utf-8
脚本
名字
数据库
账号
配置
代码
内容
功能
基础
程序
部分
需求
学习
查询
检查
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
国内网络安全形势严峻
物联网络技术是什么
编程软件开发的背景
利用脚本在数据库中查询
服务器被攻击秒解什么意思
会软件开发可以做简直吗
网络安全应对是什么
服务器nas是群晖吗
网络安全web是什么
保定网络技术网上价格
信得过的hmi软件开发
河北企业软件开发性价比高
软件开发类一级
中科院网络安全视频教学
微信公众号服务器架构
服务器十万
如何切换网易云游戏的服务器
不属于数据库安全问题
数据库课设 学生信息管理
网络安全红线工作心得
极致互联网络科技
数据库更新字段需要关联其他表
安全部数据库建设招标
网络安全专家工作经历
方舟手游怎么创建和加入服务器
服务器调试费计入什么科目
东营模具软件开发服务
江油论坛网络技术工
数据库磁盘情况
合肥金融软件开发招聘