2017-07-21 1 views
-2

Existe-t-il un moyen de copier par programme une base de données Azure sur la machine locale en utilisant strictement le code? Par exemple je voudrais créer une fonction qui une fois exécutée une copie d'une base de données Azure SQL est répliquée sur la machine locale et/ou vice versa. J'ai essayé actuellement de trouver une solution en utilisant .NET et SQL server localdb mais j'ai échoué. Seuls les moyens que je peux trouver sont faits manuellement comme la connexion au portail Azure et la création d'un fichier bacpac.Copier par programme la base de données Azure sur la machine locale et/ou vice versa

+0

Avez-vous essayé PowerShell? –

Répondre

1

Je l'ai testé utiliser Microsoft Azure SQL Management Library 0.51.0-prerelease, ça marche correctement de mon côté.

En utilisant sqlManagementClient.ImportExport.Export(resourceGroup, azureSqlServer, azureSqlDatabase,exportRequestParameters) pour exporter le fichier. bacpac fichier le azure de stockage, alors nous pourrions télécharger le blob à local à partir du stockage Azure. Mais nous n'avons pas pu trouver ImportExport dans la dernière version de Microsoft Azure SQL Management Library SDK. Le risque est que nous ne savons pas quand il sera retraité par Microsoft. Voici mes étapes de détail:

Pré-requis:

Registre une application en principe AD Azure et créer un service pour elle. Pour plus d'informations sur les étapes de la procédure de création de registre et de jeton d'accès, veuillez vous reporter au code document.

Étapes:

1.Créez une console C# application

2.Get accessToken en utilisant registre App Azure AD

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.Créez Azure objet sqlManagementClient

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

4.Utilisez sqlManagementClient.ImportExport.Export pour exporter .dacpa fichier c pour le stockage d'azur

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

Exporter vers Azure Code 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

Nous pourrions télécharger le code blob d'azur document:

// 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); 
} 

paquets. 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> 
+0

Cela semble être la réponse que je cherche. Merci pour votre réponse @Tom Sun –