如何导出Google Storage中Cloud SQL数据库的备份?

问题描述 投票:0回答:3

我有一个 GAE 项目,为此我使用了 Cloud SQL 数据库来存储数据。 我需要对我的 Cloud SQL 数据库进行按需备份,并且备份应存储在 Google 存储中。

任何人都可以帮助我如何使用 JAVA 以编程方式执行此操作?

java google-app-engine google-cloud-sql
3个回答
5
投票

您无法导出备份(按需或自动),如此处所述。不过,您可以执行的操作是将数据导出到 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

您可以在文档中找到有关导出数据的更多详细信息此处


0
投票

虽然 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>
设置您的项目)


0
投票

现在可以跨项目恢复备份,而无需单独导出实例中的每个数据库。请参阅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"
}
© www.soinside.com 2019 - 2024. All rights reserved.