gpt4 book ai didi

c# - 如何以编程方式将 SQL 数据库直接导出到 blob 存储

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:55 24 4
gpt4 key购买 nike

我需要以编程方式将 SQL 数据库(在 Azure 中或本地兼容数据库)备份/导出到 Azure 存储,并将其还原到另一个 SQL 数据库。我只想对代码依赖项使用 NuGet 包,因为我无法保证构建或生产服务器将安装 Azure SDK。我找不到任何我认为是常见操作的代码示例。我找到的最接近的是:

https://blog.hompus.nl/2013/03/13/backup-your-azure-sql-database-to-blob-storage-using-code/

但是,此代码导出到本地 bacpac 文件(需要 RoleEnvironment,一个仅限 SDK 的对象)。我认为应该有一种方法可以直接导出到 Blob 存储,而无需中间文件。一种想法是创建一个 Stream,然后运行:

services.ExportBacpac(stream, "dbnameToBackup")

然后将流写入存储;然而,内存流不起作用——这可能是一个庞大的数据库(100-200 GB)。

执行此操作的更好方法是什么?

最佳答案

根据我的测试,sql Microsoft Azure SQL Management Library 0.51.0-prerelease支持直接将sql数据库.bacpac文件导出到azure存储。

我们可以使用 sqlManagementClient.ImportExport.Export(resourceGroup, azureSqlServer, azureSqlDatabase,exportRequestParameters) 将 .bacpac 文件导出到 azure 存储 .

但我们在最新版本的 Microsoft Azure SQL 管理库 SDK 中找不到 ImportExport。所以只能使用sql Microsoft Azure SQL Management Library 0.51.0-prerelease SDK。

更多关于如何使用sql Microsoft Azure SQL Management Library将sql备份导出到Azure blob存储的详细信息,您可以引用下面的步骤和代码。

先决条件:

在 Azure AD 中注册一个应用程序并为其创建服务原则。有关如何注册应用程序和获取访问 token 的更多详细步骤,请参阅 document .

详细代码:

注意:将clientId、tenantId、secretKey、subscriptionId替换为你注册的Azure AD信息。将 azureSqlDatabase,resourceGroup,azureSqlServer,adminLogin,adminPassword,storageKey,storageAccount 替换为您自己的 sql 数据库和存储。

static void Main(string[] args)
{

var subscriptionId = "xxxxxxxx";
var clientId = "xxxxxxxxx";
var tenantId = "xxxxxxxx";
var secretKey = "xxxxx";
var azureSqlDatabase = "data base name";
var resourceGroup = "Resource Group name";
var azureSqlServer = "xxxxxxx"; //testsqlserver
var adminLogin = "user";
var adminPassword = "password";
var storageKey = "storage key";
var storageAccount = "storage account";
var baseStorageUri = $"https://{storageAccount}.blob.core.windows.net/brandotest/";//with container name endwith "/"
var backName = azureSqlDatabase + "-" + $"{DateTime.UtcNow:yyyyMMddHHmm}" + ".bacpac"; //back up sql file name
var backupUrl = baseStorageUri + backName;
ImportExportOperationStatusResponse exportStatus = new ImportExportOperationStatusResponse();
try
{
ExportRequestParameters exportRequestParameters = new ExportRequestParameters
{
AdministratorLogin = adminLogin,
AdministratorLoginPassword = adminPassword,
StorageKey = storageKey,
StorageKeyType = "StorageAccessKey",
StorageUri = new Uri(backupUrl)
};

SqlManagementClient sqlManagementClient = new SqlManagementClient(new Microsoft.Azure.TokenCloudCredentials(subscriptionId, GetAccessToken(tenantId, clientId, secretKey)));
var export = sqlManagementClient.ImportExport.Export(resourceGroup, azureSqlServer, azureSqlDatabase,
exportRequestParameters); //do export operation

while (exportStatus.Status != Microsoft.Azure.OperationStatus.Succeeded) // until operation successed
{
Thread.Sleep(1000 * 60);
exportStatus = sqlManagementClient.ImportExport.GetImportExportOperationStatus(export.OperationStatusLink);
}

Console.WriteLine($"Export DataBase {azureSqlDatabase} to Storage {storageAccount} Succesfully");
}

catch (Exception exception)
{

//todo

}

}

private static string GetAccessToken(string tenantId, string clientId, string secretKey)
{
var authenticationContext = new AuthenticationContext($"https://login.windows.net/{tenantId}");
var credential = new ClientCredential(clientId, secretKey);
var result = authenticationContext.AcquireTokenAsync("https://management.core.windows.net/",
credential);

if (result == null)
{
throw new InvalidOperationException("Failed to obtain the JWT token");
}

var token = result.Result.AccessToken;
return token;
}

结果是这样的:

1.发送请求告诉sql server开始导出到azure blob存储

enter image description here

2.继续发送请求监控数据库导出操作状态。

enter image description here

3.完成导出操作。

enter image description here

关于c# - 如何以编程方式将 SQL 数据库直接导出到 blob 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45495563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com