MySQL运维

server/2024/10/17 21:00:39/

MySQL运维

创建健壮的MySQL健康检查Python类

在本文中,我们将介绍如何创建一个强大而灵活的Python类,用于封装MySQL运维命令并提供易用的接口。这个类不仅支持后续扩展,还提供完备的响应和错误信息,同时要求必要的登录信息以确保安全性。

为什么需要MySQL健康检查?

定期进行MySQL健康检查对于维护数据库的性能和可靠性至关重要。通过自动化这个过程,我们可以:

  1. 及时发现潜在问题
  2. 监控关键性能指标
  3. 确保配置的一致性
  4. 简化运维工作

MySQLHealthCheck类的实现

下面是MySQLHealthCheck类的完整实现:

import mysql.connector
from mysql.connector import Error
from typing import Dict, Any, List, Tuple
import loggingclass MySQLHealthCheck:def __init__(self, host: str, database: str, user: str, password: str, port: int = 3306):self.host = hostself.database = databaseself.user = userself.password = passwordself.port = portself.connection = Noneself.logger = logging.getLogger(__name__)def connect(self) -> None:"""建立与MySQL数据库的连接"""try:self.connection = mysql.connector.connect(host=self.host,database=self.database,user=self.user,password=self.password,port=self.port)if self.connection.is_connected():self.logger.info("成功连接到MySQL数据库")except Error as e:self.logger.error(f"连接MySQL数据库时出错: {e}")raisedef disconnect(self) -> None:"""关闭与MySQL数据库的连接"""if self.connection and self.connection.is_connected():self.connection.close()self.logger.info("MySQL数据库连接已关闭")def execute_query(self, query: str) -> List[Tuple]:"""执行SQL查询并返回结果"""try:cursor = self.connection.cursor()cursor.execute(query)result = cursor.fetchall()cursor.close()return resultexcept Error as e:self.logger.error(f"执行查询时出错: {e}")raisedef get_variable(self, variable_name: str) -> str:"""获取MySQL变量的值"""query = f"SHOW VARIABLES LIKE '{variable_name}'"result = self.execute_query(query)return result[0][1] if result else Nonedef get_status(self, status_name: str) -> str:"""获取MySQL状态值"""query = f"SHOW STATUS LIKE '{status_name}'"result = self.execute_query(query)return result[0][1] if result else Nonedef check_basic_config(self) -> Dict[str, Any]:"""检查基本配置和状态"""return {"lower_case_table_names": self.get_variable("lower_case_table_names"),"port": self.get_variable("port"),"socket": self.get_variable("socket"),"skip_name_resolve": self.get_variable("skip_name_resolve"),"character_set_server": self.get_variable("character_set_server"),"collation_server": self.get_variable("collation_server"),"interactive_timeout": self.get_variable("interactive_timeout"),"wait_timeout": self.get_variable("wait_timeout"),"tx_isolation": self.get_variable("tx_isolation"),"datadir": self.get_variable("datadir"),"max_allowed_packet": self.get_variable("max_allowed_packet"),"thread_stack": self.get_variable("thread_stack"),"thread_cache_size": self.get_variable("thread_cache_size"),"table_open_cache": self.get_variable("table_open_cache"),"tmp_table_size": self.get_variable("tmp_table_size"),"max_heap_table_size": self.get_variable("max_heap_table_size"),"pid_file": self.get_variable("pid_file"),"log_error": self.get_variable("log_error"),"slow_query_log_file": self.get_variable("slow_query_log_file"),"long_query_time": self.get_variable("long_query_time"),}def check_connection_management(self) -> Dict[str, Any]:"""检查连接管理"""return {"max_connections": self.get_variable("max_connections"),"max_used_connections": self.get_status("Max_used_connections"),"max_used_connections_time": self.get_status("Max_used_connections_time"),"max_connect_errors": self.get_variable("max_connect_errors"),"threads_connected": self.get_status("Threads_connected"),"threads_cached": self.get_status("Threads_cached"),"threads_created": self.get_status("Threads_created"),"threads_running": self.get_status("Threads_running"),}def check_binlog_config(self) -> Dict[str, Any]:"""检查Binlog配置"""return {"log_bin": self.get_variable("log_bin"),"sync_binlog": self.get_variable("sync_binlog"),"binlog_format": self.get_variable("binlog_format"),"log_bin_basename": self.get_variable("log_bin_basename"),"log_bin_index": self.get_variable("log_bin_index"),"max_binlog_size": self.get_variable("max_binlog_size"),"expire_logs_days": self.get_variable("expire_logs_days"),"server_id": self.get_variable("server_id"),}def check_gtid_config(self) -> Dict[str, Any]:"""检查GTID配置"""return {"gtid_mode": self.get_variable("gtid_mode"),"enforce_gtid_consistency": self.get_variable("enforce_gtid_consistency"),"log_slave_updates": self.get_variable("log_slave_updates"),}def check_innodb_config(self) -> Dict[str, Any]:"""检查InnoDB配置"""return {"innodb_version": self.get_variable("innodb_version"),"innodb_file_per_table": self.get_variable("innodb_file_per_table"),"innodb_buffer_pool_size": self.get_variable("innodb_buffer_pool_size"),"innodb_log_file_size": self.get_variable("innodb_log_file_size"),"innodb_thread_concurrency": self.get_variable("innodb_thread_concurrency"),"innodb_max_dirty_pages_pct": self.get_variable("innodb_max_dirty_pages_pct"),"innodb_io_capacity_max": self.get_variable("innodb_io_capacity_max"),"innodb_log_buffer_size": self.get_variable("innodb_log_buffer_size"),"innodb_flush_log_at_trx_commit": self.get_variable("innodb_flush_log_at_trx_commit"),"innodb_io_capacity": self.get_variable("innodb_io_capacity"),"innodb_buffer_pool_instances": self.get_variable("innodb_buffer_pool_instances"),}def check_performance(self) -> Dict[str, Any]:"""检查性能指标"""return {"slow_queries": self.get_status("Slow_queries"),"innodb_rows_read": self.get_status("Innodb_rows_read"),"innodb_rows_inserted": self.get_status("Innodb_rows_inserted"),"innodb_rows_updated": self.get_status("Innodb_rows_updated"),"innodb_rows_deleted": self.get_status("Innodb_rows_deleted"),}def run_health_check(self) -> Dict[str, Any]:"""运行完整的健康检查"""try:self.connect()health_check_result = {"basic_config": self.check_basic_config(),"connection_management": self.check_connection_management(),"binlog_config": self.check_binlog_config(),"gtid_config": self.check_gtid_config(),"innodb_config": self.check_innodb_config(),"performance": self.check_performance(),}return health_check_resultexcept Error as e:self.logger.error(f"运行健康检查时出错: {e}")return {"error": str(e)}finally:self.disconnect()

类的主要功能

  1. 初始化:需要提供MySQL连接信息。
  2. 连接管理connect()disconnect()方法用于管理数据库连接。
  3. 查询执行execute_query()方法用于执行SQL查询。
  4. 变量和状态获取get_variable()get_status()方法用于获取MySQL变量和状态值。
  5. 健康检查:各个check_*方法对应不同类别的健康检查。
  6. 完整健康检查run_health_check()方法执行完整的健康检查并返回结果。

设计考虑

  • 健壮性:使用异常处理来管理可能出现的错误。
  • 可扩展性:可以轻松添加新的检查方法。
  • 日志记录:使用Python的logging模块记录重要信息和错误。
  • 类型提示:使用Python的类型提示来增强代码的可读性和可维护性。
  • 模块化:将不同类型的检查分为不同的方法,便于管理和扩展。

使用示例

if __name__ == "__main__":logging.basicConfig(level=logging.INFO)health_check = MySQLHealthCheck(host="localhost",database="your_database",user="your_username",password="your_password")result = health_check.run_health_check()print(result)

集成到其他程序

可以其他程序中集成MySQL健康检查功能。例如:

health_check = MySQLHealthCheck(host="your_host", database="your_db", user="your_user", password="your_password")
result = health_check.run_health_check()# 处理结果
if "error" in result:print(f"健康检查失败: {result['error']}")
else:print("健康检查成功")print("基本配置:", result['basic_config'])print("连接管理:", result['connection_management'])# ... 打印其他检查结果

结论

通过使用这个MySQLHealthCheck类,可以执行MySQL健康检查,监控数据库的状态,并及时发现潜在问题。这个类的设计考虑了可扩展性和健壮性,可以在各种场景下使用,并且易于根据特定需求进行定制。

  1. 基本配置和状态

    • 全局状态信息: SHOW GLOBAL STATUS;
    • 是否区分表名大小写: SHOW VARIABLES LIKE ‘lower_case_table_names’;
    • MySQL 服务端口: SHOW VARIABLES LIKE ‘port’;
    • MySQL socket 文件路径: SHOW VARIABLES LIKE ‘socket’;
    • 是否跳过域名解析: SHOW VARIABLES LIKE ‘skip_name_resolve’;
    • 数据库字符集: SHOW VARIABLES LIKE ‘character_set_server’;
    • 服务器默认的校对规则: SHOW VARIABLES LIKE ‘collation_server’;
    • 交互式连接超时时间 (秒): SHOW VARIABLES LIKE ‘interactive_timeout’;
    • 非交互式连接超时时间 (秒): SHOW VARIABLES LIKE ‘wait_timeout’;
    • 事务隔离级别: SHOW VARIABLES LIKE ‘tx_isolation’;
    • 数据文件存放位置: SHOW VARIABLES LIKE ‘%datadir%’;
    • 允许的最大数据包大小: SHOW VARIABLES LIKE ‘max_allowed_packet’;
    • 每个线程堆栈的大小: SHOW VARIABLES LIKE ‘thread_stack’;
    • 线程缓存的大小: SHOW VARIABLES LIKE ‘thread_cache_size’;
    • 可以打开的表的数量: SHOW VARIABLES LIKE ‘table_open_cache’;
    • 内部临时表的最大大小: SHOW VARIABLES LIKE ‘tmp_table_size’;
    • 内存中 HEAP 表的最大大小: SHOW VARIABLES LIKE ‘max_heap_table_size’;
    • MySQL 主进程文件的位置: SHOW VARIABLES LIKE ‘pid_file’;
    • 错误日志文件的位置: SHOW VARIABLES LIKE ‘log_error’;
    • 慢查询日志文件的位置: SHOW VARIABLES LIKE ‘slow_query_log_file’;
    • 慢查询时间阈值: SHOW VARIABLES LIKE ‘long_query_time’;
  2. 连接管理

    • 最大连接数: SHOW VARIABLES LIKE ‘max_connections’;
    • 服务器启动以来已使用的最大连接数: SHOW STATUS LIKE ‘Max_used_connections’;
    • 达到最大连接数的时间点: SHOW STATUS LIKE ‘Max_used_connections_time’;
    • 连接失败次数上限: SHOW VARIABLES LIKE ‘max_connect_errors’;
    • 当前打开的连接数: SHOW STATUS LIKE ‘Threads_connected’;
    • 当前线程缓存中有多少空闲线程: SHOW STATUS LIKE ‘Threads_cached’;
    • 从最近一次服务启动,已创建线程的数量: SHOW STATUS LIKE ‘Threads_created’;
    • 当前激活的(非睡眠状态)线程数: SHOW STATUS LIKE ‘Threads_running’;
    • 当前所有线程的信息: SHOW PROCESSLIST;
  3. Binlog配置

    • Binlog 文件列表: SHOW BINARY LOGS;
    • 是否启用 Binlog: SHOW VARIABLES LIKE ‘log_bin’;
    • Binlog 同步频率: SHOW VARIABLES LIKE ‘sync_binlog’;
    • Binlog 格式: SHOW VARIABLES LIKE ‘binlog_format’;
    • 文件路径: SHOW VARIABLES LIKE ‘log-bin’;
    • Binlog 索引文件位置: SHOW VARIABLES LIKE ‘log_bin_index’;
    • 单个 Binlog 最大大小: SHOW VARIABLES LIKE ‘max_binlog_size’;
    • Binlog 基本名字: SHOW VARIABLES LIKE ‘log_bin_basename’;
    • Binlog 文件过期时间: SHOW VARIABLES LIKE ‘expire_logs_days’;
    • MySQL 服务器的唯一 ID: SHOW VARIABLES LIKE ‘server_id’;
  4. GTID配置

    • 是否开启 GTID 模式: SHOW VARIABLES LIKE ‘gtid_mode’;
    • 是否强制 GTID 一致性: SHOW VARIABLES LIKE ‘enforce_gtid_consistency’;
    • 查询GTID执行的详细情况: SELECT * FROM mysql.gtid_executed;
    • 是否开启级联复制: SHOW VARIABLES LIKE ‘log_slave_updates’;
  5. InnoDB配置

    • InnoDB 版本: SHOW VARIABLES LIKE ‘innodb_version’;
    • 是否为每个 InnoDB 表创建单独的文件: SHOW VARIABLES LIKE ‘innodb_file_per_table’;
    • InnoDB 缓冲池大小: SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;
    • InnoDB 日志文件大小: SHOW VARIABLES LIKE ‘innodb_log_file_size’;
    • InnoDB 可以有多少线程同时运行: SHOW VARIABLES LIKE ‘innodb_thread_concurrency’;
    • 缓冲池中脏页的最大百分比: SHOW VARIABLES LIKE ‘innodb_max_dirty_pages_pct’;
    • InnoDB的最大写入 IO 能力: SHOW VARIABLES LIKE ‘innodb_io_capacity_max’;
    • 日志缓冲区大小: SHOW VARIABLES LIKE ‘innodb_log_buffer_size’;
    • 事务提交时刷新日志的频率: SHOW VARIABLES LIKE ‘innodb_flush_log_at_trx_commit’;
    • InnoDB IO 容量: SHOW VARIABLES LIKE ‘innodb_io_capacity’;
    • 缓冲池实例数: SHOW VARIABLES LIKE ‘innodb_buffer_pool_instances’;
  6. 性能监控

    • 慢查询次数: SHOW STATUS LIKE ‘Slow_queries’;
    • InnoDB 读取的行数: SHOW STATUS LIKE ‘Innodb_rows_read’;
    • InnoDB 插入的行数: SHOW STATUS LIKE ‘Innodb_rows_inserted’;
    • InnoDB 更新的行数: SHOW STATUS LIKE ‘Innodb_rows_updated’;
    • InnoDB 删除的行数: SHOW STATUS LIKE ‘Innodb_rows_deleted’;

http://www.ppmy.cn/server/130797.html

相关文章

【C语言系统编程】【第一部分:操作系统知识】1.2.POSIX标准与系统调用

1.2 POSIX标准与系统调用 1.2.1 POSIX标准概要 1.2.1.1 什么是POSIX标准 POSIX(Portable Operating System Interface of Unix)标准是一系列由IEEE定义的操作系统接口标准,其目标是在Unix操作系统族之间实现源码级别的兼容性。这些标准定义…

污水排放口细粒度检测数据集,污-水排放口的类型包括10类目标,10000余张图像,yolo格式目标检测,9GB数据量。

污水排放口细粒度检测数据集,污-水排放口的类型包括10类目标(1 合流下水道,2 雨水,3 工业废水,4 农业排水,5 牲畜养殖,6 水产养殖,7 地表径流,8 废水处理厂&…

【C++】模拟实现hash_table(哈希表)

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 📌实现HashNode类模板 🎏构造HashNode类成员变量 🎏实现HashNode类构造函数…

Map: 地图

对全国2023年各省市的人口分布情况,做出地图展示效果 参考:Map - Map_base - Document (pyecharts.org) 1、模板 # -*- coding: gbk -*- from pyecharts import options as opts from pyecharts.charts import Map from pyecharts.faker import Faker…

Tongweb7049+TongRDS2214-2216+THS6010-6012 开机自启动(by lqw)

原理 配置rc.local(这个网上有很多示范,为了方便使用,在这里总结一下各个产品的配置) Tongweb7049 Tongweb7049 本身自带开机自启动脚本(bin目录下的installxxx.sh),但是有时执行失败的话&am…

Android Studio实现安卓心理健康咨询

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目代号161 1.开发环境 android stuido3.6 jdk1.8 2.功能介绍 安卓端: 1.注册登录 2.心理测评 3.测评结果 4.心理咨询预约 5.心理综合辅导 6.个人中心 7.历史咨…

基于深度学习的视频中的姿态跟踪

基于深度学习的视频姿态跟踪是一项用于从视频序列中持续检测和跟踪人体姿态的技术。它能够识别人体的2D或3D关键点,并在时间维度上进行跟踪,主要应用于人机交互、体育分析、动作识别和虚拟现实等领域。以下是视频姿态跟踪的主要原理和方法: …

【Webpack】Webpack 中 jsonp 的使用

Webpack 在处理模块加载时会使用 JSONP(JSON with Padding)技术,特别是在动态加载(异步加载)模块的场景中。 JSONP 在 Webpack 中的作用 Webpack 使用 JSONP 来实现代码拆分和按需加载。这种技术使得浏览器可以通过插…