Azure SDK .NET新版本中数据库快照创建与导出迁移问题
迁移Azure SDK for .NET:数据库快照创建与存储账户导出替代方案
问题背景
旧版Azure SDK for .NET已弃用,需迁移至新版SDK实现以下业务逻辑:
- 对现有SQL数据库创建快照(以Copy模式)
- 将快照导出至指定存储账户容器
所需NuGet包
确保已安装以下新版SDK包:
Azure.ResourceManager.Sql(SQL资源管理核心包)Azure.ResourceManager.Storage(存储资源管理包)Azure.Identity(服务主体认证包)
步骤1:认证与资源获取修正
新版ArmClient无需先获取资源组,可直接通过资源ID定位SQL Server:
var sp = new ClientSecretCredential(tenantId, clientId, clientSecret); var armClient = new ArmClient(sp, subscriptionId); // 直接通过服务器ID获取SqlServerResource var sqlServerId = new ResourceIdentifier(db.SourceServerId); var sqlServerResponse = await armClient.GetSqlServerResource(sqlServerId).GetAsync(cancellationToken); var sqlServer = sqlServerResponse.Value;
步骤2:检查快照是否已存在
新版需异步遍历数据库列表(同步方法已移除):
var sqlDatabases = sqlServer.GetSqlDatabases(); bool snapshotExists = false; await foreach (var db in sqlDatabases.GetAllAsync(cancellationToken)) { if (db.Data.Name == snapshotDbName) { snapshotExists = true; break; } } if (snapshotExists) return;
步骤3:创建数据库快照(Copy模式)
通过SqlDatabaseData构建创建参数,调用CreateOrUpdateAsync完成创建:
// 构建快照数据库的配置参数 var snapshotDbData = new SqlDatabaseData(sqlServer.Data.Location) { CreateMode = SqlDatabaseCreateMode.Copy, SourceDatabaseId = new ResourceIdentifier(sourceDatabaseId) }; // 执行快照创建(等待操作完成) var snapshotDbResponse = await sqlServer.GetSqlDatabases().CreateOrUpdateAsync( WaitUntil.Completed, snapshotDbName, snapshotDbData, cancellationToken); var snapshotDb = snapshotDbResponse.Value;
步骤4:将快照导出至存储账户
新版无直接ExportTo方法,需通过StartExportAsync并配合存储SAS URI实现:
4.1 生成存储容器SAS URI
导出需要存储容器的写入权限,先生成SAS:
// 获取目标存储账户资源 var storageAccountId = new ResourceIdentifier(storageId); var storageAccountResponse = await armClient.GetStorageAccountResource(storageAccountId).GetAsync(cancellationToken); var storageAccount = storageAccountResponse.Value; // 构建SAS参数(有效期1小时,仅HTTPS,允许写入/列表权限) var sasBuilder = new AccountSasBuilder { Services = AccountSasServices.Blobs, ResourceTypes = AccountSasResourceTypes.Container, ExpiresOn = DateTimeOffset.UtcNow.AddHours(1), Protocol = SasProtocol.HttpsOnly }; sasBuilder.SetPermissions(AccountSasPermissions.Write | AccountSasPermissions.List); // 生成账户SAS URI,拼接成容器级SAS地址 var accountSasUri = storageAccount.GenerateAccountSasUri(sasBuilder); var containerSasUri = new Uri($"{accountSasUri.AbsoluteUri.TrimEnd('?')}/{storageContainer}?{accountSasUri.Query}");
4.2 执行导出操作
// 构建导出任务参数 var exportParams = new ExportDatabaseDefinition { StorageKeyType = StorageKeyType.SharedAccessKey, StorageUri = containerSasUri, AdministratorLogin = user, AdministratorLoginPassword = password, AuthenticationType = AuthenticationType.Sql, // 从SAS URI中提取签名部分作为StorageKey StorageKey = accountSasUri.Query.TrimStart('?') .Split('&') .First(kv => kv.StartsWith("sig=")) .Split('=')[1], DatabaseName = snapshotDb.Data.Name, ExportName = outputFileName }; // 启动导出并等待完成 var exportOperation = await snapshotDb.StartExportAsync( WaitUntil.Completed, exportParams, cancellationToken); await exportOperation.WaitForCompletionAsync(cancellationToken);
内容的提问来源于stack exchange,提问作者Jakub Vojtašák
相关产品推荐
相关产品推荐

