你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure CLI 备份 Azure PostgreSQL 数据库

本文介绍如何使用 Azure CLI 备份 Azure PostgreSQL 数据库

本文将指导如何进行以下操作:

  • 创建备份保管库
  • 创建备份策略
  • 配置 Azure PostgreSQL 数据库备份
  • 运行按需备份作业

有关 informgreSQL 数据库支持的方案和限制的信息,请参阅支持矩阵

创建备份保管库

备份保管库是 Azure 中的存储实体。 它存储 Azure 备份支持的新工作负荷的备份数据。 例如,Azure Database for PostgreSQL 服务器、存储帐户中的 Blob,以及 Azure 磁盘。 备份保管库帮助组织备份数据,并最大限度降低管理开销。 备份保管库基于 Azure 的 Azure 资源管理器型号,提供增强的功能来帮助保护备份数据。

在创建备份保管库之前,请选择保管库数据的存储冗余。 然后继续使用该存储冗余和位置创建备份保管库。

在本文中,我们将在资源组 testBkpVaultRG 下,在 westus 区域创建备份保管库 TestBkpVault。 使用 az dataprotection vault create 命令创建备份保管库。 详细了解创建备份保管库

az dataprotection backup-vault create -g testBkpVaultRG --vault-name TestBkpVault -l westus --type SystemAssigned --storage-settings datastore-type="VaultStore" type="LocallyRedundant"

{
  "eTag": null,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/testBkpVaultRG/providers/Microsoft.DataProtection/BackupVaults/TestBkpVault",
  "identity": {
    "principalId": "2ca1d5f7-38b3-4b61-aa45-8147d7e0edbc",
    "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "type": "SystemAssigned"
  },
  "location": "westus",
  "name": "TestBkpVault",
  "properties": {
    "provisioningState": "Succeeded",
    "storageSettings": [
      {
        "datastoreType": "VaultStore",
        "type": "LocallyRedundant"
      }
    ]
  },
  "resourceGroup": "testBkpVaultRG",
  "systemData": null,
  "tags": null,
  "type": "Microsoft.DataProtection/backupVaults"
}

创建保管库后,我们创建一个备份策略来保护 Azure PostgreSQL 数据库。

创建备份策略

了解 PostGreSQL 备份策略

尽管磁盘备份每天提供多个备份,而 Blob 备份是无触发器的连续备份,但 PostgreSQL 备份提供存档保护。 第一次发送到保管库的备份数据可以按照定义的规则或生命周期移动到存档层。 在此上下文中,让我们了解 PostgreSQL 的备份策略对象。

  • PolicyRule
    • BackupRule
      • BackupParameter
        • BackupType(在本例中为完整数据库备份)
        • 初始数据存储(备份初始登陆位置)
        • 触发器(如何触发备份)
          • 基于计划
          • 默认标记条件(一个默认“标记”用于所有计划的备份。此标记将备份链接到保留期规则)
    • 默认保留规则(该规则默认应用于初始数据存储上的所有备份)

因此,此对象定义触发哪些类型的备份、如何触发备份(通过计划)、它们的标签是什么、它们在何处登陆(数据存储),以及数据存储中备份数据的生命周期。 PostgreSQL 的默认 PowerShell 对象指示每周触发一次完整备份,它们将访问保管库(它们将在其中存储三个月)。

如果要将存档层添加到策略,必须决定数据何时从保管库移动到存档、数据在存档中保留多久,以及哪些计划备份应标记为“可存档”。 因此,必须添加保留规则,其中备份数据的生命周期定义为从保管库数据存储到存档数据存储以及备份数据在存档数据存储中的保留时间。 然后,需要添加一个标记,用于将计划备份标记为“符合存档条件”。

生成的 PowerShell 对象如下所示:

  • PolicyRule
    • BackupRule
      • BackupParameter
        • BackupType(在本例中为完整数据库备份)
        • 初始数据存储(备份初始登陆位置)
        • 触发器(如何触发备份)
          • 基于计划
          • 默认标记条件(一个默认“标记”用于所有计划的备份。此标记将备份链接到保留期规则)
          • 同名“X”的新保留规则的新标记条件
    • 默认保留规则(该规则默认应用于初始数据存储上的所有备份)
    • 名为“X”的新保留规则
      • 生命周期
        • 源数据存储
        • 一段时间后在源数据存储中删除
        • 复制到目标数据存储

检索策略模板

若要了解 Azure PostgreSQL 数据库备份的备份策略的内部组件,请使用 az dataprotection backup-policy get-default-policy-template 命令来检索策略模板。 此命令返回给定数据源类型的默认策略模板。 使用此策略模板创建新策略。

az dataprotection backup-policy get-default-policy-template --datasource-type AzureDatabaseForPostgreSQL
{
  "datasourceTypes": [
    "Microsoft.DBforPostgreSQL/servers/databases"
  ],
  "name": "OssPolicy1",
  "objectType": "BackupPolicy",
  "policyRules": [
    {
      "backupParameters": {
        "backupType": "Full",
        "objectType": "AzureBackupParams"
      },
      "dataStore": {
        "dataStoreType": "VaultStore",
        "objectType": "DataStoreInfoBase"
      },
      "name": "BackupWeekly",
      "objectType": "AzureBackupRule",
      "trigger": {
        "objectType": "ScheduleBasedTriggerContext",
        "schedule": {
          "repeatingTimeIntervals": [
            "R/2021-08-15T06:30:00+00:00/P1W"
          ],
          "timeZone": "UTC"
        },
        "taggingCriteria": [
          {
            "isDefault": true,
            "tagInfo": {
              "id": "Default_",
              "tagName": "Default"
            },
            "taggingPriority": 99
          }
        ]
      }
    },
    {
      "isDefault": true,
      "lifecycles": [
        {
          "deleteAfter": {
            "duration": "P3M",
            "objectType": "AbsoluteDeleteOption"
          },
          "sourceDataStore": {
            "dataStoreType": "VaultStore",
            "objectType": "DataStoreInfoBase"
          },
          "targetDataStoreCopySettings": []
        }
      ],
      "name": "Default",
      "objectType": "AzureRetentionRule"
    }
  ]
}

策略模板由触发器(决定备份的触发因素)和生命周期(决定删除/复制/移动备份的时间)。 在 Azure PostgreSQL 数据库备份中,触发器的默认值是计划每周触发一次(每 7 天备份 1 次)且每个备份保留三个月。

定时触发:

"trigger": {
        "objectType": "ScheduleBasedTriggerContext",
        "schedule": {
          "repeatingTimeIntervals": [
            "R/2021-08-15T06:30:00+00:00/P1W"
          ],
          "timeZone": "UTC"
        }

默认保留生命周期:

 {
      "isDefault": true,
      "lifecycles": [
        {
          "deleteAfter": {
            "duration": "P3M",
            "objectType": "AbsoluteDeleteOption"
          },
          "sourceDataStore": {
            "dataStoreType": "VaultStore",
            "objectType": "DataStoreInfoBase"
          },
          "targetDataStoreCopySettings": []
        }
      ],
      "name": "Default",
      "objectType": "AzureRetentionRule"
    }

修改策略模板

重要

在 Azure PowerShell 中,对象可以用作执行所有修改的暂存位置。 在 Azure CLI 中,我们必须使用文件,因为不存在对象的概念。 每个编辑操作都应重定向到新文件,其中的内容从输入文件读取,然后重新定向到输出文件。 稍后在脚本中使用时,可以按要求重命名文件。

修改计划

默认策略模板每周提供一次备份。 可以将备份计划修改为每周发生多天。 若要修改计划,请使用 az dataprotection backup-policy trigger set 命令。

以下示例将每周备份修改为每周的星期日、星期三和星期五进行备份。 计划日期数组提及日期,这些日期的星期几将视为一周中的几天。 还需要指定这些计划应每周重复一次。 因此,计划间隔为“1”,间隔类型为“每周”。

az dataprotection backup-policy trigger create-schedule --interval-type Weekly --interval-count 1 --schedule-days 2021-08-15T22:00:00 2021-08-18T22:00:00 2021-08-20T22:00:00
[
  "R/2021-08-15T22:00:00+00:00/P1W",
  "R/2021-08-18T22:00:00+00:00/P1W",
  "R/2021-08-20T22:00:00+00:00/P1W"
]

az dataprotection backup-policy trigger set --policy .\OSSPolicy.json  --schedule R/2021-08-15T22:00:00+00:00/P1W R/2021-08-18T22:00:00+00:00/P1W R/2021-08-20T22:00:00+00:00/P1W > EditedOSSPolicy.json

添加新保留规则

如果要添加存档保护,则需要修改策略模板,如下所示。

默认模板将具有默认保留规则下的初始数据存储的生命周期。 在此方案中,规则指出在三个月后删除备份数据。 应添加一个新的保留规则,用于定义何时将数据移动到存档数据存储,即备份数据首先复制到存档数据存储,然后在保管库数据存储中删除。 此外,规则应定义数据在存档数据存储中的保留时间。 使用 az dataprotection backup-policy retention-rule create-lifecycle 命令创建新生命周期,并使用 az dataprotection backup-policy retention-rule set 命令将它们与新规则或现有规则关联。

以下示例创建名为“每月”的新保留规则,其中每月的第一次成功备份应在保管库中保留六个月,然后移至存档层,并保留在存档层 24 个月。

az dataprotection backup-policy retention-rule create-lifecycle --retention-duration-count 6 --retention-duration-type Months --source-datastore VaultStore --target-datastore ArchiveStore --copy-option CopyOnExpiryOption > VaultToArchiveLifeCycle.JSON

az dataprotection backup-policy retention-rule create-lifecycle --retention-duration-count 24 --retention-duration-type Months -source-datastore ArchiveStore > OnArchiveLifeCycle.JSON

az dataprotection backup-policy retention-rule set --lifecycles .\VaultToArchiveLifeCycle.JSON .\OnArchiveLifeCycle.JSON --name Monthly --policy .\EditedOSSPolicy.JSON > AddedRetentionRulePolicy.JSON

添加标记和相关条件

创建保留规则后,你必须在备份策略的“触发器”属性中创建相应的标记。 使用 az dataprotection backup-policy tag create-absolute-criteria 命令创建新的标记条件,并使用 az dataprotection backup-policy tag set 命令更新现有标记或创建新标记。

以下示例将创建一个新标记和条件,这是当月的第一个成功备份。 标记与要应用的相应保留规则同名。

本例中的标记条件应命名为“每月”。

az dataprotection backup-policy tag create-absolute-criteria --absolute-criteria FirstOfMonth > tagCriteria.JSON
az dataprotection backup-policy tag set --criteria .\tagCriteria.JSON --name Monthly --policy .\AddedRetentionRulePolicy.JSON > AddedRetentionRuleAndTag.JSON

如果计划是每周(每个星期日、星期三、星期四,如上面示例所述)进行多次备份,并且你想要存档星期日和星期五的备份,则标记条件可以使用 az dataprotection backup-policy tag create-generic-criteria 进行如下更改。

az dataprotection backup-policy tag create-generic-criteria --days-of-week Sunday Friday > tagCriteria.JSON
az dataprotection backup-policy tag set --criteria .\tagCriteria.JSON --name Monthly --policy .\AddedRetentionRulePolicy.JSON > AddedRetentionRuleAndTag.JSON

创建新的 PostgreSQL 备份策略

根据要求修改模板后,使用 az dataprotection backup-policy create 命令来通过修改后的模板创建策略。

az dataprotection backup-policy create --backup-policy-name FinalOSSPolicy --policy AddedRetentionRuleAndTag.JSON --resource-group testBkpVaultRG --vault-name TestBkpVault

配置备份

创建保管库和策略后,需要考虑 3 个关键点来保护 Azure PostgreSQL 数据库。

所涉关键实体

要保护的 PostGreSQL 数据库

提取需要保护的 PostgreSQL 的 Azure 资源管理器 ID (ARM ID)。 它充当数据库的标识符。 我们将使用 PostgreSQL 服务器“testposgresql”下名为“empdb11”的数据库示例,该数据库位于另一订阅下的资源组“ossrg”中。

下面的示例使用 bash。

ossId="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx/resourcegroups/ossrg/providers/Microsoft.DBforPostgreSQL/servers/archive-postgresql-ccy/databases/empdb11"

Azure Key Vault

Azure 备份服务不存储用于连接到 PostgreSQL 数据库的用户名和密码。 备份管理员而需将密钥播种到密钥保管库中。 然后备份服务将访问密钥保管库、读取密钥并访问数据库。 请注意相关密钥的机密标识符。

下面的示例使用 bash。

keyURI="https://testkeyvaulteus.vault.azure.net/secrets/ossdbkey"

备份保管库

备份保管库必须连接到 PostgreSQL 服务器,然后通过密钥保管库中的密钥访问数据库。 因此,它需要访问 PostgreSQL 服务器和密钥保管库。 向备份保管库的托管服务标识 (MSI) 授予访问权限。

请查看应在 PostgreSQL 服务器和 Azure Key Vault(其中存储了数据库密钥)上授予备份保管库的托管服务标识 (MSI) 的权限

准备请求

一旦设置了所有相关的权限,就可以分 2 步执行备份配置。

  1. 首先,我们使用相关保管库、策略、使用 az dataprotection backup-instance initialize 命令的 PostgreSQL 数据库来准备相关请求。
  2. 然后,使用 az dataprotection backup-instance create 命令提交数据库保护请求。
az dataprotection backup-instance initialize --datasource-id $ossId --datasource-type AzureDatabaseForPostgreSQL -l <vault-location> --policy-id <policy_arm_id>  --secret-store-type AzureKeyVault --secret-store-uri $keyURI > OSSBkpInstance.JSON

az dataprotection backup-instance create --resource-group testBkpVaultRG --vault-name TestBkpVault TestBkpvault --backup-instance .\OSSBkpInstance.JSON

运行按需备份

触发备份时,必须指定保留规则。 若要查看策略保留规则,请导航策略保留规则的 JSON 文件。 在下面的示例中,有两个保留规则,其名称为“Default”和“Monthly”。 我们将使用“Monthly”规则进行按需备份。

az dataprotection backup-policy show  -g ossdemorg --vault-name ossdemovault-1 --subscription e3d2d341-4ddb-4c5d-9121-69b7e719485e --name osspol5
{
  "id": "/subscriptions/e3d2d341-4ddb-4c5d-9121-69b7e719485e/resourceGroups/ossdemorg/providers/Microsoft.DataProtection/backupVaults/ossdemovault-1/backupPolicies/osspol5",
  "name": "osspol5",
  "properties": {
    "datasourceTypes": [
      "Microsoft.DBforPostgreSQL/servers/databases"
    ],
    "objectType": "BackupPolicy",
    "policyRules": [
      {
        "backupParameters": {
          "backupType": "Full",
          "objectType": "AzureBackupParams"
        },
        "dataStore": {
          "dataStoreType": "VaultStore",
          "objectType": "DataStoreInfoBase"
        },
        "name": "BackupWeekly",
        "objectType": "AzureBackupRule",
        "trigger": {
          "objectType": "ScheduleBasedTriggerContext",
          "schedule": {
            "repeatingTimeIntervals": [
              "R/2020-04-04T20:00:00+00:00/P1W",
              "R/2020-04-01T20:00:00+00:00/P1W"
            ],
            "timeZone": "UTC"
          },
          "taggingCriteria": [
            {
              "criteria": [
                {
                  "absoluteCriteria": [
                    "FirstOfMonth"
                  ],
                  "daysOfMonth": null,
                  "daysOfTheWeek": null,
                  "monthsOfYear": null,
                  "objectType": "ScheduleBasedBackupCriteria",
                  "scheduleTimes": null,
                  "weeksOfTheMonth": null
                }
              ],
              "isDefault": false,
              "tagInfo": {
                "eTag": null,
                "id": "Monthly_",
                "tagName": "Monthly"
              },
              "taggingPriority": 15
            },
            {
              "criteria": null,
              "isDefault": true,
              "tagInfo": {
                "eTag": null,
                "id": "Default_",
                "tagName": "Default"
              },
              "taggingPriority": 99
            }
          ]
        }
      },
      {
        "isDefault": false,
        "lifecycles": [
          {
            "deleteAfter": {
              "duration": "P10Y",
              "objectType": "AbsoluteDeleteOption"
            },
            "sourceDataStore": {
              "dataStoreType": "VaultStore",
              "objectType": "DataStoreInfoBase"
            },
            "targetDataStoreCopySettings": []
          }
        ],
        "name": "Monthly",
        "objectType": "AzureRetentionRule"
      },
      {
        "isDefault": true,
        "lifecycles": [
          {
            "deleteAfter": {
              "duration": "P1Y",
              "objectType": "AbsoluteDeleteOption"
            },
            "sourceDataStore": {
              "dataStoreType": "VaultStore",
              "objectType": "DataStoreInfoBase"
            },
            "targetDataStoreCopySettings": []
          }
        ],
        "name": "Default",
        "objectType": "AzureRetentionRule"
      }
    ]
  },
  "resourceGroup": "ossdemorg",
  "systemData": null,
  "type": "Microsoft.DataProtection/backupVaults/backupPolicies"
}

若要触发按需备份,请使用 az dataprotection backup-instance adhoc-backup 命令。

az dataprotection backup-instance adhoc-backup --name "ossrg-empdb11" --rule-name "Monthly" --resource-group testBkpVaultRG --vault-name TestBkpVault

跟踪作业

使用 az dataprotection job list 命令跟踪所有作业。 你可以列出所有作业并提取特定作业详细信息。

还可使用 Az.ResourceGraph 来跟踪所有备份保管库中的所有作业。 使用 az dataprotection job list-from-resourcegraph 命令获取跨所有备份保管库的相关作业。

az dataprotection job list-from-resourcegraph --datasource-type AzureDatabaseForPostgreSQL --status Completed

后续步骤