导入和导出数据的最佳做法

本页面介绍了使用 Cloud SQL 导入和导出数据的最佳做法。如需了解将数据导入 Cloud SQL 的分步说明,请参阅导入数据。如需了解导出数据(无论是位于 Cloud SQL 中的数据还是位于您所管理实例中的数据)的分步说明,请参阅导出数据

导入和导出最佳做法

以下是导入和导出数据时要考虑的最佳做法:

请勿使用 Cloud Storage 请求者付款存储桶

您无法使用启用了请求者付款功能的 Cloud Storage 存储桶来将数据导入 Cloud SQL 以及从 Cloud SQL 导出数据。

最大限度地降低导出对性能的影响

从 Cloud SQL 执行标准导出时,导出操作会在数据库在线时运行。当导出的数据较小时,影响很小。但是,对于大型数据库或大型对象(例如数据库中的 BLOB),导出操作可能会降低数据库性能。这可能会影响对数据库执行数据库查询和操作所需的时间。启动导出操作后,如果数据库响应开始变得缓慢,则您无法停止导出操作。

为了防止导出期间响应变慢,您可以执行以下操作:

  1. 从读取副本执行导出。如果您经常执行导出(每天一次或更频繁),但导出的数据量很小,这是一个不错的选项。如需从读取副本执行导出,请针对读取副本实例使用 Google Cloud 控制台、gcloud 或 REST API 导出函数。如需详细了解如何创建和管理读取副本,请参阅创建读取副本

  2. 使用无服务器导出功能。使用无服务器导出功能时,Cloud SQL 会创建一个单独的临时实例来分流导出操作。如果分流导出操作,则主实例上的数据库可以按正常的性能速率继续处理查询和执行操作。数据导出操作完成后,临时实例会被自动删除。如果您要对大型数据库执行一次性导出,这可能是一个不错的选项。使用 Google Cloud 控制台、gcloud 或 REST API 导出函数并配合 offload 标志来执行无服务器导出操作。

    在无服务器导出操作期间,您可以运行一些其他操作,例如实例修改、导入和故障切换。但是,如果您选择 delete,导出操作会在您删除实例一段时间后停止,并且不会导出任何数据。

    请参阅下表,了解在无服务器导出操作运行时可以阻止的操作:
    当前操作 新操作 已阻止?
    任何操作 无服务器导出
    无服务器导出 除无服务器导出以外的任何操作
    除无服务器导出以外的任何操作 除无服务器导出以外的任何操作

    与标准导出操作相比,无服务器导出操作需要的时间更长,因为创建临时实例需要时间。实际需要的时间超过五分钟;对于较大的数据库,需要的时间可能更长。在确定要使用哪种类型的导出功能之前,请考虑其对时间、性能和费用的影响。

创建 SQL 转储文件时使用正确的标志

如果您在将数据导出到 SQL 转储文件时没有使用正确的过程,导入操作可能会失败。如需了解如何创建 SQL 转储文件以导入到 Cloud SQL,请参阅导出数据

压缩数据以减少费用

Cloud SQL 支持导入和导出压缩文件及未压缩文件。压缩文件可以节省 Cloud Storage 上的大量存储空间并减少存储费用,这在导出大型实例时尤为明显。

导出 SQL 转储文件或 CSV 文件时,请将数据压缩成扩展名为 .gz 的文件。导入扩展名为 .gz 的文件时,系统会自动将其解压缩。

减少长时间运行的导入和导出过程

导入和导出 Cloud SQL 可能需要很长时间才能完成,具体取决于要处理的数据大小。这可能产生以下影响:

  • 您无法停止长时间运行的 Cloud SQL 实例操作。
  • 针对每个实例,一次只能执行一项导入或导出操作,而长时间运行的导入或导出操作会阻止其他操作,例如每日自动备份。无服务器导出功能使您可以运行其他操作,包括修改实例、导入、故障切换以及取消阻止每日自动备份。

对小批量数据使用 Cloud SQL 导入或导出功能可以缩短每项操作的完成时间。

对于导出,您可以从读取副本执行导出,或使用无服务器导出功能最大限度地降低对数据库性能的影响,并允许在导出时对实例执行其他操作。

如需更多提示,请参阅诊断 Cloud SQL 实例的问题

验证导入的数据库

导入操作完成后,连接到您的数据库并运行相应的数据库命令,以确保内容正确无误。例如,连接并列出数据库、表和特定条目。

已知限制

如需查看已知限制列表,请参阅导入和导出数据的问题

自动执行导出操作

尽管 Cloud SQL 没有提供自动导出数据库的内置方法,但是您可以使用多个 Google Cloud 组件构建自己的自动化工具。如需了解详情,请参阅本教程

问题排查

排查导入操作问题

问题 问题排查
错误消息:permission denied for schema public 对于 PostgreSQL 版本 15 及更高版本,如果目标数据库是通过 template0 创建,则导入数据可能会失败。如需解决此问题,请运行 GRANT ALL ON SCHEMA public TO cloudsqlsuperuser SQL 命令向 cloudsqlsuperuser 用户提供公共架构特权。
HTTP Error 409: Operation failed because another operation was already in progress 您的实例已有一项待处理的操作。一次只能执行一项操作。在当前操作完成后尝试您的请求。
导入操作花费的时间太长。 过多的有效连接可能会干扰导入操作。

关闭未使用的操作。检查 Cloud SQL 实例的 CPU 和内存用量,以确保有大量的可用资源。确保将最多资源用于导入操作的最佳方法是在开始执行操作之前重启实例。

重启后,系统会执行以下操作:

  • 关闭所有连接。
  • 结束任何可能正在消耗资源的任务。
如果转储文件中引用的一个或多个用户不存在,导入操作可能会失败。 在导入转储文件之前,拥有对象或获得了对转储数据库中的对象权限的所有数据库用户都必须存在于目标数据库中。否则,导入操作将无法使用原始所有权或权限重新创建对象。

在导入之前,先创建数据库用户

导入数据后,数据磁盘的使用量变得很高。

导入数据后,可能会出现预料之外的磁盘使用量。这可能是由于使用了时间点恢复

若要解决此问题,请在导入数据后停用时间点恢复(如果您想删除日志并恢复存储空间)。请注意,减少所占用的存储空间并不会缩小为实例预配的存储空间大小。

错误消息:GRANT stderr: ERROR: must be member of role ROLE_NAME

如果您尝试将上传到 Cloud Storage 中的 SQL 转储文件导入 Cloud SQL 数据库,并且导入作业已运行大约四天,则会显示此错误消息。

ROLE_NAME 是在源 PostgreSQL 数据库中定义的自定义数据库角色。默认的 cloudsqlsuperuser 用户会导入 SQL 转储文件。但是,此用户可能不属于 ROLE_NAME 角色。

如需解决此问题,请完成以下步骤:

  1. 在要导入 SQL 转储文件的目标数据库中创建 ROLE_NAME 角色。
  2. 请勿使用 cloudsqlsuperuser 用户导入该文件。相反,请在目标数据库中指定具有 ROLE_NAME 角色的用户。如需指定用户,请运行以下命令:

    gcloud sql import sql INSTANCE URI [--async]
    [--database=DATABASE, -d DATABASE] [--user=USER] [GCLOUD_WIDE_FLAG …]

排查导出操作问题

问题 问题排查
HTTP Error 409: Operation failed because another operation was already in progress. 您的实例已有一项待处理的操作。一次只能执行一项操作。在当前操作完成后尝试您的请求。
HTTP Error 403: The service account does not have the required permissions for the bucket. 确保存储桶已存在,并且 Cloud SQL 实例(正在执行导出)的服务账号具有 Storage Object Creator 角色 (roles/storage.objectCreator) 以允许导出到存储桶。请参阅适用于 Cloud Storage 的 IAM 角色
CSV 导出成功,但 SQL 导出失败。 CSV 和 SQL 格式的导出方式不同。SQL 格式会导出整个数据库,可能需要较长的时间才能完成。CSV 格式可让您定义要导出的数据库元素。

使用 CSV 导出以仅导出您需要的文件。

导出时间太长。 Cloud SQL 不支持并发同步操作。

使用导出分流。概括来讲,在进行导出分流时,Cloud SQL 会启动一个分流实例来执行导出,而不是在源实例上发起导出。导出分流具有多项优势,包括可提高源实例的性能,以及在导出操作期间取消屏蔽管理操作。使用导出分流时,总延迟时间会增加,因为启动分流实例需要时间。通常,对于规模合理的导出,延迟时间并不明显。但是,如果导出作业足够小,那么您可能会注意到延迟时间有所增加。

创建扩展程序错误。 转储文件包含对不受支持的扩展程序的引用。

修改转储文件以移除引用

使用 pg_dumpall 时出错。 使用带有 --global 标志的 pg_dumpall 实用程序需要超级用户角色,但 Cloud SQL for PostgreSQL 不支持此角色。为防止在执行包含用户名的导出操作时发生错误,请同时使用 --no-role-passwords 标志。
导出操作在导出任何内容之前超时,并显示错误消息 Could not receive data from client: Connection reset by peer. 如果 Cloud Storage 在特定时间范围内(通常是大约七分钟内)未收到任何数据,则连接会重置。初始导出查询的运行时间可能过长。

使用 pg_dump 工具执行手动导出。

您希望自动执行导出。 Cloud SQL 不提供自动执行导出的方法。

您可以使用 Cloud Scheduler、Pub/Sub 和 Cloud Run 函数等 Google Cloud 产品构建自己的自动导出系统,类似自动备份一文所述。

后续步骤