

# 在 Aurora PostgreSQL 中使用未记录的表
<a name="aurora-postgresql-unlogged-tables"></a>

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.`

## 创建未记录的表
<a name="aurora-postgresql-unlogged-tables-create"></a>

要在 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
);
```

## 在迁移期间处理未记录的表
<a name="aurora-postgresql-unlogged-tables-migration"></a>

在准备将数据迁移到 Aurora PostgreSQL 时，正确识别和处理未记录的表非常重要。未记录的表不会写入 WAL 日志，也不会包含在复制流中，这意味着它们不会被复制到 Aurora 只读副本。

在创建 Aurora 只读副本之前，将未记录的表转换为已记录的表，或者如果未使用则删除它们。

要验证实例中的每个数据库中是否存在未记录的表，请使用以下命令：

```
SELECT oid, relfilenode, relname, relpersistence, relkind 
FROM pg_class 
WHERE relpersistence ='u';
```

要将未记录的表转换回已记录的表，请使用以下命令：

```
ALTER TABLE table_name SET LOGGED;
```

此操作会重写整个表，并在其上放置排他锁，直到操作完成。对于大型表，这可能会导致大量的停机时间。

## 将未记录的表转换为已记录的表
<a name="aurora-postgresql-unlogged-tables-convert"></a>

当您需要将未记录的表转换回已记录的表时，可以使用以下命令：

```
ALTER TABLE table_name SET LOGGED;
```

此操作会重写整个表，并在其上放置排他锁，直到操作完成。对于大型表，这可能会导致大量的停机时间。

## 未记录的表和逻辑复制
<a name="aurora-postgresql-unlogged-tables-logicalrep"></a>

逻辑复制中通常不包括未记录的表，因为逻辑复制依赖于 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（关闭）。