Amazon RDS for PostgreSQL 的数据库管理员常见任务 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon RDS for PostgreSQL 的数据库管理员常见任务

数据管理员 (DBA) 在管理 Amazon RDS for PostgreSQL 数据库实例时执行各种任务。它有助于了解 PostgreSQL 的一些基本功能以及如何在 RDS for PostgreSQL 数据库实例中使用这些功能。例如,如果您是一个已经熟悉 PostgreSQL 的数据库管理员,请注意 Amazon RDS 不允许对数据库实例的 Shell 访问权限。这意味着您无法像在服务器硬件上运行 PostgreSQL 时那样访问日志文件。要了解关于使用 RDS for PostgreSQL 日志文件的更多信息,请参阅 PostgreSQL 数据库日志文件

Amazon RDS 限制对需要 rds_superuser 角色高级权限的某些系统程序和表的访问。这是 RDS for PostgreSQL 数据库实例中具有最高权限的身份。有关更多信息,请参阅 了解 rds_superuser 角色

以下是 RDS for PostgreSQL 的一些数据库管理员常见任务。

控制用户对 PostgreSQL 数据库的访问

在 RDS for PostgreSQL 中,您可以管理哪些用户有特权连接到哪些数据库。在 PostgreSQL 环境中,有时需要通过修改 pg_hba.conf 文件来进行此类管理。在 Amazon RDS 中,您可以使用数据库授予。

在 PostgreSQL 中创建新数据库时总会带有默认的一组特权。这些默认特权使 PUBLIC(所有用户)能够连接数据库并在连接后创建临时表格。

若要控制哪些用户有权连接 Amazon RDS 中某一特定的数据库,首先撤销默认的 PUBLIC 特权。然后再以更细化的方式授予特权。下面的示例演示如何操作。

postgres=> REVOKE ALL on database db-name from public; postgres=> GRANT CONNECT, TEMPORARY on database db-name to user/role;

有关 PostgreSQL 数据库中特权的更多信息,请参阅 PostgreSQL 文档中的 GRANT 命令。

使用 RDS for PostgreSQL 支持的日志记录机制

您可以设置多个参数、扩展和其他可配置项来记录 PostgreSQL 数据库实例中发生的活动。这些功能包括:

  • log_statement 参数可用于记录 PostgreSQL 数据库中的用户活动。要了解有关 RDS for PostgreSQL 日志记录以及如何监控日志的更多信息,请参阅 PostgreSQL 数据库日志文件

  • rds.force_admin_logging_level 参数记录数据库实例上的数据库中由 Amazon RDS 内部用户 (rdsadmin) 执行的操作。它将输出写入 PostgreSQL 错误日志。允许的值包括 disableddebug5debug4debug3debug2debug1infonoticewarningerror、日志、fatalpanic。默认值为 disabled

  • 可以设置 rds.force_autovacuum_logging_level 参数以捕获 PostgreSQL 错误日志中的各种 autovacuum 操作。有关更多信息,请参阅 记录 autovacuum 和 vacuum 活动

  • 可以安装和配置 pgaudit 扩展以在会话级别或在对象级别捕获活动。有关更多信息,请参阅 使用 pgaudit 扩展在会话和对象级别进行日志记录

  • log_fdw 扩展使您可以使用 SQL 访问数据库引擎日志。有关更多信息,请参阅 使用 log_fdw 扩展通过 SQL 访问数据库日志

  • pg_stat_statements 库被指定为 RDS for PostgreSQL 版本 10 及更高版本中 shared_preload_libraries 参数的默认值。您可以使用该库分析正在运行的查询。确保在数据库参数组中设置 pg_stat_statements。有关使用此库提供的信息监控 RDS for PostgreSQL 数据库实例的更多信息,请参阅 分析 PostgreSQL 中运行的查询

一般来说,日志记录的目的是使数据库管理员能够监控、优化性能和进行故障排除。许多日志都会自动上载到 Amazon CloudWatch 或 Performance Insights。在这里,对这些日志进行排序和分组,从而为您的数据库实例提供完整指标。要了解有关 Amazon RDS 监控和指标的更多信息,请参阅 监控 Amazon RDS 实例中的指标

将用于日志分析的 pgBadger 与 PostgreSQL 结合使用

您可以使用日志分析器(如 pgBadger)分析 PostgreSQL 日志。pgBadger 文档声明 %l 模式(会话或进程的日志行)应为前缀的一部分。但如果将当前 RDS log_line_prefix 作为参数提供给 pgBadger,它应该仍生成报告。

例如,以下命令使用 pgBadger 正确设置日期为 2014-02-04 的 Amazon RDS for PostgreSQL 日志文件的格式。

./pgbadger -f stderr -p '%t:%r:%u@%d:[%p]:' postgresql.log.2014-02-04-00

将用户密码的控制限制为特定角色

您可以限制只有特殊角色的用户才能够管理数据用户密码。通过这样做,您可以在客户端更好地控制密码管理。

您可以通过静态参数 rds.restrict_password_commands 并使用名为 rds_password 的角色来启用受限制的密码管理。当参数 rds.restrict_password_commands 设置为 1 时,只有是 rds_password 角色成员的用户可以运行特定 SQL 命令。受限制的 SQL 命令包括修改数据库用户密码以及修改密码到期时间的命令。

要使用受限制的密码管理,请确保您的数据库实例运行 RDS for PostgreSQL 10.6 或更高版本。由于 rds.restrict_password_commands 参数是静态参数,更改此参数后需要重新启动数据库。

在数据库启用了受限制的密码管理后,如果您尝试运行受限制 SQL 命令,则会收到以下错误:ERROR: must be a member of rds_password to alter passwords(错误:必须是 rds_password 成员才能变更密码)。

以下是启用了受限制的密码管理时的一些受限制 SQL 命令示例。

postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword'; postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword'; postgres=> ALTER ROLE myrole VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole RENAME TO myrole2;

一些包含 ALTER ROLERENAME TO 命令也会受限制。因为重命名具有 MD5 密码的 PostgreSQL 角色会清除密码,因此这些命令会受限制。

默认情况下,rds_superuser 角色具有 rds_password 角色的成员资格,并且无法更改。您可以使用 rds_password SQL 命令向其他角色提供 GRANT 角色的成员资格。我们建议您仅将 rds_password 的成员资格提供给少数几个仅用于密码管理的角色。这些角色需要 CREATEROLE 属性以修改其角色。

请确保您验证了密码要求,例如客户端上的过期时间以及所需的复杂性。我们建议您使用自己的客户端实用程序来限制与密码相关的更改。此实用程序应具有作为 rds_password 成员的角色并具有 CREATEROLE 角色属性。

了解 rds_superuser 角色

创建 RDS for PostgreSQL 数据库实例时,将您创建的主用户系统账户分配给 rds_superuser 角色。rds_superuser 角色是一个预定义的 Amazon RDS 角色,它类似于 PostgreSQL 超级用户角色(在本地实例中习惯上称为 postgres),但有一些限制。与 PostgreSQL 超级用户角色类似,rds_superuser 角色对数据库实例享有最大特权。除非用户需要数据库实例的最大访问权限,否则不要将此角色分配给用户。

rds_superuser 角色可以执行以下操作:

如前所述,rds_superuser 角色不能做 postgres 超级用户可以做的任何事情。例如,rds_superuser 在连接到数据库时不能绕过 CONNECT 权限。必须将此角色专门授予您创建的应具有 rds_superuser 权限的任何用户。

下例展示如何创建用户,然后向该用户授予 rds_superuser 角色。

postgres=> CREATE ROLE bus_app_admin WITH PASSWORD 'change_me' LOGIN; CREATE ROLE postgres=> GRANT rds_superuser TO bus_app_admin; GRANT ROLE