本文介绍如何还原使用 Azure 备份服务备份的 Azure Database for PostgreSQL 灵活服务器。
先决条件
在还原之前:
让我们在示例中的资源组TestBkpVault
下使用现有的备份保管库testBkpVaultRG
。
还原已备份的 PostgreSQL 数据库
设置权限
备份保管库使用托管标识来访问其他 Azure 资源。 若要基于备份还原,备份保管库的托管标识需要拥有一组权限,使其可以访问要还原到的目标。 若要将恢复点还原为文件至存储帐户,备份保管库的系统托管标识需要对目标存储帐户有访问权限。
提取相关恢复点
若要列出备份实例的所有可用恢复点,请使用 列表恢复点 API。
GET https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DataProtection/backupVaults/{vaultName}/backupInstances/{backupInstanceName}/recoveryPoints?api-version=2021-07-01
例如,此 API 转换为:
GET https://management.chinacloudapi.cn/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/TestBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupInstances/pgflextestserver-857d23b1-c679-4c94-ade6-c4d34635e149/recoveryPoints?api-version=2021-07-01
对恢复点列表的响应
提交 GET 请求后,它会以 200 (确定)的形式返回响应,以及包含所有相关详细信息的所有离散恢复点的列表。
名称 | 类型 | DESCRIPTION |
---|---|---|
200 正常 | AzureBackupRecoveryPointResourceList | 好的 |
其他状态代码 | CloudError | 错误响应描述操作失败的原因。 |
对恢复点列表的响应示例:
HTTP/1.1 200 OK
Content-Length: 53396
Content-Type: application/json
Expires: -1
Pragma: no-cache
X-Content-Type-Options: nosniff
x-ms-request-id:
Strict-Transport-Security: max-age=31536000; includeSubDomains
x-ms-ratelimit-remaining-subscription-reads: 11999
x-ms-correlation-request-id: 41f7ef85-f31e-4db7-87ef-115e3ca65b93
x-ms-routing-request-id: CHINAEAST:20211022T200018Z:ba3bc1ce-c081-4895-a292-beeeb6eb22cc
Cache-Control: no-cache
Date: Fri, 22 Oct 2021 20:00:18 GMT
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
{
"value": [
{
"properties": {
"objectType": "AzureBackupDiscreteRecoveryPoint",
"recoveryPointId": "eb006fde78cb47198be5a320fbe45e9b",
"recoveryPointTime": "2021-10-21T16:31:16.8316716Z",
"recoveryPointType": "Full",
"friendlyName": "794ead7c7661410da03997d210d469e7",
"recoveryPointDataStoresDetails": [
{
"id": "9ea7eaf4-eeb8-4c8f-90a7-7f04b60bf075",
"type": "VaultStore",
"creationTime": "2021-10-21T16:31:16.8316716Z",
"expiryTime": "2022-10-21T16:31:16.8316716Z",
"metaData": null,
"visible": true,
"state": "COMMITTED",
"rehydrationExpiryTime": null,
"rehydrationStatus": null
}
],
"retentionTagName": "Default",
"retentionTagVersion": "637212748405148394",
"policyName": "osspol3",
"policyVersion": null
},
从上述列表中选择相关恢复点,并继续准备还原请求。 我们将从上述列表中选择一个名为 794ead7c7661410da03997d210d469e7 的恢复点进行还原。
准备还原请求
还原为文件
如上详述,在分配了权限的存储帐户中提取容器的 URI。 例如,具有不同订阅的存储帐户 testcontainerrestore
下名为 testossstorageaccount
的容器。
"https://testossstorageaccount.blob.core.chinacloudapi.cn/testcontainerrestore"
{
"objectType": "ValidateRestoreRequestObject",
"restoreRequestObject": {
"objectType": "AzureBackupRecoveryPointBasedRestoreRequest",
"sourceDataStoreType": "VaultStore",
"restoreTargetInfo": {
"targetDetails": {
"url": "https://testossstorageaccount.blob.core.chinacloudapi.cn/testcontainerrestore",
"filePrefix": "testprefix",
"restoreTargetLocationType": "AzureBlobs"
},
"restoreLocation": "chinanorth2",
"recoveryOption": "FailIfExists",
"objectType": "RestoreFilesTargetInfo"
},
"recoveryPointId": "eb006fde78cb47198be5a320fbe45e9b"
}
}
验证还原请求
准备好请求正文后,使用验证还原 API 对其进行验证。 与验证备份 API 一样,这是一个 POST 操作。
POST https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DataProtection/backupVaults/{vaultName}/backupInstances/{backupInstanceName}/validateRestore?api-version=2021-07-01
例如,此 API 转换为:
POST "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/testBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupInstances/pgflextestserver-857d23b1-c679-4c94-ade6-c4d34635e149/ValidateRestore?api-version=2021-07-01"
详细了解此 POST API 的请求正文。
验证还原请求的响应:
验证还原请求是一个异步操作。 因此,此操作会创建另一个你需要单独跟踪的操作。 它返回两个响应:创建另一个操作时返回“202 (已接受)”。 然后,在该操作完成时显示“200 (正常)”。 |名称 |类型 |说明 | |--- |--- |--- | | 200 正常 | |验证请求的状态 | | 202 已接受 | |接受 |
还原验证请求的示例响应:
提交 POST 作后,它将返回初始响应为 202 (已接受),其中包含标头 Azure-asyncOperation
。
HTTP/1.1 202 Accepted
Content-Length: 0
Expires: -1
Pragma: no-cache
Retry-After: 10
Azure-AsyncOperation: https://management.chinacloudapi.cn/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/providers/Microsoft.DataProtection/locations/chinanorth2/operationStatus/ZmMzNDFmYWMtZWJlMS00NGJhLWE4YTgtMDNjYjI4Y2M5OTExOzVlNzMxZDBiLTQ3MDQtNDkzNS1hYmNjLWY4YWEzY2UzNTk1ZQ==?api-version=2021-07-01
X-Content-Type-Options: nosniff
x-ms-request-id:
Strict-Transport-Security: max-age=31536000; includeSubDomains
x-ms-ratelimit-remaining-subscription-writes: 1199
x-ms-correlation-request-id: bae60c92-669d-45a4-aed9-8392cca7cc8d
x-ms-routing-request-id: CHINANORTH2:20210708T205935Z:f51db7a4-9826-4084-aa3b-ae640dc78af6
Cache-Control: no-cache
Date: Thu, 08 Jul 2021 20:59:35 GMT
Location: https://management.chinacloudapi.cn/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/providers/Microsoft.DataProtection/locations/chinanorth2/operationResults/ZmMzNDFmYWMtZWJlMS00NGJhLWE4YTgtMDNjYjI4Y2M5OTExOzVlNzMxZDBiLTQ3MDQtNDkzNS1hYmNjLWY4YWEzY2UzNTk1ZQ==?api-version=2021-07-01
X-Powered-By: ASP.NET
使用简单的 GETAzure-AsyncOperation
请求跟踪 标头。 请求成功后,它将返回 状态响应为 200 (正常)。
GET https://management.chinacloudapi.cn/subscriptions/e3d2d341-4ddb-4c5d-9121-69b7e719485e/providers/Microsoft.DataProtection/locations/chinanorth2/operationStatus/YWJjMGRmMzQtNTY1NS00MGMyLTg4YmUtMTUyZDE3ZjdiNzMyOzY4NDNmZWZkLWU4ZTMtNDM4MC04ZTJhLWUzMTNjMmNhNjI1NA==?api-version=2021-07-01
{
"id": "/subscriptions/e3d2d341-4ddb-4c5d-9121-69b7e719485e/providers/Microsoft.DataProtection/locations/chinanorth2/operationStatus/YWJjMGRmMzQtNTY1NS00MGMyLTg4YmUtMTUyZDE3ZjdiNzMyOzY4NDNmZWZkLWU4ZTMtNDM4MC04ZTJhLWUzMTNjMmNhNjI1NA==",
"name": "YWJjMGRmMzQtNTY1NS00MGMyLTg4YmUtMTUyZDE3ZjdiNzMyOzY4NDNmZWZkLWU4ZTMtNDM4MC04ZTJhLWUzMTNjMmNhNjI1NA==",
"status": "Inprogress",
"startTime": "2021-10-22T20:22:41.0305623Z",
"endTime": "0001-01-01T00:00:00Z"
}
如果出现问题,响应指示在提交还原请求之前必须解决的错误。 在我们修复了错误并重新验证了请求后,“200 (正常)”将返回一个成功的响应。
HTTP/1.1 200 OK
Content-Length: 443
Content-Type: application/json
Expires: -1
Pragma: no-cache
X-Content-Type-Options: nosniff
x-ms-request-id:
Strict-Transport-Security: max-age=31536000; includeSubDomains
x-ms-ratelimit-remaining-subscription-reads: 11999
x-ms-correlation-request-id: 61d62dd8-8e1a-473c-bcc6-c6a7a19fb035
x-ms-routing-request-id: CHINAEAST:20211022T203846Z:89af04a6-4e91-4b64-8998-a369dc763408
Cache-Control: no-cache
Date: Fri, 22 Oct 2021 20:38:46 GMT
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
{
"id": "/subscriptions/e3d2d341-4ddb-4c5d-9121-69b7e719485e/providers/Microsoft.DataProtection/locations/chinanorth2/operationStatus/YWJjMGRmMzQtNTY1NS00MGMyLTg4YmUtMTUyZDE3ZjdiNzMyOzU0NDI4YzdhLTJjNWEtNDNiOC05ZjBjLTM2NmQ3ZWVjZDUxOQ==",
"name": "YWJjMGRmMzQtNTY1NS00MGMyLTg4YmUtMTUyZDE3ZjdiNzMyOzU0NDI4YzdhLTJjNWEtNDNiOC05ZjBjLTM2NmQ3ZWVjZDUxOQ==",
"status": "Succeeded",
"startTime": "2021-10-22T20:28:24.3820169Z",
"endTime": "2021-10-22T20:28:49Z"
}
触发还原请求
触发器还原操作是一个POST API。 详细了解触发还原操作。
POST https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DataProtection/backupVaults/{vaultName}/backupInstances/{backupInstanceName}/restore?api-version=2021-07-01
例如,此 API 转换为:
POST "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/testBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupInstances/testpostgresql-empdb11-957d23b1-c679-4c94-ade6-c4d34635e149/restore?api-version=2021-07-01"
创建还原操作的请求正文
验证请求后,使用稍作修改的相同请求正文来执行 *还原请求。
触发还原请求的响应:
触发还原请求是一个异步操作。 因此,此操作会创建另一个需要单独跟踪的操作。
它返回两个响应:创建另一个操作时返回“202 (已接受)”。 然后,在该操作完成时显示“200 (正常)”。
名称 | 类型 | DESCRIPTION |
---|---|---|
200 正常 | 还原请求的状态 | |
202 已接受 | 已接受 |
触发还原请求的示例响应:
提交 POST 操作后,它将返回初始响应 202(已接受),带有 Azure-asyncOperation
标头。
HTTP/1.1 202 Accepted
Content-Length: 0
Expires: -1
Pragma: no-cache
Retry-After: 30
Azure-AsyncOperation: https://management.chinacloudapi.cn/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/providers/Microsoft.DataProtection/locations/chinanorth2/operationStatus/ZmMzNDFmYWMtZWJlMS00NGJhLWE4YTgtMDNjYjI4Y2M5OTExO2Q1NDIzY2VjLTczYjYtNDY5ZC1hYmRjLTc1N2Q0ZTJmOGM5OQ==?api-version=2021-07-01
X-Content-Type-Options: nosniff
x-ms-request-id:
Strict-Transport-Security: max-age=31536000; includeSubDomains
x-ms-ratelimit-remaining-subscription-writes: 1197
x-ms-correlation-request-id: 8661209c-5b6a-44fe-b676-4e2b9c296593
x-ms-routing-request-id: CHINANORTH2:20210708T204652Z:69e3fa4b-c5d9-4601-9410-598006ada187
Cache-Control: no-cache
Date: Thu, 08 Jul 2021 20:46:52 GMT
Location: https://management.chinacloudapi.cn/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/providers/Microsoft.DataProtection/locations/chinanorth2/operationResults/ZmMzNDFmYWMtZWJlMS00NGJhLWE4YTgtMDNjYjI4Y2M5OTExO2Q1NDIzY2VjLTczYjYtNDY5ZC1hYmRjLTc1N2Q0ZTJmOGM5OQ==?api-version=2021-07-01
X-Powered-By: ASP.NET
使用简单的 GETAzure-AsyncOperation
请求跟踪 标头。 请求成功后,将返回状态码200(成功),并包含需进一步跟踪以完成还原请求的作业ID。
GET https://management.chinacloudapi.cn/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/providers/Microsoft.DataProtection/locations/chinanorth2/operationStatus/ZmMzNDFmYWMtZWJlMS00NGJhLWE4YTgtMDNjYjI4Y2M5OTExO2Q1NDIzY2VjLTczYjYtNDY5ZC1hYmRjLTc1N2Q0ZTJmOGM5OQ==?api-version=2021-07-01
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/providers/Microsoft.DataProtection/locations/chinanorth2/operationStatus/ZmMzNDFmYWMtZWJlMS00NGJhLWE4YTgtMDNjYjI4Y2M5OTExO2Q1NDIzY2VjLTczYjYtNDY5ZC1hYmRjLTc1N2Q0ZTJmOGM5OQ==",
"name": "ZmMzNDFmYWMtZWJlMS00NGJhLWE4YTgtMDNjYjI4Y2M5OTExO2Q1NDIzY2VjLTczYjYtNDY5ZC1hYmRjLTc1N2Q0ZTJmOGM5OQ==",
"status": "Succeeded",
"startTime": "2021-07-08T20:46:52.4110868Z",
"endTime": "2021-07-08T20:46:56Z",
"properties": {
"jobId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/TestBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupJobs/c4bd49a1-0645-4eec-b207-feb818962852",
"objectType": "OperationJobExtendedInfo"
}
}
跟踪作业
触发还原请求会触发还原作业。 若要跟踪生成的作业 ID,请使用 GET Jobs API。
GET /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/TestBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupJobs/c4bd49a1-0645-4eec-b207-feb818962852?api-version=2021-07-01
上面提到的作业状态指示还原作业已完成。