我是一名初级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]
我也是这里的初学者,但作为替代方案,我想你能做以下事情吗:
- 创建具有相同配置的新实例
- 将原始备份还原到新实例中(这是可能的(
- 创建一个您感兴趣的数据库的转储
- 最后,将转储导入生产实例
通过这种方式,可以避免数据导出的麻烦,将转储操作限制在不太可能的恢复情况下,并节省数据库实例的资金。
想知道人们对这种方法有什么看法吗?
到目前为止,无法从整个实例备份中仅恢复一个数据库。正如您可以在文档中查看的那样,其余的应用程序也将经历宕机(因为目标实例将不可用于连接,并且现有连接将丢失(。
由于没有从整个备份实例中只恢复一个数据库的内置方法,因此您是正确的,并编写了一个MySQL脚本来分别备份每个数据库,并使用导入和导出操作(以下是有关Cloud SQL MySQL上下文中导入和导出操作的相关文档(。
但从实现的角度来看,我建议您为每个应用程序使用一个单独的云SQL实例,然后您可以在某个特定应用程序出现故障时恢复数据库,而不会导致其他应用程序停机或出现问题。
我看到这个话题又被提出了。以下是我如何解决从一个实例备份单个数据库的问题的描述,而不使用GCP中内置的实例备份机制并将其上传到云存储。
为了解决这个问题,我使用了Node.js 8中编写的谷歌云函数。以下是分步解决方案:
-
创建一个云存储桶。
-
使用Node.js 8创建云函数。
-
编辑以下代码以满足您的实例和数据库参数:
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函数的配置页面复制触发器URL
- 为了使函数以指定的频率自动运行,请使用Cloud调度器:描述:";,频率:使用UNIX-CORN!!!,时区:选择您的,目标:HTTP,URL:触发URL之前复制的URL HTTP方法:POST
- 仅此而已,它应该可以正常工作