MySQL性能巡检脚本分析报告

主要依赖库

mysql.connector: 用于连接和操作MySQL数据库

pandas: 数据处理和CSV导出

docx: 生成Word格式报告

datetime: 时间处理

核心函数结构

get_mysql_config() - 获取MySQL连接配置

connect_to_mysql(config) - 建立数据库连接

get_global_status(cursor) - 获取全局状态

get_global_variables(cursor) - 获取全局变量

generate_report(conn) - 生成性能报告

create_word_report(report_data, filename) - 创建Word报告

功能特性

连接管理

支持交互式输入MySQL服务器信息(IP、端口、用户名、密码)

默认连接到information_schema数据库获取系统信息

监控指标

连接数: 当前连接数与最大连接数

查询性能: 总查询数和QPS(每秒查询数)

慢查询: 慢查询总数统计

存储引擎: InnoDB缓冲池配置

临时表: 内存和磁盘临时表创建统计

日志: 日志写入请求次数

报告输出

控制台输出: 实时显示各项性能指标

Word文档: 生成格式化的性能报告

CSV文件: 支持数据持久化存储

python 复制代码
import mysql.connector
from mysql.connector import Error
import pandas as pd
from datetime import datetime
from docx import Document
from docx.shared import Pt, RGBColor
from datetime import datetime
import time
import os

def create_word_report(report_data, filename="MySQL性能报告.docx"):
    doc = Document()
    
    # 标题
    doc.add_heading('MySQL 性能巡检报告', 0)
    doc.add_paragraph(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

    # 性能指标
    doc.add_heading('📊 性能指标', level=1)
    table = doc.add_table(rows=1, cols=2)
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = '指标'
    hdr_cells[1].text = '值'

    for key, value in report_data.items():
        if key != "时间":
            row_cells = table.add_row().cells
            row_cells[0].text = key
            row_cells[1].text = str(value)

    # 设置表格字体大小
    for row in table.rows:
        for cell in row.cells:
            for paragraph in cell.paragraphs:
                paragraph.style.font.size = Pt(11)

    # 保存文档
    doc.save(filename)
    print(f"✅ 报告已保存为: {filename}")
def get_mysql_config():
    host = input("请输入MySQL服务器IP地址: ")
    port = int(input("请输入MySQL端口号(默认3306): ") or 3306)
    user = input("请输入MySQL用户名: ")
    password = input("请输入MySQL密码: ")
    return {
        'host': host,
        'port': port,
        'user': user,
        'password': password,
        'database': 'information_schema'
    }

def connect_to_mysql(config):
    try:
        conn = mysql.connector.connect(**config)
        if conn.is_connected():
            print("✅ 成功连接到 MySQL")
            return conn
    except Error as e:
        print(f"❌ 连接失败: {e}")
        return None

def get_global_status(cursor):
    cursor.execute("SHOW GLOBAL STATUS")
    return dict(cursor.fetchall())

def get_global_variables(cursor):
    cursor.execute("SHOW GLOBAL VARIABLES")
    return dict(cursor.fetchall())

def generate_report(conn):
    cursor = conn.cursor()
    status = get_global_status(cursor)
    variables = get_global_variables(cursor)

    # 计算 QPS
    time.sleep(1)
    status_after = get_global_status(cursor)
    qps = int(status_after['Queries']) - int(status['Queries'])

    report = {
        "时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "当前连接数": status.get('Threads_connected', 'N/A'),
        "最大连接数": variables.get('max_connections', 'N/A'),
        "总查询数": status.get('Queries', 'N/A'),
        "QPS (每秒查询)": qps,
        "慢查询总数": status.get('Slow_queries', 'N/A'),
        "InnoDB 缓冲池大小": variables.get('innodb_buffer_pool_size', 'N/A'),
        "临时表在内存中创建数": status.get('Created_tmp_tables', 'N/A'),
        "临时表在磁盘中创建数": status.get('Created_tmp_disk_tables', 'N/A'),
        "日志写入次数": status.get('Innodb_log_write_requests', 'N/A')
    }

    print("\n📊 MySQL 性能报告\n")
    for key, value in report.items():
        print(f"{key}: {value}")

    # 生成 Word 报告
    create_word_report(report)

    # 可选:保存为 CSV 文件
    report_df = pd.DataFrame([report])
    report_df.to_csv("remote_mysql_performance_report.csv", mode='a', index=False,
                     header=not os.path.exists("remote_mysql_performance_report.csv"))

    cursor.close()

def main():
    config = get_mysql_config()
    conn = connect_to_mysql(config)
    if conn:
        generate_report(conn)
        conn.close()

if __name__ == "__main__":
    main()
相关推荐
m0_591364732 分钟前
mysql如何通过索引减少行锁范围_mysql索引与加锁逻辑
jvm·数据库·python
代码中介商4 分钟前
MySQL 核心进阶:事务、隔离级别与视图实战
数据库·mysql
七爷不在我这里5 分钟前
oracle的26版本及以下 Null的判断及空串判定
数据库·oracle
weixin_4440129313 分钟前
CSS如何实现单选按钮自定义样式_利用伪元素隐藏默认UI
jvm·数据库·python
X566114 分钟前
CSS如何利用Grid重写老旧的表格布局
jvm·数据库·python
思麟呀16 分钟前
MySQL复合查询与内外连接
android·数据库·mysql
ㄟ留恋さ寂寞18 分钟前
mysql如何配置MySQL的连接保持_调整tcp_keepalive设置
jvm·数据库·python
2301_7838486518 分钟前
Less如何构建CSS样式库_通过继承机制优化组件化开发
jvm·数据库·python
Mahir089 小时前
Redis 与 MySQL 数据同步:一致性保证的完整解决方案
数据库·redis·mysql·缓存·面试·数据一致性
2301_769340679 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python