经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
通过Python收集汇聚MySQL 表信息
来源:jb51  时间:2021/10/25 15:05:00  对本文有异议

一.需求

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

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

二.公共基础文件说明

1.配置文件

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

  1. [uid_mysql]
  2. dbuid = 用*户*名
  3. dbuid_p_w_d = 相*应*密*码
  4.  
  5. [cmdb_server]
  6. db_host = 119.119.119.119
  7. db_port = 3306
  8.  
  9.  
  10. [dbmonitor_server]
  11. db_host = 110.110.110.110
  12. db_port = 3306
  13.  
  14. [collector_mysql]
  15. collector = DB*实*例*用*户*名
  16. collector_p_w_d = DB*实*例*密*码

2.定义声明db连接

文件为get_mysql_db_connect.py

  1. # -*- coding: utf-8 -*-
  2.  
  3. import sys
  4. import os
  5. import configparser
  6. import pymysql
  7.  
  8. # 获取连接串信息
  9. def mysql_get_db_connect(db_host, db_port):
  10. db_host = db_host
  11. db_port = db_port
  12.  
  13. db_ps_file = os.path.join(sys.path[0], "db_servers_conf.ini")
  14. config = configparser.ConfigParser()
  15. config.read(db_ps_file, encoding="utf-8")
  16. db_user = config.get('uid_mysql', 'dbuid')
  17. db_pwd = config.get('uid_mysql', 'dbuid_p_w_d')
  18.  
  19. conn = pymysql.connect(host=db_host, port=db_port, user=db_user, password=db_pwd, connect_timeout=5, read_timeout=5, write_timeout=5)
  20.  
  21. return conn
  22.  
  23. # 获取连接串信息
  24. def mysql_get_collectdb_connect(db_host, db_port):
  25. db_host = db_host
  26. db_port = db_port
  27.  
  28. db_ps_file = os.path.join(sys.path[0], "db_servers_conf.ini")
  29. config = configparser.ConfigParser()
  30. config.read(db_ps_file, encoding="utf-8")
  31. db_user = config.get('collector_mysql', 'collector')
  32. db_pwd = config.get('collector_mysql', 'collector_p_w_d')
  33.  
  34. conn = pymysql.connect(host=db_host, port=db_port, user=db_user, password=db_pwd, connect_timeout=5, read_timeout=5, write_timeout=5)
  35.  
  36. return conn

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

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

  1. # -*- coding: utf-8 -*-
  2.  
  3. import get_mysql_db_connect
  4.  
  5. def mysql_exec_dml_sql(db_host, db_port, exec_sql):
  6. conn = mysql_get_db_connect.mysql_get_db_connect(db_host, db_port)
  7. with conn.cursor() as cursor_db:
  8. cursor_db.execute(exec_sql)
  9. conn.commit()
  10. ##需要显式关闭
  11. cursor_db.close()
  12. conn.close()
  13.  
  14. def mysql_exec_select_sql(db_host, db_port, exec_sql):
  15. conn = mysql_get_db_connect.mysql_get_db_connect(db_host, db_port)
  16. with conn.cursor() as cursor_db:
  17. cursor_db.execute(exec_sql)
  18. sql_rst = cursor_db.fetchall()
  19. ##显式关闭conn
  20. cursor_db.close()
  21. conn.close()
  22.  
  23. return sql_rst
  24.  
  25. def mysql_exec_select_sql_include_colnames(db_host, db_port, exec_sql):
  26. conn = mysql_get_db_connect.mysql_get_db_connect(db_host, db_port)
  27. with conn.cursor() as cursor_db:
  28. cursor_db.execute(exec_sql)
  29. sql_rst = cursor_db.fetchall()
  30. col_names = cursor_db.description
  31. return sql_rst, col_names

三.主要代码

3.1 创建保存数据的脚本

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

  1. create table `table_info` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `host_ip` varchar(50) NOT NULL DEFAULT '0',
  4. `port` varchar(10) NOT NULL DEFAULT '3306',
  5. `db_name` varchar(100) NOT NULL DEFAULT '' COMMENT '数据库名字',
  6. `table_name` varchar(100) NOT NULL DEFAULT '' COMMENT '表名字',
  7. `table_rows` bigint NOT NULL DEFAULT 0 COMMENT '表行数',
  8. `table_data_length` bigint,
  9. `table_index_length` bigint,
  10. `table_data_free` bigint,
  11. `table_auto_increment` bigint,
  12. `creator` varchar(50) NOT NULL DEFAULT '',
  13. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  14. `operator` varchar(50) NOT NULL DEFAULT '',
  15. `operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  16. PRIMARY KEY (`id`)
  17. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
  18. ;

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

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

3.2 收集的功能脚本

定义收集 DB_info的脚本collect_tables_info.py

  1. # -*- coding: utf-8 -*-
  2.  
  3. import sys
  4. import os
  5. import datetime
  6. import configparser
  7. import pymysql
  8. import mysql_get_db_connect
  9. import mysql_exec_sql
  10. import mysql_collect_exec_sql
  11. import pandas as pd
  12.  
  13.  
  14. def collect_tables_info():
  15. db_ps_file = os.path.join(sys.path[0], "db_servers_conf.ini")
  16. config = configparser.ConfigParser()
  17. config.read(db_ps_file, encoding="utf-8")
  18.  
  19. cmdb_host = config.get('cmdb_server', 'db_host')
  20. cmdb_port = config.getint('cmdb_server', 'db_port')
  21.  
  22. monitor_db_host = config.get('dbmonitor_server', 'db_host')
  23. monitor_db_port = config.getint('dbmonitor_server', 'db_port')
  24.  
  25. # 获取需要遍历的DB列表
  26. exec_sql_1 = """
  27. select vm_ip_address,port,b.vm_host_name,remark
  28. FROM cmdbdb.mysqldb_instance
  29. ;
  30. """
  31.  
  32. exec_sql_tablesizeinfo = """
  33. select TABLE_SCHEMA,table_name,table_rows,data_length ,index_length,data_free,auto_increment
  34. from information_schema.tables
  35. where TABLE_SCHEMA not in ('mysql','information_schema','performance_schema','sys')
  36. and TABLE_TYPE ='BASE TABLE';
  37. """
  38.  
  39. 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) ;"
  40.  
  41. exec_sql_error = " insert into monitordb.gather_db_error (app_name,host_ip,port,error_msg) VALUES ('%s', '%s','%s','%s') ;"
  42.  
  43. sql_rst_1 = mysql_exec_sql.mysql_exec_select_sql(cmdb_host, cmdb_port, exec_sql_1)
  44. if len(sql_rst_1):
  45. for i in range(len(sql_rst_1)):
  46. rw_host = list(sql_rst_1[i])
  47. db_host_ip = rw_host[0]
  48. db_port_s = rw_host[1]
  49. ##print(type(rw_host))
  50.  
  51. ###ValueError: port should be of type int
  52. db_port = int(db_port_s)
  53. try:
  54. sql_rst_tablesize = mysql_collect_exec_sql.mysql_exec_select_sql(db_host_ip, db_port, exec_sql_tablesizeinfo)
  55. ##print(sql_rst_tablesize)
  56. if len(sql_rst_tablesize):
  57. for i in range(len(sql_rst_tablesize)):
  58. rw_tableinfo = list(sql_rst_tablesize[i])
  59. rw_db_name = rw_tableinfo[0]
  60. rw_table_name = rw_tableinfo[1]
  61. rw_table_rows = rw_tableinfo[2]
  62. rw_data_length = rw_tableinfo[3]
  63. rw_index_length = rw_tableinfo[4]
  64. rw_data_free = rw_tableinfo[5]
  65. rw_auto_increment = rw_tableinfo[6]
  66.  
  67. ##print(rw_auto_increment)
  68. ##Python中对变量是否为None的判断
  69. if rw_auto_increment is None:
  70. rw_auto_increment = 0
  71. ###一定要有一个exec_sql_insert_table_com,如果是exec_sql_insert_tablesize = exec_sql_insert_tablesize % ( db_host_ip.......
  72. ####则提示报错:报错信息是 TypeError: not all arguments converted during string formatting
  73. 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)
  74. print(exec_sql_insert_table_com)
  75. sql_insert_rst_1 = mysql_exec_sql.mysql_exec_dml_sql(monitor_db_host, monitor_db_port, exec_sql_insert_table_com)
  76. #print(sql_insert_rst_1)
  77. except:
  78. ####print('TypeError的错误信息如下:' + str(TypeError))
  79. print(db_host_ip +' '+str(db_port) + '登入异常无法获取table信息,请检查实例和访问账号!')
  80. exec_sql_error_sql = exec_sql_error % ( 'collect_tables_info',db_host_ip , str(db_port),'登入异常,获取table信息失败,请检查实例和访问的账号!!!' )
  81. sql_insert_err_rst_1 = mysql_exec_sql.mysql_exec_dml_sql(monitor_db_host, monitor_db_port, exec_sql_error_sql)
  82. ##print(sql_rst_1)
  83. else:
  84. print('查询无结果集')
  85.  
  86. collect_tables_info()

到此这篇关于通过Python收集汇聚MySQL 表信息的文章就介绍到这了,更多相关Python MySQL 表信息内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号