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

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

- 新增活跃查询数监控
- 新增Binlog状态检测
- 新增表碎片检测功能
- 新增连接错误统计
- 新增InnoDB缓冲池大小监控
- 新增事务状态统计
- 新增锁等待检测功能
- 完善MySQL性能指标监控体系
上级 25e4441f
...@@ -2083,6 +2083,119 @@ function Test-MySQLStatus { ...@@ -2083,6 +2083,119 @@ function Test-MySQLStatus {
Add-Issue -Message "MySQL慢查询过多: $slowCount" -Level $slowStatus Add-Issue -Message "MySQL慢查询过多: $slowCount" -Level $slowStatus
} }
} }
elseif ($line -match "^ACTIVE_QUERIES:(\d+)$") {
$activeQueries = [int]$Matches[1]
$results += [PSCustomObject]@{
Name = "活跃查询数"
Value = "$activeQueries 个"
Threshold = "-"
Status = "正常"
Message = "当前正在执行的查询数量"
}
}
elseif ($line -match "^BINLOG_STATUS:(.+)$") {
$binlogInfo = $Matches[1].Trim()
if ($binlogInfo -match "^ON/(\d+)$") {
$binlogCount = $Matches[1]
$results += [PSCustomObject]@{
Name = "Binlog状态"
Value = "开启 ($binlogCount 个文件)"
Threshold = "-"
Status = "正常"
Message = "Binlog日志已开启"
}
} else {
$results += [PSCustomObject]@{
Name = "Binlog状态"
Value = "关闭"
Threshold = "-"
Status = "警告"
Message = "Binlog日志未开启"
}
}
}
elseif ($line -match "^FRAGMENTED_TABLES:(\d+)$") {
$fragTables = [int]$Matches[1]
if ($fragTables -gt 0) {
$fragStatus = Get-StatusByThreshold -Value "$fragTables" -WarningThreshold "5" -CriticalThreshold "20" -HigherIsWorse $true
$results += [PSCustomObject]@{
Name = "表碎片"
Value = "$fragTables 个"
Threshold = ">5个警告"
Status = $fragStatus
Message = "DATA_FREE > 10MB的表数量"
}
if ($fragStatus -ne "正常") {
Add-Issue -Message "发现$fragTables个表存在碎片" -Level $fragStatus
}
} else {
$results += [PSCustomObject]@{
Name = "表碎片"
Value = "无"
Threshold = ">5个警告"
Status = "正常"
Message = "无表碎片"
}
}
}
elseif ($line -match "^CONN_ERRORS:(\d+)$") {
$connErrors = [int]$Matches[1]
$errorStatus = Get-StatusByThreshold -Value "$connErrors" -WarningThreshold "10" -CriticalThreshold "100" -HigherIsWorse $true
$results += [PSCustomObject]@{
Name = "连接错误"
Value = "$connErrors 次"
Threshold = ">10次警告"
Status = $errorStatus
Message = "累计连接错误次数"
}
if ($errorStatus -ne "正常") {
Add-Issue -Message "MySQL连接错误过多: $connErrors次" -Level $errorStatus
}
}
elseif ($line -match "^INNODB_BP_SIZE:(.+)$") {
$bpSize = $Matches[1].Trim()
$results += [PSCustomObject]@{
Name = "InnoDB缓冲池"
Value = $bpSize
Threshold = "-"
Status = "正常"
Message = "InnoDB缓冲池大小"
}
}
elseif ($line -match "^TRX_ACTIVE:(\d+)$") {
$trxActive = [int]$Matches[1]
$results += [PSCustomObject]@{
Name = "活跃事务"
Value = "$trxActive 个"
Threshold = "-"
Status = "正常"
Message = "当前活跃事务数量"
}
}
elseif ($line -match "^LOCK_WAITS:(\d+)$") {
$lockWaits = [int]$Matches[1]
if ($lockWaits -gt 0) {
$lockStatus = Get-StatusByThreshold -Value "$lockWaits" -WarningThreshold "1" -CriticalThreshold "10" -HigherIsWorse $true
$results += [PSCustomObject]@{
Name = "锁等待"
Value = "$lockWaits 个"
Threshold = ">1个警告"
Status = $lockStatus
Message = "当前行锁等待数量"
}
if ($lockStatus -ne "正常") {
Add-Issue -Message "检测到$lockWaits个锁等待" -Level $lockStatus
}
} else {
$results += [PSCustomObject]@{
Name = "锁等待"
Value = "无"
Threshold = ">1个警告"
Status = "正常"
Message = "无锁等待"
}
}
}
} }
# 清理临时脚本 # 清理临时脚本
......
...@@ -95,3 +95,58 @@ if [[ "$OPEN_TABLES" =~ ^[0-9]+$ ]] && [[ "$OPENED_TABLES" =~ ^[0-9]+$ ]]; then ...@@ -95,3 +95,58 @@ if [[ "$OPEN_TABLES" =~ ^[0-9]+$ ]] && [[ "$OPENED_TABLES" =~ ^[0-9]+$ ]]; then
else else
echo "CACHE_HIT_RATE:N/A" echo "CACHE_HIT_RATE:N/A"
fi fi
# 当前活跃查询数
ACTIVE_QUERIES=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW PROCESSLIST;" 2>/dev/null | grep -v "Sleep" | grep -v "binlog" | wc -l)
echo "ACTIVE_QUERIES:$ACTIVE_QUERIES"
# Binlog状态
BINLOG_STATUS=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW VARIABLES LIKE 'log_bin';" 2>/dev/null | awk '{print $2}')
if [ "$BINLOG_STATUS" = "ON" ]; then
BINLOG_COUNT=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW BINARY LOGS;" 2>/dev/null | wc -l)
echo "BINLOG_STATUS:ON/$BINLOG_COUNT"
else
echo "BINLOG_STATUS:OFF"
fi
# 表碎片检测 (DATA_FREE > 10MB的表数量)
FRAGMENTED_TABLES=$(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 DATA_FREE > 10485760;" 2>/dev/null)
if [ -n "$FRAGMENTED_TABLES" ] && [[ "$FRAGMENTED_TABLES" =~ ^[0-9]+$ ]]; then
echo "FRAGMENTED_TABLES:$FRAGMENTED_TABLES"
else
echo "FRAGMENTED_TABLES:0"
fi
# 连接错误统计
CONN_ERRORS=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW STATUS LIKE 'Aborted_connects';" 2>/dev/null | awk '{print $2}')
if [ -n "$CONN_ERRORS" ]; then
echo "CONN_ERRORS:$CONN_ERRORS"
else
echo "CONN_ERRORS:0"
fi
# InnoDB缓冲池大小
INNODB_BP_SIZE=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';" 2>/dev/null | awk '{print $2}')
if [ -n "$INNODB_BP_SIZE" ] && [ "$INNODB_BP_SIZE" -gt 0 ]; then
# 转换为MB
BP_SIZE_MB=$((INNODB_BP_SIZE / 1024 / 1024))
echo "INNODB_BP_SIZE:${BP_SIZE_MB}MB"
else
echo "INNODB_BP_SIZE:N/A"
fi
# 事务状态统计
TRX_ACTIVE=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW STATUS LIKE 'Innodb_trx_active';" 2>/dev/null | awk '{print $2}')
if [ -n "$TRX_ACTIVE" ]; then
echo "TRX_ACTIVE:$TRX_ACTIVE"
else
echo "TRX_ACTIVE:0"
fi
# 锁等待检测
LOCK_WAITS=$(docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" $CONTAINER mysql -uroot -N -e "SHOW STATUS LIKE 'Innodb_row_lock_current_waits';" 2>/dev/null | awk '{print $2}')
if [ -n "$LOCK_WAITS" ]; then
echo "LOCK_WAITS:$LOCK_WAITS"
else
echo "LOCK_WAITS:0"
fi
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论