为您的 RDS for PostgreSQL 数据库实例开启查询日志记录 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为您的 RDS for PostgreSQL 数据库实例开启查询日志记录

通过设置下表中列出的一些参数,您可以收集有关数据库活动的更多详细信息,包括查询、等待锁定的查询、检查点和许多其他详细信息。本主题重点介绍日志记录查询。

参数 默认值 描述

log_connections

记录每个成功的连接。

log_disconnections

记录每个会话的结束及其持续时间。

log_checkpoints

1

记录每个检查点。

log_lock_waits

记录长锁定等待次数。原定设置情况下,不设置此参数。

log_min_duration_sample

设置如超出则记录语句示例的最短执行时间(ms)。示例数量使用 log_statement_sample_rate 参数进行设置。

log_min_duration_statement

任何至少运行指定时间或更长时间的 SQL 语句都会被记录下来。原定设置情况下,不设置此参数。开启该参数可帮助查找未优化的查询。

log_statement

设置所记录的语句类型。原定设置情况下,未设置此参数,但您可以将其更改为 allddlmod,以指定要记录的 SQL 语句的类型。如果您为此参数指定了与 none 不同的任何值,还应采取其他措施来防止日志文件中的密码泄露。有关更多信息,请参阅 降低使用查询日志记录时泄露密码的风险

log_statement_sample_rate

超过在 log_min_duration_sample 中指定的时间的语句百分比,以介于 0.0 和 1.0 之间的浮点值表示。

log_statement_stats

向服务器日志写入累计性能统计数据。

使用日志记录查找执行缓慢的查询

您可以记录 SQL 语句和查询,以帮助查找执行缓慢的查询。您可以通过修改本节中概述的 log_statementlog_min_duration 参数的设置来开启此功能。在为 RDS for PostgreSQL 数据库实例开启查询日志记录之前,您应该了解日志中可能存在的密码泄露以及如何降低风险。有关更多信息,请参阅 降低使用查询日志记录时泄露密码的风险

接下来,您可以了解有关 log_statementlog_min_duration 参数的参考信息。

log_statement

此参数指定应发送到日志的 SQL 语句的类型。默认值为 none。如果您将此参数更改为 allddlmod,请务必采取建议的操作来降低在日志中泄露密码的风险。有关更多信息,请参阅 降低使用查询日志记录时泄露密码的风险

all

记录所有语句。建议将此设置用于调试目的。

ddl

记录所有数据定义语言(DDL)语句,例如 CREATE、ALTER、DROP 等。

mod

记录所有可修改数据的 DDL 语句和数据操作语言(DML)语句,例如 INSERT、UPDATE 和 DELETE。

none

不记录任何 SQL 语句。我们建议使用此设置,以避免在日志中泄露密码的风险。

log_min_duration_statement

任何至少运行指定时间或更长时间的 SQL 语句都会被记录下来。原定设置情况下,不设置此参数。开启该参数可帮助查找未优化的查询。

–1–2147483647

如超过即记录语句的运行时间的毫秒数(ms)。

设置查询日志记录

这些步骤假设您的 RDS for PostgreSQL 数据库实例使用自定义数据库参数组。

  1. log_statement 参数设置为 all。以下示例显示了使用此参数设置写入 postgresql.log 文件的信息。

    2022-10-05 22:05:52 UTC:52.95.4.1(11335):postgres@labdb:[3639]:LOG: statement: SELECT feedback, s.sentiment,s.confidence FROM support,aws_comprehend.detect_sentiment(feedback, 'en') s ORDER BY s.confidence DESC; 2022-10-05 22:05:52 UTC:52.95.4.1(11335):postgres@labdb:[3639]:LOG: QUERY STATISTICS 2022-10-05 22:05:52 UTC:52.95.4.1(11335):postgres@labdb:[3639]:DETAIL: ! system usage stats: ! 0.017355 s user, 0.000000 s system, 0.168593 s elapsed ! [0.025146 s user, 0.000000 s system total] ! 36644 kB max resident size ! 0/8 [0/8] filesystem blocks in/out ! 0/733 [0/1364] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent ! 19/0 [27/0] voluntary/involuntary context switches 2022-10-05 22:05:52 UTC:52.95.4.1(11335):postgres@labdb:[3639]:STATEMENT: SELECT feedback, s.sentiment,s.confidence FROM support,aws_comprehend.detect_sentiment(feedback, 'en') s ORDER BY s.confidence DESC; 2022-10-05 22:05:56 UTC:52.95.4.1(11335):postgres@labdb:[3639]:ERROR: syntax error at or near "ORDER" at character 1 2022-10-05 22:05:56 UTC:52.95.4.1(11335):postgres@labdb:[3639]:STATEMENT: ORDER BY s.confidence DESC; ----------------------- END OF LOG ----------------------
  2. 设置 log_min_duration_statement 参数。以下示例显示了参数设置为 postgresql.log 时写入 1 文件的信息。

    将记录超过在 log_min_duration_statement 参数中指定的持续时间的查询。下面是一个示例。您可以在 Amazon RDS 控制台中查看 RDS for PostgreSQL 数据库实例的日志文件。

    2022-10-05 19:05:19 UTC:52.95.4.1(6461):postgres@labdb:[6144]:LOG: statement: DROP table comments; 2022-10-05 19:05:19 UTC:52.95.4.1(6461):postgres@labdb:[6144]:LOG: duration: 167.754 ms 2022-10-05 19:08:07 UTC::@:[355]:LOG: checkpoint starting: time 2022-10-05 19:08:08 UTC::@:[355]:LOG: checkpoint complete: wrote 11 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=1.013 s, sync=0.006 s, total=1.033 s; sync files=8, longest=0.004 s, average=0.001 s; distance=131028 kB, estimate=131028 kB ----------------------- END OF LOG ----------------------

降低使用查询日志记录时泄露密码的风险

我们建议您将 log_statement 保持设置为 none,以避免泄露密码。如果您将 log_statement 设置为 allddlmod,我们建议您采取以下一个或多个步骤。

  • 对于客户端,加密敏感信息。有关更多信息,请参阅 PostgreSQL 文档中的加密选项。使用 ENCRYPTEDUNENCRYPTED 语句的 CREATE(和 ALTER)选项。有关更多信息,请参阅 PostgreSQL 文档中的 CREATE USER

  • 对于您的 RDS for PostgreSQL 数据库实例,请设置并使用 PostgreSQL Auditing(pgAudit)扩展。此扩展编辑发送到日志的 CREATE 和 ALTER 语句中的敏感信息。有关更多信息,请参阅 使用 pgAudit 记录数据库活动

  • 限制对 CloudWatch Logs 的访问。

  • 使用更强的身份验证机制,如 IAM。