我有一个 GAE 项目,为此我使用了 Cloud SQL 数据库来存储数据。 我需要对我的 Cloud SQL 数据库进行按需备份,并且备份应存储在 Google 存储中。
任何人都可以帮助我如何使用 JAVA 以编程方式执行此操作?
您无法导出备份(按需或自动),如此处所述。不过,您可以执行的操作是将数据导出到 SQL 转储文件或 CSV 文件(具体取决于您的使用案例),并将其存储在 Cloud Storage 上。
没有 Java 实用程序来执行导出,但 Google 公开了一个 API 端点供您触发导出。这是使用标准curl工具的示例请求:
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header 'Content-Type: application/json' \
--data '{"exportContext":
{"fileType": "SQL",
"uri": "gs://<BUCKET_NAME>/<PATH_TO_DUMP_FILE>",
"databases": ["<DATABASE_NAME1>", "<DATABASE_NAME2>"] }}' \
-X POST \
https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/export
您可以在文档中找到有关导出数据的更多详细信息此处。
虽然 LundinCast 的答案仍然正确并且提供了有用的信息,但在某种程度上已经过时了。
引入了新的 Java 实用程序
Google 现在为其提供了 Java 实用程序,可以在此处找到:https://cloud.google.com/sql/docs/mysql/admin-api/rest/v1beta4/instances/export
在我看来,那里给出的示例代码缺乏如何设置请求正文的最低代码。所以我在这里提供一个简单的片段:
var exportContext = new ExportContext();
// gs:// stands for the gsutil tool, the filename should have "gz" as file extension
exportContext.setUri("gs://<BUCKET_NAME>/<BACKUP_FILENAME.gz>"); exportContext.setDatabases(List.of("<DATABASE_NAME>"));
exportContext.setFileType("SQL");
var requestBody = new InstancesExportRequest();
requestBody.setExportContext(exportContext);
必要的权限和自动化
Java 实用程序可能无法开箱即用,因为您需要正确设置一些权限/角色。完整的食谱(还涵盖自动化,例如每天)可以在这里找到:https://cloud.google.com/architecture/scheduling-cloud-sql-database-exports-using-cloud-scheduler。不幸的是(截至 2022 年 4 月 21 日)Python 脚本已过时(并且还缺少其他语言的示例)。使用我的答案中给出的第一个链接来查看更新的实现。
通过 gcloud 进行预先测试
要测试导出步骤,首先通过 gcloud 进行测试可能会有所帮助:
gcloud sql export sql <CLOUD_SQL_INSTANCE> gs://<BUCKET_NAME>/<BACKUP_FILENAME>.gz --database=<DATABASE_NAME>
(您可能必须先通过
gcloud config set project <PROJECT_NAME>
设置您的项目)
现在可以跨项目恢复备份,而无需单独导出实例中的每个数据库。请参阅https://cloud.google.com/sql/docs/postgres/backup-recovery/restoring#projectid
您可以使用所有休息调用,或 gcloud 和休息调用的组合。这里的一个较旧的答案是使用
curl
,所以我的也会,因为这是目前有效的方法,并且这个问题出现在 Google 中。
获取您想要的备份ID:
chris_chiasson@cloudshell:~ (gluca360-prod)$ gcloud sql backups list \
--instance=SOURCE_SQL_INSTANCE_ID \
--project=SOURCE_PROJECT_ID
它将按时间倒序列出以下格式的条目。选择你想要的。:
ID: SOURCE_BACKUPID
WINDOW_START_TIME: 2023-12-23T02:26:07.357+00:00
ERROR: -
STATUS: SUCCESSFUL
INSTANCE: SOURCE_SQL_INSTANCE_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{
"restoreBackupContext": {
"backupRunId": "SOURCE_BACKUP_ID",
"project": "SOURCE_PROJECT_ID",
"instanceId": "SOURCE_SQL_INSTANCE_ID"
}
}' \
"https://sqladmin.googleapis.com/v1/projects/TARGET_PROJECT_ID/instances/TARGET_SQL_INSTANCE_ID/restoreBackup"
响应将以这种格式返回:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/TARGET_PROJECT_ID/instances/TARGET_SQL_INSTANCE_ID",
"status": "PENDING",
"user": "[email protected]",
"insertTime": "2023-12-23T04:44:21.223Z",
"operationType": "RESTORE_VOLUME",
"name": "RESTORE_OPERATION_ID",
"targetId": "TARGET_SQL_INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/TARGET_PROJECT_ID/operations/RESTORE_OPERATION_ID",
"targetProject": "gluca360-prod"
}