"PostgreSQL 12: 新增 log_statement_sample_rate 参数控制数据库日志中慢SQL百分比"

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: PostgreSQL 提供的 log_min_duration_statement 参数设置后,数据库中执行时间超出设置值的SQL将记录到数据库中,此参数对所有库所有SQL都有效。维护PostgreSQL生产库时,数据库日志出现高频慢SQL实属正常,若其中一条比较繁忙的SQL若执行时间超过 log_min_duration_statement 设置值,那么数据库日志中将存在大量此条SQL的日志,这个日志量是很惊人的,多则一天上百GB。

PostgreSQL 提供的 log_min_duration_statement 参数设置后,数据库中执行时间超出设置值的SQL将记录到数据库中,此参数对所有库所有SQL都有效。维护PostgreSQL生产库时,数据库日志出现高频慢SQL实属正常,若其中一条比较繁忙的SQL若执行时间超过 log_min_duration_statement 设置值,那么数据库日志中将存在大量此条SQL的日志,这个日志量是很惊人的,多则一天上百GB。

PostgreSQL 12 提供了一个新的参数,能够有效的控制超出 log_min_duration_statement 参数设置值的SQL的日志量,这个参数为 log_statement_sample_rate,本文简单测试下。

发行说明

Allow logging of only a percentage of statements and transactions meeting log_min_duration_statement criteria (Adrien Nayrat)

The parameters log_statement_sample_rate and log_transaction_sample_rate control this.

本文后续仅介绍 log_statement_sample_rate, log_transaction_sample_rate 参数使用场景不是很多,不做介绍。

关于 log_statement_sample_rate

Determines the fraction of statements that exceed log_min_duration_statement to be logged. The default is 1.0, meaning log all such statements. Setting this to zero disables logging by duration, same as setting log_min_duration_statement to -1. log_statement_sample_rate is helpful when the traffic is too high to log all queries.

备注: 参数 log_statement_sample_rate 控制执行时间超出 log_min_duration_statement 参数设置值的 SQL 写数据库日志的百分比,默认值 1 ,表示比例为 100%,0 表示不记录,对于比较繁忙的生产库,此参数能有效缓解数据库日志量,减少无效日志。

环境准备

计划使用 pgbench 对数据库进行压力测试,执行大量SQL。

创建测试表并插入 100 万数据,如下:

CREATE TABLE log_sample(id int8,name text,creat_time timestamp(0) without time zone default clock_timestamp());    
INSERT INTO  log_sample(id,name)  select n,n||'_test'  from generate_series(1,1000000) n;  
ALTER TABLE log_sample ADD PRIMARY KEY (id);  
VACUUM ANALYZE log_sample;

编写脚本 select_id.sql ,如下:

\set v_id random(1,1000000)

select name from log_sample where id=:v_id;

场景一: log_statement_sample_rate = 1.0

postgresql.conf 设置 log_statement_sample_rate 值 1.0,log_min_duration_statement 设置为 0,并执行 pg_ctl reload 使参数生效,如下:

log_statement_sample_rate = 1.0
log_min_duration_statement = 0

log_min_duration_statement 设置为 0 表示记录执行时间超出 0 毫秒的SQL都记录,方便测试。

清空 $PGDATA/pg_log 目录下的数据库日志,之后执行 pgbench,如下:

[pg12@pghost1 pgbench]$ pgbench -n -M prepared -c 2 -j 2 -T 60 -U pguser mydb -f select_id.sql
transaction type: select_id.sql
scaling factor: 1
query mode: prepared
number of clients: 2
number of threads: 2
duration: 60 s
number of transactions actually processed: 498949
latency average = 0.241 ms
tps = 8315.763633 (including connections establishing)
tps = 8316.384134 (excluding connections establishing)

查看 pg_log 目录的数据库日志量为 242 MB 左右,如下:

[pg12@pghost1 pgbench]$ du -sm $PGDATA/pg_log
242     /pgdata/pg12/pg_root/pg_log

场景二: log_statement_sample_rate = 0.2

postgresql.conf 设置 log_statement_sample_rate 值 0.2,log_min_duration_statement 设置为 0,并执行 pg_ctl reload 使参数生效,如下:

log_statement_sample_rate = 0.2
log_min_duration_statement = 0

清空 $PGDATA/pg_log 目录下的数据库日志,之后执行 pgbench,如下:

[pg12@pghost1 pgbench]$ pgbench -n -M prepared -c 2 -j 2 -T 60 -U pguser mydb -f select_id.sql
transaction type: select_id.sql
scaling factor: 1
query mode: prepared
number of clients: 2
number of threads: 2
duration: 60 s
number of transactions actually processed: 640501
latency average = 0.187 ms
tps = 10674.933384 (including connections establishing)
tps = 10675.548084 (excluding connections establishing)

查看 pg_log 目录的数据库日志量为 62 MB 左右,如下:

[pg12@pghost1 pgbench]$ du -sm $PGDATA/pg_log
62      /pgdata/pg12/pg_root/pg_log

总结

测试场景二的日志量确实只有场景一的 25% 左右,大幅减少了无效日志,同时 tps 也有一小幅度提升,可能是因为少写了大量数据库日志,缓解了CPU、IO资源压力。

参考

原文链接: https://postgres.fun/20190717141000.html

新书推荐

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

_5_PostgreSQL_

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
44 1
|
5天前
|
SQL 安全 关系型数据库
SQL 注入神器:SQLMap 参数详解
SQL 注入神器:SQLMap 参数详解
|
11天前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中,如何通过PolarDB for MySQL来查看binlog日志
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
28 1
|
11天前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
|
11天前
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之DataWorks中,填写ODPS SQL任务中的参数和分区信息如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
24 0
|
12天前
|
SQL 关系型数据库 MySQL
【MySQL】:探秘主流关系型数据库管理系统及SQL语言
【MySQL】:探秘主流关系型数据库管理系统及SQL语言
25 0
|
12天前
|
运维 安全 关系型数据库
PolarDB产品使用合集之关于PolarDB DRDS的设置参数,主要有哪些
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1月前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
42 7
|
2月前
|
SQL 数据库 索引
解决SQL报错:索引中丢失IN或OUT參数
解决SQL报错:索引中丢失IN或OUT參数
|
2月前
|
SQL Java 数据库连接
Mybatis拦截器实现带参数SQL语句打印
Mybatis拦截器实现带参数SQL语句打印