☰
使用 Azure.ResourceManager.MySql .NET SDK 全生命周期管理 MySQL Flexible Server:从部署到运维实战指南
2026/10/21 11:26:03 网站建设 项目流程
  • AI 技能
  • AI 插件
  • 人工智能

【免费下载链接】agentic-awesome-skills

AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.

项目地址:https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills
点击查看免费下载

导读

本文以 AAS(agentic-awesome-skills)仓库中收录的社区技能 azure-resource-manager-mysql-dotnet/SKILL.md 为主体,系统讲解如何基于官方管理 SDKAzure.ResourceManager.MySql(GA 版本 v1.2.0,API 版本 2023-12-30)对 Azure MySQL Flexible Server 完成从创建、配置、备份恢复到启停、扩缩容、删除的全生命周期管理。读完本文,你将掌握 10 个可直接落地的 C# 工作流、关键资源类型与枚举取值,以及生产环境下的安全与运维最佳实践。该技能在仓库目录 data/catalog.json 中被归类为cloud类别、critical风险等级,其触发词覆盖azure、mysql、flexible server、dotnet、deployments等,适合 Agent 在收到相关 Azure MySQL 管理任务时自动加载使用。

技能概览与适用边界

该技能的核心定位是:面向 .NET 开发者的 MySQL Flexible Server 管理 SDK 使用指南。它聚焦于“控制面”(control plane)操作——即通过 Azure Resource Manager(ARM)API 管理服务器资源本身,而非通过MySqlConnector等驱动执行 SQL 数据操作(后者属于数据面)。

以下几点决定了本文的适用前提:

  • 技能name为azure-resource-manager-mysql-dotnet,source为community,risk为critical(管理类操作涉及生产资源变更,需谨慎);
  • 技能明确提示:Single Server(单服务器)已弃用并计划退役,本文所有示例均基于 Flexible Server;
  • 技能自身的 “Limitations” 部分要求:仅在与上述范围匹配时使用,输出不能替代环境特定的验证、测试与专家评审,若缺少输入、权限、安全边界或成功标准时应停止并请求澄清。

安装与环境准备

安装 NuGet 包

在 .NET 项目中通过 dotnet CLI 安装管理 SDK 与身份认证库:

dotnet add package Azure.ResourceManager.MySql dotnet add package Azure.Identity
  • Azure.ResourceManager.MySql:提供 MySQL Flexible Server 的 ARM 管理类型(服务器、数据库、防火墙规则、配置、备份、Entra ID 管理员等);
  • Azure.Identity:提供DefaultAzureCredential等凭据类型,用于与 ARM 控制面进行免密钥认证。

技能标注的版本信息为:SDK 当前版本 v1.2.0(GA),API 版本 2023-12-30。这两个版本号是技能编写时点的事实,实际使用时请以 NuGet 上获取到的包版本为准。

环境变量

技能约定以下环境变量作为脚本化运维的最小输入集合:

AZURE_SUBSCRIPTION_ID=<your-subscription-id> AZURE_RESOURCE_GROUP=<your-resource-group> AZURE_MYSQL_SERVER_NAME=<your-mysql-server>

将它们注入 CI/CD 或本地 shell 环境,可避免在代码中硬编码订阅与资源组标识。此外,创建服务器时还需要管理员密码,示例代码约定从MYSQL_ADMIN_PASSWORD环境变量读取(见下文创建工作流)。

初始化客户端与认证

ARM SDK 的统一入口是ArmClient,配合DefaultAzureCredential自动完成从环境变量、Azure CLI 登录态、托管身份等多渠道的凭据解析:

using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.MySql; using Azure.ResourceManager.MySql.FlexibleServers; ArmClient client = new ArmClient(new DefaultAzureCredential());

资源层级模型

理解资源层级是正确使用 SDK 的前提。MySQL Flexible Server 的资源树如下:

Subscription └── ResourceGroup └── MySqlFlexibleServer # MySQL Flexible Server instance ├── MySqlFlexibleServerDatabase # Database within the server ├── MySqlFlexibleServerFirewallRule # IP firewall rules ├── MySqlFlexibleServerConfiguration # Server parameters ├── MySqlFlexibleServerBackup # Backup information ├── MySqlFlexibleServerMaintenanceWindow # Maintenance schedule └── MySqlFlexibleServerAadAdministrator # Entra ID admin

从源码结构看,SDK 遵循 ARM 客户端库的统一“资源集合(Collection)→ 子资源(Resource)”模式:ResourceGroupResource通过GetMySqlFlexibleServers()得到服务器集合,MySqlFlexibleServerResource再通过各自的Get...()方法下钻到数据库、防火墙规则、配置、备份与管理员等子资源。下文每个工作流都将沿着这条层级逐级操作。

核心工作流:10 个实战场景

1. 创建 MySQL Flexible Server

创建服务器需要先拿到资源组,再通过服务器集合发起CreateOrUpdateAsync。完整示例:

using System; using Azure.ResourceManager.MySql.FlexibleServers; using Azure.ResourceManager.MySql.FlexibleServers.Models; ResourceGroupResource resourceGroup = await client .GetDefaultSubscriptionAsync() .Result .GetResourceGroupAsync("my-resource-group"); MySqlFlexibleServerCollection servers = resourceGroup.GetMySqlFlexibleServers(); MySqlFlexibleServerData data = new MySqlFlexibleServerData(AzureLocation.EastUS) { Sku = new MySqlFlexibleServerSku("Standard_D2ds_v4", MySqlFlexibleServerSkuTier.GeneralPurpose), AdministratorLogin = "mysqladmin", AdministratorLoginPassword = Environment.GetEnvironmentVariable("MYSQL_ADMIN_PASSWORD") ?? throw new InvalidOperationException("MYSQL_ADMIN_PASSWORD is required"), Version = MySqlFlexibleServerVersion.Ver8_0_21, Storage = new MySqlFlexibleServerStorage { StorageSizeInGB = 128, AutoGrow = MySqlFlexibleServerEnableStatusEnum.Enabled, Iops = 3000 }, Backup = new MySqlFlexibleServerBackupProperties { BackupRetentionDays = 7, GeoRedundantBackup = MySqlFlexibleServerEnableStatusEnum.Disabled }, HighAvailability = new MySqlFlexibleServerHighAvailability { Mode = MySqlFlexibleServerHighAvailabilityMode.ZoneRedundant, StandbyAvailabilityZone = "2" }, AvailabilityZone = "1" }; ArmOperation<MySqlFlexibleServerResource> operation = await servers .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql-server", data); MySqlFlexibleServerResource server = operation.Value; Console.WriteLine($"Server created: {server.Data.FullyQualifiedDomainName}");

关键参数说明:

配置块字段含义与建议
SkuName/Tier计算规格名与层级,如Standard_D2ds_v4+GeneralPurpose
VersionVer8_0_21选择 8.0.21 版本(技能示例值),可按需选其他受支持版本
StorageStorageSizeInGB/AutoGrow/Iops存储容量(GB)、自动增长开关、预置 IOPS
BackupBackupRetentionDays/GeoRedundantBackup备份保留天数与异地冗余开关
HighAvailabilityMode/StandbyAvailabilityZoneHA 模式与备用可用区
AvailabilityZone—主服务器所在可用区

WaitUntil.Completed表示等待长时操作完成(ARM 客户端库的标准语义);operation.Value即创建完成后的MySqlFlexibleServerResource,可直接读取Data.FullyQualifiedDomainName得到服务器 FQDN,用于后续连接。

2. 在服务器内创建数据库

MySqlFlexibleServerResource server = await resourceGroup .GetMySqlFlexibleServerAsync("my-mysql-server"); MySqlFlexibleServerDatabaseCollection databases = server.GetMySqlFlexibleServerDatabases(); MySqlFlexibleServerDatabaseData dbData = new MySqlFlexibleServerDatabaseData { Charset = "utf8mb4", Collation = "utf8mb4_unicode_ci" }; ArmOperation<MySqlFlexibleServerDatabaseResource> operation = await databases .CreateOrUpdateAsync(WaitUntil.Completed, "myappdb", dbData); MySqlFlexibleServerDatabaseResource database = operation.Value; Console.WriteLine($"Database created: {database.Data.Name}");

示例使用utf8mb4字符集与utf8mb4_unicode_ci排序规则,这是面向多语言/emoji 存储的推荐组合;实际业务可依据表结构需要调整。

3. 配置防火墙规则

防火墙规则用于控制哪些 IP 可以访问服务器。两种典型场景:允许内部 IP 段、允许 Azure 服务访问。

MySqlFlexibleServerFirewallRuleCollection firewallRules = server.GetMySqlFlexibleServerFirewallRules(); // Allow specific IP range MySqlFlexibleServerFirewallRuleData ruleData = new MySqlFlexibleServerFirewallRuleData { StartIPAddress = System.Net.IPAddress.Parse("10.0.0.1"), EndIPAddress = System.Net.IPAddress.Parse("10.0.0.255") }; ArmOperation<MySqlFlexibleServerFirewallRuleResource> operation = await firewallRules .CreateOrUpdateAsync(WaitUntil.Completed, "allow-internal", ruleData); // Allow Azure services MySqlFlexibleServerFirewallRuleData azureServicesRule = new MySqlFlexibleServerFirewallRuleData { StartIPAddress = System.Net.IPAddress.Parse("0.0.0.0"), EndIPAddress = System.Net.IPAddress.Parse("0.0.0.0") }; await firewallRules.CreateOrUpdateAsync(WaitUntil.Completed, "AllowAllAzureServicesAndResourcesWithinAzureIps", azureServicesRule);

注意:第二条规则使用0.0.0.0–0.0.0.0区间,是 Azure 官方“允许 Azure 服务与资源访问”的约定表示法。它范围较宽,生产环境更推荐使用私有终结点(private endpoints)替代开放公网访问。

4. 更新服务器参数(Configuration)

服务器参数(如max_connections)可通过配置集合读写:

MySqlFlexibleServerConfigurationCollection configurations = server.GetMySqlFlexibleServerConfigurations(); // Get current configuration MySqlFlexibleServerConfigurationResource config = await configurations .GetAsync("max_connections"); // Update configuration MySqlFlexibleServerConfigurationData configData = new MySqlFlexibleServerConfigurationData { Value = "500", Source = MySqlFlexibleServerConfigurationSource.UserOverride }; ArmOperation<MySqlFlexibleServerConfigurationResource> operation = await configurations .CreateOrUpdateAsync(WaitUntil.Completed, "max_connections", configData); // Common configurations to tune string[] commonParams = { "max_connections", "innodb_buffer_pool_size", "slow_query_log", "long_query_time" };

技能给出的常用调优参数集包括:max_connections(最大连接数)、innodb_buffer_pool_size(InnoDB 缓冲池)、slow_query_log(慢查询日志开关)、long_query_time(慢查询阈值秒数)。Source置为UserOverride表示该值为用户显式覆盖,而非继承默认值。

5. 配置 Entra ID(Azure AD)管理员

使用 Microsoft Entra ID(原 Azure Active Directory)认证替代 SQL 口令认证,可增强安全性与集中管理能力:

MySqlFlexibleServerAadAdministratorCollection admins = server.GetMySqlFlexibleServerAadAdministrators(); MySqlFlexibleServerAadAdministratorData adminData = new MySqlFlexibleServerAadAdministratorData { AdministratorType = MySqlFlexibleServerAdministratorType.ActiveDirectory, Login = "aad-admin@contoso.com", Sid = Guid.Parse("<entra-object-id>"), TenantId = Guid.Parse("<tenant-id>"), IdentityResourceId = new ResourceIdentifier("/subscriptions/.../userAssignedIdentities/mysql-identity") }; ArmOperation<MySqlFlexibleServerAadAdministratorResource> operation = await admins .CreateOrUpdateAsync(WaitUntil.Completed, "ActiveDirectory", adminData);

需要把<entra-object-id>、<tenant-id>以及IdentityResourceId中的用户分配托管身份路径替换为实际值;IdentityResourceId指向用于认证托管的用户分配标识(User Assigned Identity)。

6. 列出并管理服务器与数据库

枚举是运维脚本的高频操作,ARM SDK 通过await foreach支持异步流式遍历:

// List servers in resource group await foreach (MySqlFlexibleServerResource server in resourceGroup.GetMySqlFlexibleServers()) { Console.WriteLine($"Server: {server.Data.Name}"); Console.WriteLine($" FQDN: {server.Data.FullyQualifiedDomainName}"); Console.WriteLine($" Version: {server.Data.Version}"); Console.WriteLine($" State: {server.Data.State}"); Console.WriteLine($" SKU: {server.Data.Sku.Name} ({server.Data.Sku.Tier})"); } // List databases in server await foreach (MySqlFlexibleServerDatabaseResource db in server.GetMySqlFlexibleServerDatabases()) { Console.WriteLine($"Database: {db.Data.Name}"); }

server.Data.State可反映服务器运行状态(如 Ready/Stopped 等),Data.Sku可直接读取当前规格与层级,便于做容量盘点。

7. 备份与时间点还原(PITR)

先枚举现有备份,再通过PointInTimeRestore创建模式完成还原:

// List available backups await foreach (MySqlFlexibleServerBackupResource backup in server.GetMySqlFlexibleServerBackups()) { Console.WriteLine($"Backup: {backup.Data.Name}"); Console.WriteLine($" Type: {backup.Data.BackupType}"); Console.WriteLine($" Completed: {backup.Data.CompletedOn}"); } // Point-in-time restore MySqlFlexibleServerData restoreData = new MySqlFlexibleServerData(AzureLocation.EastUS) { CreateMode = MySqlFlexibleServerCreateMode.PointInTimeRestore, SourceServerResourceId = server.Id, RestorePointInTime = DateTimeOffset.UtcNow.AddHours(-2) }; ArmOperation<MySqlFlexibleServerResource> operation = await servers .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql-restored", restoreData);

还原的关键语义:CreateMode = PointInTimeRestore+SourceServerResourceId(源服务器 ARM ID)+RestorePointInTime(还原时间点)。示例将还原点设为“当前时间前 2 小时”,可用于误删数据后的恢复演练。

8. 停止 / 启动 / 重启服务器

Flexible Server 支持按需停止以节省非高峰期的计算成本:

MySqlFlexibleServerResource server = await resourceGroup .GetMySqlFlexibleServerAsync("my-mysql-server"); // Stop server (saves costs when not in use) await server.StopAsync(WaitUntil.Completed); // Start server await server.StartAsync(WaitUntil.Completed); // Restart server await server.RestartAsync(WaitUntil.Completed, new MySqlFlexibleServerRestartParameter { RestartWithFailover = MySqlFlexibleServerEnableStatusEnum.Enabled, MaxFailoverSeconds = 60 });

重启时可通过MySqlFlexibleServerRestartParameter控制是否带故障转移重启(RestartWithFailover)与最大故障转移等待秒数(MaxFailoverSeconds),这对 HA 部署下的计划维护很有用。

9. 更新服务器(垂直扩缩容)

通过UpdateAsync提交补丁(Patch),可调整 SKU 与存储:

MySqlFlexibleServerResource server = await resourceGroup .GetMySqlFlexibleServerAsync("my-mysql-server"); MySqlFlexibleServerPatch patch = new MySqlFlexibleServerPatch { Sku = new MySqlFlexibleServerSku("Standard_D4ds_v4", MySqlFlexibleServerSkuTier.GeneralPurpose), Storage = new MySqlFlexibleServerStorage { StorageSizeInGB = 256, Iops = 6000 } }; ArmOperation<MySqlFlexibleServerResource> operation = await server .UpdateAsync(WaitUntil.Completed, patch);

示例把计算规格从Standard_D2ds_v4提升到Standard_D4ds_v4,同时将存储扩容到 256GB、IOPS 提升到 6000。请注意:MySQL Flexible Server 的存储容量通常只支持扩容、不支持缩容,变更前应结合计费与容量规划确认。

10. 删除服务器

MySqlFlexibleServerResource server = await resourceGroup .GetMySqlFlexibleServerAsync("my-mysql-server"); await server.DeleteAsync(WaitUntil.Completed);

删除为不可逆操作,生产环境建议在脚本中先做备份确认与二次确认(如传入--yes风格的人工确认标志),再执行删除。

关键类型速查表

TypePurpose
MySqlFlexibleServerResourceFlexible Server instance
MySqlFlexibleServerDataServer configuration data
MySqlFlexibleServerCollectionCollection of servers
MySqlFlexibleServerDatabaseResourceDatabase within server
MySqlFlexibleServerFirewallRuleResourceIP firewall rule
MySqlFlexibleServerConfigurationResourceServer parameter
MySqlFlexibleServerBackupResourceBackup metadata
MySqlFlexibleServerAadAdministratorResourceEntra ID admin
MySqlFlexibleServerSkuSKU (compute tier + size)
MySqlFlexibleServerStorageStorage configuration
MySqlFlexibleServerHighAvailabilityHA configuration
MySqlFlexibleServerBackupPropertiesBackup settings

这套命名遵循 ARM SDK 的{Resource}Resource(实例)/{Resource}Collection(集合)/{Resource}Data(数据负载)三层惯例,理解该惯例后,遇到新子资源(如MaintenanceWindow)也能快速上手。

SKU 层级选择

TierUse CaseSKU Examples
BurstableDev/test, light workloadsStandard_B1ms, Standard_B2s
GeneralPurposeProduction workloadsStandard_D2ds_v4, Standard_D4ds_v4
MemoryOptimizedHigh memory requirementsStandard_E2ds_v4, Standard_E4ds_v4
  • Burstable:适合开发测试与突发型轻负载,成本低但算力峰值有限;
  • GeneralPurpose:生产工作负载的默认选择,计算/内存均衡;
  • MemoryOptimized:适合高内存需求(如大 InnoDB 缓冲池、复杂分析查询)场景。

高可用(HA)模式

ModeDescription
DisabledNo HA (single server)
SameZoneHA within same availability zone
ZoneRedundantHA across availability zones

ZoneRedundant将备用副本部署到不同可用区,可抵御单可用区故障;生产环境建议开启。启用 HA 后,服务器会在主备之间同步数据并提供故障转移能力(见工作流 8 的RestartWithFailover参数)。

最佳实践清单

技能给出的 10 条最佳实践可归纳为四个维度:

版本与形态

  1. Use Flexible Server— Single Server 已弃用,新部署一律选择 Flexible Server;
  2. Enable zone-redundant HA— 生产工作负载开启跨可用区 HA。

认证与安全3.Use DefaultAzureCredential— 优先于连接字符串中的明文口令,利用托管身份/CLI 登录态; 4.Configure Entra ID authentication— 比 SQL 认证更安全,支持集中式身份生命周期管理; 7.Use private endpoints— 通过私有终结点实现安全网络访问,避免暴露公网。

存储与备份5.Enable auto-grow storage— 防止存储写满导致服务中断; 6.Set appropriate backup retention— 依据合规要求设置 7–35 天备份保留。

运维与监控8.Tune server parameters— 根据工作负载特征调整服务器参数; 9.Monitor with Azure Monitor— 开启指标与日志采集; 10.Stop dev/test servers— 空闲的开发/测试服务器及时停止以节省成本。

错误处理模式

ARM SDK 的失败操作统一抛出Azure.RequestFailedException,可按 HTTP 状态码做分支处理:

using Azure; try { ArmOperation<MySqlFlexibleServerResource> operation = await servers .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql", data); } catch (RequestFailedException ex) when (ex.Status == 409) { Console.WriteLine("Server already exists"); } catch (RequestFailedException ex) when (ex.Status == 400) { Console.WriteLine($"Invalid configuration: {ex.Message}"); } catch (RequestFailedException ex) { Console.WriteLine($"Azure error: {ex.Status} - {ex.Message}"); }

典型状态码语义:409 Conflict表示同名资源已存在(幂等场景可直接视为成功);400 Bad Request表示配置非法(如 SKU 不适用、参数越界);其余状态码按ex.Status与ex.Message记录并告警。

连接字符串与数据面访问

创建服务器后,应用侧通过 ADO.NET 连接字符串访问数据库(注意区分:本文管理的“控制面”资源,连接则属于“数据面”):

// ADO.NET connection string string connectionString = $"Server={server.Data.FullyQualifiedDomainName};" + "Database=myappdb;" + "User Id=mysqladmin;" + "Password=YourSecurePassword123!;" + "SslMode=Required;"; // With Entra ID token (recommended) var credential = new DefaultAzureCredential(); var token = await credential.GetTokenAsync( new TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" })); string connectionString = $"Server={server.Data.FullyQualifiedDomainName};" + "Database=myappdb;" + $"User Id=aad-admin@contoso.com;" + $"Password={token.Token};" + "SslMode=Required;";

两种方式的要点:

  • 通用连接串包含SslMode=Required,强制 TLS 加密连接;
  • Entra ID 令牌方案先从DefaultAzureCredential获取https://ossrdbms-aad.database.windows.net/.default作用域的访问令牌,将其作为密码注入连接串,实现无明文口令的数据库登录。

相关 SDK 生态

MySQL 管理 SDK 只是 Azure 数据库管理家族的一员,仓库中还存在多个同类技能的对照实现,例如:

SDKPurposeInstall
Azure.ResourceManager.MySqlMySQL management (this SDK)dotnet add package Azure.ResourceManager.MySql
Azure.ResourceManager.PostgreSqlPostgreSQL managementdotnet add package Azure.ResourceManager.PostgreSql
MySqlConnectorMySQL data accessdotnet add package MySqlConnector
  • Azure.ResourceManager.PostgreSql:PostgreSQL 管理,仓库对应技能位于 azure-resource-manager-postgresql-dotnet/SKILL.md,API 形态与本技能高度一致,可触类旁通;
  • MySqlConnector:高性能 MySQL 数据访问驱动,用于连接串建立后的 SQL 读写,与本技能互补。

在 AAS 仓库内,与本文技能同属azure-resource-manager-*-dotnet系列的还有 Cosmos DB、SQL、Redis、Playwright 与 DurableTask 等管理技能,可在plugins/agentic-awesome-skills-claude/skills/目录下按前缀检索对照。

何时使用本技能

本技能适用于执行与其概览描述一致的工作流或动作,典型触发场景包括:

  • 在 .NET 项目中需要以代码方式创建、更新或删除 Azure MySQL Flexible Server 及其数据库;
  • 需要将 MySQL 部署、备份、扩缩容等运维动作纳入 CI/CD 或 Agent 自动化流水线;
  • 需要为应用配置 Entra ID 认证、防火墙与高可用等安全/可靠性能力。

限制与注意项

  • 仅当任务明确匹配上述范围时使用本技能,不要扩展到其他 Azure 服务或 SQL 数据操作;
  • 本技能的示例代码与参数取值(版本号、SKU、API 版本)以技能编写时的 SDK 为准,使用前请对照当前 NuGet 包版本与 Azure 官方文档核对;
  • 不要将技能输出视为环境特定验证、测试或专家评审的替代品;
  • 当缺少必要输入、权限、安全边界或成功标准时,应停止执行并向用户请求澄清。
  • AI 技能
  • AI 插件
  • 人工智能

【免费下载链接】agentic-awesome-skills

AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.

项目地址:https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills
点击查看免费下载
上一篇:CANN ops-nn 负对数似然损失反向算子 aclnnNLLLoss2dBackward 调用指南
下一篇:CodePilot 图片生成技能(image-generation Skill):基于 Nano Banana Pro 的结构化图像生成指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询