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
touser/role
;
有关 PostgreSQL 数据库中特权的更多信息,请参阅 PostgreSQL 文档中的 GRANT
使用 RDS for PostgreSQL 支持的日志记录机制
您可以设置多个参数、扩展和其他可配置项来记录 PostgreSQL 数据库实例中发生的活动。这些功能包括:
log_statement
参数可用于记录 PostgreSQL 数据库中的用户活动。要了解有关 RDS for PostgreSQL 日志记录以及如何监控日志的更多信息,请参阅 PostgreSQL 数据库日志文件。rds.force_admin_logging_level
参数记录数据库实例上的数据库中由 Amazon RDS 内部用户 (rdsadmin) 执行的操作。它将输出写入 PostgreSQL 错误日志。允许的值包括disabled
、debug5
、debug4
、debug3
、debug2
、debug1
、info
、notice
、warning
、error
、日志、fatal
和panic
。默认值为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 结合使用
您可以使用日志分析器(如 pgBadgerlog_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 ROLE
的 RENAME 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
角色可以执行以下操作:
添加可用于 Amazon RDS 的扩展。有关更多信息,请参阅使用 Amazon RDS for PostgreSQL 支持的 PostgreSQL 功能和 PostgreSQL 文档
。 管理表空间,包括创建和删除它们。有关更多信息,请参阅 PostgreSQL 文档中的 适用于 RDS for PostgreSQL 的表空间 和 Tablespaces
部分。 使用
rds_superuser
命令查看所有未分配pg_stat_activity
角色的用户,并使用pg_terminate_backend
和pg_cancel_backend
命令停止其连接。向所有非
rds_superuser
角色授予和撤消rds_replication
角色。有关更多信息,请参阅 PostgreSQL 文档中的 GRANT部分。
如前所述,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