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()