提交 9bd5a905 authored 作者: 陈泽健's avatar 陈泽健

feat(mysql): 添加MySQL深度检查功能

- 新增线程池状态监控,显示运行/连接/空闲连接数
- 集成InnoDB引擎状态检测功能
- 实现临时表使用率统计和阈值告警
- 添加数据库总大小统计功能
- 增加表数量统计功能
- 实现主从复制状态检测
- 添加Binlog日志过期时间监控
- 扩展健康检查脚本的数据解析能力
上级 f760ec35
...@@ -2196,6 +2196,105 @@ function Test-MySQLStatus { ...@@ -2196,6 +2196,105 @@ function Test-MySQLStatus {
} }
} }
} }
elseif ($line -match "^THREADS_POOL:(.+)$") {
$poolInfo = $Matches[1].Trim()
if ($poolInfo -ne "N/A" -and $poolInfo -match "^(\d+)/(\d+)/(\d+)$") {
$running = $Matches[1]
$connected = $Matches[2]
$idle = $Matches[3]
$results += [PSCustomObject]@{
Name = "线程池状态"
Value = "运行:$running, 连接:$connected, 空闲:$idle"
Threshold = "-"
Status = "正常"
Message = "活跃/空闲连接分析"
}
}
}
elseif ($line -match "^INNODB_STATUS:(\d+)$") {
$innodbStatus = $Matches[1].Trim()
$results += [PSCustomObject]@{
Name = "InnoDB状态"
Value = "正常"
Threshold = "-"
Status = "正常"
Message = "InnoDB引擎运行状态"
}
}
elseif ($line -match "^TEMP_TABLE_RATE:(.+)$") {
$tempRate = $Matches[1].Trim()
if ($tempRate -ne "N/A") {
$tempStatus = Get-StatusByThreshold -Value "$tempRate" -WarningThreshold "20" -CriticalThreshold "50" -HigherIsWorse $true
$results += [PSCustomObject]@{
Name = "临时表使用率"
Value = "$tempRate%"
Threshold = ">20%警告"
Status = $tempStatus
Message = "磁盘临时表比例"
}
if ($tempStatus -ne "正常") {
Add-Issue -Message "临时表使用率过高: $tempRate%" -Level $tempStatus
}
} else {
$results += [PSCustomObject]@{
Name = "临时表使用率"
Value = "N/A"
Threshold = "-"
Status = "正常"
Message = "临时表使用统计"
}
}
}
elseif ($line -match "^DATABASE_SIZE:(.+)$") {
$dbSize = $Matches[1].Trim()
$results += [PSCustomObject]@{
Name = "数据库总大小"
Value = $dbSize
Threshold = "-"
Status = "正常"
Message = "所有数据库大小总和"
}
}
elseif ($line -match "^TABLE_COUNT:(\d+)$") {
$tableCount = [int]$Matches[1]
$results += [PSCustomObject]@{
Name = "表数量"
Value = "$tableCount 个"
Threshold = "-"
Status = "正常"
Message = "数据库表总数"
}
}
elseif ($line -match "^REPLICATION_STATUS:(.+)$") {
$replStatus = $Matches[1].Trim()
if ($replStatus -eq "SLAVE") {
$results += [PSCustomObject]@{
Name = "复制状态"
Value = "从库"
Threshold = "-"
Status = "正常"
Message = "MySQL主从复制: 从库"
}
} else {
$results += [PSCustomObject]@{
Name = "复制状态"
Value = "主库"
Threshold = "-"
Status = "正常"
Message = "MySQL主从复制: 主库"
}
}
}
elseif ($line -match "^BINLOG_EXPIRE:(.+)$") {
$binlogExpire = $Matches[1].Trim()
$results += [PSCustomObject]@{
Name = "Binlog过期时间"
Value = $binlogExpire
Threshold = "-"
Status = "正常"
Message = "Binlog日志保留时间"
}
}
} }
# 清理临时脚本 # 清理临时脚本
......
...@@ -150,3 +150,59 @@ if [ -n "$LOCK_WAITS" ]; then ...@@ -150,3 +150,59 @@ if [ -n "$LOCK_WAITS" ]; then
else else
echo "LOCK_WAITS:0" echo "LOCK_WAITS:0"
fi fi
# 连接池分析(Threads_running/Threads_connected)
THREADS_RUNNING=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW STATUS LIKE 'Threads_running';" 2>/dev/null | awk '{print $2}')
THREADS_CONNECTED_NEW=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null | awk '{print $2}')
if [ -n "$THREADS_RUNNING" ] && [ -n "$THREADS_CONNECTED_NEW" ] && [ "$THREADS_CONNECTED_NEW" -gt 0 ]; then
IDLE_CONN=$((THREADS_CONNECTED_NEW - THREADS_RUNNING))
echo "THREADS_POOL:$THREADS_RUNNING/$THREADS_CONNECTED_NEW/$IDLE_CONN"
else
echo "THREADS_POOL:N/A"
fi
# InnoDB状态摘要
INNODB_STATUS=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW ENGINE INNODB STATUS\G" 2>/dev/null | grep -E "LATEST DETECTED DEADLOCK|TRANSACTIONS" | wc -l)
echo "INNODB_STATUS:$INNODB_STATUS"
# 临时表使用率
TEMP_TABLES=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW STATUS LIKE 'Created_tmp_disk_tables';" 2>/dev/null | awk '{print $2}')
TEMP_TABLES_TOTAL=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW STATUS LIKE 'Created_tmp_tables';" 2>/dev/null | awk '{print $2}')
if [ -n "$TEMP_TABLES" ] && [ -n "$TEMP_TABLES_TOTAL" ] && [ "$TEMP_TABLES_TOTAL" -gt 0 ]; then
TEMP_RATE=$(awk "BEGIN {printf \"%.2f\", ($TEMP_TABLES * 100) / $TEMP_TABLES_TOTAL}")
echo "TEMP_TABLE_RATE:$TEMP_RATE"
else
echo "TEMP_TABLE_RATE:N/A"
fi
# 数据库总大小(MB)
DB_SIZE=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','performance_schema','mysql','sys');" 2>/dev/null)
if [ -n "$DB_SIZE" ]; then
echo "DATABASE_SIZE:${DB_SIZE}MB"
else
echo "DATABASE_SIZE:N/A"
fi
# 表数量统计
TABLE_COUNT=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','performance_schema','mysql','sys') AND TABLE_TYPE='BASE TABLE';" 2>/dev/null)
if [ -n "$TABLE_COUNT" ]; then
echo "TABLE_COUNT:$TABLE_COUNT"
else
echo "TABLE_COUNT:0"
fi
# 复制状态
SLAVE_STATUS=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW SLAVE STATUS\G" 2>/dev/null | grep "Slave_IO_Running:" | awk '{print $2}')
if [ "$SLAVE_STATUS" = "Yes" ]; then
echo "REPLICATION_STATUS:SLAVE"
else
echo "REPLICATION_STATUS:MASTER"
fi
# Binlog过期时间(天)
BINLOG_EXPIRE=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW VARIABLES LIKE 'expire_logs_days';" 2>/dev/null | awk '{print $2}')
if [ -n "$BINLOG_EXPIRE" ]; then
echo "BINLOG_EXPIRE:${BINLOG_EXPIRE}days"
else
echo "BINLOG_EXPIRE:N/A"
fi
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论