如何从 GCP 上的实例备份恢复单个数据库?

How to restore single database from instance backup on GCP?

我是初学者 GCP 管理员。我在一个实例上有多个应用程序 运行。每个应用程序都有自己的数据库。我通过 GCP GUI 设置了自动实例备份。

我想为其中一个应用程序(即一个数据库)可能出现的故障做好准备。我想准备一个恢复这样一个数据库的程序,但是在 GCP GUI 中没有恢复一个数据库的选项,我需要恢复整个实例,由于其他应用程序在这个实例上的操作,我不能这样做。

我也在文档中看到无法导出备份。

有没有办法从整个实例备份中只恢复一个数据库?

我是否必须编写 MySQL 脚本来单独备份每个数据库并将其保存到云存储?

目前还没有办法从整个实例备份中只恢复一个数据库。如您所见,documentation 其余应用程序也将出现停机(因为目标实例将无法连接并且现有连接将丢失)。

因为没有内置的方法可以从整个备份实例中只恢复一个数据库,你是对的,写了一个MySQL脚本来单独备份每个数据库并使用导入和导出操作(这里是相关的有关云 SQL MySQL 上下文中 import and export 操作的文档)。

但我建议您从实施的角度为每个应用程序使用单独的 Cloud SQL 实例,然后您可以在某个特定应用程序失败时恢复数据库,而不会导致停机或出现问题其余的应用程序。

我也是这里的初学者,但作为替代方案,我想您可以执行以下操作:

  1. 创建具有相同配置的新实例
  2. 将原始备份恢复到新实例中(这是可能的)
  3. Create a dump 您感兴趣的一个数据库
  4. 最后,将该转储导入生产实例

通过这种方式,您可以避免混淆数据导出,将转储操作限制在不太可能发生的还原情况下,并节省数据库实例的费用。

想知道人们对这种方法的看法吗?

正如 Daniel 提到的,您可以使用 gcloud sql export/import 来执行此操作。您还需要一个 Google 存储桶。

首先将数据库导出到文件

gcloud sql export sql [instance-name] [gs://path-to-export-file.gz] --database=[database-name]

创建一个空数据库

gcloud sql databases create [new-database-name] --instance=[instance-name]

使用导出文件填充新的空数据库。

gcloud sql import sql [instance-name] [gs://path-to-export-file.gz] --database=[database-name]

我看到话题又被提出来了。以下是我如何解决从一个实例备份单个数据库的问题,而不使用 GCP 中内置的实例备份机制并将其上传到云存储。

为了解决这个问题,我使用了 Google 写在 Node.js 8 中的 Cloud Functions。 这是一步一步的解决方案:

  1. 创建云存储桶。

  2. 使用 Node.js8.

    创建云函数
  3. 编辑以下代码以满足您的实例和数据库参数:

    const {google} = require("googleapis");
    const {auth} = require("google-auth-library");
    var sqladmin = google.sqladmin("v1beta4");
    
    exports.exportDatabase = (_req, res) => {
      async function doBackup() {
        const authRes = await auth.getApplicationDefault();
        let authClient = authRes.credential;
        var request = {
          // Project ID 
          project: "",
          // Cloud SQL instance ID
          instance: "",
          resource: {
            // Contains details about the export operation.
            exportContext: {
              // This is always sql#exportContext.
              kind: "sql#exportContext",
              // The file type for the specified uri (e.g. SQL or CSV)
              fileType: "SQL", 
              /** 
               * The path to the file in GCS where the export will be stored.
               * The URI is in the form gs://bucketName/fileName.
               * If the file already exists, the operation fails.
               * If fileType is SQL and the filename ends with .gz, the contents are compressed.
           */
          uri:``,
          /**
           * Databases from which the export is made.
           * If fileType is SQL and no database is specified, all databases are exported.
           * If fileType is CSV, you can optionally specify at most one database to export.
           * If csvExportOptions.selectQuery also specifies the database, this field will be ignored.
           */
          databases: [""]
        }
      },
      // Auth client
      auth: authClient
    };
    
    // Kick off export with requested arguments.
    sqladmin.instances.export(request, function(err, result) {
      if (err) {
        console.log(err);
      } else {
        console.log(result);
      }
      res.status(200).send("Command completed", err, result); 
    }); } doBackup(); };
    

最后一行很抱歉,但我无法很好地格式化它。

  1. 保存并部署此 Cloud Functions
  2. 从 Cloud 功能的配置页面复制触发器 URL。
  3. 为了让函数以指定的频率自动 运行,请使用 Cloud 调度程序:说明:“”,频率:使用 UNIX-CORN !!!,时区:选择 你的,Target: HTTP, URL: PAST COPIED BEFORE TRIGGER URL HTTP 方法:POST
  4. 就这些了,应该没问题。