处理没有主键的表以创建 Amazon Aurora PostgreSQL 零 ETL 集成与 Ama
在创建 Amazon Aurora PostgreSQL 与 Amazon Redshift 的零ETL 集成时处理没有主键的表
关键点摘要
在这篇文章中,我们将讨论如何在创建 Amazon Aurora PostgreSQL 与 Amazon Redshift 的零ETL 集成时处理没有主键的表。我们将提供可行的解决方案和策略,帮助您有效地处理这种情况,并保证数据同步的完整性。
在 Amazon Web Services (AWS),我们正在不断推进我们的零提取、转换和加载 (ETL) 理念的实现,通过 Amazon Aurora 的零ETL 集成,您可以将事务数据与 Amazon Redshift 的分析能力结合起来。这种集成能够打破数据孤岛,为各个应用程序提供全面的洞察,节省费用,提高操作效率。

目前,Aurora 的零ETL 集成已对 Amazon Aurora MySQL 完全可用,对于 Amazon Aurora PostgreSQL 处于公共预览阶段,用于 Amazon RDS for MySQL 的零ETL 集成同样处于公共预览,而 Amazon DynamoDB 目前在私有预览中。更多信息请参考 处理 Aurora 的零ETL 集成。
没有主键的表的挑战
主键是用于唯一识别表中记录行的属性,由一个或多个列的组合定义,且这些列均不可为 NULL。主键的存在对关系型数据库至关重要,因为它们可以帮助进行数据管理,提高查询性能并简化数据库变更日志的消费。
在 PostgreSQL 源中,零ETL 集成使用逻辑复制作为构建基石。成功的零ETL 集成要求 Aurora PostgreSQL 表必须有主键,才能成功同步到 Amazon Redshift 目标,以处理更新和删除事务。因此,没有主键的 Aurora PostgreSQL 表无法复制到 Amazon Redshift 数据仓库。
为了帮助您应对没有主键的表,接下来我们将展示可行的解决方案。
解决方案概述
如果您在使用公共预览的 Aurora PostgreSQL 与 Amazon Redshift 的零ETL 集成时发现没有主键的表无法复制,Amazon Redshift 的监控控制台会显示相应状态为“失败”,而整体零ETL 集成状态会更改为“需要关注”。
1) 评估现有列、键或唯一索引能否作为主键
找到一个唯一的或联合的自然键,作为源 Aurora PostgreSQL 表中的主键,通常是最简单的方案。如果有这样的列,您应确认哪些列可以成为主键。如果主键位于分区表上,则所有分区键中的列必须成为主键,以遵循唯一约束限制。
白鲸加速器最新版下载安装一些识别表中潜在主键的方法如下:
检查表中是否存在唯一索引,这些索引可能是良好的主键候选。查看 pgstats 目录视图,确定 ndistinct 列是否可以用来识别唯一列。识别一个主键后,运行 ALTER TABLE 命令来添加主键。
sqlALTER TABLE lttablenamegt ADD PRIMARY KEY (column1column2) 或者 ALTER TABLE lttablenamegt ADD CONSTRAINT ltconstraintnamegt PRIMARY KEY (column1column2)
注意:在生产系统中添加主键可能会影响到查询性能,因此在执行这些操作前,务必在非生产环境中测试,以评估所需时间和性能影响。
2) 添加合成主键
如果没有列可以作为有效的主键,您可以创建一个合成列,通过序列号填充。为现有表添加序列号并回填缺失的键值是一项复杂的工作,需要合理计划,尤其是在生产环境中。
21) 向空或小表中添加身份列身份列是一个数字生成器,已在 PostgreSQL 10 版本中引入,属于 SQL 标准兼容的列类型。身份列后会自动分配来自序列的值,推荐使用身份列替代序列列。
如果表很小或没有数据,您可以直接添加身份列作为主键。以下是向 PostgreSQL 中现有表添加身份列的示例代码。
sqlALTER TABLE ltoriginaltablegt ADD COLUMN ltidcolumnnamegt BIGINT PRIMARY KEYGENERATED { ALWAYS BY DEFAULT } AS IDENTITY
22) 向现有大表添加主键为大事务表添加新身份列可能导致长时间的停机时间,因为需要加锁整个表。为了减轻停机时间,您可以按照以下步骤操作:
向现有表添加一个 Nullable 列,且没有默认值,这不会造成任何阻塞或重写整个表。手动创建一个序列,并将其当前值重置为比现有表的行数多。使用现有表的 pgstatalltables 视图,估算当前行数,以此作为序列的起始值。将创建的序列与新列关联,使得后续交易自动使用序列中的值。sqlALTER TABLE ltoriginaltablegt ADD COLUMN ltidcolumnnamegt BIGINT NULLCREATE SEQUENCE ltidvaluesequencenamegtSELECT SETVAL(ltidvaluesequencenamegt COALESCE(MAX(ltidcolumnnamegt) ltbuffergt count() ltbuffergt)) from ltoriginaltablegtALTER SEQUENCE ltidvaluesequencenamegt OWNED BY ltoriginaltablegtltidcolumnnamegtALTER TABLE ltoriginaltablegt ALTER COLUMN ltidcolumnnamegt SET DEFAULT nextval(ltidvaluesequencenamegt)
然后,使用批处理的方法更新现有行并添加唯一索引。
确认成功的零ETL 集成
从零ETL 集成的角度来看,向现有表添加主键应该会自动导致表的重新同步。状态将从“需要关注”变为“激活”,并且表的状态将从“失败”过渡到“重新同步已启动”并最终达到“已同步”。
无论您选择哪种策略,务必在非生产环境中测试您的方法,以确保其有效性及最小化停机时间。在生产环境中进行更改前,进行充分的规划和测试是非常关键的。
结论
本文详细说明了在源表未定义主键的情况下,如何继续使用 Aurora PostgreSQL 的零ETL 集成与 Amazon Redshift。我们还提供了一般性指导、策略及如何处理主键创建和修改的方法。使用零ETL 集成功能,您可以高效地对事务或运营数据集执行分析。
关于作者
Rohit Vashishtha 是 AWS 的高级 Redshift 专家解决方案架构师,拥有超过 17 年的大数据平台架构和建设经验。他帮助客户利用 AWS 服务现代化他们的分析工作负载。
Sikandra Chaudhary 是 AWS 的高级数据库专家解决方案架构师,协助 AWS 客户进行架构设计和迁移。
Abhinav Dhandh 是 Amazon Aurora 的高级产品经理,负责 AWS 内的零ETL 和变化数据捕获CDC产品愿景和路线图。
Kanishka Chaturvedi 是 Amazon Aurora 的首席工程师,领导 Aurora 引擎的零ETL 计划技术方向。
Gopal Paliwal 是 Amazon Redshift 的首席工程师,主导 Amazon Redshift 的零ETL 计划的软件开发。