在 Aurora PostgreSQL 中使用未记录的表
Amazon Aurora PostgreSQL 支持未记录的表,这些表具有崩溃安全性,即使在出现写入器实例故障或进行失效转移后也能保持数据完整性。在标准 PostgreSQL 中,未记录的表在写入操作期间会绕过预写日志(WAL),从而提高写入速度。但是,这是以降低持久性为代价的,因为未记录的表不具有崩溃安全性,在系统故障或不正常关闭后可能会丢失数据。这些未记录的表会在崩溃或不正常关闭后自动截断。它们的内容和索引也不会复制到备用服务器。
相比之下,Aurora PostgreSQL 由于其分布式存储架构,处理未记录的表的方式有所不同。这是因为 Aurora 的存储系统不依赖于传统的 PostgreSQL WAL 来实现持久性。然而,在标准 PostgreSQL 中通常与未记录的表关联的性能优势在 Aurora 中可能并不那么明显。这归因于 Aurora 的分布式存储架构,与标准 PostgreSQL 中使用的本地存储相比,这种架构可能会带来额外的开销。
在 Aurora PostgreSQL 中使用未记录的表时,请注意以下事项:
-
您只能从 Aurora 数据库集群中的写入器节点访问未记录的表。
-
读取器节点只有在提升到写入器状态时,才能访问未记录的表。
-
当您尝试从读取器节点访问未记录的表时,将导致以下错误:
cannot access temporary or unlogged relations during recovery.
创建未记录的表
要在 Aurora PostgreSQL 中创建未记录的表,请在 CREATE TABLE 语句中添加 UNLOGGED 关键字:
CREATE UNLOGGED TABLE staging_sales_data ( transaction_id bigint, customer_id bigint, product_id bigint, transaction_date date, amount NUMERIC );
未记录的表和逻辑复制
逻辑复制中通常不包括未记录的表,因为逻辑复制依赖于 WAL 来捕获和传输更改。默认情况下,对未记录的表进行的更改不会记录 WAL 并被排除在复制流之外,这使得它们不适合需要逻辑复制的用例。但是,Aurora PostgreSQL 提供了一个名为 rds.logically_replicate_unlogged_tables
的参数,让您可以控制这种行为:
-
当
rds.logically_replicate_unlogged_tables
设置为 0(关闭)时,将从逻辑复制中排除未记录的表。 -
当
rds.logically_replicate_unlogged_tables
设置为 1(开启)时,将在逻辑复制中包含未记录的表。
注意
在 Aurora PostgreSQL 中,rds.logically_replicate_unlogged_tables
参数在版本 14 及更早版本中默认设置为 1(开启),而在版本 15 及更高版本中默认设置为 0(关闭)。