如何从 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 实例,然后您可以在某个特定应用程序失败时恢复数据库,而不会导致停机或出现问题其余的应用程序。
我也是这里的初学者,但作为替代方案,我想您可以执行以下操作:
- 创建具有相同配置的新实例
- 将原始备份恢复到新实例中(这是可能的)
- Create a dump 您感兴趣的一个数据库
- 最后,将该转储导入生产实例
通过这种方式,您可以避免混淆数据导出,将转储操作限制在不太可能发生的还原情况下,并节省数据库实例的费用。
想知道人们对这种方法的看法吗?
正如 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。
这是一步一步的解决方案:
创建云存储桶。
使用 Node.js8.
创建云函数
编辑以下代码以满足您的实例和数据库参数:
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(); };
最后一行很抱歉,但我无法很好地格式化它。
- 保存并部署此 Cloud Functions
- 从 Cloud 功能的配置页面复制触发器 URL。
- 为了让函数以指定的频率自动 运行,请使用 Cloud
调度程序:说明:“”,频率:使用 UNIX-CORN !!!,时区:选择
你的,Target: HTTP, URL: PAST COPIED BEFORE TRIGGER URL HTTP
方法:POST
- 就这些了,应该没问题。
我是初学者 GCP 管理员。我在一个实例上有多个应用程序 运行。每个应用程序都有自己的数据库。我通过 GCP GUI 设置了自动实例备份。
我想为其中一个应用程序(即一个数据库)可能出现的故障做好准备。我想准备一个恢复这样一个数据库的程序,但是在 GCP GUI 中没有恢复一个数据库的选项,我需要恢复整个实例,由于其他应用程序在这个实例上的操作,我不能这样做。
我也在文档中看到无法导出备份。
有没有办法从整个实例备份中只恢复一个数据库?
我是否必须编写 MySQL 脚本来单独备份每个数据库并将其保存到云存储?
目前还没有办法从整个实例备份中只恢复一个数据库。如您所见,documentation 其余应用程序也将出现停机(因为目标实例将无法连接并且现有连接将丢失)。
因为没有内置的方法可以从整个备份实例中只恢复一个数据库,你是对的,写了一个MySQL脚本来单独备份每个数据库并使用导入和导出操作(这里是相关的有关云 SQL MySQL 上下文中 import and export 操作的文档)。
但我建议您从实施的角度为每个应用程序使用单独的 Cloud SQL 实例,然后您可以在某个特定应用程序失败时恢复数据库,而不会导致停机或出现问题其余的应用程序。
我也是这里的初学者,但作为替代方案,我想您可以执行以下操作:
- 创建具有相同配置的新实例
- 将原始备份恢复到新实例中(这是可能的)
- Create a dump 您感兴趣的一个数据库
- 最后,将该转储导入生产实例
通过这种方式,您可以避免混淆数据导出,将转储操作限制在不太可能发生的还原情况下,并节省数据库实例的费用。
想知道人们对这种方法的看法吗?
正如 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。 这是一步一步的解决方案:
创建云存储桶。
使用 Node.js8.
创建云函数编辑以下代码以满足您的实例和数据库参数:
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(); };
最后一行很抱歉,但我无法很好地格式化它。
- 保存并部署此 Cloud Functions
- 从 Cloud 功能的配置页面复制触发器 URL。
- 为了让函数以指定的频率自动 运行,请使用 Cloud 调度程序:说明:“”,频率:使用 UNIX-CORN !!!,时区:选择 你的,Target: HTTP, URL: PAST COPIED BEFORE TRIGGER URL HTTP 方法:POST
- 就这些了,应该没问题。