porta microsoft management azure azure-sql-database azure-resource-manager

microsoft - Posibilidad de crear una nueva base de datos a partir de la recuperación de punto en el tiempo utilizando Azure ARMs SqlManagementClient?



porta azure (2)

Específicamente, buscando una forma de realizar un punto en el tiempo restaurar a una nueva base de datos, preservar la base de datos original; usando Managed API en lugar de REST API o Plantillas .

Código que tengo hasta ahora:

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...''" } }

Encontrado lo siguiente:

Y el mismo enlace hace referencia a una new Database de new Database lugar de a DatabaseInner . No puedo encontrar el espacio de nombres de los objetos de la Base de

Edición 1: Intenté el método de restauración específicamente de la respuesta de Brando Zhang pero aparentemente hay cambios en el espacio de nombres. Estoy usando:

  • .Net 4.6.1

  • Microsoft.Azure.Management.Sql versión 1.6.0-preview

  • Microsoft.Azure.Management.Sql.Models

  • Microsoft.Azure.Management.Sql.Fluent versión 1.2.0

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

No se pudo encontrar el espacio de nombres para DatabaseCreateOrUpdateParameters , DatabaseCreateOrUpdateProperties , DatabaseCreateMode , DatabaseCreateOrUpdateResponse .

SqlManagementClient existe en los ..sql nombres ..sql y ..slq.fluent que no encuentran el espacio de nombres para .server en la línea sqlMgmtClient.Servers.Get(resourceGroupName, serverName).Server;

Busqué los espacios de nombres de administración de Azure de Microsoft sin suerte.

Pero Google encontró DatabaseCreateOrUpdateParameters y su espacio de nombres en un sitio español de MSDN , que enlaza con el anterior.


De acuerdo con su descripción, le sugiero que intente usar este paquete nuget.

Biblioteca de administración de SQL de Microsoft Azure

Entonces podría usar los códigos a continuación para lograr la recuperación de puntos en el tiempo.

Código así:

Tenga en cuenta que necesita registrar una aplicación para obtener tenantId, applicationId, SecretKey y luego con subscriptionId para obtener el token de autenticación.

Sobre cómo registrarse, puede consultar estos códigos:

Método principal:

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

El método get auth token:

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

El método de restauración:

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

Resultado:


La confusión aquí es porque hay 3 API diferentes:

  1. Microsoft.Azure.Management.Sql versión <1.0
  2. Microsoft.Azure.Management.Sql version> = 1.0 (Referencia de API: https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.sql?view=azure-dotnet )
  3. Microsoft.Azure.Management.Sql.Fluent , que se basa en la versión Microsoft.Azure.Management.Sql > = 1.0 y pretende ser un diseño más amigable para los humanos, pero no tiene tanto soporte de características como la biblioteca base .Sql . (Referencia de API: https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.sql.fluent?view=azure-dotnet )

La respuesta de Brando es para la API # 1. Para actualizar el código de la nueva API (n. ° 2), debería verse así:

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

Las principales diferencias son:

  1. Ya no hay clases separadas como DatabaseCreateOrUpdateParameters , DatabaseCreateOrUpdateProperties , DatabaseCreateOrUpdateResponse . Solo hay una Database clase.
  2. Las propiedades de la Database de Database se "aplanan" por lo que no hay Properties internas para establecer.