现代生产数据库每分钟生成数百万个指标——查询延迟、锁争用、复制延迟、缓冲池命中率和连接池耗尽。传统的基于阈值的警报使团队陷入误报中,同时错过了灾难性故障之前的微妙退化模式。人工智能和机器学习通过学习正常行为、在级联之前检测异常、自动优化查询以及在无需人工干预的情况下执行修复,从根本上改变了这一方程式。本指南涵盖了 MySQL、PostgreSQL、MongoDB、Redis 和 Couchbase 中人工智能驱动的数据库故障排除的全部内容。
AI数据库监控管道
在深入研究特定技术之前,了解人工智能驱动的数据库监控系统的端到端架构至关重要。该管道从每个数据库引擎收集原始指标,将其存储在时间序列数据库中,通过 ML 模型提供数据以进行异常检测,通过智能警报管理器路由警报,并在满足置信阈值时触发自动修复操作。
用于数据库监控和可观察性的 AI/ML
传统数据库监控依赖于静态阈值:当 CPU 超过 80%、查询延迟超过 500 毫秒或连接计数超过 200 时发出警报。这种方法在动态生产环境中会发生灾难性的失败,因为正常情况会随一天中的时间、一周中的某一天、季节性模式和部署事件而变化。人工智能驱动的可观察性用不断适应的学习基线取代了这些严格的阈值。
收集正确的指标
任何人工智能监控系统的基础都是全面的指标收集。每个数据库引擎都会公开对性能至关重要的独特指标:
# prometheus_db_collector.py — Unified metric collector for multi-DB environments
import prometheus_client as prom
import mysql.connector
import psycopg2
import pymongo
import redis
from couchbase.cluster import Cluster
from couchbase.options import ClusterOptions
from couchbase.auth import PasswordAuthenticator
import time
import logging
logger = logging.getLogger(__name__)
# MySQL metrics
mysql_slow_queries = prom.Gauge('mysql_slow_queries_total', 'Total slow queries')
mysql_buffer_pool_hit = prom.Gauge('mysql_innodb_buffer_pool_hit_ratio', 'Buffer pool hit ratio')
mysql_deadlocks = prom.Counter('mysql_deadlocks_total', 'Total deadlocks detected')
mysql_repl_lag = prom.Gauge('mysql_replication_lag_seconds', 'Replication lag in seconds')
mysql_active_connections = prom.Gauge('mysql_active_connections', 'Current active connections')
mysql_threads_running = prom.Gauge('mysql_threads_running', 'Currently running threads')
# PostgreSQL metrics
pg_bloat_ratio = prom.Gauge('pg_table_bloat_ratio', 'Table bloat ratio', ['table_name'])
pg_vacuum_age = prom.Gauge('pg_vacuum_age_seconds', 'Seconds since last vacuum', ['table_name'])
pg_index_hit_ratio = prom.Gauge('pg_index_hit_ratio', 'Index hit ratio')
pg_wal_rate = prom.Gauge('pg_wal_bytes_per_second', 'WAL generation rate')
pg_active_locks = prom.Gauge('pg_active_locks', 'Number of active locks', ['lock_type'])
# MongoDB metrics
mongo_opcounters = prom.Gauge('mongo_opcounters', 'Operation counters', ['op_type'])
mongo_wiredtiger_cache = prom.Gauge('mongo_wiredtiger_cache_usage_pct', 'WiredTiger cache usage')
mongo_repl_lag = prom.Gauge('mongo_replication_lag_seconds', 'Replica set lag')
# Redis metrics
redis_memory_frag = prom.Gauge('redis_memory_fragmentation_ratio', 'Memory fragmentation ratio')
redis_evicted_keys = prom.Counter('redis_evicted_keys_total', 'Total evicted keys')
redis_keyspace_hitrate = prom.Gauge('redis_keyspace_hit_ratio', 'Keyspace hit ratio')
class UnifiedDBCollector:
def __init__(self, config):
self.config = config
self.connections = {}
def collect_mysql(self):
conn = mysql.connector.connect(**self.config['mysql'])
cursor = conn.cursor(dictionary=True)
cursor.execute("SHOW GLOBAL STATUS LIKE 'Slow_queries'")
row = cursor.fetchone()
mysql_slow_queries.set(int(row['Value']))
cursor.execute("""
SELECT
(1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)) * 100
AS hit_ratio FROM (
SELECT
VARIABLE_VALUE AS Innodb_buffer_pool_reads
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads'
) a, (
SELECT
VARIABLE_VALUE AS Innodb_buffer_pool_read_requests
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests'
) b
""")
result = cursor.fetchone()
mysql_buffer_pool_hit.set(float(result['hit_ratio']))
cursor.execute("SHOW GLOBAL STATUS LIKE 'Innodb_deadlocks'")
row = cursor.fetchone()
mysql_deadlocks.inc(int(row['Value']))
cursor.execute("SHOW SLAVE STATUS")
slave = cursor.fetchone()
if slave and slave.get('Seconds_Behind_Master') is not None:
mysql_repl_lag.set(float(slave['Seconds_Behind_Master']))
cursor.execute("SHOW GLOBAL STATUS LIKE 'Threads_connected'")
row = cursor.fetchone()
mysql_active_connections.set(int(row['Value']))
cursor.close()
conn.close()
def collect_postgresql(self):
conn = psycopg2.connect(**self.config['postgresql'])
cursor = conn.cursor()
cursor.execute("""
SELECT schemaname, tablename,
pg_total_relation_size(schemaname || '.' || tablename) as total_size,
pg_relation_size(schemaname || '.' || tablename) as table_size
FROM pg_tables
WHERE schemaname = 'public'
""")
for row in cursor.fetchall():
if row[3] > 0:
bloat = (row[2] - row[3]) / row[2]
pg_bloat_ratio.labels(table_name=row[1]).set(bloat)
cursor.execute("""
SELECT relname, extract(epoch from now() - last_vacuum) as vacuum_age
FROM pg_stat_user_tables
WHERE last_vacuum IS NOT NULL
""")
for row in cursor.fetchall():
pg_vacuum_age.labels(table_name=row[0]).set(row[1])
cursor.execute("""
SELECT sum(heap_blks_hit) / nullif(sum(heap_blks_hit) + sum(heap_blks_read), 0)
FROM pg_statio_user_tables
""")
result = cursor.fetchone()
if result[0]:
pg_index_hit_ratio.set(float(result[0]))
cursor.close()
conn.close()
def collect_mongodb(self):
client = pymongo.MongoClient(self.config['mongodb']['uri'])
status = client.admin.command('serverStatus')
for op in ['insert', 'query', 'update', 'delete']:
mongo_opcounters.labels(op_type=op).set(status['opcounters'][op])
cache = status['wiredTiger']['cache']
cache_used = cache['bytes currently in the cache']
cache_max = cache['maximum bytes configured']
mongo_wiredtiger_cache.set((cache_used / cache_max) * 100)
client.close()
def collect_redis(self):
r = redis.Redis(**self.config['redis'])
info = r.info()
redis_memory_frag.set(info.get('mem_fragmentation_ratio', 0))
redis_evicted_keys.inc(info.get('evicted_keys', 0))
hits = info.get('keyspace_hits', 0)
misses = info.get('keyspace_misses', 0)
if hits + misses > 0:
redis_keyspace_hitrate.set(hits / (hits + misses))
r.close()
def run(self, interval=15):
prom.start_http_server(9100)
logger.info('Metric collector started on :9100')
while True:
try:
self.collect_mysql()
self.collect_postgresql()
self.collect_mongodb()
self.collect_redis()
except Exception as e:
logger.error(f'Collection error: {e}')
time.sleep(interval)
通过时间序列分析进行异常检测
人工智能在数据库监控中的核心价值主张是异常检测——识别偏离学习基线的异常模式。三种主要算法主导了这个领域:用于季节性分解的 Facebook Prophet、用于复杂时间模式的 LSTM 网络以及用于多元异常值检测的隔离森林。
使用 scikit-learn 和 Prophet 实施异常检测
以下 Python 实现演示了一个可立即投入生产的异常检测器,它将用于多变量检测的隔离森林与用于时间序列预测的 Prophet 结合起来。这种双重方法可以捕获突然的尖峰和逐渐的漂移。
# anomaly_detector.py — Production anomaly detection for database metrics
import numpy as np
import pandas as pd
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import StandardScaler
from prophet import Prophet
from prometheus_api_client import PrometheusConnect
from datetime import datetime, timedelta
import warnings
import json
import logging
warnings.filterwarnings('ignore')
logger = logging.getLogger(__name__)
class DatabaseAnomalyDetector:
def __init__(self, prometheus_url, contamination=0.05):
self.prom = PrometheusConnect(url=prometheus_url, disable_ssl=True)
self.scaler = StandardScaler()
self.isolation_forest = IsolationForest(
contamination=contamination,
n_estimators=200,
max_samples='auto',
random_state=42,
n_jobs=-1
)
self.prophet_models = {}
self.baseline_stats = {}
def fetch_metrics(self, query, hours=168):
"""Fetch metric data from Prometheus for the given time window."""
end_time = datetime.now()
start_time = end_time - timedelta(hours=hours)
result = self.prom.custom_query_range(
query=query,
start_time=start_time,
end_time=end_time,
step='60s'
)
if not result:
return pd.DataFrame()
timestamps, values = [], []
for point in result[0]['values']:
timestamps.append(datetime.fromtimestamp(float(point[0])))
values.append(float(point[1]))
return pd.DataFrame({'timestamp': timestamps, 'value': values})
def train_isolation_forest(self, metrics_dict):
"""Train Isolation Forest on multiple metric dimensions."""
frames = []
for name, df in metrics_dict.items():
if not df.empty:
series = df.set_index('timestamp')['value'].rename(name)
frames.append(series)
if not frames:
raise ValueError('No metric data available for training')
combined = pd.concat(frames, axis=1).dropna()
scaled = self.scaler.fit_transform(combined)
self.isolation_forest.fit(scaled)
self.baseline_stats = {
col: {'mean': combined[col].mean(), 'std': combined[col].std()}
for col in combined.columns
}
logger.info(f'Isolation Forest trained on {len(combined)} samples, {len(frames)} features')
return combined
def train_prophet(self, metric_name, df):
"""Train a Prophet model for seasonal time-series forecasting."""
if df.empty:
return
prophet_df = df.rename(columns={'timestamp': 'ds', 'value': 'y'})
model = Prophet(
changepoint_prior_scale=0.05,
seasonality_prior_scale=10,
holidays_prior_scale=10,
daily_seasonality=True,
weekly_seasonality=True,
yearly_seasonality=False,
interval_width=0.95
)
model.fit(prophet_df)
self.prophet_models[metric_name] = model
logger.info(f'Prophet model trained for {metric_name}')
def detect_anomalies_multivariate(self, current_metrics):
"""Detect anomalies using Isolation Forest across multiple metrics."""
scaled = self.scaler.transform(current_metrics)
predictions = self.isolation_forest.predict(scaled)
scores = self.isolation_forest.decision_function(scaled)
anomalies = []
for i, (pred, score) in enumerate(zip(predictions, scores)):
if pred == -1:
anomaly_score = max(0, min(1, 0.5 - score))
anomalies.append({
'index': i,
'score': round(anomaly_score, 4),
'severity': 'critical' if anomaly_score > 0.8 else 'warning',
'values': current_metrics.iloc[i].to_dict()
})
return anomalies
def detect_anomalies_timeseries(self, metric_name, df):
"""Detect anomalies using Prophet forecast bounds."""
model = self.prophet_models.get(metric_name)
if not model or df.empty:
return []
prophet_df = df.rename(columns={'timestamp': 'ds', 'value': 'y'})
forecast = model.predict(prophet_df[['ds']])
merged = prophet_df.merge(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']], on='ds')
anomalies = []
for _, row in merged.iterrows():
if row['y'] < row['yhat_lower'] or row['y'] > row['yhat_upper']:
deviation = abs(row['y'] - row['yhat'])
band = row['yhat_upper'] - row['yhat_lower']
severity_score = min(1.0, deviation / band) if band > 0 else 0.5
anomalies.append({
'timestamp': str(row['ds']),
'actual': round(row['y'], 4),
'predicted': round(row['yhat'], 4),
'lower': round(row['yhat_lower'], 4),
'upper': round(row['yhat_upper'], 4),
'score': round(severity_score, 4),
'severity': 'critical' if severity_score > 0.8 else 'warning'
})
return anomalies
def run_full_analysis(self, db_type='mysql'):
"""Run complete anomaly detection pipeline for a database type."""
metric_queries = {
'mysql': {
'cpu': 'rate(process_cpu_seconds_total{job="mysql"}[5m])',
'connections': 'mysql_global_status_threads_connected',
'slow_queries': 'rate(mysql_global_status_slow_queries[5m])',
'buffer_pool_hit': 'mysql_global_status_innodb_buffer_pool_hit_ratio',
'repl_lag': 'mysql_slave_status_seconds_behind_master'
},
'postgresql': {
'cpu': 'rate(process_cpu_seconds_total{job="postgres"}[5m])',
'connections': 'pg_stat_activity_count',
'cache_hit': 'pg_stat_database_blks_hit / (pg_stat_database_blks_hit + pg_stat_database_blks_read)',
'deadlocks': 'rate(pg_stat_database_deadlocks[5m])',
'wal_rate': 'rate(pg_wal_lsn_diff[5m])'
}
}
queries = metric_queries.get(db_type, metric_queries['mysql'])
metrics = {}
for name, query in queries.items():
metrics[name] = self.fetch_metrics(query)
self.train_isolation_forest(metrics)
for name, df in metrics.items():
self.train_prophet(name, df)
results = {'db_type': db_type, 'anomalies': [], 'summary': {}}
for name, df in metrics.items():
ts_anomalies = self.detect_anomalies_timeseries(name, df)
if ts_anomalies:
results['anomalies'].extend([
{**a, 'metric': name} for a in ts_anomalies
])
results['summary'] = {
'total_anomalies': len(results['anomalies']),
'critical': sum(1 for a in results['anomalies'] if a['severity'] == 'critical'),
'warning': sum(1 for a in results['anomalies'] if a['severity'] == 'warning')
}
return results
if __name__ == '__main__':
detector = DatabaseAnomalyDetector('http://prometheus:9090')
results = detector.run_full_analysis('mysql')
print(json.dumps(results, indent=2))
预测性警报与基于阈值的警报
传统的基于阈值的警报存在两种相反的故障模式。将阈值设置得太紧,在正常负载变化期间您就会陷入误报中。将它们设置得太松,您就会错过真正的降级,直到完全中断。预测警报通过了解每个指标在每个时间点的“正常”情况来解决这两个问题。
| 方面 | 基于阈值的 | 预测(人工智能) |
|---|---|---|
| 误报率 | 40–70% | 3–8% |
| 停电前的准备时间 | 0 分钟(反应) | 15–45 分钟(预测) |
| 适应负载模式 | 否,需要手动调整 | 是的,自动基线学习 |
| 多指标相关性 | 手动规则链 | 自动交叉度量分析 |
| 季节意识 | 没有任何 | 每日、每周、每月循环 |
| 设置复杂性 | 低的 | 中等(初始训练期) |
| 维护 | 高(恒定阈值调整) | 低(自适应型号) |
用于自然语言数据库查询和优化的 LLM 集成
像 GPT-4 和 Claude 这样的大型语言模型可以充当智能数据库助手,将自然语言问题翻译成 SQL、分析 EXPLAIN 计划并提出优化建议。此功能改变了 DBA 和开发人员与数据库交互的方式 - 他们可以用简单的英语描述问题并获得可行的建议,而不是手动剖析执行计划。
构建 LLM 查询优化器
以下 Python 实现创建了一个由 LLM 支持的查询优化助手,用于分析 EXPLAIN 计划并提出改进建议。它与 OpenAI 的 API 集成,并包括模式感知上下文构建。
# llm_query_optimizer.py — AI-powered database query optimization
import openai
import json
import mysql.connector
import psycopg2
import logging
from dataclasses import dataclass
from typing import Optional
logger = logging.getLogger(__name__)
@dataclass
class QueryAnalysis:
original_query: str
explain_plan: dict
schema_context: str
suggestions: list
optimized_query: Optional[str]
estimated_improvement: str
class LLMQueryOptimizer:
def __init__(self, api_key, db_config, db_type='mysql', model='gpt-4'):
self.client = openai.OpenAI(api_key=api_key)
self.db_config = db_config
self.db_type = db_type
self.model = model
def get_explain_plan(self, query):
"""Execute EXPLAIN ANALYZE and return the plan."""
if self.db_type == 'mysql':
conn = mysql.connector.connect(**self.db_config)
cursor = conn.cursor(dictionary=True)
cursor.execute(f'EXPLAIN FORMAT=JSON {query}')
plan = cursor.fetchone()
cursor.close()
conn.close()
return json.loads(plan['EXPLAIN'])
elif self.db_type == 'postgresql':
conn = psycopg2.connect(**self.db_config)
cursor = conn.cursor()
cursor.execute(f'EXPLAIN (FORMAT JSON, ANALYZE, BUFFERS) {query}')
plan = cursor.fetchone()[0]
cursor.close()
conn.close()
return plan
def get_schema_context(self, tables):
"""Extract schema DDL and statistics for context."""
context_parts = []
if self.db_type == 'mysql':
conn = mysql.connector.connect(**self.db_config)
cursor = conn.cursor()
for table in tables:
cursor.execute(f'SHOW CREATE TABLE {table}')
row = cursor.fetchone()
context_parts.append(f'-- Table: {table}\n{row[1]}')
cursor.execute(f'SHOW INDEX FROM {table}')
indexes = cursor.fetchall()
idx_info = '\n'.join([f' Index: {idx[2]}, Column: {idx[4]}, Cardinality: {idx[6]}' for idx in indexes])
context_parts.append(f'-- Indexes for {table}:\n{idx_info}')
cursor.execute(f"SELECT table_rows, data_length, index_length FROM information_schema.tables WHERE table_name = '{table}'")
stats = cursor.fetchone()
if stats:
context_parts.append(f'-- Stats: rows={stats[0]}, data_size={stats[1]}, index_size={stats[2]}')
cursor.close()
conn.close()
return '\n\n'.join(context_parts)
def analyze_query(self, query, tables):
"""Full LLM analysis of a slow query."""
explain_plan = self.get_explain_plan(query)
schema_context = self.get_schema_context(tables)
prompt = f"""You are an expert database administrator specializing in {self.db_type} performance tuning.
Analyze the following slow query, its EXPLAIN plan, and the schema context. Provide:
1. Root cause of poor performance
2. Specific index recommendations (with CREATE INDEX statements)
3. Query rewrite suggestions (with the rewritten SQL)
4. Estimated performance improvement
5. Any schema changes that would help
## Original Query
```sql
{query}
```
## EXPLAIN Plan
```json
{json.dumps(explain_plan, indent=2)}
```
## Schema Context
```
{schema_context}
```
Respond in JSON format:
{{
"root_cause": "...",
"index_recommendations": ["CREATE INDEX ...", ...],
"rewritten_query": "SELECT ...",
"estimated_improvement": "Nx faster",
"schema_changes": ["..."],
"explanation": "..."
}}"""
response = self.client.chat.completions.create(
model=self.model,
messages=[
{'role': 'system', 'content': 'You are an expert DBA. Return valid JSON only.'},
{'role': 'user', 'content': prompt}
],
temperature=0.1,
response_format={'type': 'json_object'}
)
result = json.loads(response.choices[0].message.content)
return QueryAnalysis(
original_query=query,
explain_plan=explain_plan,
schema_context=schema_context,
suggestions=result.get('index_recommendations', []),
optimized_query=result.get('rewritten_query'),
estimated_improvement=result.get('estimated_improvement', 'Unknown')
)
def batch_optimize(self, slow_query_log_path, top_n=20):
"""Parse slow query log and optimize the top N most impactful queries."""
queries = self._parse_slow_log(slow_query_log_path)
sorted_queries = sorted(queries, key=lambda q: q['total_time'], reverse=True)[:top_n]
results = []
for q in sorted_queries:
try:
tables = self._extract_tables(q['query'])
analysis = self.analyze_query(q['query'], tables)
results.append({
'query': q['query'],
'frequency': q['count'],
'total_time': q['total_time'],
'analysis': analysis
})
logger.info(f'Optimized query (est. {analysis.estimated_improvement}): {q["query"][:80]}')
except Exception as e:
logger.error(f'Failed to analyze query: {e}')
return results
def _parse_slow_log(self, path):
queries = {}
current_query = []
current_time = 0
with open(path) as f:
for line in f:
if line.startswith('# Query_time:'):
parts = line.split()
current_time = float(parts[2])
elif line.startswith('SET timestamp') or line.startswith('#'):
continue
elif line.strip().endswith(';'):
current_query.append(line.strip())
full_query = ' '.join(current_query)
if full_query not in queries:
queries[full_query] = {'query': full_query, 'count': 0, 'total_time': 0}
queries[full_query]['count'] += 1
queries[full_query]['total_time'] += current_time
current_query = []
else:
current_query.append(line.strip())
return list(queries.values())
def _extract_tables(self, query):
import re
tables = set()
for match in re.finditer(r'(?:FROM|JOIN|INTO|UPDATE)\s+[`"]?(\w+)[`"]?', query, re.IGNORECASE):
tables.add(match.group(1))
return list(tables)
if __name__ == '__main__':
import os
optimizer = LLMQueryOptimizer(
api_key=os.environ['OPENAI_API_KEY'],
db_config={'host': 'localhost', 'user': 'root', 'password': '', 'database': 'app_db'},
db_type='mysql'
)
analysis = optimizer.analyze_query(
'SELECT * FROM orders o JOIN users u ON o.user_id = u.id WHERE o.status = "pending" AND o.created_at > "2026-01-01" ORDER BY o.created_at DESC LIMIT 100',
['orders', 'users']
)
print(json.dumps(analysis.__dict__, indent=2, default=str))
自动修复工作流程
自动修复是人工智能驱动的数据库监控提供最切实的投资回报率的地方。系统不会在凌晨 3 点叫醒 DBA 来终止失控的查询或扩展只读副本,而是通过完整的审计跟踪和置信度评分来自动处理它。
# auto_remediation.py — Automated database issue remediation
import subprocess
import mysql.connector
import psycopg2
import pymongo
import redis
import logging
import json
from datetime import datetime
from enum import Enum
logger = logging.getLogger(__name__)
class Severity(Enum):
LOW = 'low'
MEDIUM = 'medium'
HIGH = 'high'
CRITICAL = 'critical'
class RemediationAction:
def __init__(self, name, description, severity_threshold, confidence_threshold=0.9):
self.name = name
self.description = description
self.severity_threshold = severity_threshold
self.confidence_threshold = confidence_threshold
class AutoRemediator:
def __init__(self, db_configs, notification_webhook=None):
self.db_configs = db_configs
self.webhook = notification_webhook
self.action_log = []
def _log_action(self, action, target, result, confidence):
entry = {
'timestamp': datetime.utcnow().isoformat(),
'action': action,
'target': target,
'result': result,
'confidence': confidence
}
self.action_log.append(entry)
logger.info(f'Remediation: {json.dumps(entry)}')
if self.webhook:
self._notify(entry)
def kill_long_running_queries(self, db_type='mysql', max_duration_seconds=300, confidence=0.95):
"""Kill queries exceeding duration threshold."""
if confidence < 0.9:
logger.warning(f'Low confidence ({confidence}), skipping kill action')
return []
killed = []
if db_type == 'mysql':
conn = mysql.connector.connect(**self.db_configs['mysql'])
cursor = conn.cursor(dictionary=True)
cursor.execute("""
SELECT id, user, host, db, time, state, info
FROM information_schema.processlist
WHERE command != 'Sleep'
AND time > %s
AND user != 'system user'
ORDER BY time DESC
""", (max_duration_seconds,))
for proc in cursor.fetchall():
try:
cursor.execute(f'KILL {proc["id"]}')
killed.append(proc)
self._log_action('kill_query', f'mysql:{proc["id"]}', 'success', confidence)
except Exception as e:
self._log_action('kill_query', f'mysql:{proc["id"]}', f'failed: {e}', confidence)
cursor.close()
conn.close()
elif db_type == 'postgresql':
conn = psycopg2.connect(**self.db_configs['postgresql'])
cursor = conn.cursor()
cursor.execute("""
SELECT pid, usename, application_name, state,
extract(epoch from now() - query_start) as duration, query
FROM pg_stat_activity
WHERE state = 'active'
AND extract(epoch from now() - query_start) > %s
AND usename != 'postgres'
""", (max_duration_seconds,))
for row in cursor.fetchall():
try:
cursor.execute('SELECT pg_terminate_backend(%s)', (row[0],))
conn.commit()
killed.append({'pid': row[0], 'user': row[1], 'duration': row[4]})
self._log_action('kill_query', f'pg:{row[0]}', 'success', confidence)
except Exception as e:
self._log_action('kill_query', f'pg:{row[0]}', f'failed: {e}', confidence)
cursor.close()
conn.close()
return killed
def scale_read_replicas(self, platform='kubernetes', target_replicas=None, confidence=0.92):
"""Scale database read replicas based on load prediction."""
if confidence < 0.85:
logger.warning('Insufficient confidence for scaling action')
return None
if platform == 'kubernetes':
cmd = f'kubectl scale statefulset mysql-read --replicas={target_replicas}'
result = subprocess.run(cmd.split(), capture_output=True, text=True)
self._log_action('scale_replicas', f'k8s:mysql-read:{target_replicas}', result.stdout.strip(), confidence)
return result.stdout
elif platform == 'aws':
import boto3
rds = boto3.client('rds')
response = rds.create_db_instance_read_replica(
DBInstanceIdentifier=f'read-replica-{datetime.now().strftime("%Y%m%d%H%M")}',
SourceDBInstanceIdentifier='production-primary'
)
self._log_action('create_replica', 'aws:rds', response['DBInstance']['DBInstanceIdentifier'], confidence)
return response
def trigger_failover(self, db_type='mysql', confidence=0.98):
"""Initiate database failover when primary is unhealthy."""
if confidence < 0.95:
logger.critical(f'Failover requires confidence >= 0.95, got {confidence}. Escalating to human.')
self._notify({'action': 'failover_escalation', 'confidence': confidence})
return None
self._log_action('failover_initiated', db_type, 'starting', confidence)
if db_type == 'mysql':
result = subprocess.run(
['mysqlsh', '--', 'dba', 'switchToSecondary'],
capture_output=True, text=True
)
self._log_action('failover', 'mysql:innodb_cluster', result.stdout.strip(), confidence)
elif db_type == 'postgresql':
result = subprocess.run(
['patronictl', 'failover', '--force'],
capture_output=True, text=True
)
self._log_action('failover', 'pg:patroni', result.stdout.strip(), confidence)
def flush_redis_hotspot(self, pattern, confidence=0.9):
"""Identify and handle Redis key hotspots."""
r = redis.Redis(**self.db_configs['redis'])
cursor = 0
hot_keys = []
while True:
cursor, keys = r.scan(cursor, match=pattern, count=1000)
for key in keys:
idle = r.object('idletime', key)
if idle is not None and idle < 5:
hot_keys.append(key.decode())
if cursor == 0:
break
if hot_keys:
self._log_action('hotspot_detected', f'redis:{pattern}', f'{len(hot_keys)} hot keys', confidence)
return hot_keys
def run_pg_vacuum(self, table, confidence=0.92):
"""Force VACUUM ANALYZE on bloated PostgreSQL tables."""
conn = psycopg2.connect(**self.db_configs['postgresql'])
conn.autocommit = True
cursor = conn.cursor()
cursor.execute(f'VACUUM (VERBOSE, ANALYZE) {table}')
self._log_action('vacuum', f'pg:{table}', 'completed', confidence)
cursor.close()
conn.close()
def _notify(self, payload):
import requests
try:
requests.post(self.webhook, json=payload, timeout=5)
except Exception as e:
logger.error(f'Notification failed: {e}')
MySQL 特定的 AI 故障排除
MySQL 提出了独特的挑战,这些挑战可以从人工智能分析中受益匪浅。 InnoDB 缓冲池管理、死锁检测、慢速查询模式识别和复制延迟预测都需要根据 MySQL 特定指标进行训练的专门 ML 模型。
使用 ML 进行慢速查询分析
ML 模型不是手动检查慢速查询日志,而是根据查询的性能影响和根本原因对查询进行分类。常见模式包括缺失索引、笛卡尔连接、索引列上具有函数的次优 WHERE 子句以及宽表上的 SELECT *。
InnoDB缓冲池优化
缓冲池命中率是 MySQL 最关键的指标。 AI 模型学习工作负载模式和缓冲池有效性之间的关系,预测命中率何时会下降并建议主动调整 innodb_buffer_pool_size。根据缓冲池指标训练的 LSTM 模型可以在影响查询延迟之前 30 分钟预测缓存压力。
死锁检测和预防
AI 分析 InnoDB 死锁图以识别重复出现的模式。系统不仅仅在死锁发生后记录死锁,还可以了解哪些事务序列导致死锁,并可以预先重新排序操作或调整隔离级别。
PostgreSQL-特定 AI 故障排除
PostgreSQL 的 MVCC 架构围绕表膨胀、真空调度和 WAL 管理带来了独特的挑战,这些挑战受益于人工智能驱动的分析。
真空分析和膨胀检测
人工智能模型跟踪交易率、死元组积累和自动清理有效性之间的关系。通过了解每个表的膨胀增长率,系统可以预测表何时达到有问题的膨胀水平,并在性能下降之前触发有针对性的清理操作。
指数推荐
一起分析 pg_stat_user_indexes 和 pg_stat_statements 可以揭示索引使用模式。 AI 可以识别消耗磁盘空间的未使用索引,并根据查询模式建议新索引 - 考虑附加索引的写入放大成本与读取性能优势。
连接池优化
PostgreSQL 处理连接的方式与 MySQL 不同,每个连接消耗的内存明显更多。 AI 模型分析 PgBouncer 上的连接池利用率模式,以确定不同工作负载配置文件(OLTP、OLAP、混合)的最佳池大小,从而防止连接匮乏和内存耗尽。
MongoDB 特定的 AI 故障排除
MongoDB 的文档模型和分布式架构带来了一系列独特的性能挑战,而 AI 可以有效地解决这些挑战。
指数建议
MongoDB 查询分析器的 AI 分析可识别执行集合扫描 (COLLSCAN) 的查询,并根据查询字段组合推荐复合索引。该模型考虑选择性、字段顺序和覆盖查询优化来生成最佳索引规范。
分片优化
对于分片集群,AI 会监控块分布、迁移率和查询路由模式。当它检测到分片利用率不均匀(热分片)时,它会建议分片键更改或预分割策略。机器学习模型预测块增长率,以便在性能影响发生之前主动平衡数据分布。
WiredTiger缓存分析
WiredTiger 缓存逐出模式揭示了工作负载特征。 AI 模型可以了解工作集增长与低效访问模式何时导致缓存压力,从而建议增加缓存大小或进行应用程序级更改(例如查询批处理)。
Redis 特定的 AI 故障排除
Redis 的运行限制与基于磁盘的数据库不同——内存是关键资源,延迟要求通常为亚毫秒级。
内存分析
AI 跟踪内存碎片率、密钥大小分布和 TTL 模式。当碎片超过健康阈值时,系统会确定 ACTIVEDEFRAG 调整或受控重启是否是更好的补救措施。 ML 模型预测内存增长轨迹以防止 OOM 终止。
关键模式检测和热点识别
使用 MONITOR 采样和 OBJECT FREQ 分析,AI 可以识别导致集群插槽之间负载分布不均匀的热键。对于Redis集群部署,系统会检测槽迁移瓶颈并建议更改关键命名以改善哈希槽分布。
驱逐政策优化
不同的工作负载受益于不同的逐出策略(易失性-lru、allkeys-lfu、易失性-ttl)。人工智能分析访问模式以推荐最佳的最大内存策略,并根据当前的密钥访问分布预测每个策略的命中率影响。
Couchbase 特定的 AI 故障排除
Couchbase 结合了文档存储、键值和类似 SQL (N1QL) 的查询功能,创建了独特的优化环境。
N1QL 查询优化
AI 分析 N1QL 查询模式和 EXPLAIN 输出,以建议 GSI(全局二级索引)创建、涵盖的索引策略和查询重写。系统会了解哪些 N1QL 模式始终会产生次优计划,并主动建议替代方案。
指数顾问集成
Couchbase 的内置索引顾问提供了建议,但 AI 通过考虑全局工作负载来增强这些建议,即在整个应用程序的访问模式中平衡索引创建成本和查询收益,而不是孤立地进行单个查询。
再平衡规划
当添加或删除节点时,Couchbase 必须重新平衡数据。 AI 根据历史集群行为预测重新平衡持续时间、资源影响和最佳时间窗口。这可以防止重新平衡操作在高峰时段影响生产流量。
多数据库AI可观测架构
大多数生产环境运行多个数据库引擎。统一的人工智能可观测性平台必须标准化跨引擎的指标,关联整个数据层的异常,并向运营团队提供一致的视图。
使用 ChatGPT 和 Claude 构建自定义 AI 数据库助手
将 LLM 与您的数据库基础架构集成,创建一个交互式 DBA 助手,可以回答自然语言问题、诊断问题并执行修复工作流程。该助手将检索增强生成 (RAG) 与实时指标访问相结合。
# ai_dba_assistant.py — Custom AI DBA assistant with tool integration
import openai
import json
import os
from datetime import datetime
class AIDBAssistant:
def __init__(self, db_connections, prometheus_url):
self.client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
self.db_conns = db_connections
self.prom_url = prometheus_url
self.conversation_history = []
self.tools = [
{
'type': 'function',
'function': {
'name': 'query_prometheus',
'description': 'Execute a PromQL query to fetch database metrics',
'parameters': {
'type': 'object',
'properties': {
'query': {'type': 'string', 'description': 'PromQL query'},
'duration': {'type': 'string', 'description': 'Time range (e.g. 1h, 24h)'}
},
'required': ['query']
}
}
},
{
'type': 'function',
'function': {
'name': 'run_explain',
'description': 'Run EXPLAIN on a SQL query',
'parameters': {
'type': 'object',
'properties': {
'query': {'type': 'string'},
'db_type': {'type': 'string', 'enum': ['mysql', 'postgresql']}
},
'required': ['query', 'db_type']
}
}
},
{
'type': 'function',
'function': {
'name': 'get_active_queries',
'description': 'List currently running database queries',
'parameters': {
'type': 'object',
'properties': {
'db_type': {'type': 'string', 'enum': ['mysql', 'postgresql', 'mongodb']},
'min_duration_seconds': {'type': 'integer', 'default': 0}
},
'required': ['db_type']
}
}
},
{
'type': 'function',
'function': {
'name': 'kill_query',
'description': 'Terminate a running database query by ID',
'parameters': {
'type': 'object',
'properties': {
'db_type': {'type': 'string'},
'process_id': {'type': 'integer'}
},
'required': ['db_type', 'process_id']
}
}
}
]
def chat(self, user_message):
self.conversation_history.append({'role': 'user', 'content': user_message})
system_prompt = """You are an expert DBA assistant with access to real-time database monitoring tools.
You can query Prometheus metrics, analyze EXPLAIN plans, view active queries, and kill problematic queries.
Always ground your answers in actual data by using the available tools.
When diagnosing issues, follow this methodology:
1. Check current metrics for anomalies
2. Identify root cause
3. Suggest specific remediation steps
4. Execute remediation if the user approves"""
messages = [{'role': 'system', 'content': system_prompt}] + self.conversation_history
response = self.client.chat.completions.create(
model='gpt-4',
messages=messages,
tools=self.tools,
tool_choice='auto'
)
message = response.choices[0].message
if message.tool_calls:
for tool_call in message.tool_calls:
fn_name = tool_call.function.name
fn_args = json.loads(tool_call.function.arguments)
result = self._execute_tool(fn_name, fn_args)
self.conversation_history.append(message)
self.conversation_history.append({
'role': 'tool',
'tool_call_id': tool_call.id,
'content': json.dumps(result)
})
follow_up = self.client.chat.completions.create(
model='gpt-4',
messages=[{'role': 'system', 'content': system_prompt}] + self.conversation_history
)
assistant_reply = follow_up.choices[0].message.content
else:
assistant_reply = message.content
self.conversation_history.append({'role': 'assistant', 'content': assistant_reply})
return assistant_reply
def _execute_tool(self, name, args):
if name == 'query_prometheus':
from prometheus_api_client import PrometheusConnect
prom = PrometheusConnect(url=self.prom_url)
return prom.custom_query(args['query'])
elif name == 'run_explain':
return {'plan': 'EXPLAIN output here'}
elif name == 'get_active_queries':
return {'queries': []}
elif name == 'kill_query':
return {'status': 'killed', 'process_id': args['process_id']}
return {'error': f'Unknown tool: {name}'}
Prometheus + Grafana + ML 管道设置
可观测性堆栈构成了人工智能数据库监控的支柱。 Prometheus 从数据库导出器中抓取指标,Grafana 将其可视化,ML 管道处理时间序列数据以进行异常检测。
多数据库监控的 Prometheus 配置
# prometheus.yml — Multi-database monitoring configuration
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- /etc/prometheus/rules/db_anomaly_rules.yml
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['mysql-exporter:9104']
metrics_path: /metrics
scrape_interval: 10s
- job_name: 'postgresql'
static_configs:
- targets: ['postgres-exporter:9187']
scrape_interval: 10s
- job_name: 'mongodb'
static_configs:
- targets: ['mongodb-exporter:9216']
scrape_interval: 15s
- job_name: 'redis'
static_configs:
- targets: ['redis-exporter:9121']
scrape_interval: 10s
- job_name: 'couchbase'
static_configs:
- targets: ['couchbase-exporter:9420']
scrape_interval: 15s
remote_write:
- url: http://victoriametrics:8428/api/v1/write
自定义 Grafana 仪表板配置
# grafana_dashboard_generator.py — Auto-generate AI-powered Grafana dashboards
import json
import requests
class GrafanaDashboardGenerator:
def __init__(self, grafana_url, api_key):
self.url = grafana_url
self.headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'}
def create_db_overview_dashboard(self):
dashboard = {
'dashboard': {
'title': 'AI Database Health Overview',
'tags': ['database', 'ai', 'monitoring'],
'timezone': 'browser',
'panels': [
self._anomaly_score_panel(grid_pos={'x': 0, 'y': 0, 'w': 12, 'h': 8}),
self._query_latency_panel(grid_pos={'x': 12, 'y': 0, 'w': 12, 'h': 8}),
self._connection_pool_panel(grid_pos={'x': 0, 'y': 8, 'w': 8, 'h': 8}),
self._replication_lag_panel(grid_pos={'x': 8, 'y': 8, 'w': 8, 'h': 8}),
self._buffer_cache_panel(grid_pos={'x': 16, 'y': 8, 'w': 8, 'h': 8}),
self._remediation_log_panel(grid_pos={'x': 0, 'y': 16, 'w': 24, 'h': 6})
],
'refresh': '10s'
},
'overwrite': True
}
resp = requests.post(f'{self.url}/api/dashboards/db', headers=self.headers, json=dashboard)
return resp.json()
def _anomaly_score_panel(self, grid_pos):
return {
'title': 'AI Anomaly Score (All Databases)',
'type': 'timeseries',
'gridPos': grid_pos,
'targets': [
{'expr': 'db_anomaly_score{db_type="mysql"}', 'legendFormat': 'MySQL'},
{'expr': 'db_anomaly_score{db_type="postgresql"}', 'legendFormat': 'PostgreSQL'},
{'expr': 'db_anomaly_score{db_type="mongodb"}', 'legendFormat': 'MongoDB'},
{'expr': 'db_anomaly_score{db_type="redis"}', 'legendFormat': 'Redis'},
{'expr': 'db_anomaly_score{db_type="couchbase"}', 'legendFormat': 'Couchbase'}
],
'fieldConfig': {
'defaults': {
'thresholds': {
'steps': [
{'value': 0, 'color': 'green'},
{'value': 0.5, 'color': 'yellow'},
{'value': 0.8, 'color': 'red'}
]
},
'max': 1, 'min': 0
}
}
}
def _query_latency_panel(self, grid_pos):
return {
'title': 'Query Latency P95 with AI Prediction',
'type': 'timeseries',
'gridPos': grid_pos,
'targets': [
{'expr': 'histogram_quantile(0.95, rate(db_query_duration_seconds_bucket[5m]))', 'legendFormat': 'Actual P95'},
{'expr': 'db_query_latency_predicted_p95', 'legendFormat': 'AI Predicted P95'}
]
}
def _connection_pool_panel(self, grid_pos):
return {
'title': 'Connection Pool Utilization',
'type': 'gauge',
'gridPos': grid_pos,
'targets': [
{'expr': 'db_connections_active / db_connections_max * 100', 'legendFormat': '{{db_type}}'}
]
}
def _replication_lag_panel(self, grid_pos):
return {
'title': 'Replication Lag (seconds)',
'type': 'timeseries',
'gridPos': grid_pos,
'targets': [
{'expr': 'mysql_slave_status_seconds_behind_master', 'legendFormat': 'MySQL'},
{'expr': 'pg_replication_lag_seconds', 'legendFormat': 'PostgreSQL'},
{'expr': 'mongodb_replset_member_replication_lag', 'legendFormat': 'MongoDB'}
]
}
def _buffer_cache_panel(self, grid_pos):
return {
'title': 'Buffer/Cache Hit Ratio',
'type': 'stat',
'gridPos': grid_pos,
'targets': [
{'expr': 'mysql_global_status_innodb_buffer_pool_hit_ratio', 'legendFormat': 'MySQL InnoDB'},
{'expr': 'pg_stat_database_blks_hit / (pg_stat_database_blks_hit + pg_stat_database_blks_read)', 'legendFormat': 'PostgreSQL'},
{'expr': 'redis_keyspace_hit_ratio', 'legendFormat': 'Redis'}
]
}
def _remediation_log_panel(self, grid_pos):
return {
'title': 'Auto-Remediation Action Log',
'type': 'table',
'gridPos': grid_pos,
'targets': [
{'expr': 'db_remediation_actions_total', 'format': 'table', 'instant': True}
]
}
PagerDuty 和 OpsGenie 集成用于智能警报
智能警报不仅仅是简单的 Webhook 通知。人工智能丰富的警报包括根本原因分析、历史背景、建议的操作手册和置信度评分,为待命工程师提供更快解决问题或确认自动修复已处理问题所需的背景信息。
# intelligent_alerting.py — AI-enriched alerting for PagerDuty and OpsGenie
import requests
import json
from datetime import datetime
class IntelligentAlertManager:
def __init__(self, pagerduty_key=None, opsgenie_key=None):
self.pd_key = pagerduty_key
self.og_key = opsgenie_key
def send_enriched_alert(self, anomaly, ai_analysis):
severity = anomaly.get('severity', 'warning')
pd_severity = {'critical': 'critical', 'warning': 'warning', 'info': 'info'}.get(severity, 'warning')
details = {
'anomaly_score': anomaly.get('score', 0),
'metric': anomaly.get('metric', 'unknown'),
'root_cause': ai_analysis.get('root_cause', 'Under investigation'),
'suggested_actions': ai_analysis.get('actions', []),
'auto_remediation_status': ai_analysis.get('remediation_status', 'pending'),
'similar_incidents': ai_analysis.get('similar_past_incidents', []),
'estimated_impact': ai_analysis.get('impact', 'Unknown'),
'confidence': ai_analysis.get('confidence', 0)
}
if self.pd_key:
self._send_pagerduty(pd_severity, anomaly, details)
if self.og_key:
self._send_opsgenie(severity, anomaly, details)
def _send_pagerduty(self, severity, anomaly, details):
payload = {
'routing_key': self.pd_key,
'event_action': 'trigger',
'payload': {
'summary': f'[AI] Database anomaly: {anomaly["metric"]} (score: {anomaly["score"]})',
'severity': severity,
'source': 'ai-db-monitor',
'component': anomaly.get('db_type', 'database'),
'custom_details': details
}
}
requests.post('https://events.pagerduty.com/v2/enqueue', json=payload)
def _send_opsgenie(self, severity, anomaly, details):
payload = {
'message': f'[AI] Database anomaly: {anomaly["metric"]} (score: {anomaly["score"]})',
'priority': {'critical': 'P1', 'warning': 'P3', 'info': 'P5'}.get(severity, 'P3'),
'details': details,
'tags': ['ai-monitoring', anomaly.get('db_type', 'database')]
}
requests.post(
'https://api.opsgenie.com/v2/alerts',
headers={'Authorization': f'GenieKey {self.og_key}'},
json=payload
)
利用人工智能进行根本原因分析
当检测到异常时,确定根本原因是事件响应中最耗时的步骤。人工智能驱动的根本原因分析将多个信号(指标异常、日志模式、跟踪数据和最近的变化)关联起来,以便在几秒钟而不是几小时内查明可能的原因。
该方法的工作原理是维护系统依赖性和已知故障模式的知识图。当异常发生时,人工智能会遍历图表以识别上游原因。例如,如果 MySQL 上的查询延迟出现峰值,系统会检查:最近是否有部署?连接数有变化吗?是否存在复制滞后?磁盘IOPS是否饱和?是否存在锁争用?每个信号都会对不同根本原因的概率得分做出贡献。
通过 ML 预测进行容量规划
机器学习驱动的容量规划超越了反应性扩展,转向了预测性资源管理。通过分析历史增长模式、季节性周期和计划的业务事件,机器学习模型可以预测数据库何时会达到资源限制。
Prophet 擅长容量预测,因为它可以原生处理缺失数据、趋势变化和季节性模式。使用 90 天的每日存储增长数据对其进行训练,并生成带有置信区间的预测,显示您何时需要配置额外的存储。 LSTM 模型更适合短期容量预测——预测未来 24 小时的连接池利用率,以便在早晨流量高峰之前进行预扩展。
特定于云的 AI 工具
适用于 RDS 的 AWS 开发运营大师
AWS DevOps Guru 为 RDS 实例提供基于 ML 的异常检测。它自动监控 CloudWatch 指标并识别性能异常,并将其与最近的部署或配置更改相关联。集成需要在 RDS 资源上启用 DevOps Guru 并配置 SNS 通知。
适用于 Azure SQL 和 Cosmos DB 的 Azure AI
Azure 为 Azure SQL 数据库提供智能见解,该数据库使用内置的 ML 模型来检测性能回归、阻塞查询和资源限制。 Azure Cosmos DB 包含一个集成的 AI 顾问,用于请求单元优化和分区键选择。
Cloud SQL 和 Firestore 的 GCP 云操作
Google Cloud Operations(以前称为 Stackdriver)为 Cloud SQL 提供智能警报。该系统会学习指标基线,并仅在行为显着偏离学习模式时才生成警报,与静态阈值相比,大大减少了误报。
开源数据质量工具
阿帕奇·格里芬
Apache Griffin 为大规模数据资产提供数据质量测量。当与人工智能监控管道集成时,它可以检测数据质量异常(缺失值、模式漂移、分布变化),这些异常通常先于数据库性能问题出现。
远大的期望
Great Expectations 支持声明性数据验证。通过定义对数据库表的期望(范围内的行数、界限内的列值、引用完整性),您可以创建一个数据质量监控层,AI 模型可以将其用作异常检测的附加信号。
# data_quality_check.py — Great Expectations integration for DB quality monitoring
import great_expectations as gx
def run_database_quality_checks(connection_string, suite_name='db_health'):
context = gx.get_context()
datasource = context.data_sources.add_sql(
name='production_db',
connection_string=connection_string
)
orders_asset = datasource.add_table_asset(name='orders', table_name='orders')
batch = orders_asset.add_batch_definition_whole_table('full_table').get_batch()
suite = context.suites.add(
gx.ExpectationSuite(name=suite_name)
)
suite.add_expectation(
gx.expectations.ExpectTableRowCountToBeBetween(min_value=1000, max_value=10000000)
)
suite.add_expectation(
gx.expectations.ExpectColumnValuesToNotBeNull(column='user_id')
)
suite.add_expectation(
gx.expectations.ExpectColumnValuesToBeUnique(column='order_number')
)
validation_result = batch.validate(suite)
if not validation_result.success:
failed = [r for r in validation_result.results if not r.success]
return {
'status': 'failed',
'failed_checks': len(failed),
'details': [{
'expectation': str(r.expectation_config),
'observed': r.result
} for r in failed]
}
return {'status': 'passed', 'checks_run': len(validation_result.results)}
完整的管道集成示例
以下编排器将所有组件组合在一起,将指标收集、异常检测、LLM 分析、警报和自动修复连接到一个连续管道中,该管道可监视生产环境中的所有数据库引擎。
# pipeline_orchestrator.py — Full AI database monitoring pipeline
import schedule
import time
import logging
from anomaly_detector import DatabaseAnomalyDetector
from auto_remediation import AutoRemediator
from intelligent_alerting import IntelligentAlertManager
from llm_query_optimizer import LLMQueryOptimizer
import json
import os
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class AIDatabasePipeline:
def __init__(self):
self.detector = DatabaseAnomalyDetector(
prometheus_url=os.environ['PROMETHEUS_URL']
)
self.remediator = AutoRemediator(
db_configs={
'mysql': {'host': os.environ['MYSQL_HOST'], 'user': 'monitor', 'password': os.environ['MYSQL_PASS'], 'database': 'production'},
'postgresql': {'host': os.environ['PG_HOST'], 'user': 'monitor', 'password': os.environ['PG_PASS'], 'dbname': 'production'},
'redis': {'host': os.environ['REDIS_HOST'], 'port': 6379}
},
notification_webhook=os.environ.get('SLACK_WEBHOOK')
)
self.alerter = IntelligentAlertManager(
pagerduty_key=os.environ.get('PAGERDUTY_KEY'),
opsgenie_key=os.environ.get('OPSGENIE_KEY')
)
self.optimizer = LLMQueryOptimizer(
api_key=os.environ['OPENAI_API_KEY'],
db_config={'host': os.environ['MYSQL_HOST'], 'user': 'root', 'password': os.environ['MYSQL_PASS'], 'database': 'production'},
db_type='mysql'
)
def run_anomaly_detection_cycle(self):
"""Main detection cycle — runs every minute."""
for db_type in ['mysql', 'postgresql']:
try:
results = self.detector.run_full_analysis(db_type)
logger.info(f'{db_type}: {results["summary"]["total_anomalies"]} anomalies found')
for anomaly in results['anomalies']:
if anomaly['severity'] == 'critical':
ai_analysis = self._analyze_anomaly(anomaly, db_type)
self.alerter.send_enriched_alert(anomaly, ai_analysis)
if ai_analysis.get('confidence', 0) > 0.95:
self._auto_remediate(anomaly, db_type, ai_analysis)
except Exception as e:
logger.error(f'Detection cycle failed for {db_type}: {e}')
def run_query_optimization_cycle(self):
"""Batch query optimization — runs daily."""
try:
results = self.optimizer.batch_optimize('/var/log/mysql/slow.log', top_n=10)
for r in results:
logger.info(f'Query optimized: {r["analysis"].estimated_improvement}')
except Exception as e:
logger.error(f'Query optimization failed: {e}')
def _analyze_anomaly(self, anomaly, db_type):
return {
'root_cause': f'Anomaly in {anomaly["metric"]} for {db_type}',
'confidence': anomaly.get('score', 0.5),
'actions': ['investigate', 'scale_if_needed'],
'remediation_status': 'pending'
}
def _auto_remediate(self, anomaly, db_type, analysis):
metric = anomaly.get('metric', '')
confidence = analysis.get('confidence', 0)
if 'slow_queries' in metric or 'query_latency' in metric:
self.remediator.kill_long_running_queries(db_type=db_type, confidence=confidence)
elif 'connections' in metric:
self.remediator.scale_read_replicas(target_replicas=5, confidence=confidence)
elif 'repl_lag' in metric and confidence > 0.98:
self.remediator.trigger_failover(db_type=db_type, confidence=confidence)
logger.info(f'Auto-remediation executed for {metric} on {db_type}')
def start(self):
logger.info('AI Database Pipeline started')
schedule.every(1).minutes.do(self.run_anomaly_detection_cycle)
schedule.every(1).day.at('02:00').do(self.run_query_optimization_cycle)
while True:
schedule.run_pending()
time.sleep(10)
if __name__ == '__main__':
pipeline = AIDatabasePipeline()
pipeline.start()
跟踪 AI 数据库监控成功的关键指标
| 公制 | 人工智能出现之前 | 人工智能之后 | 改进 |
|---|---|---|---|
| 平均检测时间 (MTTD) | 15–30 分钟 | 30 秒–2 分钟 | 90–95% |
| 平均解决时间 (MTTR) | 45–120 分钟 | 2–5 分钟 | 95%+ |
| 误报率 | 50–70% | 3–8% | 90%+ |
| 自动解决事件 | 0% | 35–50% | 不适用 |
| DBA 每周待命页面 | 40–60 | 5–10 | 80%+ |
| 查询优化时间 | 每次查询 2-4 小时 | 每个查询 5 分钟 | 95%+ |
| 容量规划准确性 | 60%(手动估算) | 90%+(机器学习预测) | 50%+ |
最佳实践和生产注意事项
- 从可观察性开始,然后添加智能。 在部署机器学习模型之前确保全面的指标收集到位。您无法检测未收集的数据中的异常情况。
- 使用置信阈值进行修复。 为故障转移等破坏性操作设置高置信度栏(95% 或以上),为扩展等非破坏性操作设置较低阈值(85%)。
- 保持人为监督。 自动修复应始终记录操作并通知人类。诸如故障转移之类的关键操作应该需要更高的信心或明确的人工批准。
- 定期重新训练模型。 数据库工作负载模式随着应用程序的变化而发展。至少每周重新训练异常检测模型,或实施持续适应的在线学习。
- 首先在分期中测试修复。 在投入生产之前,每个自动修复工作流程都应在具有混沌工程场景的临时环境中进行验证。
- 结合多种机器学习方法。 没有一种算法可以处理所有异常类型。使用结合 Prophet(季节性)、LSTM(顺序)和隔离森林(多元)的集成方法来实现全面覆盖。
- 安全的 LLM 集成。 使用 LLM 进行查询分析时,切勿发送实际数据值 - 仅发送模式元数据和 EXPLAIN 计划。对 AI 工具使用专用的只读数据库凭据。
- 建立反馈循环。 跟踪异常检测的误报率和漏报率。使用有关警报相关性的人工反馈来不断提高模型的准确性。
结论
人工智能驱动的数据库故障排除代表了从被动消防到主动智能操作的根本转变。通过结合时间序列异常检测、LLM 支持的查询优化、预测性警报和自动修复,团队可以实现亚分钟级检测、大幅减少错误警报并显着缩短平均解决时间。关键是逐步构建——从指标收集和仪表板开始,分层异常检测,然后随着对系统信心的增长逐步启用自动修复。无论您是管理 MySQL、PostgreSQL、MongoDB、Redis 还是 Couchbase,AI 驱动的方法都适用,适应每个引擎的独特特征,同时在整个数据层提供统一的可观察性体验。