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



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

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

我还在文档中读到备份无法导出。

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

我是否必须编写一个MySQL脚本,分别备份每个数据库并将其保存到云存储?

如Daniel所述,您可以使用gcloud-sql导出/导入来完成此操作。你还需要一个谷歌存储桶。

首先将数据库导出到文件

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]

我也是这里的初学者,但作为替代方案,我想你能做以下事情吗:

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

通过这种方式,可以避免数据导出的麻烦,将转储操作限制在不太可能的恢复情况下,并节省数据库实例的资金。

想知道人们对这种方法有什么看法吗?

到目前为止,无法从整个实例备份中仅恢复一个数据库。正如您可以在文档中查看的那样,其余的应用程序也将经历宕机(因为目标实例将不可用于连接,并且现有连接将丢失(。

由于没有从整个备份实例中只恢复一个数据库的内置方法,因此您是正确的,并编写了一个MySQL脚本来分别备份每个数据库,并使用导入和导出操作(以下是有关Cloud SQL MySQL上下文中导入和导出操作的相关文档(。

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

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

为了解决这个问题,我使用了Node.js 8中编写的谷歌云函数。以下是分步解决方案:

  1. 创建一个云存储桶。

  2. 使用Node.js 8创建云函数。

  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. 保存并部署此云功能
  2. 从Cloud函数的配置页面复制触发器URL
  3. 为了使函数以指定的频率自动运行,请使用Cloud调度器:描述:";,频率:使用UNIX-CORN!!!,时区:选择您的,目标:HTTP,URL:触发URL之前复制的URL HTTP方法:POST
  4. 仅此而已,它应该可以正常工作

相关内容

  • 没有找到相关文章

最新更新