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

Azure SDK .NET新版本中数据库快照创建与导出迁移问题

迁移Azure SDK for .NET:数据库快照创建与存储账户导出替代方案

问题背景

旧版Azure SDK for .NET已弃用,需迁移至新版SDK实现以下业务逻辑:

  1. 对现有SQL数据库创建快照(以Copy模式)
  2. 将快照导出至指定存储账户容器

所需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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:10:46