在将数据导入和导出到 AlloyDB for PostgreSQL 时,考虑采用以下最佳实践:
- 请勿使用 Cloud Storage 请求者付款存储桶进行导入或导出。
- 创建 SQL 转储文件时使用正确的标志。
- 压缩数据以减少费用。
- 通过分批处理数据来减少长时间运行的导入和导出过程。
- 导入后,验证导入的数据库。
请勿使用 Cloud Storage 请求者付款存储分区
您无法使用启用了“请求者付款”功能的 Cloud Storage 存储桶来将数据导入 AlloyDB 或从 AlloyDB 导出数据。AlloyDB 使用 Google 管理的服务账号(即服务代理)来执行导入和导出操作。 此代理通常没有足够的上下文或配置来针对请求者的数据访问项目收费,这会导致涉及“请求者付款”存储桶的操作失败。
创建 SQL 转储文件时使用正确的标志
如果在将数据导出到 SQL 转储文件时未使用正确的标志和选项,则导入操作可能会失败。如需了解如何导出数据以导入到 AlloyDB,请参阅导出 DMP 文件和导出 SQL 文件。
压缩数据以减少费用
AlloyDB 支持从 Cloud Storage 导入和导出压缩的 .gz 文件。压缩文件可以节省 Cloud Storage 上的大量存储空间并减少存储费用,这在导出大量数据时尤为明显。使用 AlloyDB API 导出 SQL 转储文件或 CSV 文件时,在目标 URI 中使用 .gz 文件扩展名来压缩数据。导入扩展名为 .gz 的文件时,系统会自动将其解压缩。
减少长时间运行的导入和导出过程
根据数据的大小,将数据导入 AlloyDB 和从 AlloyDB 导出数据可能需要很长时间才能完成。如果某项操作花费的时间过长,可能会阻塞其他操作。
使用较小的数据批次来缩短每项操作的完成时间。您还可以使用 pg_dump 工具从连接到读取池实例的客户端执行手动导出。
验证导入的数据库
导入操作完成后,使用 psql 或其他客户端连接到您的数据库,然后运行相应的命令,以确保内容正确无误,例如列出表或查询行数。
自动执行导出操作
虽然 AlloyDB 没有提供用于自动执行导出操作的内置方法,但您可以使用其他Google Cloud 组件(例如 Cloud Scheduler、Pub/Sub 和 Cloud Run functions)构建自动化工具。
问题排查
本部分针对您在执行导入和导出操作时可能遇到的问题提供了建议的修复。
导入操作
| 问题 | 说明 | 建议的修复方法 |
|---|---|---|
ERROR: permission denied for schema public |
对于 PostgreSQL 15 及更高版本,如果您通过 template0 创建目标数据库,则可能会因架构权限而导致数据导入失败。 |
如需解决此问题,请使用以下命令向导入数据的用户授予对
GRANT ALL ON SCHEMA public TO my_import_user;
|
| 导入操作花费的时间太长。 | 过多的有效连接可能会干扰导入操作。 |
请尝试以下操作:
|
| 导入操作失败,因为转储文件中引用的一个或多个用户不存在。 | 在导入转储文件之前,拥有对象或获得了对转储数据库中的对象权限的所有数据库用户都必须存在于目标数据库中。如果这些用户不存在,导入操作将无法使用原始所有权或权限重新创建对象。 | 在导入之前,先创建所需的数据库用户。 |
GRANT stderr: ERROR: must be member of role ROLE_NAME
|
如果您导入的 SQL 转储文件包含 ROLE_NAME 拥有的对象或授予 ROLE_NAME 的权限,但执行导入的数据库用户不是 ROLE_NAME 的成员,则可能发生此错误。 |
如需解决此问题,请确保目标数据库中存在 ROLE_NAME 角色,并在运行导入之前,向执行导入的用户授予 ROLE_NAME 的成员资格。 |
导出操作
| 问题 | 说明 | 建议的修复方法 |
|---|---|---|
HTTP Error 403: The service account does not have the required
permissions for the bucket. |
AlloyDB 服务账号没有目标存储桶所需的权限。 | 确保目标 Cloud Storage 存储桶存在,且已向 AlloyDB 服务账号授予 roles/storage.objectAdmin 或 roles/storage.objectCreator 角色。这些角色允许它写入存储桶。请参阅适用于 Cloud Storage 的 Identity and Access Management (IAM) 角色。
|
| CSV 导出成功,但 SQL 导出失败。 | CSV 和 SQL 格式的导出方式不同。SQL 格式会导出数据库架构和数据,通常需要较长时间。CSV 格式仅导出您提供的 SELECT 查询所产生的数据。 |
如果 SQL 导出失败或速度太慢,请考虑使用 CSV 导出各个表。 |
| 导出时间太长。 | 如果主实例上的导出操作耗时过长,则可能是导出内容过大。 | 考虑分批导出数据。例如,分别导出各个表,而不是在一个操作中导出整个数据库。您还可以使用 pg_dump 工具从连接到读取池实例的客户端执行手动导出。 |
pg_restore 日志中存在 Create Extension 错误,或者导入失败。 |
转储文件包含对 AlloyDB 不支持或未安装在集群中的 PostgreSQL 扩展程序的引用。 | 如需移除这些引用,请修改转储文件,或者在 AlloyDB 支持的情况下,在集群上安装扩展程序。 |
使用 pg_dumpall 时出错。 |
带有 --globals-only 等标志的 pg_dumpall 实用程序可能需要 AlloyDB 中没有的权限。 |
如需导出没有密码的用户和角色等全局对象,请使用以下命令并添加
pg_dumpall --globals-only --no-role-passwords
|
导出操作超时,或者您看到 Connection reset by peer。 |
如果 Cloud Storage 在特定时间范围内未收到数据,则连接可能会重置。如果导出所需的初始数据库查询运行时间过长,可能会发生这种情况。 | 如果发生这种情况,请尝试使用 pg_dump 工具从连接到读取池实例的客户端执行手动导出。 |
常见问题
| 问题 | 说明 | 建议的修复方法 |
|---|---|---|
HTTP Error 409: Operation failed because another operation was
already in progress. |
系统一次只允许执行一项基于 API 的导入或导出操作。 | 在当前操作完成后尝试您的请求。 |
后续步骤
- 使用转储文件导入数据。
- 使用转储文件导出数据。
- 使用 CSV 文件导入数据。
- 使用 CSV 文件导出数据。
- 使用 SQL 文件导入数据。
- 使用 SQL 文件导出数据。
- 启用自动备份。
- 使用备份进行恢复。