2017-09-21 2 views
2

Sie suchen nach einer Möglichkeit, die Wiederherstellung der Uhrzeit in einer neuen Datenbank durchzuführen und die ursprüngliche Datenbank beizubehalten; mit verwalteter API anstelle von REST API oder Vorlagen.Möglich, neue Datenbank von Point-in-Time-Wiederherstellung mit Azure ARMs SqlManagementClient zu erstellen?

Code I bisher haben:

public async Task CreateDatabaseFromRestorePointAsync(
     string resourceGroupName, string serverName, 
     string databaseName, DateTime time) { 

     using (SqlManagementClient sqlMgmtClient = GetSqlManagementClient()) 
     { 
      DatabaseInner myDb = await sqlMgmtClient.Databases.GetAsync(
       resourceGroupName, serverName, databaseName);    

      var newDb = new DatabaseInner 
      { 
       Location = myDb.Location, 
       CreateMode = CreateMode.PointInTimeRestore, 
       // RestorePointInTime = time; 
       Edition = "Basic", 
       SourceDatabaseId = myDb.Id     
      }; 

      var result = await sqlMgmtClient.Databases.CreateOrUpdateAsync(
       resourceGroupName, serverName, "BackUpRestoreTestDb", newDb);    

      // Throws "The point in time was not specified for restoring live database...'" 
     } 
    } 

Gefunden folgendes:

Und der gleiche Link verweist auf eine new Database anstelle einer DatabaseInner. Kann den Namespace der Datenbankobjekte nicht finden.

Edit 1: die Methode speziell von Brando Zhang's answer wiederherzustellen versucht, aber es gibt offenbar Namespace Änderungen. Ich verwende:

  • .Net 4.6.1

  • Microsoft.Azure.Management.Sql Version 1.6.0-Vorschau

  • Microsoft.Azure.Management.Sql.Models

  • Microsoft.Azure.Management.Sql.Fluent Version 1.2.0

  • Microsoft.Azure.Management.Sql.Fluent.Models

Erste die Namespace konnte nicht für DatabaseCreateOrUpdateParameters, DatabaseCreateOrUpdateProperties, DatabaseCreateMode, DatabaseCreateOrUpdateResponse finden.

SqlManagementClient existiert in beiden ..sql und ..slq.fluent Namespaces von denen beide Namespace für .server in der Leitung nicht sqlMgmtClient.Servers.Get(resourceGroupName, serverName).Server;

ohne Glück gesucht Microsoft's Azure Management Namespaces finden.

Aber google DatabaseCreateOrUpdateParameters und seinen Namespace auf einem spanish MSDN site gefunden, die oben verlinkt.

Antwort

3

Die Verwirrung hier, da gibt es 3 verschiedene APIs:

  1. Microsoft.Azure.Management.Sql Version < 1.0
  2. Microsoft.Azure.Management.Sql Version> = 1.0 (API-Referenz: https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.sql?view=azure-dotnet)
  3. Microsoft.Azure.Management.Sql.Fluent Das basiert auf Microsoft.Azure.Management.Sql Version> = 1.0 und soll ein menschenfreundlicheres Design sein aber tun Es hat nicht so viel Feature-Unterstützung wie die Basis .SQL-Bibliothek. (API-Referenz: https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.sql.fluent?view=azure-dotnet)

Brandos Antwort ist für die API # 1. Um den Code für die neue API zu aktualisieren (# 2), sollte es so aussehen:

// Create a database: configure create or update parameters and properties explicitly 
    Database newDatabaseParameters = new Database() 
    { 
     Location = currentServer.Location, 
     CreateMode = DatabaseCreateMode.PointInTimeRestore, 
     Edition = databaseEdition, 
     SourceDatabaseId = "/subscriptions/{yoursubscriptionid}/resourceGroups/{yourgroupid}/providers/Microsoft.Sql/servers/{sqlservername}/databases/{sqldatabasename}", 
     RestorePointInTime = DateTime.Parse("2017-09-22T02:32:08Z"),//Restore Point time 
    }; 

    Database db = sqlMgmtClient.Databases.CreateOrUpdate(resourceGroupName, serverName, databaseName, newDatabaseParameters); 
    return db; 

Die wichtigsten Unterschiede sind:

  1. Es ist nicht mehr separate Klassen wie DatabaseCreateOrUpdateParameters, DatabaseCreateOrUpdateProperties, DatabaseCreateOrUpdateResponse. Es gibt nur eine Klasse Database.
  2. Die Eigenschaften von Database sind "abgeflacht", so dass es keine innere Properties zu setzen gibt.
+0

Vielen Dank für diese Information! – ttugates

3

Gemäß Ihrer Beschreibung, schlage ich vor, Sie könnten versuchen, dieses nugget-Paket zu verwenden.

Microsoft Azure SQL Management Library

Dann könnten Sie unter Codes verwenden Zeitpunkt zu erreichen Wiederherstellen.

-Code wie folgt aus:

Hinweis, benötigen Sie einen Anwendungsregistrierungs tenantId, applicationId, SecretKey zu bekommen, dann mit subscriptionId den Authentifizierungs-Token zu erhalten.

Über wie Sie sich registrieren, können Sie auf diese Codes beziehen könnten:

Main-Methode:

 var subscriptionId = "subscriptionId "; 
     var clientId = "clientId "; 
     var tenantId = "tenantId "; 
     var secretKey = "secretKey "; 
     var azureSqlDatabase = "azureSqlDatabase "; 
     var resourceGroup = "resourceGroup "; 
     var azureSqlServer = "azureSqlServer "; 
     var databaseEdition = DatabaseEditions.Standard; 
     var databasePerfLevel = "S1"; 

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

     CreateOrUpdateDatabase(sqlManagementClient, resourceGroup, azureSqlServer, azureSqlDatabase, databaseEdition, databasePerfLevel); 

Die get-Auth-Token-Methode:

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

Die Wiederherstellungsmethode:

static DatabaseCreateOrUpdateResponse CreateOrUpdateDatabase(SqlManagementClient sqlMgmtClient, string resourceGroupName, string serverName, string databaseName, string databaseEdition, string databasePerfLevel) 
    { 
     // Retrieve the server that will host this database 
     Server currentServer = sqlMgmtClient.Servers.Get(resourceGroupName, serverName).Server; 

     // Create a database: configure create or update parameters and properties explicitly 
     DatabaseCreateOrUpdateParameters newDatabaseParameters = new DatabaseCreateOrUpdateParameters() 
     { 
      Location = currentServer.Location, 
      Properties = new DatabaseCreateOrUpdateProperties 
      { 
       CreateMode = DatabaseCreateMode.PointInTimeRestore, 
       //DatabaseEditions.Standard; 
       Edition = databaseEdition, 
       SourceDatabaseId = "/subscriptions/{yoursubscriptionid}/resourceGroups/{yourgroupid}/providers/Microsoft.Sql/servers/{sqlservername}/databases/{sqldatabasename}", 
       RestorePointInTime = DateTime.Parse("2017-09-22T02:32:08Z"),//Restore Point time 
       //S1 
       RequestedServiceObjectiveName = databasePerfLevel 
      } 
     }; 

     DatabaseCreateOrUpdateResponse dbResponse = sqlMgmtClient.Databases.CreateOrUpdate(resourceGroupName, serverName, databaseName, newDatabaseParameters); 
     return dbResponse; 
    } 

R eiter:

enter image description here

+0

Als Sie. Ich habe die folgenden Namespaces, 'mit Microsoft.Azure.Management.Sql; mit Microsoft.Azure.Management.Sql.Models; mit Microsoft.Azure.Management.Sql.Fluent; unter Verwendung von Microsoft.Azure.Management.Sql.Fluent.Models; 'on .Net 4.6.1; DatabaseCreateOrUpdateParameters, DatabaseCreateOrUpdateProperties und einige andere wurden jedoch nicht gefunden. Dies ist [Link zu Namespace] (https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.sql.models?view=azure-dotnet) Ich glaube, es war in. Würde es Ihnen etwas ausmachen, Ihre Framework- und Microsoft.Azure.Management-Versionen anzugeben? – ttugates

Verwandte Themen