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()
相关推荐
Lyyaoo.2 小时前
Redis基础
数据库·redis·缓存
杨云龙UP3 小时前
ODA登录ODA Web管理界面时提示Password Expired的处理方法_20260423
linux·运维·服务器·数据库·oracle
解救女汉子3 小时前
SQL触发器如何获取触发源应用名_利用APP_NAME函数追踪
jvm·数据库·python
weixin_520649875 小时前
数据库函数
数据库
Bert.Cai5 小时前
MySQL LPAD()函数详解
数据库·mysql
OnlyEasyCode6 小时前
Navicat 任务自动备份指定数据库
数据库
if else6 小时前
Redis 哨兵集群部署方案
数据库·redis
yejqvow126 小时前
Pandas 高效实现组内跨行时间戳匹配与布尔标记
jvm·数据库·python
了不起的云计算V7 小时前
从DeepSeek V4适配看国产算力的三个拐点
数据库·人工智能