|
Add this skill
npx mdskills install sickn33/azure-resource-manager-mysql-dotnetComprehensive Azure MySQL SDK documentation with excellent code examples and clear workflows
1---2name: azure-resource-manager-mysql-dotnet3description: |4 Azure MySQL Flexible Server SDK for .NET. Database management for MySQL Flexible Server deployments. Use for creating servers, databases, firewall rules, configurations, backups, and high availability. Triggers: "MySQL", "MySqlFlexibleServer", "MySQL Flexible Server", "Azure Database for MySQL", "MySQL database management", "MySQL firewall", "MySQL backup".5package: Azure.ResourceManager.MySql6---78# Azure.ResourceManager.MySql (.NET)910Azure Resource Manager SDK for managing MySQL Flexible Server deployments.1112## Installation1314```bash15dotnet add package Azure.ResourceManager.MySql16dotnet add package Azure.Identity17```1819**Current Version**: v1.2.0 (GA)20**API Version**: 2023-12-302122> **Note**: This skill focuses on MySQL Flexible Server. Single Server is deprecated and scheduled for retirement.2324## Environment Variables2526```bash27AZURE_SUBSCRIPTION_ID=<your-subscription-id>28AZURE_RESOURCE_GROUP=<your-resource-group>29AZURE_MYSQL_SERVER_NAME=<your-mysql-server>30```3132## Authentication3334```csharp35using Azure.Identity;36using Azure.ResourceManager;37using Azure.ResourceManager.MySql;38using Azure.ResourceManager.MySql.FlexibleServers;3940ArmClient client = new ArmClient(new DefaultAzureCredential());41```4243## Resource Hierarchy4445```46Subscription47└── ResourceGroup48 └── MySqlFlexibleServer # MySQL Flexible Server instance49 ├── MySqlFlexibleServerDatabase # Database within the server50 ├── MySqlFlexibleServerFirewallRule # IP firewall rules51 ├── MySqlFlexibleServerConfiguration # Server parameters52 ├── MySqlFlexibleServerBackup # Backup information53 ├── MySqlFlexibleServerMaintenanceWindow # Maintenance schedule54 └── MySqlFlexibleServerAadAdministrator # Entra ID admin55```5657## Core Workflows5859### 1. Create MySQL Flexible Server6061```csharp62using Azure.ResourceManager.MySql.FlexibleServers;63using Azure.ResourceManager.MySql.FlexibleServers.Models;6465ResourceGroupResource resourceGroup = await client66 .GetDefaultSubscriptionAsync()67 .Result68 .GetResourceGroupAsync("my-resource-group");6970MySqlFlexibleServerCollection servers = resourceGroup.GetMySqlFlexibleServers();7172MySqlFlexibleServerData data = new MySqlFlexibleServerData(AzureLocation.EastUS)73{74 Sku = new MySqlFlexibleServerSku("Standard_D2ds_v4", MySqlFlexibleServerSkuTier.GeneralPurpose),75 AdministratorLogin = "mysqladmin",76 AdministratorLoginPassword = "YourSecurePassword123!",77 Version = MySqlFlexibleServerVersion.Ver8_0_21,78 Storage = new MySqlFlexibleServerStorage79 {80 StorageSizeInGB = 128,81 AutoGrow = MySqlFlexibleServerEnableStatusEnum.Enabled,82 Iops = 300083 },84 Backup = new MySqlFlexibleServerBackupProperties85 {86 BackupRetentionDays = 7,87 GeoRedundantBackup = MySqlFlexibleServerEnableStatusEnum.Disabled88 },89 HighAvailability = new MySqlFlexibleServerHighAvailability90 {91 Mode = MySqlFlexibleServerHighAvailabilityMode.ZoneRedundant,92 StandbyAvailabilityZone = "2"93 },94 AvailabilityZone = "1"95};9697ArmOperation<MySqlFlexibleServerResource> operation = await servers98 .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql-server", data);99100MySqlFlexibleServerResource server = operation.Value;101Console.WriteLine($"Server created: {server.Data.FullyQualifiedDomainName}");102```103104### 2. Create Database105106```csharp107MySqlFlexibleServerResource server = await resourceGroup108 .GetMySqlFlexibleServerAsync("my-mysql-server");109110MySqlFlexibleServerDatabaseCollection databases = server.GetMySqlFlexibleServerDatabases();111112MySqlFlexibleServerDatabaseData dbData = new MySqlFlexibleServerDatabaseData113{114 Charset = "utf8mb4",115 Collation = "utf8mb4_unicode_ci"116};117118ArmOperation<MySqlFlexibleServerDatabaseResource> operation = await databases119 .CreateOrUpdateAsync(WaitUntil.Completed, "myappdb", dbData);120121MySqlFlexibleServerDatabaseResource database = operation.Value;122Console.WriteLine($"Database created: {database.Data.Name}");123```124125### 3. Configure Firewall Rules126127```csharp128MySqlFlexibleServerFirewallRuleCollection firewallRules = server.GetMySqlFlexibleServerFirewallRules();129130// Allow specific IP range131MySqlFlexibleServerFirewallRuleData ruleData = new MySqlFlexibleServerFirewallRuleData132{133 StartIPAddress = System.Net.IPAddress.Parse("10.0.0.1"),134 EndIPAddress = System.Net.IPAddress.Parse("10.0.0.255")135};136137ArmOperation<MySqlFlexibleServerFirewallRuleResource> operation = await firewallRules138 .CreateOrUpdateAsync(WaitUntil.Completed, "allow-internal", ruleData);139140// Allow Azure services141MySqlFlexibleServerFirewallRuleData azureServicesRule = new MySqlFlexibleServerFirewallRuleData142{143 StartIPAddress = System.Net.IPAddress.Parse("0.0.0.0"),144 EndIPAddress = System.Net.IPAddress.Parse("0.0.0.0")145};146147await firewallRules.CreateOrUpdateAsync(WaitUntil.Completed, "AllowAllAzureServicesAndResourcesWithinAzureIps", azureServicesRule);148```149150### 4. Update Server Configuration151152```csharp153MySqlFlexibleServerConfigurationCollection configurations = server.GetMySqlFlexibleServerConfigurations();154155// Get current configuration156MySqlFlexibleServerConfigurationResource config = await configurations157 .GetAsync("max_connections");158159// Update configuration160MySqlFlexibleServerConfigurationData configData = new MySqlFlexibleServerConfigurationData161{162 Value = "500",163 Source = MySqlFlexibleServerConfigurationSource.UserOverride164};165166ArmOperation<MySqlFlexibleServerConfigurationResource> operation = await configurations167 .CreateOrUpdateAsync(WaitUntil.Completed, "max_connections", configData);168169// Common configurations to tune170string[] commonParams = { "max_connections", "innodb_buffer_pool_size", "slow_query_log", "long_query_time" };171```172173### 5. Configure Entra ID Administrator174175```csharp176MySqlFlexibleServerAadAdministratorCollection admins = server.GetMySqlFlexibleServerAadAdministrators();177178MySqlFlexibleServerAadAdministratorData adminData = new MySqlFlexibleServerAadAdministratorData179{180 AdministratorType = MySqlFlexibleServerAdministratorType.ActiveDirectory,181 Login = "aad-admin@contoso.com",182 Sid = Guid.Parse("<entra-object-id>"),183 TenantId = Guid.Parse("<tenant-id>"),184 IdentityResourceId = new ResourceIdentifier("/subscriptions/.../userAssignedIdentities/mysql-identity")185};186187ArmOperation<MySqlFlexibleServerAadAdministratorResource> operation = await admins188 .CreateOrUpdateAsync(WaitUntil.Completed, "ActiveDirectory", adminData);189```190191### 6. List and Manage Servers192193```csharp194// List servers in resource group195await foreach (MySqlFlexibleServerResource server in resourceGroup.GetMySqlFlexibleServers())196{197 Console.WriteLine($"Server: {server.Data.Name}");198 Console.WriteLine($" FQDN: {server.Data.FullyQualifiedDomainName}");199 Console.WriteLine($" Version: {server.Data.Version}");200 Console.WriteLine($" State: {server.Data.State}");201 Console.WriteLine($" SKU: {server.Data.Sku.Name} ({server.Data.Sku.Tier})");202}203204// List databases in server205await foreach (MySqlFlexibleServerDatabaseResource db in server.GetMySqlFlexibleServerDatabases())206{207 Console.WriteLine($"Database: {db.Data.Name}");208}209```210211### 7. Backup and Restore212213```csharp214// List available backups215await foreach (MySqlFlexibleServerBackupResource backup in server.GetMySqlFlexibleServerBackups())216{217 Console.WriteLine($"Backup: {backup.Data.Name}");218 Console.WriteLine($" Type: {backup.Data.BackupType}");219 Console.WriteLine($" Completed: {backup.Data.CompletedOn}");220}221222// Point-in-time restore223MySqlFlexibleServerData restoreData = new MySqlFlexibleServerData(AzureLocation.EastUS)224{225 CreateMode = MySqlFlexibleServerCreateMode.PointInTimeRestore,226 SourceServerResourceId = server.Id,227 RestorePointInTime = DateTimeOffset.UtcNow.AddHours(-2)228};229230ArmOperation<MySqlFlexibleServerResource> operation = await servers231 .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql-restored", restoreData);232```233234### 8. Stop and Start Server235236```csharp237MySqlFlexibleServerResource server = await resourceGroup238 .GetMySqlFlexibleServerAsync("my-mysql-server");239240// Stop server (saves costs when not in use)241await server.StopAsync(WaitUntil.Completed);242243// Start server244await server.StartAsync(WaitUntil.Completed);245246// Restart server247await server.RestartAsync(WaitUntil.Completed, new MySqlFlexibleServerRestartParameter248{249 RestartWithFailover = MySqlFlexibleServerEnableStatusEnum.Enabled,250 MaxFailoverSeconds = 60251});252```253254### 9. Update Server (Scale)255256```csharp257MySqlFlexibleServerResource server = await resourceGroup258 .GetMySqlFlexibleServerAsync("my-mysql-server");259260MySqlFlexibleServerPatch patch = new MySqlFlexibleServerPatch261{262 Sku = new MySqlFlexibleServerSku("Standard_D4ds_v4", MySqlFlexibleServerSkuTier.GeneralPurpose),263 Storage = new MySqlFlexibleServerStorage264 {265 StorageSizeInGB = 256,266 Iops = 6000267 }268};269270ArmOperation<MySqlFlexibleServerResource> operation = await server271 .UpdateAsync(WaitUntil.Completed, patch);272```273274### 10. Delete Server275276```csharp277MySqlFlexibleServerResource server = await resourceGroup278 .GetMySqlFlexibleServerAsync("my-mysql-server");279280await server.DeleteAsync(WaitUntil.Completed);281```282283## Key Types Reference284285| Type | Purpose |286|------|---------|287| `MySqlFlexibleServerResource` | Flexible Server instance |288| `MySqlFlexibleServerData` | Server configuration data |289| `MySqlFlexibleServerCollection` | Collection of servers |290| `MySqlFlexibleServerDatabaseResource` | Database within server |291| `MySqlFlexibleServerFirewallRuleResource` | IP firewall rule |292| `MySqlFlexibleServerConfigurationResource` | Server parameter |293| `MySqlFlexibleServerBackupResource` | Backup metadata |294| `MySqlFlexibleServerAadAdministratorResource` | Entra ID admin |295| `MySqlFlexibleServerSku` | SKU (compute tier + size) |296| `MySqlFlexibleServerStorage` | Storage configuration |297| `MySqlFlexibleServerHighAvailability` | HA configuration |298| `MySqlFlexibleServerBackupProperties` | Backup settings |299300## SKU Tiers301302| Tier | Use Case | SKU Examples |303|------|----------|--------------|304| `Burstable` | Dev/test, light workloads | Standard_B1ms, Standard_B2s |305| `GeneralPurpose` | Production workloads | Standard_D2ds_v4, Standard_D4ds_v4 |306| `MemoryOptimized` | High memory requirements | Standard_E2ds_v4, Standard_E4ds_v4 |307308## High Availability Modes309310| Mode | Description |311|------|-------------|312| `Disabled` | No HA (single server) |313| `SameZone` | HA within same availability zone |314| `ZoneRedundant` | HA across availability zones |315316## Best Practices3173181. **Use Flexible Server** — Single Server is deprecated3192. **Enable zone-redundant HA** — For production workloads3203. **Use DefaultAzureCredential** — Prefer over connection strings3214. **Configure Entra ID authentication** — More secure than SQL auth3225. **Enable auto-grow storage** — Prevents out-of-space issues3236. **Set appropriate backup retention** — 7-35 days based on compliance3247. **Use private endpoints** — For secure network access3258. **Tune server parameters** — Based on workload characteristics3269. **Monitor with Azure Monitor** — Enable metrics and logs32710. **Stop dev/test servers** — Save costs when not in use328329## Error Handling330331```csharp332using Azure;333334try335{336 ArmOperation<MySqlFlexibleServerResource> operation = await servers337 .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql", data);338}339catch (RequestFailedException ex) when (ex.Status == 409)340{341 Console.WriteLine("Server already exists");342}343catch (RequestFailedException ex) when (ex.Status == 400)344{345 Console.WriteLine($"Invalid configuration: {ex.Message}");346}347catch (RequestFailedException ex)348{349 Console.WriteLine($"Azure error: {ex.Status} - {ex.Message}");350}351```352353## Connection String354355After creating the server, connect using:356357```csharp358// ADO.NET connection string359string connectionString = $"Server={server.Data.FullyQualifiedDomainName};" +360 "Database=myappdb;" +361 "User Id=mysqladmin;" +362 "Password=YourSecurePassword123!;" +363 "SslMode=Required;";364365// With Entra ID token (recommended)366var credential = new DefaultAzureCredential();367var token = await credential.GetTokenAsync(368 new TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" }));369370string connectionString = $"Server={server.Data.FullyQualifiedDomainName};" +371 "Database=myappdb;" +372 $"User Id=aad-admin@contoso.com;" +373 $"Password={token.Token};" +374 "SslMode=Required;";375```376377## Related SDKs378379| SDK | Purpose | Install |380|-----|---------|---------|381| `Azure.ResourceManager.MySql` | MySQL management (this SDK) | `dotnet add package Azure.ResourceManager.MySql` |382| `Azure.ResourceManager.PostgreSql` | PostgreSQL management | `dotnet add package Azure.ResourceManager.PostgreSql` |383| `MySqlConnector` | MySQL data access | `dotnet add package MySqlConnector` |384385## Reference Links386387| Resource | URL |388|----------|-----|389| NuGet Package | https://www.nuget.org/packages/Azure.ResourceManager.MySql |390| API Reference | https://learn.microsoft.com/dotnet/api/azure.resourcemanager.mysql |391| Product Documentation | https://learn.microsoft.com/azure/mysql/flexible-server/ |392| GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/mysql/Azure.ResourceManager.MySql |393
Full transparency — inspect the skill content before installing.