You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python SDK获取Azure数据库CPU利用率并判断空闲状态

Azure数据库空闲检测与自动停止实现方案

核心逻辑

和你提供的Azure VM监控逻辑一致,我们通过Azure Monitor获取数据库关键运行指标判断是否空闲,再调用Azure管理API执行停止操作。以下是针对Azure SQL数据库(最常见场景)的实现步骤与代码:

步骤1:调整资源ID格式

Azure数据库的资源ID结构和VM不同,以Azure SQL数据库为例,格式如下:

resource_id = (
    "subscriptions/{}/"
    "resourceGroups/{}/"
    "providers/Microsoft.Sql/servers/{}/"
    "databases/{}"
).format(subscription_id, resource_group_name, sql_server_name, db_name)

如果是其他类型数据库(如Azure Database for MySQL/PostgreSQL),替换对应的providers路径即可,比如MySQL的是Microsoft.DBforMySQL/servers/{}/databases/{}。

步骤2:选择空闲判断指标

不同数据库类型的监控指标略有差异,推荐以下核心指标判断空闲:

  • Azure SQL数据库:cpu_percent(CPU使用率)、connection_successful(成功连接数)、dtu_consumption_percent(DTU使用率,仅DTU模式)、log_write_bytes(日志写入量)
  • Azure MySQL/PostgreSQL:cpu_percent、connections、storage_read/storage_write

你可以先通过以下代码列出当前数据库的所有可用指标,确认需要的指标名称:

# 列出数据库的所有监控指标
for metric in client.metric_definitions.list(resource_id):
    print("{}: id={}, unit={}".format(
        metric.name.localized_value,
        metric.name.value,
        metric.unit
    ))

步骤3:获取监控数据并判断空闲

以下代码实现获取最近24小时的CPU使用率和连接数,判断是否连续6小时处于低负载(CPU<5%且无连接):

import datetime
from azure.mgmt.monitor import MonitorManagementClient
from azure.mgmt.sql import SqlManagementClient
from azure.identity import DefaultAzureCredential

# 配置参数
subscription_id = "your-sub-id"
resource_group_name = "your-rg-name"
sql_server_name = "your-sql-server"
db_name = "your-db-name"

# 初始化客户端
credential = DefaultAzureCredential()
monitor_client = MonitorManagementClient(credential, subscription_id)
sql_client = SqlManagementClient(credential, subscription_id)

# 构建数据库资源ID
resource_id = (
    "subscriptions/{}/"
    "resourceGroups/{}/"
    "providers/Microsoft.Sql/servers/{}/"
    "databases/{}"
).format(subscription_id, resource_group_name, sql_server_name, db_name)

# 设置时间范围:最近24小时
end_time = datetime.datetime.now(datetime.timezone.utc)
start_time = end_time - datetime.timedelta(hours=24)
timespan = f"{start_time.isoformat()}/{end_time.isoformat()}"

# 获取CPU使用率(每小时聚合)
cpu_metrics = monitor_client.metrics.list(
    resource_id,
    timespan=timespan,
    interval='PT1H',
    metric='cpu_percent',
    aggregation='Average'
)

# 获取成功连接数(每小时聚合)
conn_metrics = monitor_client.metrics.list(
    resource_id,
    timespan=timespan,
    interval='PT1H',
    metric='connection_successful',
    aggregation='Total'
)

# 整理指标数据
cpu_data = []
for item in cpu_metrics.value:
    for timeserie in item.timeseries:
        for data in timeserie.data:
            cpu_data.append(data.average or 0)

conn_data = []
for item in conn_metrics.value:
    for timeserie in item.timeseries:
        for data in timeserie.data:
            conn_data.append(data.total or 0)

# 判断空闲:连续6小时CPU<5%且连接数为0
is_idle = False
if len(cpu_data) >=6 and len(conn_data)>=6:
    recent_cpu = cpu_data[-6:]
    recent_conn = conn_data[-6:]
    if all(cpu <5 for cpu in recent_cpu) and all(conn ==0 for conn in recent_conn):
        is_idle = True

# 如果空闲,停止数据库
if is_idle:
    print("数据库处于空闲状态,执行停止操作...")
    sql_client.databases.begin_pause(
        resource_group_name=resource_group_name,
        server_name=sql_server_name,
        database_name=db_name
    ).result()
    print("数据库已成功停止")
else:
    print("数据库未处于空闲状态")

关键注意事项

  • 权限配置:执行代码的身份需要具备SQL DB Contributor或更高权限,才能读取监控指标和停止数据库。
  • 数据库类型差异:如果是MySQL/PostgreSQL,需要替换对应的管理客户端(如azure.mgmt.rdbms.mysql)和停止方法(如begin_stop)。
  • 停止限制:并非所有Azure数据库都支持停止操作,比如弹性池中的SQL数据库无法单独停止,需停止整个弹性池;部分数据库类型(如Azure Cosmos DB)没有停止功能,只能通过调整吞吐量节省成本。
  • 阈值调整:根据你的业务场景调整空闲判断的阈值(如CPU阈值、连续低负载时长),避免误停止正在运行的数据库。

内容的提问来源于stack exchange,提问作者Rohit Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:30:48