使用扩展和外部数据包装器
要扩展 Aurora PostgreSQL 兼容版数据库集群的功能,您可以安装和使用各种 PostgreSQL 扩展。例如,如果您的使用案例要求在非常大的表中输入密集型数据,则可以安装 pg_partman
扩展以对数据进行分区,从而分散工作负载。
注意
自 Aurora PostgreSQL 14.5 起,Aurora PostgreSQL 支持适用于 PostgreSQL 的可信语言扩展。此功能是作为扩展 pg_tle
实现的,您可以将其添加到 Aurora PostgreSQL 中。通过使用此扩展,开发人员可以在安全的环境中创建自己的 PostgreSQL 扩展,从而简化设置和配置要求以及新扩展的许多初步测试。有关更多信息,请参阅使用适用于 PostgreSQL 的可信语言扩展。
在某些情况下,您可以将特定模块添加到 Aurora PostgreSQL 数据库集群的自定义数据库集群参数组中的 shared_preload_libraries
列表中,而不是安装扩展。通常,原定设置的数据库集群参数组仅加载 pg_stat_statements
,但还有其他几个模块可供添加到此列表中。例如,您可以通过添加 pg_cron
模块来添加调度功能,详情请见使用 PostgreSQL pg_cron 扩展计划维护。再举一个例子,您可以通过加载 auto_explain
模块来记录查询执行计划。要了解更多信息,请参阅 Amazon 知识中心中的记录查询执行计划
提供对外部数据的访问权限的扩展更具体地称为外部数据包装器(FDW)。例如,oracle_fdw
扩展允许 Aurora PostgreSQL 数据库集群使用 Oracle 数据库。
接下来,您可以找到有关设置和使用 Aurora PostgreSQL 可用的一些扩展、模块和 FDW 的信息。为简单起见,这些都称为“扩展”。您可以找到可与当前可用的 Aurora PostgreSQL 版本结合使用的扩展列表,请参阅《Aurora PostgreSQL 版本注释》中的 Amazon Aurora PostgreSQL 的扩展版本。
使用 pgAudit 记录数据库活动
金融机构、政府机构和许多行业需要保留审计日志以满足监管要求。通过将 PostgreSQL Audit 扩展(pgAudit)与 Aurora PostgreSQL 数据库集群结合使用,您可以捕获审计人员通常需要或满足监管要求的详细记录。例如,您可以设置 pgAudit 扩展来跟踪对特定数据库和表所做的更改,记录进行更改的用户以及许多其他详细信息。
pgAudit 扩展通过更详细地扩展日志消息,进一步构建原生 PostgreSQL 日志记录基础设施的功能。换句话说,您将使用与查看任何日志消息相同的方法来查看审计日志。有关 PostgreSQL 日志记录的更多信息,请参阅 Aurora PostgreSQL 数据库日志文件。
pgAudit 扩展会编辑日志中的敏感数据,例如明文密码。如果您的 Aurora PostgreSQL 数据库集群配置为记录数据操作语言(DML)语句(详情请见为您的 Aurora PostgreSQL 数据库集群开启查询日志记录),则可以使用 PostgreSQL Audit 扩展来避免明文密码问题。
您可以在数据库实例上配置具有高度明确性的审计。您可以审计所有数据库和所有用户。或者,您可以选择仅审计某些数据库、用户和其他对象。您也可以明确排除对某些用户和数据库进行审计。有关更多信息,请参阅从审计日志记录中排除用户或数据库。
考虑到可以捕获的详细信息量,我们建议您在使用 pgAudit 时监控存储消耗。
所有可用的 Aurora PostgreSQL 版本都支持 pgAudit 扩展。有关 Aurora PostgreSQL 版本支持的 pgAudit 版本的列表,请参阅《Aurora PostgreSQL 版本注释》https://docs.amazonaws.cn/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Extensions.html中的 Amazon Aurora PostgreSQL 的扩展版本。。
设置 pgAudit 扩展
要在 Aurora PostgreSQL 数据库集群上设置 pgAudit 扩展,首先要将 pgAudit 添加到 Aurora PostgreSQL 数据库集群的自定义数据库集群参数组上的共享库中。有关创建自定义数据库集群参数组的信息,请参阅使用参数组。接下来,安装 pgAudit 扩展。最后,指定要审计的数据库和对象。本部分中的过程向您展示如何操作。您可以使用 Amazon Web Services Management Console或 Amazon CLI。
您必须拥有 rds_superuser
角色的权限才能执行所有这些任务。
以下步骤假设您的 Aurora PostgreSQL 数据库集群 与自定义数据库集群 参数组相关联。
设置 pgAudit 扩展
登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择 Aurora PostgreSQL 数据库集群的写入器实例 。
-
打开 Aurora PostgreSQL 数据库集群写入器实例 的 Configuration(配置)选项卡。在实例详细信息中,找到 Parameter group(参数组)链接。
-
选择此链接以打开与您的 Aurora PostgreSQL 数据库集群 关联的自定义参数。
-
在 Parameters(参数)搜索字段中,键入
shared_pre
以查找shared_preload_libraries
参数。 -
选择 Edit parameters(编辑参数)以访问属性值。
-
将
pgaudit
添加到 Values(值)字段的列表中。使用逗号分隔值列表中的项目。 重启 Aurora PostgreSQL 数据库集群的写入器实例,以使对
shared_preload_libraries
参数的更改生效。当实例可用时,请验证 pgAudit 是否已初始化。使用
psql
连接到 Aurora PostgreSQL 数据库集群的写入器实例,然后运行以下命令。SHOW shared_preload_libraries;
shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)
初始化 pgAudit 后,您现在可以创建扩展了。您需要在初始化库后创建扩展,因为
pgaudit
扩展会为审计数据定义语言(DDL)语句安装事件触发器。CREATE EXTENSION pgaudit;
关闭
psql
会话。labdb=>
\q
登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 在列表中找到
pgaudit.log
参数并设置为适合您的使用案例的值。例如,将pgaudit.log
参数设置为write
(如下图所示),可以捕获对日志的插入、更新、删除和其他一些类型的更改。还可以为
pgaudit.log
参数选择以下值之一。none – 这是原定设置值。不记录任何数据库更改。
all – 记录所有内容(read、write、function、role、ddl、misc)。
ddl – 记录所有数据定义语言(DDL)语句(不包括在
ROLE
类中)。function – 记录函数调用和
DO
块。misc – 记录其他命令,例如
DISCARD
、FETCH
、CHECKPOINT
、VACUUM
和SET
。read –当源为关系(例如表)或查询时记录
SELECT
和COPY
。role – 记录与角色和权限相关的语句,例如
GRANT
、REVOKE
、CREATE ROLE
、ALTER ROLE
和DROP ROLE
。write – 当目标为关系(表)时,记录
INSERT
、UPDATE
、DELETE
、TRUNCATE
和COPY
。
选择 Save changes(保存更改)。
通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 从数据库列表中选择 Aurora PostgreSQL 数据库集群的写入器实例以将其选中,然后从 Actions(操作)菜单中选择 Reboot(重启)。
设置 pgAudit
要使用 Amazon CLI 设置 pgAudit,您可以调用 modify-db-parameter-group 操作来修改自定义参数组中的审计日志参数,如以下过程所示。
使用以下 Amazon CLI 命令向
shared_preload_libraries
参数中添加pgaudit
。aws rds modify-db-parameter-group \ --db-parameter-group-name
custom-param-group-name
\ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pgaudit,ApplyMethod=pending-reboot" \ --regionaws-region
-
使用以下 Amazon CLI 命令重启 Aurora PostgreSQL 数据库集群的写入器实例,以便初始化 pgaudit 库。
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
当实例可用时,您可以验证
pgaudit
是否已初始化。使用psql
连接到 Aurora PostgreSQL 数据库集群的写入器实例,然后运行以下命令。SHOW shared_preload_libraries;
shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)
初始化 pgAudit 后,您现在可以创建扩展了。
CREATE EXTENSION pgaudit;
关闭
psql
会话以便您可以使用 Amazon CLI。labdb=>
\q
使用以下 Amazon CLI 命令指定要由会话审计日志记录所记录的语句类别。该示例将
pgaudit.log
参数设置为write
,用于捕获对日志的插入、更新和删除。aws rds modify-db-parameter-group \ --db-parameter-group-name
custom-param-group-name
\ --parameters "ParameterName=pgaudit.log,ParameterValue=write
,ApplyMethod=pending-reboot" \ --regionaws-region
还可以为
pgaudit.log
参数选择以下值之一。none – 这是原定设置值。不记录任何数据库更改。
all – 记录所有内容(read、write、function、role、ddl、misc)。
ddl – 记录所有数据定义语言(DDL)语句(不包括在
ROLE
类中)。function – 记录函数调用和
DO
块。misc – 记录其他命令,例如
DISCARD
、FETCH
、CHECKPOINT
、VACUUM
和SET
。read –当源为关系(例如表)或查询时记录
SELECT
和COPY
。role – 记录与角色和权限相关的语句,例如
GRANT
、REVOKE
、CREATE ROLE
、ALTER ROLE
和DROP ROLE
。write – 当目标为关系(表)时,记录
INSERT
、UPDATE
、DELETE
、TRUNCATE
和COPY
。
使用以下 Amazon CLI 命令重启 Aurora PostgreSQL 数据库集群的写入器实例。
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
审计数据库对象
在 Aurora PostgreSQL 数据库集群 上设置 pgAudit 并根据您的要求进行配置后,将在 PostgreSQL 日志中捕获更多详细信息。例如,虽然原定设置 PostgreSQL 日志记录配置标识数据库表中发生更改的日期和时间,但使用 pgAudit 扩展后,日志条目可以包括模式、进行更改的用户和其他详细信息,具体取决于扩展参数的配置方式。您可以设置审计以通过以下方法跟踪更改。
对于每个会话,按用户进行跟踪。对于会话级别,您可以捕获完全限定的命令文本。
对于每个对象,按用户和数据库进行跟踪。
当您在系统上创建 rds_pgaudit
角色,然后将此角色添加到自定义参数组中的 pgaudit.role
参数时,将激活对象审计功能。原定设置情况下,pgaudit.role
参数处于未设置状态,唯一允许的值是 rds_pgaudit
。以下步骤假设 pgaudit
已初始化,并且您已按照设置 pgAudit 扩展中的步骤创建了 pgaudit
扩展。

如本示例所示,“LOG: AUDIT: SESSION”行提供了有关表及其架构的信息以及其他详细信息。
设置对象审计
使用
psql
连接到 Aurora PostgreSQL 数据库集群的写入器实例。psql --host=
your-instance-name
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
postgres --password --dbname=labdb
-
使用以下命令创建名为
rds_pgaudit
的数据库角色。labdb=>
CREATE ROLE rds_pgaudit;
CREATE ROLE
labdb=>
关闭
psql
会话。labdb=>
\q
在接下来的几步中,使用 Amazon CLI 修改自定义参数组中的审计日志参数。
-
使用以下 Amazon CLI 命令将
pgaudit.role
参数设置为rds_pgaudit
。原定设置情况下,此参数为空,rds_pgaudit
是唯一允许的值。aws rds modify-db-parameter-group \ --db-parameter-group-name
custom-param-group-name
\ --parameters "ParameterName=pgaudit.role,ParameterValue=rds_pgaudit,ApplyMethod=pending-reboot" \ --regionaws-region
-
使用以下 Amazon CLI 命令重启 Aurora PostgreSQL 数据库集群的写入器实例,以使对参数的更改生效。
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
运行以下命令确认
pgaudit.role
设置为rds_pgaudit
。SHOW pgaudit.role;
pgaudit.role ------------------ rds_pgaudit
要测试 pgAudit 日志记录,您可以运行几条要审计的示例命令。例如,您可以运行以下命令。
CREATE TABLE t1 (id int); GRANT SELECT ON t1 TO rds_pgaudit; SELECT * FROM t1;
id ---- (0 rows)
数据库日志应包含类似于以下内容的条目。
...
2017-06-12 19:09:49 UTC:...:rds_test@postgres:[11701]:LOG: AUDIT:
OBJECT,1,1,READ,SELECT,TABLE,public.t1,select * from t1;
...
有关查看日志的信息,请参阅监控 Amazon Aurora 日志文件。
要了解关于 pgAudit 扩展的更多信息,请参阅 GitHub 上的 pgAudit
从审计日志记录中排除用户或数据库
如 Aurora PostgreSQL 数据库日志文件中所述,PostgreSQL 日志会消耗存储空间。使用 pgAudit 扩展会在不同程度上增加日志中收集的数据量,具体取决于您跟踪的更改。您可能不需要审计 Aurora PostgreSQL 数据库集群 中的每个用户或数据库。
为了最大限度地减少对存储的影响,避免不必要地捕获审计记录,您可以将用户和数据库排除在审计范围之外。您还可以在给定会话中更改日志记录。下面的示例向您演示如何操作。
注意
会话级别的参数设置优先于 Aurora PostgreSQL 数据库集群的写入器实例的自定义数据库参数组中的设置。如果您不希望数据库用户绕过您的审计日志记录配置设置,请务必更改其权限。
假设您的 Aurora PostgreSQL 数据库集群 配置为审计所有用户和数据库的相同级别的活动。然后,您决定不想对用户 myuser
进行审计。您可以使用以下 SQL 命令对 myuser
关闭审计功能。
ALTER USER myuser SET pgaudit.log TO 'NONE';
然后,您可以使用以下查询来检查 pgaudit.log
的 user_specific_settings
列,以确认该参数已设置为 NONE
。
SELECT usename AS user_name, useconfig AS user_specific_settings FROM pg_user WHERE usename = 'myuser';
您将看到如下输出。
user_name | user_specific_settings
-----------+------------------------
myuser | {pgaudit.log=NONE}
(1 row)
在给定用户与数据库的会话期间,您可以使用以下命令对此用户关闭日志记录功能。
ALTER USER myuser IN DATABASE mydatabase SET pgaudit.log TO 'none';
使用以下查询,对于特定用户和数据库组合检查 pgaudit.log 的设置列。
SELECT usename AS "user_name", datname AS "database_name", pg_catalog.array_to_string(setconfig, E'\n') AS "settings" FROM pg_catalog.pg_db_role_setting s LEFT JOIN pg_catalog.pg_database d ON d.oid = setdatabase LEFT JOIN pg_catalog.pg_user r ON r.usesysid = setrole WHERE usename = 'myuser' AND datname = 'mydatabase' ORDER BY 1, 2;
您将看到类似以下内容的输出。
user_name | database_name | settings
-----------+---------------+------------------
myuser | mydatabase | pgaudit.log=none
(1 row)
对 myuser
关闭审计后,您决定不想跟踪对 mydatabase
的更改。您可以使用以下命令对该特定数据库关闭审计。
ALTER DATABASE mydatabase SET pgaudit.log to 'NONE';
然后,使用以下查询检查 database_specific_settings 列,以确认 pgaudit.log 已设置为 NONE。
SELECT a.datname AS database_name, b.setconfig AS database_specific_settings FROM pg_database a FULL JOIN pg_db_role_setting b ON a.oid = b.setdatabase WHERE a.datname = 'mydatabase';
您将看到如下输出。
database_name | database_specific_settings
---------------+----------------------------
mydatabase | {pgaudit.log=NONE}
(1 row)
要将 myuser 的设置恢复为原定设置,请使用以下命令:
ALTER USER myuser RESET pgaudit.log;
要将数据库的设置恢复为原定设置,请使用以下命令。
ALTER DATABASE mydatabase RESET pgaudit.log;
要将用户和数据库重置为原定设置,请使用以下命令。
ALTER USER myuser IN DATABASE mydatabase RESET pgaudit.log;
还可以通过将 pgaudit.log
设置为 pgaudit.log
参数的其他允许值之一,将特定事件捕获到日志中。有关更多信息,请参阅pgaudit.log 参数允许的设置列表。
ALTER USER myuser SET pgaudit.log TO 'read'; ALTER DATABASE mydatabase SET pgaudit.log TO 'function'; ALTER USER myuser IN DATABASE mydatabase SET pgaudit.log TO 'read,function'
pgAudit 扩展的参考
您可以通过更改本节中列出的一个或多个参数来为审计日志指定所需的详细级别。
控制 pgAudit 行为
您可以通过更改下表中列出的一个或多个参数来控制审计日志记录。
参数 | 描述 |
---|---|
| 指定会话审计日志记录将记录哪些语句类。允许的值包括 ddl、function、misc、read、role、write、none、all。有关更多信息,请参阅pgaudit.log 参数允许的设置列表。 |
|
启用(设置为 1)时,如果语句中的所有关系都在 pg_catalog 中,则将语句添加到审计跟踪中。 |
|
指定要用于日志条目的日志级别。允许的值:debug5、debug4、debug3、debug2、debug1、info、notice、warning、log |
|
启用(设置为 1)时,将在审计日志中捕获随语句传递的参数。 |
|
启用(设置为 1)时,会话的审计日志为 SELECCT 或 DML 语句中引用的每个关系(TABLE、VIEW 等)创建单独的日志条目。 |
|
指定日志记录在语句/子语句组合中的第一个日志条目中包含语句文本和参数,还是在每个条目中都包含。 |
|
指定用于对象审计日志记录的主角色。唯一允许的条目是 |
pgaudit.log
参数允许的设置列表
值 | 描述 |
---|---|
无 | 这是默认模式。不记录任何数据库更改。 |
全部 | 记录所有内容(read、write、function、role、ddl、misc)。 |
ddl | 记录所有数据定义语言(DDL)语句(不包括在 |
函数 | 记录函数调用和 |
misc | 记录其他命令,例如 |
read | 当源为关系(例如表)或查询时记录 |
role | 记录与角色和权限相关的语句,例如 |
write | 当目标为关系(表)时,记录 |
要使用会话审计记录多种事件类型,请使用逗号分隔的列表。要记录所有事件类型,请将 pgaudit.log
设置为 ALL
。重启数据库实例以应用更改。
通过对象审计,您可以细化审计日志记录以使用特定的关系。例如,您可以指定要对一个或多个表上的 READ
操作进行审计日志记录。
使用 pglogical 跨实例同步数据
所有当前可用的 Aurora PostgreSQL 版本都支持 pglogical
扩展。pglogic 扩展早于 PostgreSQL 在版本 10 中引入的功能类似的逻辑复制功能。有关更多信息,请参阅 使用 Aurora 的 PostgreSQL 逻辑复制。
pglogical
扩展支持在两个或更多 Aurora PostgreSQL 数据库集群 之间进行逻辑复制。它还支持在不同的 PostgreSQL 版本之间进行复制,以及在 RDS for PostgreSQL 数据库实例和 Aurora PostgreSQL 数据库集群上运行的数据库之间进行复制。pglogical
扩展使用发布-订阅模型将对表和其他对象(例如序列)的更改从发布者复制到订阅者。它依赖于复制插槽来确保更改从发布者节点同步到订阅者节点,定义如下。
发布者节点是作为要复制到其他节点的数据来源的 Aurora PostgreSQL 数据库集群。发布者节点定义要在发布集中复制的表。
订阅者节点是用于接收来自发布商的 WAL 更新的 Aurora PostgreSQL 数据库集群。订阅者创建订阅以连接到发布者并获取解码后的 WAL 数据。订阅者创建订阅时,将在发布者节点上创建复制插槽。
在下文中,您可以了解有关设置 pglogical
扩展的信息。
主题
pglogical 扩展的要求和限制
所有当前可用的 Aurora PostgreSQL 版本都支持 pglogical
扩展。
发布者节点和订阅者节点都必须设置为进行逻辑复制。
要从订阅者复制到发布者的表必须具有相同的名称和相同的模式。这些表还必须包含相同的列,并且这些列必须使用相同的数据类型。发布者表和订阅者表必须具有相同的主键。我们建议您仅使用 PRIMARY KEY 作为唯一约束。
对于 CHECK 约束和 NOT NULL 约束,订阅者节点上的表可能比发布者节点上的表具有更宽松的约束。
pglogical
扩展提供了诸如双向复制之类的功能,PostgreSQL(版本 10 及更高版本)中内置的逻辑复制功能不支持这些功能。有关更多信息,请参阅使用 pglogic 进行 PostgreSQL 双向复制
设置 pglogical 扩展
要在 Aurora PostgreSQL 数据库集群上设置 pglogical
扩展,首先要将 pglogical
添加到 Aurora PostgreSQL 数据库集群的自定义数据库集群参数组上的共享库中。您还需要将 rds.logical_replication
参数的值设置为 1
,以开启逻辑解码。最后,在数据库中创建此扩展。您可以使用 Amazon Web Services Management Console或 Amazon CLI 执行这些任务。
您必须拥有 rds_superuser
角色的权限才能执行这些任务。
以下步骤假设您的 Aurora PostgreSQL 数据库集群 与自定义数据库集群 参数组相关联。有关创建自定义数据库集群参数组的信息,请参阅使用参数组。
设置 pglogical 扩展
登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择 Aurora PostgreSQL 数据库集群的写入器实例 。
-
打开 Aurora PostgreSQL 数据库集群写入器实例 的 Configuration(配置)选项卡。在实例详细信息中,找到 Parameter group(参数组)链接。
-
选择此链接以打开与您的 Aurora PostgreSQL 数据库集群 关联的自定义参数。
-
在 Parameters(参数)搜索字段中,键入
shared_pre
以查找shared_preload_libraries
参数。 -
选择 Edit parameters(编辑参数)以访问属性值。
-
将
pglogical
添加到 Values(值)字段的列表中。使用逗号分隔值列表中的项目。 找到
rds.logical_replication
参数并将其设置为1
,以开启逻辑复制。重启 Aurora PostgreSQL 数据库集群的写入器实例,以使更改生效。
当实例可用时,可以使用
psql
(或 pgAdmin)连接到 Aurora PostgreSQL 数据库集群的写入器实例。psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
要验证 pglogical 是否初始化,可以运行以下命令。
SHOW shared_preload_libraries;
shared_preload_libraries -------------------------- rdsutils,pglogical (1 row)
验证启用逻辑解码的设置,如下所示。
SHOW wal_level;
wal_level ----------- logical (1 row)
创建扩展,如下所示。
CREATE EXTENSION pglogical;
EXTENSION CREATED
选择 Save changes(保存更改)。
通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 从数据库列表中选择 Aurora PostgreSQL 数据库集群的写入器实例以将其选中,然后从 Actions(操作)菜单中选择 Reboot(重启)。
设置 pglogical 扩展
要使用 Amazon CLI 设置 pglogical,您可以调用 modify-db-parameter-group 操作来修改自定义参数组中的某些参数,如以下过程所示。
使用以下 Amazon CLI 命令向
shared_preload_libraries
参数中添加pglogical
。aws rds modify-db-parameter-group \ --db-parameter-group-name
custom-param-group-name
\ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pglogical,ApplyMethod=pending-reboot" \ --regionaws-region
使用以下 Amazon CLI 命令将
rds.logical_replication
设置为1
,以针对 Aurora PostgreSQL 数据库集群的写入器实例 开启逻辑解码功能。aws rds modify-db-parameter-group \ --db-parameter-group-name
custom-param-group-name
\ --parameters "ParameterName=rds.logical_replication,ParameterValue=1,ApplyMethod=pending-reboot" \ --regionaws-region
-
使用以下 Amazon CLI 命令重启 Aurora PostgreSQL 数据库集群的写入器实例,以便初始化 pglogical 库。
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
当实例可用时,使用
psql
连接到 Aurora PostgreSQL 数据库集群的写入器实例。psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
创建扩展,如下所示。
CREATE EXTENSION pglogical;
EXTENSION CREATED
使用以下 Amazon CLI 命令重启 Aurora PostgreSQL 数据库集群的写入器实例。
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
为 Aurora PostgreSQL 数据库集群设置逻辑复制
以下过程说明如何在两个 Aurora PostgreSQL 数据库集群之间启动逻辑复制。这些步骤假设来源(发布者)和目标(订阅者)都如 设置 pglogical 扩展 中所述设置了 pglogical
扩展。
创建发布者节点并定义要复制的表
这些步骤假设您的 Aurora PostgreSQL 数据库集群有一个写入器实例以及一个数据库,其中包含一个或多个您要复制到另一个节点的表。您需要在订阅者上根据发布者重新创建表结构,因此,如果需要,首先获取表结构。为此,您可以使用 psq1
元命令 \d
,然后在订阅者实例上创建相同的表。以下过程在发布者(来源)上创建示例表以用于演示目的。tablename
使用
psql
连接到具有要用作订阅者来源的表的实例。psql --host=
source-instance
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
如果没有现有表要复制,可以按如下方式创建示例表。
使用以下 SQL 语句创建一个示例表。
CREATE TABLE docs_lab_table (a int PRIMARY KEY);
使用以下 SQL 语句用生成的数据填充表。
INSERT INTO docs_lab_table VALUES (generate_series(1,5000));
INSERT 0 5000
使用以下 SQL 语句验证表中是否存在数据。
SELECT count(*) FROM docs_lab_table;
将这一 Aurora PostgreSQL 数据库集群标识为发布者节点,如下所示。
SELECT pglogical.create_node( node_name := '
docs_lab_provider
', dsn := 'host=source-instance
.aws-region
.rds.amazonaws.com port=5432 dbname=labdb
');create_node ------------- 3410995529 (1 row)
将要复制的表添加到原定设置的复制集。有关复制集的更多信息,请参阅 pglogical 文档中的复制集
。 SELECT pglogical.replication_set_add_table('default', '
docs_lab_table
', 'true', NULL, NULL);replication_set_add_table --------------------------- t (1 row)
发布者节点设置已完成。现在,您可以设置订阅者节点以接收来自发布者的更新。
设置订阅者节点并创建订阅以接收更新
这些步骤假设已使用 pglogical
扩展设置了 Aurora PostgreSQL 数据库集群。有关更多信息,请参阅设置 pglogical 扩展。
使用
psql
连接到要从发布者接收更新的实例。psql --host=
target-instance
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
-
在订阅者 Aurora PostgreSQL 数据库集群上,创建与发布者上存在的相同表。在本例中,该表为
docs_lab_table
。您可以按如下所示创建表。CREATE TABLE docs_lab_table (a int PRIMARY KEY);
验证此表为空。
SELECT count(*) FROM docs_lab_table;
count ------- 0 (1 row)
将这一 Aurora PostgreSQL 数据库集群标识为订阅者节点,如下所示。
SELECT pglogical.create_node( node_name := '
docs_lab_target
', dsn := 'host=target-instance
.aws-region
.rds.amazonaws.com port=5432 sslmode=require dbname=labdb
user=postgres
password=********
');create_node ------------- 2182738256 (1 row)
创建订阅。
SELECT pglogical.create_subscription( subscription_name := 'docs_lab_subscription', provider_dsn := 'host=
source-instance
.aws-region
.rds.amazonaws.com port=5432 sslmode=require dbname=labdb
user=postgres
password=*******
', replication_sets := ARRAY['default'], synchronize_data := true, forward_origins := '{}' );create_subscription --------------------- 1038357190 (1 row)
完成此步骤后,将在订阅者上的表中创建发布者上表中的数据。您可以使用以下 SQL 查询来验证是否已发生这种情况。
SELECT count(*) FROM docs_lab_table;
count ------- 5000 (1 row)
此后,对发布者上的表所做的更改将复制到订阅者上的表中。
在主要升级后重新建立逻辑复制
对于设置为逻辑复制的发布者节点的 Aurora PostgreSQL 数据库集群,在可以对其执行主要版本升级之前,您必须删除所有复制插槽,即使是不活动的复制插槽也是如此。我们建议您暂时从发布者节点转移数据库事务,删除复制插槽,升级 Aurora PostgreSQL 数据库集群,然后重新建立并重新启动复制。
复制插槽仅托管在发布者节点上。逻辑复制场景中的 Aurora PostgreSQL 订阅者节点没有要删除的插槽。Aurora PostgreSQL 主要版本升级过程支持将订阅者升级到独立于发布者节点的 PostgreSQL 的新主要版本。但是,升级过程确实会中断复制过程并干扰发布者节点和订阅者节点之间的 WAL 数据同步。在升级发布者、订阅者或两者之后,您需要在发布者和订阅者之间重新建立逻辑复制。以下过程说明了如何确定复制已中断以及如何解决此问题。
确定逻辑复制已中断
您可以通过查询发布者节点或订阅者节点来确定复制过程是否已中断,如下所示。
检查发布者节点
使用
psql
连接到发布者节点,然后查询pg_replication_slots
函数。注意活动列中的值。通常,这将返回t
(true),表明复制处于活动状态。如果查询返回f
(false),则表明向订阅者的复制已停止。SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots;
slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_labcb4fa94_docs_lab3de412c | pglogical_output | logical | f (1 row)
检查订阅者节点
在订阅者节点上,您可以通过三种不同的方式检查复制的状态。
浏览订阅者节点上的 PostgreSQL 日志,以查找失败消息。该日志使用包含退出代码 1 的消息来标识故障,如下所示。
2022-07-06 16:17:03 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 14610) exited with exit code 1 2022-07-06 16:19:44 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 21783) exited with exit code 1
查询
pg_replication_origin
函数。使用psql
连接到订阅者节点上的数据库并查询pg_replication_origin
函数,如下所示。SELECT * FROM pg_replication_origin;
roident | roname ---------+-------- (0 rows)
结果集为空表示复制已中断。正常情况下,您将看到如下输出。
roident | roname ---------+---------------------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
查询
pglogical.show_subscription_status
函数,如以下示例所示。SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status();
subscription_name | status | slot_name ---====----------------+--------+------------------------------------- docs_lab_subscription | down | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
此输出显示复制已中断。它的状态为
down
。通常,输出将状态显示为replicating
。
如果您的逻辑复制过程已中断,则可以按照以下步骤重新建立复制。
在发布者节点和订阅者节点之间重新建立逻辑复制
要重新建立复制,请先断开订阅者与发布者节点的连接,然后重新建立订阅,如这些步骤所述。
使用
psql
连接到订阅者节点,如下所示。psql --host=
222222222222
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
通过使用
pglogical.alter_subscription_disable
函数停用订阅。SELECT pglogical.alter_subscription_disable('docs_lab_subscription',true);
alter_subscription_disable ---------------------------- t (1 row)
通过查询
pg_replication_origin
获取发布者节点的标识符,如下所示。SELECT * FROM pg_replication_origin;
roident | roname ---------+------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
将上一步的响应与
pg_replication_origin_create
命令一起使用,以分配重新建立时订阅可以使用的标识符。SELECT pg_replication_origin_create('pgl_labdb_docs_labcb4fa94_docs_lab3de412c');
pg_replication_origin_create ------------------------------ 1 (1 row)
通过传递其状态为
true
的名称来打开订阅,如下面的示例所示。SELECT pglogical.alter_subscription_enable('docs_lab_subscription',true);
alter_subscription_enable --------------------------- t (1 row)
检查节点的状态。其状态应为 replicating
,如本例所示。
SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status();
subscription_name | status | slot_name -------------------------------+-------------+------------------------------------- docs_lab_subscription | replicating | pgl_labdb_docs_lab98f517b_docs_lab3de412c (1 row)
检查发布者节点上订阅者的复制插槽的状态。插槽的 active
列应返回 t
(true),表示已重新建立复制。
SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots;
slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_lab98f517b_docs_lab3de412c | pglogical_output | logical | t (1 row)
管理 Aurora PostgreSQL 的逻辑复制查槽
对于在逻辑复制场景中充当发布者节点的 Aurora PostgreSQL 数据库集群的编写器实例,在对其执行主要版本升级之前,必须删除该实例上的复制插槽。主要版本升级预检查过程会通知您,在插槽被删除之前,升级无法继续。
要识别使用 pglogical
扩展创建的复制插槽,请登录到每个数据库并获取节点的名称。当您查询订阅者节点时,您会在输出中得到发布者节点和订阅者节点,如本示例所示。
SELECT * FROM pglogical.node;
node_id | node_name ------------+------------------- 2182738256 | docs_lab_target 3410995529 | docs_lab_provider (2 rows)
您可以通过以下查询获取有关订阅的详细信息。
SELECT sub_name,sub_slot_name,sub_target FROM pglogical.subscription;
sub_name | sub_slot_name | sub_target ----------+--------------------------------+------------ docs_lab_subscription | pgl_labdb_docs_labcb4fa94_docs_lab3de412c | 2182738256 (1 row)
现在您可以删除订阅,如下所示。
SELECT pglogical.drop_subscription(subscription_name := 'docs_lab_subscription');
drop_subscription ------------------- 1 (1 row)
删除订阅后,您可以删除该节点。
SELECT pglogical.drop_node(node_name := 'docs-lab-subscriber');
drop_node ----------- t (1 row)
您可以验证该节点是否不再存在,如下所示。
SELECT * FROM pglogical.node;
node_id | node_name ---------+----------- (0 rows)
pglogical 扩展的参数参考
在表中,您可以找到与 pglogical
扩展关联的参数。pglogical.conflict_log_level
和 pglogical.conflict_resolution
等参数用于处理更新冲突。当对订阅来自发布者的更改的相同表进行本地更改时,可能会出现冲突。在不同情况下也可能发生冲突,例如双向复制或当多个订阅者从同一个发布者进行复制时。有关更多信息,请参阅使用 pglogical 进行 PostgreSQL 双向复制
参数 | 描述 |
---|---|
pglogical.batch_inserts | 在可能时执行批量插入。原定设置情况下未设置。更改为“1”将打开,更改为“0”将关闭。 |
pglogical.conflict_log_level | 设置用于记录已解决的冲突的日志级别。支持的字符串值为 debug5、debug4、debug3、debug2、debug1、info、notice、warning、error、log、fatal、panic。 |
pglogical.conflict_resolution | 设置在冲突可以解决时用来解决冲突的方法。支持的字符串值为 error、apply_remote、keep_local、last_update_wins、first_update_wins。 |
pglogical.extra_connection_options | 要添加到所有对等节点连接的连接选项。 |
pglogical.synchronous_commit | pglogical 专用的同步提交值 |
pglogical.use_spi | 使用 SPI(服务器编程接口)而非低级 API 来应用更改。设置为“1”将打开,设置为“0”将关闭。有关 SPI 的更多信息,请参阅 PostgreSQL 文档中的服务器编程接口 |