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

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

导入和导出最佳做法

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

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

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

压缩数据以减少费用

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

导出 BAK 文件时,请使用 .gz 文件扩展名来压缩数据。导入扩展名为 .gz 的文件时,系统会自动将其解压缩。

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

使用导入功能(通过 Cloud Storage 存储分区)导入到 Cloud SQL 以及从 Cloud SQL 导出可能需要很长时间才能完成,具体取决于数据库的大小。这可能产生以下影响:

  • 您无法停止长时间运行的操作。
  • 针对每个实例,每次仅可执行一项导入或导出操作。

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

对于导出,您可以使用无服务器导出来最大限度地降低对数据库性能的影响,并允许其他操作在导出运行时在实例上运行。

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

长时间运行导入和导出过程的提示

使用导入功能(通过 Cloud Storage 存储分区)导入到 Cloud SQL 以及从 Cloud SQL 导出可能需要很长时间才能完成,具体取决于数据库的大小。这可能产生以下影响:

  • 您无法停止长时间运行的操作。
  • 针对每个实例,每次仅可执行一项导入或导出操作。

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

对于导出,您可以使用无服务器导出来最大限度地降低对数据库性能的影响,并允许其他操作在导出运行时在实例上运行。

问题排查

点击表中的链接可查看详细信息:

针对此问题… 可能的原因… 请尝试以下操作…
无法查看当前操作状态。 用户界面仅显示成功或失败。 使用相关数据库命令了解详情。
导出时间太长。 Cloud SQL 不支持并发同步操作。 使用导出分流。了解详情
导入时间太长。 过多的有效连接可能会干扰导入操作。 关闭未使用的连接,或者在开始执行导入操作之前重启 Cloud SQL 实例。
导入失败。 导出的文件可能包含尚不存在的数据库用户。 在导入之前先创建数据库用户
连接在导出操作期间关闭。 查询必须在前 7 分钟内生成数据。 手动测试查询。了解详情
导出过程中出现未知错误。 可能存在带宽问题。 确保实例和 Cloud Storage 存储分区位于同一区域
您想要自动执行导出。 Cloud SQL 不提供自动执行导出的方法。 构建您自己的流水线来执行此功能。了解详情
ERROR_RDBMS: system error occurred Cloud Storage 权限或不存在的表。 检查权限或确保表存在

无法查看操作状态

您无法查看正在进行的操作的状态。

可能的原因

Google Cloud Console 在完成后仅报告成功或失败,不会返回警告。

可以尝试的操作

连接到数据库并运行 SHOW WARNINGS


导出时间太长

导出时间太长,阻止了其他操作。

可能的原因

Cloud SQL 不支持并发同步操作。

可以尝试的操作

尝试一次导出较小的数据集。


导入时间太长

导入时间太长,阻止了其他操作。

可能的原因

过多的有效连接可能会干扰导入操作。连接会消耗 CPU 和内存,从而限制可用的资源。

可以尝试的操作

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

  • 关闭所有连接。
  • 结束任何可能正在消耗资源的任务。


导入失败

如果导出的 SQL 转储文件中引用的一个或多个用户不存在,则导入会失败。

可能的原因

在导入 SQL 转储之前,拥有对象或获得了对转储数据库中的对象权限的所有数据库用户都必须存在。如果不存在,则恢复将无法重新创建具有原始所有权和/或权限的对象。

可以尝试的操作

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


连接在导出操作期间关闭

连接在导出操作期间关闭。

可能的原因

与 Cloud Storage 的连接可能超时,因为在导出中运行的查询在导出启动后的 7 分钟内未生成任何数据。

可以尝试的操作

手动测试查询,方法是从任何客户端连接,然后使用以下命令将查询的输出发送到 STDOUT:

COPY (INSERT_YOUR_QUERY_HERE) TO STDOUT WITH ( FORMAT csv, DELIMITER ',', ENCODING 'UTF8', QUOTE '"', ESCAPE '"' )

这是预期行为,因为启动导出后,客户端应立即开始发送数据。在未发送数据情况下保持连接最终会断开连接,最后导致导出失败,使操作处于不确定状态。此外,以下是来自 gcloud 的错误消息:

operation is taking longer than expected


导出过程中出现未知错误

您在尝试将数据库导出到 Cloud Storage 存储分区时看到错误消息 Unknown error

可能的原因

转移可能由于带宽问题失败。

可以尝试的操作

Cloud SQL 实例可能与 Cloud Storage 存储分区位于不同区域。从一个大洲读取数据并将数据写入另一个大洲涉及很多网络用量,可能会导致类似的问题。检查实例和存储分区所在的区域。


想要自动执行导出

您想要自动执行导出。

可能的原因

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

可以尝试的操作

此处所述,您可以使用以下 Google Cloud 产品构建自己的自动导出系统:Cloud Scheduler、Pub/Sub、Cloud Functions。


出现 ERROR_RDBMS 系统错误

您看到错误消息 [ERROR_RDBMS] system error occurred

可能的原因

  • 用户可能没有所需的所有 Cloud Storage 权限。
  • 数据库表可能不存在。

可以尝试的操作

  1. 检查核实您对存储分区至少拥有 WRITER 权限,并且对导出文件至少拥有 READER 权限。如需详细了解如何在 Cloud Storage 中配置访问权限控制,请参阅创建和管理访问权限控制列表
  2. 确保表已存在。如果表已存在,请确认您对存储分区拥有正确的权限。

后续步骤