我正在使用 REST 管理 API 使用 BacPac 文件将 SQL 数据库导入到 Azure。我需要能够检查导入的状态,因为 Azure 不允许我在导入成功时发送事件。
这是我正在执行的操作的文档: https://learn.microsoft.com/en-us/rest/api/sql/databases%20-%20import%20export/import
我已经尝试使用 Azure 的 Analysis Services API 通过操作 ID 和操作发生的区域来检查操作的状态。但是,调用此端点将返回 404 未找到。
这里是 Azure 的 Analysis Services API 端点的文档,我尝试使用导入的操作 ID 及其发生的区域进行调用: https://learn.microsoft.com/en-us/rest/api/analysisservices/servers/listoperationresults
我期望 Analysis Services 向我提供我使用 Azure 管理 API 开始的导入/导出操作的状态。这样做会导致 404,所以我不确定我是否调用了正确的 API 端点(我仔细检查以确保我正在构建以检查操作状态的 URI 中没有拼写错误)。
如果您使用 PowerShell,我确实知道如何跟踪导入/导出操作的进度,但我不知道如何使用 Azure REST API 跟踪进度。
如果您使用 PowerShell New-AzureRmSqlDatabaseImport cmdlet 导入数据库或使用 New-AzureRmSqlDatabaseExport 导出数据库,则可以使用 Get-AzureRmSqlDatabaseImportExportStatus 跟踪导入进度/出口操作。
对于任何 api,例如 BeginX(),都有一个相应的 api X() 等待完成。在这种情况下,请使用 Import() 代替 BeginImport()。
如果您希望更直接地控制轮询,那么您可以查看 Import 的定义并直接使用下层,即 BeginImportWithHttpMessagesAsync() 然后 GetPostOrDeleteOperationResultAsync():
public async Task<AzureOperationResponse<ImportExportResponse>> ImportWithHttpMessagesAsync(string resourceGroupName, string serverName, string databaseName, ExportRequest parameters, Dictionary<string, List<string>> customHeaders = null, CancellationToken cancellationToken = default(CancellationToken))
{
// Send request
AzureOperationResponse<ImportExportResponse> _response = await BeginImportWithHttpMessagesAsync(resourceGroupName, serverName, databaseName, parameters, customHeaders, cancellationToken).ConfigureAwait(false);
// Poll for completion
return await Client.GetPostOrDeleteOperationResultAsync(_response, customHeaders, cancellationToken).ConfigureAwait(false);
}
这个答案专门针对 .net,但对于其他语言,同样的原则也适用。
要监控导入进度,请打开数据库的服务器页面,然后在“设置”下选择“导入/导出历史记录”。成功后,导入状态为“已完成”。
我找到一篇文章Azure SQL 数据库导出,它讨论了如何使用 Microsoft Azure SQL 数据库导入/导出 REST 服务 API 检查导出的状态。
总结:
在管理门户中,单击数据库,仪表板将显示最近的导出状态。在屏幕截图 5 中,您将看到我的数据库的 AUTOMATED EXPORT 状态显示为 NEVER EXPORTED。一旦成功导出,这种情况就会改变。 在管理门户中,单击数据库,仪表板将显示最近的导出状态。
最终计划在凌晨 1 点导出完成后,5 分钟后完成,我的仪表板中的自动导出状态显示相同。 (参见屏幕截图 6)。
希望这有帮助。
根据微软的说法:
“我们有用于将操作导入/导出到 Azure sql 的 REST API,但我们没有任何 REST API 来查找导入/导出状态。客户应使用 Powershell 来获取状态”
我发现使用 Powershell 命令无法知道导入是否失败,因为失败的导入永远不会创建并返回 404(因为导入失败)。
您可以实施的一种解决方案是最佳猜测方法,其中强制执行 48 小时的限制,任何花费超过此时间的导入都会被解释为失败。如果您知道大多数 SQL 数据库都是在 10 分钟的时间窗口内导入的,那么务实地说,任何耗时超过 48 小时的 SQL 导入都会完全失败。
您还可以选择与上述时间窗口结合使用对数后退方法,在检查状态时逐渐后退。这将使您、微软和地球免受不必要的浪费 🙂