使用 Azure CLI 备份 PostgreSQL 数据库

本文介绍如何使用 Azure CLI 在 Azure 虚拟机 中备份 PostgreSQL 数据库。 还可以使用 Azure 门户Azure PowerShell 和适用于 PostgreSQL 数据库的 REST API 配置备份。

详细了解 支持的方案和 备份 Azure Database for PostgreSQL 的 常见问题

创建备份保管库

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

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

在本文中,您将在TestBkpVault区域的资源组westus下创建一个名为testBkpVaultRG的备份保管库。 使用 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": "aaaaaaaa-bbbb-cccc-1111-222222222222",
    "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"
}

创建备份策略

创建保管库后,可以创建备份策略来帮助保护 PostgreSQL 数据库。 还可以 使用 REST API 为 PostgreSQL 数据库创建备份策略

了解 PostgreSQL 备份策略

尽管磁盘备份每天提供多个备份,且 Blob 备份是无需触发的连续备份,PostgreSQL 备份则提供存档保护。 首次发送到保管库的备份数据可以按照定义的规则或生命周期移动到存档层。

在此上下文中,以下层次结构可帮助你了解 PostgreSQL 的备份策略对象:

  • 策略规则
    • 备份规则
      • 备份参数
        • 备份类型(在本例中为完整数据库备份)
        • 初始数据存储(备份最初到达的位置)
        • 触发器(如何触发备份)
          • 时间表
          • 默认标记条件(将所有计划备份链接到保留规则的默认标记)
    • 默认保留规则(默认应用于初始数据存储上的所有备份的规则)

策略对象定义备份的类型、触发的方式(通过计划)、为备份增加的标签、备份存放的位置(数据存储)以及其在数据存储中的生命周期。

PostgreSQL 的默认 PowerShell 对象表示每周触发 完整 备份。 备份会到达保管库,并将在那里存储三个月。

如果要将存档层添加到策略,则必须确定数据何时从保管库移动到存档,数据将保留在存档中的时长,以及应将计划备份中的哪一个标记为可存档。 必须添加一个保留规则,该规则定义从保管库数据存储到存档数据存储的备份数据的生命周期。 保留规则还定义了备份数据将保留在存档数据存储中的时长。 然后,需要添加一个标记,将计划备份标记为符合存档条件。

生成的 PowerShell 对象如下所示:

  • 策略规则
    • 备份规则
      • 备份参数
        • 备份类型(在本例中为完整数据库备份)
        • 初始数据存储(备份最初到达的位置)
        • 触发器(如何触发备份)
          • 时间表
          • 默认标记条件(将所有计划备份链接到保留规则的默认标记)
          • 同名新保留规则的新标记条件
    • 默认保留规则(默认应用于初始数据存储上的所有备份的规则)
    • 新的保留规则
      • 生命周期
        • 源数据存储
        • 源数据存储中删除的时间段
        • 复制到目标数据存储

检索策略模板

若要了解 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"
    }
  ]
}

策略模板由触发器(决定哪些触发器触发备份)和生命周期(决定何时删除、复制或移动备份)组成。 在 PostgreSQL 数据库备份中,触发器的默认值是计划的每周触发器(每七天一次备份)。 每个备份将保留三个月。

定时触发

"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 ,间隔类型为 Weekly

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 该命令。

以下示例创建一个名为Monthly的新保留规则。 在此规则中,每月第一次成功备份将保留在保管库中六个月,然后移至档案层,并在档案层保留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

添加标记和相关条件

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

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

在此示例中,标记条件被命名为 Monthly:

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

配置备份

创建保管库和策略后,需要考虑三个关键点,以便在 Azure Database for PostgreSQL 中备份 PostgreSQL 数据库。

了解关键实体

要备份的 PostgreSQL 数据库

提取要备份的 PostgreSQL 数据库的资源管理器 ID。 此 ID 充当数据库的标识符。 以下示例使用在 PostgreSQL 服务器empdb11下命名testposgresql的数据库,该数据库位于不同订阅下的资源组ossrg中。 此示例使用 Bash。

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

密钥保管库

Azure 备份服务不存储用于连接到 PostgreSQL 数据库的用户名和密码。 相反,备份管理员将密钥放入密钥保管库。 然后,Azure 备份服务访问密钥保管库、读取密钥并访问数据库。

以下示例使用 Bash。 请注意相关密钥的机密标识符。

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

备份保管库

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

请阅读有关应在 PostgreSQL 服务器和存储数据库密钥的密钥保管库上授予备份保管库的托管标识的权限

准备请求

设置所有相关权限后,执行两个步骤中的备份配置:

  1. 使用相关保管库、策略、PostgreSQL 数据库通过 az dataprotection backup-instance initialize 命令准备请求。
  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 文件。 在下面的示例中,有两个保留规则的名称 DefaultMonthly。 本文使用 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