暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

MySQL一条命令生成数据库巡检报告进阶(生成更好看更美观的报告)

原创 szrsu 2024-10-24
932

在上一篇文章MySQL一条命令生成数据库巡检报告,省时省力! 提到用一条命令生成一份可供DBA分析数据库状态的报告,生成的hmtl没有样式,比较难看。想着能不能像oracle 的awr报告那样的样式显示,于是用shell脚本来实现,把CSS样式加入到生成的html里,shell脚本如下:

#!/bin/bash

# MySQL 连接参数
HOST="10.10.10.1"
PORT="3306"
USER="root"
PASSWORD="rootmysql"
SQL_QUERY="CALL sys.diagnostics(1, 1, 'current')"

# 输出 HTML 文件路径
html_file="/tmp/report_$(date +"%Y-%m-%d_%H-%M").html"

# 执行 SQL 并生成 HTML 文件
mysql -h"$HOST" -P"$PORT" -u"$USER" -p"$PASSWORD" -H -e "$SQL_QUERY" > "$html_file"
# 插入 AWR 风格的 CSS 样式
cat << 'EOF' | sed -i '1i\
<!DOCTYPE html>\
<html lang="en">\
<head>\
<meta charset="UTF-8">\
<title>MySQL Diagnostics Report</title>\
<style type="text/css">\
body { font: bold 10pt Arial, Helvetica, sans-serif; color: black; background: white; }\
table { width: 100%; border-collapse: collapse; }\
th { background-color: #0066CC; color: white; padding: 8px; text-align: left; }\
td { padding: 8px; border: 1px solid #ddd; vertical-align: top; }\
tr:nth-child(even) { background-color: #f2f2f2; }\
h1 { font-size: 20pt; color: #336699; margin-bottom: 10px; }\
h2 { font-size: 18pt; color: #336699; margin-top: 10px; margin-bottom: 5px; }\
a { color: #0066CC; text-decoration: none; }\
a:hover { text-decoration: underline; }\
</style>\
</head>\
<body>\
<h1>MySQL Diagnostics Report</h1>' "$html_file"
EOF

# 追加 HTML 结束标签
echo "</body></html>" >> "$html_file"

echo "Report generated: $html_file"

产生的html如下:
image.png
对比之前的:
image.png
是不是感觉好看、顺眼许多?

另外,想着这个报告内容也比较多,没有一个目录,找起来麻烦。能不能像awr报告,先在报告开头生成一个Main report目录,要看哪个项,点一下,自动跳转查看具体项目。于是又改了一下脚本,生成的效果如下:
image.png
image.png
可以看到,有了一个总目录,要查看具体项时,点一下就能自动跳转了!查看完,点一下浏览器的返回键,返回到目录,再查看其他的项目,是不是又方便很多!!!

当然,这些目录都生成在一列上,基本上首屏都被它撑满了,能不能给它分成三列或者四列来显示?当然可以,继续更改脚本,最终效果如下:
image.png

这样看起来是不是又清爽很多,有没有爱上它了?好了,附上最终的脚本,大家有需要的可以再进一步修改:

#!/bin/bash

# MySQL 连接参数
HOST="10.10.10.1"
PORT="3306"
USER="root"
PASSWORD="rootmysql"
SQL_QUERY="CALL sys.diagnostics(1, 1, 'current')"

# 输出 HTML 文件路径
html_file="/tmp/report_$(date +"%Y-%m-%d_%H-%M").html"

# 执行 SQL 并生成 HTML 文件
mysql -h"$HOST" -P"$PORT" -u"$USER" -p"$PASSWORD" -H -e "$SQL_QUERY" > "$html_file"
# 插入 AWR 风格的 CSS 样式
cat << 'EOF' | sed -i '1i\
<!DOCTYPE html>\
<html lang="en">\
<head>\
<meta charset="UTF-8">\
<title>MySQL Diagnostics Report</title>\
<style type="text/css">\
body { font: bold 10pt Arial, Helvetica, sans-serif; color: black; background: white; }\
table { width: 100%; border-collapse: collapse; }\
th { background-color: #0066CC; color: white; padding: 8px; text-align: left; }\
td { padding: 8px; border: 1px solid #ddd; vertical-align: top; }\
tr:nth-child(even) { background-color: #f2f2f2; }\
h1 { font-size: 20pt; color: #336699; margin-bottom: 10px; }\
h2 { font-size: 18pt; color: #336699; margin-top: 10px; margin-bottom: 5px; }\
</style>\
</head>\
<body>\
<h1 >MySQL Diagnostics Report</h1>' "$html_file"
EOF

# 提取报告内容并创建链接
report_content=$(grep -oP 'The following output is:</TH></TR><TR><TD>\K[^<]+' $html_file | grep -Ev '^(NOW\(\)|\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|[0-9]{4}-[0-9]{2}-[0-9]{2}|^\s*$)')
link_table="<table><tr><ul>"

# 计数器,用于分列
counter=0
max_columns=4

# 创建超链接并将其放入表格中
while IFS= read -r line; do
    link_name=$(echo "$line" | tr '[:upper:]' '[:lower:]' | sed 's/[ .]/_/g')  # 生成链接名
    link_table+="<td><li><a href=\"#$link_name\">$line</a></li></td>"
    escaped_line=$(printf '%s\n' "$line" | sed 's/[.*]/\\&/g')
    sed -i "s|<TD>$escaped_line</TD>|<TD id=\"$link_name\">$escaped_line</TD>|g" "$html_file"
    counter=$((counter + 1))
    
    # 分列
    if (( counter % max_columns == 0 )); then
        link_table+="</tr><tr>"
    fi
done <<< "$report_content"

# 完成表格
link_table+="</ul></tr></table>"

# 在HTML中插入 Main Report
sed -i "/<h1 >MySQL Diagnostics Report<\/h1>/a $link_table" "$html_file"


# 追加 HTML 结束标签
echo "</body></html>" >> "$html_file"

echo "Report generated: $html_file"

生成的html报告,有兴趣的可以到https://www.modb.pro/doc/137021 这个链接下载看看!

喜欢这篇文章的人还喜欢:
openGauss 一主一备 从5.0 LTS 版本升级至 6.0 LTS 版本实战
openGauss 6.0 主备切换 switchover和failover 实操

最后修改时间:2024-11-08 15:47:19
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论