mcpField
A
azure-resource-manager-mysql-dotnet

azure-resource-manager-mysql-dotnet

github.com/sickn33云与 DevOps48.7k63 次安装今天更新
代码仓库

关于 azure-resource-manager-mysql-dotnet

面向 .NET 开发者的技能,通过 Azure Resource Manager 管理 Azure Database for MySQL Flexible Server。涵盖服务器生命周期与配置,以及数据库、防火墙规则、备份和身份管理。

主要功能

  1. 01创建、列出、扩展和删除服务器
  2. 02管理数据库与防火墙规则
  3. 03读取和更新服务器参数
  4. 04查看备份并配置恢复流程
  5. 05配置 Entra ID 管理员

适用场景

  1. 01部署 MySQL Flexible Server
  2. 02管理数据库访问和服务器设置
  3. 03检查备份并规划恢复
  4. 04闲置时停止开发服务器

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill azure-resource-manager-mysql-dotnet

安装后在 Claude Code 中输入/azure-resource-manager-mysql-dotnet确认已加载。

详细介绍

Azure.ResourceManager.MySql(.NET)

用于管理 MySQL 灵活服务器部署的 Azure Resource Manager SDK。

安装

dotnet add package Azure.ResourceManager.MySql
dotnet add package Azure.Identity

历史示例基线:v1.2.0;请确认当前兼容的包和类型 API 版本:2023-12-30

注意:此技能专注于 MySQL 灵活服务器。单一服务器已退役;请使用当前的灵活服务器迁移指南。

环境变量

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

身份验证

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.MySql;
using Azure.ResourceManager.MySql.FlexibleServers;

ArmClient client = new ArmClient(new DefaultAzureCredential());

资源层级结构

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

核心工作流

1. 创建 MySQL 灵活服务器
using System;
using Azure.ResourceManager.MySql.FlexibleServers;
using Azure.ResourceManager.MySql.FlexibleServers.Models;

using Azure.ResourceManager.Resources;
using Azure.Core;
using Azure;

var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID")
    ?? throw new InvalidOperationException("AZURE_SUBSCRIPTION_ID is required");
var subscription = client.GetSubscriptionResource(new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
ResourceGroupResource resourceGroup = (await subscription.GetResourceGroupAsync("my-resource-group")).Value;

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}");
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}");
3. 配置防火墙规则
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);
4. 更新服务器配置
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" };
5. 配置 Entra ID 管理员
MySqlFlexibleServerAadAdministratorCollection admins = server.GetMySqlFlexibleServerAadAdministrators();

MySqlFlexibleServerAadAdministratorData adminData = new MySqlFlexibleServerAadAdministratorData
{
    AdministratorType = MySqlFlexibleServerAdministratorType.ActiveDirectory,
    Login = "[email protected]",
    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);
6. 列出和管理服务器
// List servers in resource group
await foreach (MySqlFlexibleServerResource server in resourceGroup.GetMySqlFlexibleServers().GetAllAsync())
{
    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().GetAllAsync())
{
    Console.WriteLine($"Database: {db.Data.Name}");
}
7. 备份和还原
// List available backups
await foreach (MySqlFlexibleServerBackupResource backup in server.GetMySqlFlexibleServerBackups().GetAllAsync())
{
    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);
8. 停止和启动服务器
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
});
9. 更新服务器(扩展)
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);
10. 删除服务器
MySqlFlexibleServerResource server = await resourceGroup
    .GetMySqlFlexibleServerAsync("my-mysql-server");

await server.DeleteAsync(WaitUntil.Completed);

关键类型参考

类型用途
MySqlFlexibleServerResource灵活服务器实例
MySqlFlexibleServerData服务器配置数据
MySqlFlexibleServerCollection服务器集合
MySqlFlexibleServerDatabaseResource服务器中的数据库
MySqlFlexibleServerFirewallRuleResourceIP 防火墙规则
MySqlFlexibleServerConfigurationResource服务器参数
MySqlFlexibleServerBackupResource备份元数据
MySqlFlexibleServerAadAdministratorResourceEntra ID 管理员
MySqlFlexibleServerSkuSKU(计算层级和大小)
MySqlFlexibleServerStorage存储配置
MySqlFlexibleServerHighAvailability高可用性配置
MySqlFlexibleServerBackupProperties备份设置

SKU 层级

层级使用场景SKU 示例
Burstable开发/测试、轻负载Standard_B1ms、Standard_B2s
GeneralPurpose生产工作负载Standard_D2ds_v4、Standard_D4ds_v4
MemoryOptimized高内存需求Standard_E2ds_v4、Standard_E4ds_v4

高可用性模式

模式说明
Disabled无高可用性(单服务器)
SameZone在同一可用性区域内实现高可用性
ZoneRedundant跨可用性区域实现高可用性

最佳实践

  1. 使用灵活服务器 — 单一服务器已弃用
  2. 启用区域冗余高可用性 — 适用于生产工作负载
  3. 使用 DefaultAzureCredential — 优先于连接字符串
  4. 配置 Entra ID 身份验证 — 比 SQL 身份验证更安全
  5. 启用存储自动增长 — 防止空间不足问题
  6. 设置适当的备份保留期 — 根据合规要求设置为 7-35 天
  7. 使用专用终结点 — 确保网络访问安全
  8. 调整服务器参数 — 根据工作负载特征进行调整
  9. 使用 Azure Monitor 进行监视 — 启用指标和日志
  10. 停止开发/测试服务器 — 不使用时节省成本

错误处理

using Azure;

try
{
    ArmOperation<MySqlFlexibleServerResource> operation = await servers
        .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql", data);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
    Console.WriteLine("Conflict; inspect provider code and current operation state");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
    Console.WriteLine($"Invalid configuration: {ex.Message}");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"Azure error: {ex.Status} - {ex.Message}");
}

连接字符串

创建服务器后,使用以下方式连接:

// ADO.NET connection string
string connectionString = $"Server={server.Data.FullyQualifiedDomainName};" +
    "Database=myappdb;" +
    "User Id=mysqladmin;" +
     $"Password={Environment.GetEnvironmentVariable("MYSQL_ADMIN_PASSWORD")};" +
    "SslMode=VerifyFull;";

// 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 [email protected];" +
    $"Password={token.Token};" +
    "SslMode=VerifyFull;";

相关 SDK

SDK用途安装
Azure.ResourceManager.MySqlMySQL 管理(此 SDK)dotnet add package Azure.ResourceManager.MySql
Azure.ResourceManager.PostgreSqlPostgreSQL 管理dotnet add package Azure.ResourceManager.PostgreSql
MySqlConnectorMySQL 数据访问dotnet add package MySqlConnector

参考链接

资源URL
NuGet 包https://www.nuget.org/packages/Azure.ResourceManager.MySql
API 参考https://learn.microsoft.com/dotnet/api/azure.resourcemanager.mysql
产品文档https://learn.microsoft.com/azure/mysql/flexible-server/
GitHub 源码https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/mysql/Azure.ResourceManager.MySql

适用场景

此技能适用于执行概述中描述的工作流或操作。

限制

  • 仅当任务明确符合上述范围时,才使用此技能。
  • 不要将输出视为环境特定验证、测试或专家审查的替代品。
  • 如果缺少必要的输入、权限、安全边界或成功标准,请停止并请求澄清。

这些都是彼此独立的历史片段,并非编译后的部署模板。请验证生成的类型、SKU、区域和 API 版本,补上遗漏的导入,并使用连接器连接字符串构建器正确转义密码或令牌。请在建立新的池化连接时刷新 Entra 令牌,不要重复使用已过期的令牌。管理凭据不会自动授予数据库登录权限。公共防火墙规则必须使用实际的公共出口地址;10.x 网段并不能建立专用网络。0.0.0.0 Azure 服务规则的适用范围覆盖多个 Azure 租户,必须明确限定范围。停止服务后仍可能产生存储费用,并可能在服务限制范围内自动重启。还原操作会创建新的终结点;扩缩或重启可能会中断服务,而自动增长并不保证容量。删除操作必须明确目标和备份恢复范围。

评论

支持 Markdown