我想为我的 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 数据库实例启用查询日志记录。
简短描述
根据要记录的查询,启用 log_statement 或 log_min_duration_statement。有关详细信息,请参阅 PostgreSQL 网站上的 log_min_duration_statement 和 log_statement。您无需修改这两个参数即可在 Amazon RDS for PostgreSQL 中启用日志记录。
要查看需要一定时间才能完成的查询的日志,请在阈值范围内以毫秒为单位修改 log_min_duration_statement 参数。例如,如果将参数值设置为 500,则 Amazon RDS 会记录需要超过半秒才能完成的所有查询。如果将参数值设置为 -1,则会禁用此参数。Amazon RDS 不会根据完成时间来记录查询。如果将参数值设置为 0,则 Amazon RDS 会记录所有查询。
要控制要记录的 SQL 语句,您可以修改 log_statement 参数的以下值:
- ddl 会记录所有数据定义语言 (DDL) 语句,例如 CREATE、ALTER 和 DROP。
- mod 会记录所有 DDL 和数据修改语言 (DML) 语句,例如 INSERT、UPDATE 和 DELETE。
- all 会记录所有查询,无论运行时间如何。
**注意:**log_statement 参数的默认值为 none。
无论您为 log_min_duration_statement 或 log_statement 设置何值,Amazon RDS 都会将查询写入日志一次。但是,修改参数时,数据库实例的卷可能需要更多空间。为最大限度地减少存储使用量,请勿将参数设置为会生成大量日志记录的值,例如将 log_statement 设置为 all,将 log_min_duration_statement 设置为 0。
由于卷存储空间已满时数据库实例不可用,因此最佳做法是修改 rds.log_retention_period 参数以删除不必要的日志。另一种最佳做法是使用 FreeStorageSpace Amazon CloudWatch 指标持续监控您的存储使用情况。如果存储空间接近已满状态,您可以增加存储空间,以便数据库实例始终可用。
解决方法
修改自定义参数组以启用日志记录
完成以下步骤:
- 打开 Amazon RDS 控制台。
- 创建自定义参数组,然后将其与您的数据库实例关联。
**注意:**如果您选择 Apply immediately(立即应用),则数据库实例会暂时不可用。
- 在导航窗格中,选择 Parameter group(参数组)。
- 选择您的自定义参数组。
- 选择 Edit Parameter(编辑参数)。
- 在 Filter parameters(筛选参数)字段中,输入 log_statement 或 log_min_duration_statement。
- 选择参数,然后进行修改。例如,您可以将 log_statement 更改为 ddl,或将 log_min_duration_statement 更改为 1000(1 秒)。
- 选择 Save changes(保存更改)。
**注意:**由于参数是动态的,因此您无需重启数据库实例即可使参数更改生效。
参数组状态将更改为 Applying(正在应用)。参数组修改完成后,状态将更改为 In-sync(同步中)。
确认您已启用日志记录
完成以下步骤:
- 连接到数据库实例。
- 运行以下命令:
CREATE TABLE article(article_code bigint, created_at timestamp with time zone, summary text, content text) ;
SELECT pg_sleep(2);
SELECT generate_series(1,10000000) as test;
**注意:**请将示例值替换为您的值。
上述示例命令的输出会显示所有 DDL 语句以及执行时间超过 1 秒的查询。
查看查询日志
完成以下步骤:
- 打开 Amazon RDS 控制台。
- 在导航窗格中,选择 Databases(数据库)。
- 选择您的数据库实例。
- 选择 Logs & Events(日志和事件)选项卡。
- 在 Logs(日志)部分中,选择最新的日志,然后选择 View(查看)。
日志示例:
2018-12-19 11:05:32 UTC:172.31.xx.yyy(35708):user@awspostgres:[27174]:LOG: statement: CREATE TABLE article(article_code bigint, created_at timestamp with time zone, summary text, content text) ;
2018-12-19 11:10:36 UTC:172.31.xx.yyy(35708):user@awspostgres:[27174]:LOG: duration: 2010.247 ms statement: select pg_sleep(2);
2018-12-19 11:11:25 UTC:172.31.xx.yyy(35708):user@awspostgres:[27174]:LOG: duration: 2159.838 ms statement: SELECT generate_series(1,10000000) as test;
相关信息
RDS for PostgreSQL 数据库日志文件