备份和恢复数据库

您可以使用数据库服务备份数据库并将备份工件存储在对象存储服务中。之后,如果原始数据库损坏,您可以使用备份工件来恢复数据库。恢复过程会创建一个新的数据库实例。

备份数据存储在 OpenStack Swift 中,用户可以自定义将数据存储在哪个容器中。以下方式按优先级从高到低描述:

  1. 在创建备份时可以指定容器名称,这可以覆盖备份策略设置或 Trove 配置中的默认设置。

  2. 用户可以为项目范围或特定实例创建备份策略。

  3. 如果最终用户未进行配置,将使用 Trove 配置中的默认值。

警告

如果手动删除了备份容器中的对象,则无法正确恢复数据库。

本示例演示如何创建备份策略、创建备份以及从备份恢复实例。

  1. 创建备份之前

    1. 确保您已创建实例,例如,在本示例中,我们使用以下实例:

      $ openstack database instance list
      +--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+-------------------------------------------------------------------------------------------------+-----------+------+------+
      | ID                                   | Name   | Datastore | Datastore Version | Status | Operating Status | Public | Addresses                                                                                       | Flavor ID | Size | Role |
      +--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+-------------------------------------------------------------------------------------------------+-----------+------+------+
      | 78e338e3-d1c4-4189-8ea7-bfc1fab5011f | mysql1 | mysql     | 8.0.29            | ACTIVE | HEALTHY          | False  | [{'address': '10.0.0.9', 'type': 'private', 'network': '33f3a589-b806-4212-9a59-8e058cac0699'}] | d2        |    1 |      |
      +--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+-------------------------------------------------------------------------------------------------+-----------+------+------+
      
    2. 可选地,为实例创建一个备份策略。您还可以在创建备份时指定不同的 swift 容器名称 (--swift-container)。

      $ openstack database backup strategy create --instance-id 78e338e3-d1c4-4189-8ea7-bfc1fab5011f --swift-container my-trove-backups
      +-----------------+--------------------------------------+
      | Field           | Value                                |
      +-----------------+--------------------------------------+
      | backend         | swift                                |
      | instance_id     | 78e338e3-d1c4-4189-8ea7-bfc1fab5011f |
      | project_id      | fc51186c63df417ea63cec6c65a2d564     |
      | swift_container | my-trove-backups                     |
      +-----------------+--------------------------------------+
      
  2. 备份数据库实例

    使用 openstack database backup create 命令备份数据库实例。在本示例中,备份名为 mysql-backup-name1

    $ openstack database backup create mysql-backup-name1 --instance mysql1 --swift-container 'my-trove-backups'
    +----------------------+--------------------------------------+
    | Field                | Value                                |
    +----------------------+--------------------------------------+
    | created              | 2022-10-24T01:46:38                  |
    | datastore            | mysql                                |
    | datastore_version    | 8.0.29                               |
    | datastore_version_id | 324f2bdf-6099-4754-a5f9-82abee026a19 |
    | description          | None                                 |
    | id                   | 1ecd0a75-e4aa-400b-b0c8-cb738944fd43 |
    | instance_id          | 78e338e3-d1c4-4189-8ea7-bfc1fab5011f |
    | locationRef          | None                                 |
    | name                 | mysql-backup-name1                   |
    | parent_id            | None                                 |
    | project_id           | fc51186c63df417ea63cec6c65a2d564     |
    | size                 | None                                 |
    | status               | NEW                                  |
    | updated              | 2022-10-24T01:46:38                  |
    +----------------------+--------------------------------------+
    

    稍后,使用 openstack database backup list 命令或 openstack database backup show 命令来检查备份状态

    $ openstack database backup list
    +--------------------------------------+--------------------------------------+------------------------------+-----------+--------------------------------------+---------------------+----------------------------------+
    | ID                                   | Instance ID                          | Name                         | Status    | Parent ID                            | Updated             | Project ID                       |
    +--------------------------------------+--------------------------------------+------------------------------+-----------+--------------------------------------+---------------------+----------------------------------+
    | 1ecd0a75-e4aa-400b-b0c8-cb738944fd43 | 78e338e3-d1c4-4189-8ea7-bfc1fab5011f | mysql-backup-name1           | COMPLETED | None                                 | 2022-10-24T01:46:55 | fc51186c63df417ea63cec6c65a2d564 |
    +--------------------------------------+--------------------------------------+------------------------------+-----------+--------------------------------------+---------------------+----------------------------------+
    $ openstack database backup show 1ecd0a75-e4aa-400b-b0c8-cb738944fd43
    +----------------------+---------------------------------------------------------------------------------+
    | Field                | Value                                                                           |
    +----------------------+---------------------------------------------------------------------------------+
    | created              | 2022-10-24T01:46:38                                                             |
    | datastore            | mysql                                                                           |
    | datastore_version    | 8.0.29                                                                          |
    | datastore_version_id | 324f2bdf-6099-4754-a5f9-82abee026a19                                            |
    | description          | None                                                                            |
    | id                   | 1ecd0a75-e4aa-400b-b0c8-cb738944fd43                                            |
    | instance_id          | 78e338e3-d1c4-4189-8ea7-bfc1fab5011f                                            |
    | locationRef          | http://172.../my-trove-backups/1ecd0a75-e4aa-400b-b0c8-cb738944fd43.xbstream.gz |
    | name                 | mysql-backup-name1                                                              |
    | parent_id            | None                                                                            |
    | project_id           | fc51186c63df417ea63cec6c65a2d564                                                |
    | size                 | 0.19                                                                            |
    | status               | COMPLETED                                                                       |
    | updated              | 2022-10-24T01:46:55                                                             |
    +----------------------+---------------------------------------------------------------------------------+
    
  3. 检查 Swift 中的备份数据

    检查是否创建了容器,并将备份数据作为对象保存在容器内。

    $ openstack container list
    +------------------+
    | Name             |
    +------------------+
    | my-trove-backups |
    +------------------+
    $ openstack object list my-trove-backups
    +--------------------------------------------------+
    | Name                                             |
    +--------------------------------------------------+
    | 1ecd0a75-e4aa-400b-b0c8-cb738944fd43.xbstream.gz |
    +--------------------------------------------------+
    
  4. 恢复数据库实例

    现在假设 mysql1 数据库实例已损坏,您需要恢复它。在本示例中,您使用 openstack database instance create 命令创建一个名为 mysql2 的新数据库实例。

    • 指定新的 mysql2 实例具有与原始 mysql1 实例相同的 flavor (d2) 和相同的根卷大小 (1)。

    • 使用 --backup 参数指示此新实例基于 ID 为 mysql-backup-name1 的备份工件。

    $ openstack database instance create mysql2 --flavor d2 --nic net-id=$network_id
          --datastore mysql --datastore-version 8.0.29 --datastore-version-number 8.0.29 --size 1 \
          --backup $(openstack database backup show mysql-backup-name1 -f value -c id)
    +--------------------------+--------------------------------------+
    | Field                    | Value                                |
    +--------------------------+--------------------------------------+
    | allowed_cidrs            | []                                   |
    | created                  | 2022-10-24T01:56:55                  |
    | datastore                | mysql                                |
    | datastore_version        | 8.0.29                               |
    | datastore_version_number | 8.0.29                               |
    | encrypted_rpc_messaging  | True                                 |
    | flavor                   | d2                                   |
    | id                       | 62f0f152-8cd5-42b3-9cd6-91bda651a4c0 |
    | name                     | mysql2                               |
    | operating_status         |                                      |
    | public                   | False                                |
    | region                   | RegionOne                            |
    | server_id                | None                                 |
    | service_status_updated   | 2022-10-24T01:56:55                  |
    | status                   | BUILD                                |
    | tenant_id                | fc51186c63df417ea63cec6c65a2d564     |
    | updated                  | 2022-10-24T01:56:55                  |
    | volume                   | 1                                    |
    | volume_id                | None                                 |
    +--------------------------+--------------------------------------+
    
  5. 验证备份

    现在检查新的 mysql2 实例是否具有与原始 mysql1 实例相同的特征。

    首先获取新的 mysql2 实例的 ID。

    $ openstack database instance list
    +--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+--------------------------------------------------------------------------------------------------+-----------+------+------+
    | ID                                   | Name   | Datastore | Datastore Version | Status | Operating Status | Public | Addresses                                                                                        | Flavor ID | Size | Role |
    +--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+--------------------------------------------------------------------------------------------------+-----------+------+------+
    | 6eef378d-1d9c-4e48-b206-b3db130d750d | mysql2 | mysql     | 8.0.29            | ACTIVE | HEALTHY          | False  | [{'address': '10.0.0.8', 'type': 'private', 'network': '33f3a589-b806-4212-9a59-8e058cac0699'}]  | d2        |    1 |      |
    | 78e338e3-d1c4-4189-8ea7-bfc1fab5011f | mysql1 | mysql     | 8.0.29            | ACTIVE | HEALTHY          | False  | [{'address': '10.0.0.18', 'type': 'private', 'network': '33f3a589-b806-4212-9a59-8e058cac0699'}] | d2        |    1 |      |
    +--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+--------------------------------------------------------------------------------------------------+-----------+------+------+
    

    使用 openstack database instance show 命令显示有关新 mysql2 实例的信息。传入 mysql2 的 INSTANCE_ID,即 6eef378d-1d9c-4e48-b206-b3db130d750d

    $ openstack database instance show mysql2
    +--------------------------+-------------------------------------------------------------------------------------------------+
    | Field                    | Value                                                                                           |
    +--------------------------+-------------------------------------------------------------------------------------------------+
    | addresses                | [{'address': '10.0.0.8', 'type': 'private', 'network': '33f3a589-b806-4212-9a59-8e058cac0699'}] |
    | allowed_cidrs            | []                                                                                              |
    | created                  | 2022-10-24T01:58:51                                                                             |
    | datastore                | mysql                                                                                           |
    | datastore_version        | 8.0.29                                                                                          |
    | datastore_version_number | 8.0.29                                                                                          |
    | encrypted_rpc_messaging  | True                                                                                            |
    | flavor                   | d2                                                                                              |
    | id                       | 6eef378d-1d9c-4e48-b206-b3db130d750d                                                            |
    | ip                       | 10.0.0.8                                                                                        |
    | name                     | mysql2                                                                                          |
    | operating_status         | HEALTHY                                                                                         |
    | public                   | False                                                                                           |
    | region                   | RegionOne                                                                                       |
    | server_id                | 7a8cd089-bd1c-4230-aedd-ced4e945ad46                                                            |
    | service_status_updated   | 2022-10-24T02:12:35                                                                             |
    | status                   | ACTIVE                                                                                          |
    | tenant_id                | fc51186c63df417ea63cec6c65a2d564                                                                |
    | updated                  | 2022-10-24T02:05:03                                                                             |
    | volume                   | 1                                                                                               |
    | volume_id                | 7080954f-e22f-4442-8f40-e26aaa080c9d                                                            |
    | volume_used              | 0.19                                                                                            |
    +--------------------------+-------------------------------------------------------------------------------------------------+
    

    请注意,数据存储、flavor ID 和卷大小与原始 mysql1 实例中的值相同。

    使用 openstack database db list 命令检查原始数据库 (db1db2) 是否存在于恢复的实例上。

    $ openstack database db list INSTANCE_ID
    +--------------------+
    |        name        |
    +--------------------+
    |        db1         |
    |        db2         |
    | performance_schema |
    |        test        |
    +--------------------+
    

    使用 openstack database user list 命令检查原始用户 (user1) 是否存在于恢复的实例上。

    $ openstack database user list INSTANCE_ID
    +--------+------+-----------+
    |  name  | host | databases |
    +--------+------+-----------+
    | user1  |  %   |  db1, db2 |
    +--------+------+-----------+
    
  6. 通知用户

    告知正在访问现已禁用的 mysql1 数据库实例的用户,他们现在可以访问 mysql2。向他们提供 mysql2 的名称、IP 地址以及他们可能需要的任何其他信息。(您可以使用 openstack database instance show 命令获取此信息。)

  7. 清理

    此时,您可能需要使用 openstack database instance delete 命令删除禁用的 mysql1 实例。

    $ openstack database instance delete INSTANCE_ID
    

创建增量备份

增量备份允许您将一系列备份链接在一起。您从常规备份开始。然后,当您想要创建后续增量备份时,您指定父备份。

从增量备份恢复数据库实例与从常规备份创建数据库实例相同。数据库服务会处理应用增量备份链的过程。

基于父备份创建增量备份

$ openstack database backup create mysql-backup-name1.1 --instance mysql1 --swift-container 'my-trove-backups' \
      --parent $(openstack database backup show mysql-backup-name1 -f value -c id)
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| created              | 2022-10-24T02:38:41                  |
| datastore            | mysql                                |
| datastore_version    | 8.0.29                               |
| datastore_version_id | 324f2bdf-6099-4754-a5f9-82abee026a19 |
| description          | None                                 |
| id                   | e15ae06a-3afb-4794-8890-7059317b2218 |
| instance_id          | 78e338e3-d1c4-4189-8ea7-bfc1fab5011f |
| locationRef          | None                                 |
| name                 | mysql-backup-name1.1                 |
| parent_id            | 1ecd0a75-e4aa-400b-b0c8-cb738944fd43 |
| project_id           | fc51186c63df417ea63cec6c65a2d564     |
| size                 | None                                 |
| status               | NEW                                  |
| updated              | 2022-10-24T02:38:41                  |
+----------------------+--------------------------------------+

从其他区域恢复备份

在 Wallaby 中引入了从其他区域恢复备份的功能。

在具有地理复制 Swift 的多区域部署中,用户可以使用在其他区域创建的备份数据在一个区域创建备份,这在灾难恢复场景中很有用。在这种情况下,在恢复备份时不需要实例 ID,但需要原始备份数据位置(swift 对象 URL)、本地数据存储版本和备份数据大小。

警告

恢复的备份依赖于原始备份数据,如果原始备份被删除,恢复的备份将无效。

  1. 在区域 1 中,获取备份信息。

    $ openstack database backup show b3957063-18ac-48f4-a710-82602f2ddb78 -c locationRef -c size -c datastore -c datastore_version
    +-------------------+---------------------------------------------------------------------------------------------------------------------------------------+
    | Field             | Value                                                                                                                                 |
    +-------------------+---------------------------------------------------------------------------------------------------------------------------------------+
    | datastore         | mysql                                                                                                                                 |
    | datastore_version | 5.7.29                                                                                                                                |
    | locationRef       | http://192.168.206.8:8080/v1/AUTH_055b2fb9a2264ae5a5f6b3cc066c4a1d/trove-backup-data/b3957063-18ac-48f4-a710-82602f2ddb78.xbstream.gz |
    | size              | 0.2                                                                                                                                   |
    +-------------------+---------------------------------------------------------------------------------------------------------------------------------------+
    
  2. 在区域 2 中,创建一个新的备份。

    $ openstack database backup create \
      --restore-from http://192.168.206.8:8080/v1/AUTH_055b2fb9a2264ae5a5f6b3cc066c4a1d/trove-backup-data/b3957063-18ac-48f4-a710-82602f2ddb78.xbstream.gz \
      --restore-datastore-version 40430eea-9ee3-4c2c-a06f-9ec72277af7a \
      --restore-size 0.3 test-restore
    +----------------------+---------------------------------------------------------------------------------------------------------------------------------------+
    | Field                | Value                                                                                                                                 |
    +----------------------+---------------------------------------------------------------------------------------------------------------------------------------+
    | created              | 2021-02-22T01:44:06                                                                                                                   |
    | datastore            | mysql                                                                                                                                 |
    | datastore_version    | 5.7.29                                                                                                                                |
    | datastore_version_id | 40430eea-9ee3-4c2c-a06f-9ec72277af7a                                                                                                  |
    | description          | None                                                                                                                                  |
    | id                   | ad98bbb0-b1d8-4569-b404-7e6af6700235                                                                                                  |
    | instance_id          | None                                                                                                                                  |
    | locationRef          | http://192.168.206.8:8080/v1/AUTH_055b2fb9a2264ae5a5f6b3cc066c4a1d/trove-backup-data/b3957063-18ac-48f4-a710-82602f2ddb78.xbstream.gz |
    | name                 | test-restore                                                                                                                          |
    | parent_id            | None                                                                                                                                  |
    | project_id           | 055b2fb9a2264ae5a5f6b3cc066c4a1d                                                                                                      |
    | size                 | 0.3                                                                                                                                   |
    | status               | RESTORED                                                                                                                              |
    | updated              | 2021-02-22T01:44:06                                                                                                                   |
    +----------------------+---------------------------------------------------------------------------------------------------------------------------------------+
    

故障排除

无法为 PostgreSQL 创建增量备份

可能的原因是,自从创建父备份以来已经过了很长时间,并且由于磁盘压力,父备份 WAL 文件已在内部删除,可以通过检查实例详细信息来确认,例如:

$ openstack database instance show e7231e46-ca3b-4dce-bf67-739b3af0ef85 -c fault
+-------+----------------------------------------------------------------------+
| Field | Value                                                                |
+-------+----------------------------------------------------------------------+
| fault | Failed to create backup c76de467-6587-4e27-bb8d-7c3d3b136663, error: |
|       |     Cannot find parent backup WAL file.                              |
+-------+----------------------------------------------------------------------+

在这种情况下,您必须创建完整备份。

为了避免将来出现此问题,您可以设置 cron 作业以定期创建(增量)备份。