之前在项目中遇到过postgresql数据库服务器cpu周期性的飙升,这里后来排查原因是某个全表查询过于频繁,查询时没有对于查询条件添加索引,这里分析一下整个排障过程。
首先登录到服务器上面,使用top命令查询哪个pg进程的cpu非常高,记录下这个进程PID,
然后到我们的数据库上面根据进程ID使用下面的SQL语句,查询具体哪条SQL导致数据库CPU飙升。
SELECT
30 procpid,
31 start,
32 now() - start AS lap,
33 current_query
34 FROM
35 (SELECT
36 backendid,
37 pg_stat_get_backend_pid(S.backendid) AS procpid,
38 pg_stat_get_backend_activity_start(S.backendid) AS start,39 pg_stat_get_backend_activity(S.backendid) AS current_query
40 FROM
41 (SELECT pg_stat_get_backend_idset() AS backendid) AS S
42 ) AS S
43 WHERE
44 current_query <> '<IDLE>' and procpid ='7896' ---procpid 对应进程号
45 ORDER BY
46 lap DESC;
后面查询到具体的SQL后,进行相应的SQL优化