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:
- Este enlace SO Cómo restaurar una Base de datos SQL Azure a un punto en el tiempo utilizando las bibliotecas de administración de Azure para .NET .
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-previewMicrosoft.Azure.Management.Sql.Models
Microsoft.Azure.Management.Sql.Fluent
versión 1.2.0Microsoft.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:
-
Microsoft.Azure.Management.Sql
versión <1.0 -
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 ) -
Microsoft.Azure.Management.Sql.Fluent
, que se basa en la versiónMicrosoft.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:
- Ya no hay clases separadas como
DatabaseCreateOrUpdateParameters
,DatabaseCreateOrUpdateProperties
,DatabaseCreateOrUpdateResponse
. Solo hay unaDatabase
clase. - Las propiedades de la
Database
deDatabase
se "aplanan" por lo que no hayProperties
internas para establecer.