将数据库快照数据导出到 Amazon S3
您可以将数据库快照数据导出到 Amazon S3 存储桶。导出过程在后台运行,而不会影响活动数据库的性能。
导出数据库快照时,Amazon RDS 从快照中提取数据并将其存储在 Amazon S3 存储桶中。数据以压缩和一致的 Apache Parquet 格式存储。
您可以导出所有类型的数据库快照 – 包括手动快照、自动系统快照和 AWS Backup 服务创建的快照。默认情况下,将导出快照中的所有数据。但是,您可以选择导出特定的一组数据库、方案或表。
导出数据后,您可以通过 Amazon Athena 或 Amazon Redshift Spectrum 等工具直接分析导出的数据。有关使用 Athena 读取 Parque 数据的更多信息,请参阅 Amazon Athena 用户指南中的 Parquet SerDe。有关使用 Redshift Spectrum 读取 Parquet 数据的更多信息,请参阅《Amazon Redshift 数据库开发人员指南》中的从列式数据格式执行 COPY 操作。
主题
区域和版本可用性
功能可用性和支持因每个数据库引擎的特定版本以及 AWS 区域而异。有关将快照导出到 S3 的版本和区域可用性的更多信息,请参阅支持在 Amazon RDS 中将快照导出到 S3 的区域和数据库引擎。
限制
将数据库快照数据导出到 Amazon S3 有以下限制:
-
您不能同时为同一个数据库快照运行多个导出任务。这同时适用于完全导出和部分导出。
-
不支持从使用磁性存储的数据库导出快照。
-
导出到 S3 不支持包含冒号(:)的 S3 前缀。
-
在导出过程中,S3 文件路径中的以下字符将转换为下划线 (_):
\ ` " (space)
-
如果数据库、架构或表的名称中包含以下字符以外的字符,则不支持部分导出。但是,您可以导出整个数据库快照。
-
拉丁字母 (A–Z)
-
数字 (0–9)
-
美元符号 ($)
-
下划线 (_)
-
-
数据库表列名不支持空格 ( ) 和某些字符。在导出过程中会跳过列名中包含以下字符的表:
, ; { } ( ) \n \t = (space)
-
在导出过程中会跳过其名称中包含斜杠 (/) 的表。
-
在导出期间,将跳过 RDS for PostgreSQL 临时表和未记录的表。
-
如果数据包含接近或大于 500MB 的大型对象(例如 BLOB 或 CLOB),则导出失败。
-
如果表中某个大行的大小接近或大于 2GB,则会在导出过程中略过该表。
-
对于部分导出,
ExportOnly
列表的最大大小为 200 KB。 -
强烈建议您为每个导出任务使用唯一的名称。如果您没有使用唯一的任务名称,可能会收到以下错误消息:
ExportTaskAlreadyExistsFault:调用 StartExportTask 操作时发生错误 (ExportTaskAlreadyExists):ID 为
xxxxx
的导出任务已存在。 -
您可以在将快照数据导出到 S3 时删除快照,但是在导出任务完成之前,仍需支付该快照的存储成本。
-
您无法将从 S3 导出的快照数据还原到新的数据库实例,也无法将快照数据从 S3 导入到现有的数据库实例。
-
每个 AWS 账户 最多可以执行五个并发数据库快照导出任务。
-
要将数据库快照导出到跨账户 Amazon S3 存储桶,必须使用 AWS CLI 或 RDS API。
导出快照数据概述
您可以使用以下过程将数据库快照数据导出到 Amazon S3 存储桶。有关更多详细信息,请参阅以下部分。
-
确定要导出的快照。
使用现有的自动快照或手动快照,或创建数据库实例或多可用区数据库集群的手动快照。
-
设置对 Amazon S3 存储桶的访问权限。
存储桶是 Amazon S3 对象或文件的容器。要提供访问存储桶的信息,请执行以下步骤:
-
标识要将快照导出到的 S3 存储桶。S3 存储桶必须与快照位于同一 AWS 区域。有关更多信息,请参阅 标识要导出到的 Amazon S3 存储桶。
-
创建一个 AWS Identity and Access Management (IAM) 角色,用于授予快照导出任务对 S3 存储桶的访问权限。有关更多信息,请参阅 使用 IAM 角色提供对 Amazon S3 存储桶的访问权限。
-
-
创建对称加密 AWS KMS key 以进行服务器端加密。快照导出任务使用 KMS 密钥在将导出数据写入 S3 时设置 AWS KMS 服务器端加密。
KMS 密钥策略必须同时包含
kms:CreateGrant
和kms:DescribeKey
权限。有关在 Amazon RDS 中使用 KMS 密钥的更多信息,请参阅AWS KMS key 管理。如果 KMS 密钥策略中有拒绝语句,则确保显式排除 AWS 服务主体
export.rds.amazonaws.com
。您可以在您的 AWS 账户内使用 KMS 密钥,或者您可以使用跨账户 KMS 密钥。有关更多信息,请参阅 使用跨账户 AWS KMS key 加密 Amazon S3 导出的内容。
-
使用控制台或
start-export-task
CLI 命令将快照导出到 Amazon S3。有关更多信息,请参阅 将数据库快照导出到 Amazon S3 桶。 -
要访问 Amazon S3 存储桶中导出的数据,请参阅 Amazon Simple Storage Service 用户指南中的上传、下载和管理对象。
设置 Amazon S3 存储桶的访问权限
要将数据库快照数据导出到 Amazon S3 文件,首先需要授予快照访问 Amazon S3 存储桶的权限。然后,您创建 IAM 角色以允许 Amazon RDS 服务写入 Amazon S3 存储桶。
主题
标识要导出到的 Amazon S3 存储桶
标识要将数据库快照导出到的 Amazon S3 存储桶。使用现有 S3 存储桶或创建新的 S3 存储桶。
注意
要导出到的 S3 存储桶必须与快照位于同一 AWS 区域中。
有关使用 Amazon S3 存储桶的详细信息,请参阅 Amazon Simple Storage Service 用户指南中的以下主题:
使用 IAM 角色提供对 Amazon S3 存储桶的访问权限
将数据库快照数据导出到 Amazon S3 之前,请授予快照导出任务对 Amazon S3 存储桶的写入访问权限。
要授予此权限,请创建 IAM 策略以提供对桶的访问权限,然后创建一个 IAM 角色并将该策略附加到该角色。您稍后将此 IAM 角色分配给快照导出任务。
重要
如果计划使用AWS Management Console导出快照,则可以选择在导出快照时自动创建 IAM 策略和角色。有关说明,请参阅 将数据库快照导出到 Amazon S3 桶。
授予数据库快照任务访问 Amazon S3 的权限
-
创建一个 IAM 策略。此策略提供允许快照导出任务访问 Amazon S3 的存储桶和对象权限。
在策略中包含以下必需操作,以允许将文件从 Amazon RDS 桶传输到 S3 桶:
-
s3:PutObject*
-
s3:GetObject*
-
s3:ListBuckets
-
s3:DeleteObject*
-
s3:GetBucketLocation
在策略中,包含以下资源以标识 S3 桶以及该桶中的对象。以下资源列表显示用于访问 Amazon S3 的 Amazon Resource Name (ARN) 格式。
-
arn:aws:s3:::
DOC-EXAMPLE-BUCKET
-
arn:aws:s3:::
DOC-EXAMPLE-BUCKET
/*
有关为 Amazon RDS 创建 IAM 策略的更多信息,请参阅创建和使用适用于 IAM 数据库访问的 IAM 策略。另请参阅 IAM 用户指南中的教程:创建和附加您的第一个客户托管式策略。
以下 AWS CLI 命令使用这些选项创建一个名为
ExportPolicy
的 IAM 策略。它授予对名为DOC-EXAMPLE-BUCKET
的存储桶的访问权限。注意
创建策略后,请记下策略的 ARN。在将策略附加到 IAM 角色时,您在后面的步骤中需要使用 ARN。
aws iam create-policy --policy-name ExportPolicy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExportPolicy", "Effect": "Allow", "Action": [ "s3:PutObject*", "s3:ListBuckets", "s3:GetObject*", "s3:DeleteObject*", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::
DOC-EXAMPLE-BUCKET
", "arn:aws:s3:::DOC-EXAMPLE-BUCKET
/*" ] } ] }' -
-
创建一个 IAM 角色,以便 Amazon RDS 可以代入该 IAM 角色,代表您访问 Amazon S3 桶。有关更多信息,请参阅 IAM 用户指南中的创建向 IAM 用户委派权限的角色。
以下示例说明了如何使用 AWS CLI 命令创建一个名为
rds-s3-export-role
的角色。aws iam create-role --role-name rds-s3-export-role --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "export.rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'
-
将您创建的 IAM 策略附加到您创建的 IAM 角色。
以下 AWS CLI 命令将之前创建的策略附加到名为
rds-s3-export-role
的角色。将
替换为您在先前步骤中记下的策略 ARN。your-policy-arn
aws iam attach-role-policy --policy-arn
your-policy-arn
--role-name rds-s3-export-role
使用跨账户 Amazon S3 存储桶
您可以跨 AWS 账户使用 Amazon S3 存储桶。要使用跨账户存储桶,请添加存储桶策略以允许访问您用于 S3 导出的 IAM 角色。有关更多信息,请参阅示例 2:存储桶拥有者授予跨账户存储桶权限。
将存储桶策略附加到存储桶,如下面的示例所示。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:role/Admin" }, "Action": [ "s3:PutObject*", "s3:ListBuckets", "s3:GetObject*", "s3:DeleteObject*", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET
", "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET
/*" ] } ] }
使用跨账户 AWS KMS key 加密 Amazon S3 导出的内容
您可以使用跨账户 AWS KMS key 以加密 Amazon S3 导出的内容。首先,向本地账户添加密钥策略,然后在外部账户中添加 IAM 策略。有关更多信息,请参阅允许其他账户中的用户使用 KMS 密钥。
要使用跨账户 KMS 密钥
-
向本地账户添加密钥策略。
以下示例为外部账户 444455556666 中的
ExampleRole
和ExampleUser
提供了内部账户 123456789012 中的权限。{ "Sid": "Allow an external account to use this KMS key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::444455556666:role/ExampleRole", "arn:aws:iam::444455556666:user/ExampleUser" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey", "kms:RetireGrant" ], "Resource": "*" }
-
在外部账户中添加 IAM 策略。
以下示例 IAM 策略允许主体使用账户 123456789012 中的 KMS 密钥执行加密操作。要向账户 444455556666 中的
ExampleRole
和ExampleUser
授予此权限,请将策略附加到该账户中的用户或角色。{ "Sid": "Allow use of KMS key in account 123456789012", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey", "kms:RetireGrant" ], "Resource": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab" }
将数据库快照导出到 Amazon S3 桶
每个 AWS 账户 最多可以执行五个并发数据库快照导出任务。
注意
导出 RDS 快照可能需要一段时间,具体取决于您的数据库类型和大小。导出任务首先还原并扩展整个数据库,然后再将数据提取到 Amazon S3。此阶段的任务进度显示为正在启动。当任务切换到将数据导出到 S3 时,进度显示为正在进行。
完成导出所需的时间取决于数据库中存储的数据。例如,具有分布良好的数字主键或索引列的表导出速度最快。不包含适用于分区的列的表,以及只有基于字符串的列上的一个索引的表将需要更长时间。导出时间之所以更长,是因为导出使用较慢的单线程进程。
您可以使用AWS Management Console、AWS CLI 或 RDS API 将数据库快照导出到 Amazon S3。要将数据库快照导出到跨账户 Amazon S3 存储桶,请使用 AWS CLI 或 RDS API。
如果您使用 Lambda 函数导出快照,请将 kms:DescribeKey
操作添加到 Lambda 函数策略中。有关更多信息,请参阅 AWS Lambda 权限。
仅为可导出到 Amazon S3 的快照显示导出到 Amazon S3 控制台选项。由于以下原因,快照可能无法导出:
-
此数据库引擎不支持 S3 导出。
-
此数据库引擎版本不支持 S3 导出。
-
创建了快照的 AWS 区域不支持 S3 导出。
导出数据库快照
-
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择快照。
-
从选项卡中,选择要导出的快照类型。
-
在快照列表中,选择要导出的快照。
-
对于 Actions (操作),选择 Export to Amazon S3 (导出到 Amazon S3)。
此时将显示 Export to Amazon S3 (导出到 Amazon S3) 窗口。
-
对于 Export identifier (导出标识符),输入用于标识导出任务的名称。此值也用于在 S3 存储桶中创建的文件的名称。
-
选择要导出的数据:
-
选择 All (全部) 可导出快照中的所有数据。
-
选择 Partial (部分) 可导出快照的特定部分。如需标识要导出快照的哪些部分,请为 Identifiers (标识符)(以空格分隔)输入一个或多个数据库、架构或表。
使用以下格式:
database
[.schema
][.table
]database2
[.schema2
][.table2
] ...database
n[.schema
n][.table
n]例如:
mydatabase mydatabase2.myschema1 mydatabase2.myschema2.mytable1 mydatabase2.myschema2.mytable2
-
-
对于 S3 bucket (S3 存储桶),选择要导出到的存储桶。
要将导出的数据分配给 S3 存储桶中的文件夹路径,请为 S3 prefix (S3 前缀) 输入可选路径。
-
对于 IAM role (IAM 角色),请选择一个角色以授予您对所选 S3 存储桶的写入访问权限,或创建新角色。
-
如果您按照 使用 IAM 角色提供对 Amazon S3 存储桶的访问权限中的步骤创建了角色,请选择该角色。
-
如果您没有创建授予您对所选 S3 桶的写入访问权限的角色,则选择 Create a new role(创建新角色)来自动创建该角色。接下来,在 IAM role name (IAM 角色名称) 中输入角色的名称。
-
-
对于 AWS KMS key,输入要用于加密导出数据的密钥的 ARN。
-
选择 Export to Amazon S3 (导出到 Amazon S3)。
要使用 AWS CLI 将数据库快照导出到 Amazon S3,请使用包含以下所需选项的 start-export-task 命令:
-
--export-task-identifier
-
--source-arn
-
--s3-bucket-name
-
--iam-role-arn
-
--kms-key-id
在以下示例中,快照导出任务名为 my-snapshot-export
,该任务将快照导出到名为 DOC-EXAMPLE-BUCKET
的 S3 存储桶。
对于 Linux、macOS 或 Unix:
aws rds start-export-task \ --export-task-identifier
my-snapshot-export
\ --source-arn arn:aws:rds:AWS_Region
:123456789012:snapshot:snapshot-name
\ --s3-bucket-nameDOC-EXAMPLE-BUCKET
\ --iam-role-arniam-role
\ --kms-key-idmy-key
对于 Windows:
aws rds start-export-task ^ --export-task-identifier
my-snapshot-export
^ --source-arn arn:aws:rds:AWS_Region
:123456789012:snapshot:snapshot-name
^ --s3-bucket-nameDOC-EXAMPLE-BUCKET
^ --iam-role-arniam-role
^ --kms-key-idmy-key
示例输出如下。
{ "Status": "STARTING", "IamRoleArn": "iam-role", "ExportTime": "2019-08-12T01:23:53.109Z", "S3Bucket": "my-export-bucket", "PercentProgress": 0, "KmsKeyId": "my-key", "ExportTaskIdentifier": "my-snapshot-export", "TotalExtractedDataInGB": 0, "TaskStartTime": "2019-11-13T19:46:00.173Z", "SourceArn": "arn:aws:rds:AWS_Region:123456789012:snapshot:snapshot-name" }
要在 S3 存储桶中为快照导出提供文件夹路径,请在 start-export-task 命令中包含 --s3-prefix
选项。
要使用 Amazon RDS API 将数据库快照导出到 Amazon S3,请使用包含以下所需参数的 StartExportTask 操作:
-
ExportTaskIdentifier
-
SourceArn
-
S3BucketName
-
IamRoleArn
-
KmsKeyId
监控快照导出
您可以使用 AWS Management Console、AWS CLI 或 RDS API 监控数据库快照导出。
监视数据库快照导出
-
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择快照。
-
要查看快照导出的列表,请选择 Amazon S3 中的导出选项卡。
-
要查看有关特定快照导出的信息,请选择导出任务。
要使用 AWS CLI 监控数据库快照导出,请使用 describe-export-tasks 命令。
以下示例说明如何显示有关所有快照导出的当前信息。
aws rds describe-export-tasks { "ExportTasks": [ { "Status": "CANCELED", "TaskEndTime": "2019-11-01T17:36:46.961Z", "S3Prefix": "something", "ExportTime": "2019-10-24T20:23:48.364Z", "S3Bucket": "
DOC-EXAMPLE-BUCKET
", "PercentProgress": 0, "KmsKeyId": "arn:aws:kms:AWS_Region
:123456789012:key/K7MDENG/bPxRfiCYEXAMPLEKEY", "ExportTaskIdentifier": "anewtest", "IamRoleArn": "arn:aws:iam::123456789012:role/export-to-s3", "TotalExtractedDataInGB": 0, "TaskStartTime": "2019-10-25T19:10:58.885Z", "SourceArn": "arn:aws:rds:AWS_Region
:123456789012:snapshot:parameter-groups-test" }, { "Status": "COMPLETE", "TaskEndTime": "2019-10-31T21:37:28.312Z", "WarningMessage": "{\"skippedTables\":[],\"skippedObjectives\":[],\"general\":[{\"reason\":\"FAILED_TO_EXTRACT_TABLES_LIST_FOR_DATABASE\"}]}", "S3Prefix": "", "ExportTime": "2019-10-31T06:44:53.452Z", "S3Bucket": "DOC-EXAMPLE-BUCKET1
", "PercentProgress": 100, "KmsKeyId": "arn:aws:kms:AWS_Region
:123456789012:key/2Zp9Utk/h3yCo8nvbEXAMPLEKEY", "ExportTaskIdentifier": "thursday-events-test", "IamRoleArn": "arn:aws:iam::123456789012:role/export-to-s3", "TotalExtractedDataInGB": 263, "TaskStartTime": "2019-10-31T20:58:06.998Z", "SourceArn": "arn:aws:rds:AWS_Region
:123456789012:snapshot:rds:example-1-2019-10-31-06-44" }, { "Status": "FAILED", "TaskEndTime": "2019-10-31T02:12:36.409Z", "FailureCause": "The S3 bucket edgcuc-export isn't located in the current AWS Region. Please, review your S3 bucket name and retry the export.", "S3Prefix": "", "ExportTime": "2019-10-30T06:45:04.526Z", "S3Bucket": "DOC-EXAMPLE-BUCKET2
", "PercentProgress": 0, "KmsKeyId": "arn:aws:kms:AWS_Region
:123456789012:key/2Zp9Utk/h3yCo8nvbEXAMPLEKEY", "ExportTaskIdentifier": "wednesday-afternoon-test", "IamRoleArn": "arn:aws:iam::123456789012:role/export-to-s3", "TotalExtractedDataInGB": 0, "TaskStartTime": "2019-10-30T22:43:40.034Z", "SourceArn": "arn:aws:rds:AWS_Region
:123456789012:snapshot:rds:example-1-2019-10-30-06-45" } ] }
要显示有关特定快照导出的信息,请在 --export-task-identifier
命令中包含 describe-export-tasks
选项。要筛选输出,请包括 --Filters
选项。有关更多选项,请参阅 describe-export-tasks 命令。
要使用 Amazon RDS API 显示有关数据库快照导出的信息,请使用 DescribeExportTasks 操作。
要跟踪导出工作流的完成情况或启动其他工作流,您可以订阅 Amazon Simple Notification Service 主题。有关 Amazon SNS 的更多信息,请参阅 使用 Amazon RDS 事件通知。
取消快照导出任务
您可以使用 AWS Management Console、AWS CLI 或 RDS API 取消数据库快照导出任务。
注意
取消快照导出任务不会删除导出到 Amazon S3 的任何数据。有关如何使用控制台删除数据的信息,请参阅如何从 S3 存储桶删除对象? 要使用 CLI 删除数据,请使用 delete-object 命令。
取消快照导出任务
-
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择快照。
-
选择 Exports in Amazon S3 (Amazon S3 中的导出) 选项卡。
-
选择要取消的快照导出任务。
-
选择 Cancel (取消)。
-
在确认页面上选择 Cancel export task (取消导出任务)。
要使用 AWS CLI 取消快照导出任务,请使用 cancel-export-task 命令。该命令需要 --export-task-identifier
选项。
aws rds cancel-export-task --export-task-identifier my_export { "Status": "CANCELING", "S3Prefix": "", "ExportTime": "2019-08-12T01:23:53.109Z", "S3Bucket": "
DOC-EXAMPLE-BUCKET
", "PercentProgress": 0, "KmsKeyId": "arn:aws:kms:AWS_Region
:123456789012:key/K7MDENG/bPxRfiCYEXAMPLEKEY", "ExportTaskIdentifier": "my_export", "IamRoleArn": "arn:aws:iam::123456789012:role/export-to-s3", "TotalExtractedDataInGB": 0, "TaskStartTime": "2019-11-13T19:46:00.173Z", "SourceArn": "arn:aws:rds:AWS_Region
:123456789012:snapshot:export-example-1" }
要使用 Amazon RDS API 取消快照导出任务,请使用带 ExportTaskIdentifier
参数的 CancelExportTask 操作。
Amazon S3 导出任务的失败消息
下表描述了 Amazon S3 导出任务失败时返回的消息。
失败消息 | 描述 |
---|---|
出现未知的内部错误。 |
由于未知错误、异常或故障导致任务失败。 |
将导出任务的元数据写入 S3 存储桶 [存储桶名称] 时出现未知的内部错误。 |
由于未知错误、异常或故障导致任务失败。 |
RDS 导出无法编写导出任务的元数据,因为它无法担任 IAM 角色 [角色 ARN]。 |
导出任务将担任您的 IAM 角色来验证是否允许向 S3 存储桶写入元数据。如果任务无法担任您的 IAM 角色,它将失败。 |
RDS 导出未能使用带有 KMS 密钥 [密钥 ID] 的 IAM 角色 [角色 ARN] 将导出任务的元数据写入 S3 存储桶 [存储桶名称]。错误代码:[错误代码] |
缺少一个或多个权限,因此导出任务无法访问 S3 存储桶。收到以下错误代码之一时,会引发此失败消息:
这些错误代码表示 IAM 角色、S3 桶或 KMS 密钥的设置出现配置错误。 |
IAM 角色 [角色 ARN] 无权在 S3 存储桶 [存储桶名称] 上调用 [S3 操作]。查看您的权限并重试导出。 |
IAM 策略配置错误。缺少对 S3 桶执行特定 S3 操作的权限,这会导致导出任务失败。 |
KMS 密钥检查失败。检查 KMS 密钥上的凭证然后重试。 |
KMS 密钥凭证检查失败。 |
S3 凭证检查失败。检查 S3 存储桶和 IAM 策略的权限。 |
S3 凭证检查失败。 |
S3 存储桶 [存储桶名称] 无效。它不在当前 AWS 区域,或者它不存在。检查 S3 存储桶名称,然后重试导出。 |
S3 存储桶无效。 |
S3 存储桶 [存储桶名称] 不在当前 AWS 区域。检查 S3 存储桶名称,然后重试导出。 |
S3 存储桶处于错误的 AWS 区域。 |
排查 PostgreSQL 权限错误
将 PostgreSQL 数据库导出到 Amazon S3 时,您可能会看到 PERMISSIONS_DO_NOT_EXIST
错误,指出已跳过某些表。当您在创建数据库时指定的超级用户无权访问这些表时,通常会发生此错误。
要修复此错误,请运行以下命令:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA
schema_name
TOsuperuser_name
有关超级用户权限的更多信息,请参阅 主用户账户权限。
文件命名约定
特定表的导出数据以
格式存储,基本前缀如下:base_prefix
/files
export_identifier
/database_name
/schema_name
.table_name
/
例如:
export-1234567890123-459/rdststdb/rdststdb.DataInsert_7ADB5D19965123A2/
文件的命名方式有两种约定。
-
当前约定:
batch_index
/part-partition_index
-random_uuid
.format-based_extension
批量索引是一个序列号,表示从表中读取的一批数据。如果我们无法将您的表分区成小块以并行导出,则会有多个批量索引。如果表分区成多个表,也会发生同样的情况。这会出现多个批量索引,主表的每个表分区对应一个。
如果我们可以将表分区成小块以并行读取,那么就只有批量索引
1
文件夹。在批量索引文件夹中,有一个或多个包含表数据的 Parquet 文件。Parquet 文件名的前缀是
part-
。如果您的表已分区,则会有多个以分区索引partition_index
00000
开头的文件。分区索引序列中可能存在间隙。之所以发生这种情况,是因为每个分区都是从表中的范围查询中获得的。如果该分区的范围内没有数据,则跳过该序列号。
例如,假设
id
列是表的主键,其最小值和最大值为100
和1000
。当我们尝试导出这个带有九个分区的表时,我们会使用并行查询读取它,如下所示:SELECT * FROM table WHERE id <= 100 AND id < 200 SELECT * FROM table WHERE id <= 200 AND id < 300
这应该生成九个文件,从
part-00000-
到random_uuid
.gz.parquetpart-00008-
。但是,如果没有 ID 介于random_uuid
.gz.parquet200
和350
之间的行,则其中一个已完成的分区为空,并且不会为其创建任何文件。在前面的示例中,未创建part-00001-
。random_uuid
.gz.parquet -
较早的约定:
part-
partition_index
-random_uuid
.format-based_extension
这与当前约定相同,但没有
前缀,例如:batch_index
part-00000-c5a881bb-58ff-4ee6-1111-b41ecff340a3-c000.gz.parquet part-00001-d7a881cc-88cc-5ab7-2222-c41ecab340a4-c000.gz.parquet part-00002-f5a991ab-59aa-7fa6-3333-d41eccd340a7-c000.gz.parquet
文件命名约定可能会更改。因此,在读取目标表时,我们建议您读取表的基本前缀内的所有内容。
导出到 Amazon S3 存储桶时的数据转换
将数据库快照导出到 Amazon S3 存储桶时,Amazon RDS 以 Parquet 格式转换数据、导出数据并存储数据。有关 Parquet 的更多信息,请参阅 Apache Parquet
Parquet 将所有数据存储为以下原始类型之一:
-
BOOLEAN
-
INT32
-
INT64
-
INT96
-
FLOAT
-
DOUBLE
-
BYTE_ARRAY – 一个可变长度的字节数组,也称为二进制
-
FIXED_LEN_BYTE_ARRAY – 当值具有恒定大小时使用的固定长度字节数组
Parquet 数据类型很少能减少读取和写入格式的复杂性。Parquet 提供了用于扩展原始类型的逻辑类型。逻辑类型实现为具有 LogicalType
元数据字段中数据的注释。逻辑类型注释说明如何解释原始类型。
当 STRING
逻辑类型注释 BYTE_ARRAY
类型时,它表示字节数组应被解释为 UTF-8 编码的字符串。导出任务完成后,如果发生了任何字符串转换,则 Amazon RDS 会通知您。导出的基础数据始终与源中的数据相同。但是,由于 UTF-8 中的编码差异,在工具(如 Athena)中读取时,某些字符可能会显示与源不同。
有关更多信息,请参阅 Parquet 文档中的 Parquet 逻辑类型定义
MySQL 和 MariaDB 数据类型到 Parquet 的映射
下表显示在将数据转换并导出到 Amazon S3 时从 MySQL 和 MariaDB 数据类型到 Parquet 数据类型的映射。
源数据类型 | Parquet 原始类型 | 逻辑类型注释 | 转换说明 |
---|---|---|---|
数字数据类型 | |||
BIGINT | INT64 | ||
BIGINT UNSIGNED | FIXED_LEN_BYTE_ARRAY(9) | DECIMAL(20,0) | Parquet 仅支持签名类型,因此映射需要额外的字节(8 加 1)来存储 BIGINT_UNSIGNED 类型。 |
BIT | BYTE_ARRAY | ||
DECIMAL | INT32 | DECIMAL (p,s) | 如果源值小于 231,它其存储为 INT32。 |
INT64 | DECIMAL (p,s) | 如果源值等于或大于 231,但小于 263,它将存储为 INT64。 | |
FIXED_LEN_BYTE_ARRAY(N) | DECIMAL (p,s) | 如果源值等于或大于 263,则将它存储为 FIXED_LEN_BYTE_ARRAY(N)。 | |
BYTE_ARRAY | STRING | Parquet 不支持大于 38 的小数精度。十进制值转换为 BYTE_ARRAY 类型的字符串,并编码为 UTF8。 | |
DOUBLE | DOUBLE | ||
FLOAT | DOUBLE | ||
INT | INT32 | ||
INT UNSIGNED | INT64 | ||
MEDIUMINT | INT32 | ||
MEDIUMINT UNSIGNED | INT64 | ||
NUMERIC | INT32 | DECIMAL (p,s) |
如果源值小于 231,它其存储为 INT32。 |
INT64 | DECIMAL (p,s) | 如果源值等于或大于 231,但小于 263,它将存储为 INT64。 | |
FIXED_LEN_ARRAY(N) | DECIMAL (p,s) | 如果源值等于或大于 263,则将它存储为 FIXED_LEN_BYTE_ARRAY(N)。 | |
BYTE_ARRAY | STRING | Parquet 不支持大于 38 的数值精度。此数值类型的值转换为 BYTE_ARRAY 类型的字符串,并编码为 UTF8。 | |
SMALLINT | INT32 | ||
SMALLINT UNSIGNED | INT32 | ||
TINYINT | INT32 | ||
TINYINT UNSIGNED | INT32 | ||
字符串数据类型 | |||
BINARY | BYTE_ARRAY | ||
BLOB | BYTE_ARRAY | ||
CHAR | BYTE_ARRAY | ||
ENUM | BYTE_ARRAY | STRING | |
LINESTRING | BYTE_ARRAY | ||
LONGBLOB | BYTE_ARRAY | ||
LONGTEXT | BYTE_ARRAY | STRING | |
MEDIUMBLOB | BYTE_ARRAY | ||
MEDIUMTEXT | BYTE_ARRAY | STRING | |
MULTILINESTRING | BYTE_ARRAY | ||
SET | BYTE_ARRAY | STRING | |
TEXT | BYTE_ARRAY | STRING | |
TINYBLOB | BYTE_ARRAY | ||
TINYTEXT | BYTE_ARRAY | STRING | |
VARBINARY | BYTE_ARRAY | ||
VARCHAR | BYTE_ARRAY | STRING | |
日期和时间数据类型 | |||
DATE | BYTE_ARRAY | STRING | 日期将转换为 BYTE_ARRAY 类型的字符串,并编码为 UTF8。 |
DATETIME | INT64 | TIMESTAMP_MICROS | |
TIME | BYTE_ARRAY | STRING | TIME 类型转换为 BYTE_ARRAY 类型的字符串,并编码为 UTF8。 |
TIMESTAMP | INT64 | TIMESTAMP_MICROS | |
YEAR | INT32 | ||
几何数据类型 | |||
GEOMETRY | BYTE_ARRAY | ||
GEOMETRYCOLLECTION | BYTE_ARRAY | ||
MULTIPOINT | BYTE_ARRAY | ||
MULTIPOLYGON | BYTE_ARRAY | ||
POINT | BYTE_ARRAY | ||
POLYGON | BYTE_ARRAY | ||
JSON 数据类型 | |||
JSON | BYTE_ARRAY | STRING |
PostgreSQL 数据类型到 Parquet 的映射
下表显示在将数据转换并导出到 Amazon S3 时从 PostgreSQL 数据类型到 Parquet 数据类型的映射。
PostgreSQL 数据类型 | Parquet 原始类型 | 逻辑类型注释 | 映射注释 |
---|---|---|---|
数字数据类型 | |||
BIGINT | INT64 | ||
BIGSERIAL | INT64 | ||
DECIMAL | BYTE_ARRAY | STRING | DECIMAL 类型转换为 BYTE_ARRAY 类型的字符串,并编码为 UTF8。 此转换是为了避免由于数据精度和非数字 (NaN) 的数据值而引起的复杂性。 |
DOUBLE PRECISION | DOUBLE | ||
INTEGER | INT32 | ||
MONEY | BYTE_ARRAY | STRING | |
REAL | FLOAT | ||
SERIAL | INT32 | ||
SMALLINT | INT32 | INT_16 | |
SMALLSERIAL | INT32 | INT_16 | |
字符串和相关数据类型 | |||
ARRAY | BYTE_ARRAY | STRING |
数组转换为字符串并编码为 BINARY (UTF8)。 此转换是为了避免因数据精度、非数字 (NaN) 的数据值和时间数据值而产生的复杂性。 |
BIT | BYTE_ARRAY | STRING | |
BIT VARYING | BYTE_ARRAY | STRING | |
BYTEA | BINARY | ||
CHAR | BYTE_ARRAY | STRING | |
CHAR(N) | BYTE_ARRAY | STRING | |
ENUM | BYTE_ARRAY | STRING | |
NAME | BYTE_ARRAY | STRING | |
TEXT | BYTE_ARRAY | STRING | |
文本搜索 | BYTE_ARRAY | STRING | |
VARCHAR(N) | BYTE_ARRAY | STRING | |
XML | BYTE_ARRAY | STRING | |
日期和时间数据类型 | |||
DATE | BYTE_ARRAY | STRING | |
INTERVAL | BYTE_ARRAY | STRING | |
TIME | BYTE_ARRAY | STRING | |
带时区的时间 | BYTE_ARRAY | STRING | |
TIMESTAMP | BYTE_ARRAY | STRING | |
TIMESTAMP(有时区) | BYTE_ARRAY | STRING | |
几何数据类型 | |||
BOX | BYTE_ARRAY | STRING | |
CIRCLE | BYTE_ARRAY | STRING | |
LINE | BYTE_ARRAY | STRING | |
LINESEGMENT | BYTE_ARRAY | STRING | |
路径 | BYTE_ARRAY | STRING | |
POINT | BYTE_ARRAY | STRING | |
POLYGON | BYTE_ARRAY | STRING | |
JSON 数据类型 | |||
JSON | BYTE_ARRAY | STRING | |
JSONB | BYTE_ARRAY | STRING | |
其他数据类型 | |||
BOOLEAN | BOOLEAN | ||
CIDR | BYTE_ARRAY | STRING | 网络数据类型 |
COMPOSITE | BYTE_ARRAY | STRING | |
DOMAIN | BYTE_ARRAY | STRING | |
INET | BYTE_ARRAY | STRING | 网络数据类型 |
MACADDR | BYTE_ARRAY | STRING | |
对象标识符 | 不适用 | ||
PG_LSN | BYTE_ARRAY | STRING | |
RANGE | BYTE_ARRAY | STRING | |
UUID | BYTE_ARRAY | STRING |