排查思路
要排查 PostgreSQL 性能压测结果不理想的问题,可以采取以下步骤:
-
确认测试环境是否符合要求,包括硬件配置、软件版本、网络带宽等。如果硬件配置不足、软件版本过低、网络带宽不足等,都可能导致性能瓶颈。
-
确认测试数据是否真实、准确、充分。测试数据应当具有代表性,包括数据量、数据类型、数据结构等。
-
使用 PostgreSQL 自带的性能分析工具,如 pg_stat_statements、pg_stat_activity 等,对数据库进行监控和分析,查看是否存在慢查询、死锁等问题。
-
使用系统监控工具,如 top、vmstat、iostat 等,对系统资源的使用情况进行监控和分析,查看是否存在 CPU、内存、磁盘等资源瓶颈。
-
调整 PostgreSQL 的配置参数,如 shared_buffers、work_mem、max_connections 等,根据测试结果进行优化。
-
使用第三方性能分析工具,如 pgBadger、pgCluu 等,对 PostgreSQL 进行更深入的性能分析和优化。
总之,要排查 PostgreSQL 性能压测不上去的问题,需要综合考虑多个方面的因素,进行全面、系统的分析和优化。
性能报告
在 Oracle 数据库中,有一个名为 AWR(Automatic Workload Repository)的特性,可以自动收集数据库的性能数据,并生成报告,用于分析数据库的性能瓶颈和优化方案。
而在 PostgreSQL 中,没有类似 AWR 的自动性能报告功能。不过,PostgreSQL 提供了一些性能分析工具,如 pg_stat_statements、pg_stat_activity、pg_top 等,可以用于监控和分析数据库的性能数据。
此外,还有一些第三方工具,如 pgBadger、pgCluu 等,可以生成 PostgreSQL 的性能报告,提供更全面、详细的性能分析和优化建议。
需要注意的是,这些工具都需要手动运行,并且需要对其输出结果进行分析和解释,因此需要一定的专业知识和经验才能充分利用这些工具进行 PostgreSQL 性能优化。
pg_stat_statements、pg_stat_activity、pg_top 使用方法
这里简单介绍一下 PostgreSQL 的几个常用性能分析工具的使用方法:
1. pg_stat_statements
pg_stat_statements 是一个内置的性能分析模块,可以用于分析 SQL 语句的执行情况,包括执行次数、执行时间、返回行数等。启用 pg_stat_statements 后,可以通过以下步骤进行查询:
- 在 postgresql.conf 文件中添加以下配置:
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
- 重启 PostgreSQL 服务。
- 使用以下 SQL 查询语句查看统计数据:
\d+ pg_stat_statements
SELECT * FROM pg_stat_statements ORDER BY total_time DESC;
2. pg_stat_activity
pg_stat_activity 可以用于监控当前数据库连接的情况,包括连接数、当前执行的 SQL 语句、等待状态等。使用方法如下:
- 使用以下 SQL 查询语句查看当前连接信息:
SELECT * FROM pg_stat_activity;
- 可以通过过滤特定条件,如查询等待状态的连接:
SELECT * FROM pg_stat_activity WHERE waiting = true;
3. pg_top
pg_top 是一个类似于 Unix top 命令的工具,可以用于实时监控 PostgreSQL 数据库的性能状况,包括 CPU 利用率、内存使用、磁盘 I/O 等。使用方法如下:
- 安装 pg_top 工具,可以通过以下命令进行安装:
sudo apt-get install pgtop
- 运行 pg_top 工具,可以使用以下命令:
pg_top -U postgres -d mydatabase -W
其中,-U 参数指定连接数据库的用户名,-d 参数指定连接的数据库名称,-W 参数表示需要输入密码。运行后,可以实时查看数据库的性能状况。
需要注意的是,这些工具都是用于监控和分析 PostgreSQL 数据库的性能数据,需要根据实际情况选择合适的工具和参数进行使用。
执行时间
在使用psql与PostgreSQL数据库进行交互时,可以通过设置psql
的参数来启用执行时间的显示。下面是一种常用的方法:
- 打开终端并运行
psql
命令,连接到你的PostgreSQL数据库。 - 在psql命令行提示符下,输入以下命令开启执行时间显示:
\timing
执行上述命令后,psql
会在每次执行SQL语句时显示执行时间。
示例输出:
Timing is on.
- 现在,每次在
psql
中执行SQL语句时,都会显示执行时间,类似于以下输出:
Timing is on.
SELECT * FROM table;
Time: 12.234 ms
在这个例子中,执行时间显示为 “Time: 12.234 ms”,表示该查询的执行时间为12.234毫秒。
需要注意的是,开启执行时间显示只会影响当前的psql
会话。一旦你退出psql
,再次打开一个新的psql
会话,你需要重新输入\timing
命令来启用执行时间显示。
另外,如果你想在.psqlrc
配置文件中设置默认开启执行时间,你可以将以下行添加到该文件中:
\timing
这样,每次启动psql
会话时,都会自动开启执行时间显示。.psqlrc
文件通常位于你的用户主目录下(~/.psqlrc
)或者当前工作目录下(.psqlrc
)。
通过开启执行时间显示,你可以更好地了解每个SQL查询的执行性能,以便进行性能优化和调整。
关闭
要关闭 psql
中的执行时间显示,可以按照以下步骤进行操作:
- 打开终端并运行
psql
命令,连接到你的 PostgreSQL 数据库。 - 在
psql
命令行提示符下,输入以下命令关闭执行时间显示:
\timing off
执行上述命令后,psql
将不再显示执行时间。
示例输出:
Timing is off.
- 现在,每次在
psql
中执行 SQL 语句时,不会显示执行时间。
需要注意的是,关闭执行时间显示只会影响当前的 psql
会话。一旦你退出 psql
,再次打开一个新的 psql
会话,你需要重新输入 \timing off
命令来关闭执行时间显示。
另外,如果你在 .psqlrc
配置文件中设置了默认开启执行时间,你可以将以下行注释或从该文件中删除:
\timing
这样,每次启动 psql
会话时,将不再自动开启执行时间显示。
通过控制执行时间显示,你可以根据需要在 psql
中开启或关闭它,以便更好地适应你的查询调试和性能优化需求。
显示查询结果的优雅方式
以下是几种显示查询结果的优雅方式:
-
使用 \x 命令切换到扩展模式,这样查询结果将以更易读的格式显示。在扩展模式下,每行将仅显示一列,而不是平铺式的列。您可以使用 \x 命令切换回默认模式。
-
使用 \pset 命令设置输出格式。例如,使用以下命令将输出格式设置为表格:
\pset format aligned
-
使用 \x auto 命令设置自动扩展模式。在自动扩展模式下,查询结果将根据屏幕大小自动切换到扩展模式或默认模式。您可以使用 \x 命令切换回手动扩展模式。
-
使用 \watch 命令观察查询结果的实时更新。这对于需要实时监控查询结果的情况非常有用。
-
使用查询结果集中的聚合函数,例如 count、sum、avg 等,以便将结果集汇总为单个值。
-
使用视图或临时表格来组织查询结果,以便更好地呈现和分析数据。
-
最后,您还可以使用第三方工具,例如 pgcli 和 psqlpp,以获得更丰富的查询结果显示功能和更好的用户体验。
FATAL: no pg_hba.conf entry for host “[local]”, user “bpx”, database “bpx”, SSL off
这个错误提示表明PostgreSQL数据库没有为当前主机和用户配置访问权限。
要解决这个问题,你需要在PostgreSQL的pg_hba.conf
文件中添加一个条目来允许该主机和用户访问数据库。pg_hba.conf
文件位于PostgreSQL的数据目录中,通常在/var/lib/pgsql/data/
目录下。
下面是一个示例条目,可以将其添加到pg_hba.conf
文件中:
# TYPE DATABASE USER ADDRESS METHOD
host bpx bpx 127.0.0.1/32 md5
这个条目允许用户bpx
通过md5
身份验证方法连接到数据库bpx
,并且只允许来自127.0.0.1
的连接。
添加完条目后,需要重启PostgreSQL服务才能生效:
systemctl restart postgresql
请注意,根据你的具体情况,可能需要修改一些参数,例如数据库名称、用户名、IP地址、身份验证方法等。
重新加载配置文件
host all all 0.0.0.0/0 trust
pg_ctl -D /pgdata/data/*/ reload
这个命令会在PostgreSQL的pg_hba.conf文件中添加一条条目,允许任何用户和任何数据库从任何IP地址连接到PostgreSQL服务器,而不需要密码。出于安全考虑,通常不建议这样做,因为它允许具有服务器网络访问权限的任何人可能在不进行身份验证的情况下访问PostgreSQL数据库。建议使用更安全的身份验证方法,例如密码身份验证或SSL / TLS加密,并限制对受信任的IP地址或网络的访问。