以编程方式将Azure数据库复制到本地计算机和/或反之亦然

时间:2017-07-21 15:46:33

标签: .net sql-server azure azure-sql-database

有没有办法使用严格的代码以编程方式将Azure数据库复制到本地计算机?例如,我想创建一个函数,在执行时,Azure SQL数据库的副本在本地计算机上复制和/或反之亦然。我目前一直在尝试使用.NET和SQL服务器localdb找到解决方案,但一直没有成功。只有我能找到的方法才能手动完成,例如登录Azure门户并创建bacpac文件。

1 个答案:

答案 0 :(得分:1)

我使用Microsoft Azure SQL Management Library 0.51.0-prerelease测试它,它在我身边正常工作。

使用sqlManagementClient.ImportExport.Export(resourceGroup, azureSqlServer, azureSqlDatabase,exportRequestParameters)导出。 bacpac 文件 azure storage ,然后我们可以 blob下载到本地Azure存储。但是,我们无法在 Microsoft Azure SQL Management Library SDK 的最新版本中找到ImportExport风险是因为我们不知道微软什么时候退休。以下是我的详细步骤:

<强>先决条件:

在Azure AD中注册应用程序并为其创建服务原则。有关如何注册应用和获取访问令牌的更多详细信息,请参阅document

步骤:

1.创建C#控制台应用程序

2.使用Azure AD中的注册表应用程序获取accessToken

 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.AcquireToken("https://management.core.windows.net/",
                credential);

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

            var token = result.AccessToken;
            return token;
        }

3.创建Azure sqlManagementClient对象

 SqlManagementClient sqlManagementClient = new SqlManagementClient(new TokenCloudCredentials(subscriptionId, GetAccessToken(tenantId, clientId, secretKey)));

4.使用sqlManagementClient.ImportExport.Export将.dacpac文件导出到azure存储

var export = sqlManagementClient.ImportExport.Export(resourceGroup, azureSqlServer, azureSqlDatabase,   
                    exportRequestParameters)

导出到Azure blob代码:

  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"; //tomtestsqlserver 
  var adminLogin = "user";
  var adminPassword = "password";
  var storageKey = "storage key";
  var storageAccount = "storage account";
  var baseStorageUri = $"https://{storageAccount}.blob.core.windows.net/myblobcontainer/";//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 TokenCloudCredentials(subscriptionId, GetAccessToken(tenantId, clientId, secretKey)));
    var export = sqlManagementClient.ImportExport.Export(resourceGroup, azureSqlServer, azureSqlDatabase,
                    exportRequestParameters); //do export operation

    while (exportStatus.Status != 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

      }

enter image description here

我们可以从azure document下载blob代码:

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// Retrieve reference to a blob
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob name");

// Save blob contents to a file.
using (var fileStream = System.IO.File.OpenWrite(@"path\myfile"))
{
    blockBlob.DownloadToStream(fileStream);
}

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Hyak.Common" version="1.0.2" targetFramework="net452" />
  <package id="Microsoft.Azure.Common" version="2.1.0" targetFramework="net452" />
  <package id="Microsoft.Azure.Common.Authentication" version="1.7.0-preview" targetFramework="net452" />
  <package id="Microsoft.Azure.Common.Dependencies" version="1.0.0" targetFramework="net452" />
  <package id="Microsoft.Azure.Management.Sql" version="0.51.0-prerelease" targetFramework="net452" />
  <package id="Microsoft.Bcl" version="1.1.9" targetFramework="net452" />
  <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net452" />
  <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net452" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.18.206251556" targetFramework="net452" />
  <package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net452" />
  <package id="Microsoft.Rest.ClientRuntime" version="2.0.1" targetFramework="net452" />
  <package id="Microsoft.Rest.ClientRuntime.Azure.Authentication" version="2.0.1-preview" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net452" />
</packages>