PostgreSQL เชฎเชพเชŸเซ‡ ASH เชเชจเชพเชฒเซ‹เช— เชฌเชจเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ

เชธเชฎเชธเซเชฏเชพเชจเซ€ เชฐเชšเชจเชพ

PostgreSQL เช•เซเชตเซ‡เชฐเซ€เชเชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชชเซเชฐเชตเซƒเชคเซเชคเชฟ เช‡เชคเชฟเชนเชพเชธเชจเซเช‚ เชชเซƒเชฅเซเชฅเช•เชฐเชฃ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชฐเชพเชน, เชคเชพเชณเชพเช“ เช…เชจเซ‡ เชŸเซ‡เชฌเชฒ เช†เช‚เช•เชกเชพเช“, เช–เซ‚เชฌ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡.

เช‰เชชเชฒเชฌเซเชง เชคเช•เซ‹

เชเชคเชฟเชนเชพเชธเชฟเช• เชตเชฐเซเช•เชฒเซ‹เชก เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชธเชพเชงเชจ เช…เชฅเชตเชพ "เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธ เชฎเชพเชŸเซ‡ AWR": เช–เซ‚เชฌ เชœ เชฐเชธเชชเซเชฐเชฆ เช‰เช•เซ‡เชฒ, เชชเชฐเช‚เชคเซ pg_stat_activity เช…เชจเซ‡ pg_locks เชจเซ‹ เช•เซ‹เชˆ เช‡เชคเชฟเชนเชพเชธ เชจเชฅเซ€.

pgsentinel เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ :
ยซเชฌเชงเซ€ เชธเช‚เชšเชฟเชค เชฎเชพเชนเชฟเชคเซ€ เชซเช•เซเชค RAM เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชตเชชเชฐเชพเชถ เช•เชฐเซ‡เชฒ เชฎเซ‡เชฎเชฐเซ€เชจเซ€ เชฎเชพเชคเซเชฐเชพ เช›เซ‡เชฒเซเชฒเชพ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฆเซเชตเชพเชฐเชพ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡.

queryid เชซเซ€เชฒเซเชก เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ - pg_stat_statements เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชฎเชพเช‚เชฅเซ€ เชธเชฎเชพเชจ queryid (เชชเซ‚เชฐเซเชต-เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชœเชฐเซ‚เชฐเซ€).ยซ

เช†, เช…เชฒเชฌเชคเซเชค, เช˜เชฃเซ€ เชฎเชฆเชฆ เช•เชฐเชถเซ‡, เชชเชฐเช‚เชคเซ เชธเซŒเชฅเซ€ เชฎเซเชถเซเช•เซ‡เชฒเซ€เชœเชจเช• เชฌเชพเชฌเชค เช เชชเซเชฐเชฅเชฎ เชฎเซเชฆเซเชฆเซ‹ เช›เซ‡.เชฌเชงเซ€ เชธเช‚เชšเชฟเชค เชฎเชพเชนเชฟเชคเซ€ เชซเช•เซเชค RAM เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡ โ€, เชเชŸเชฒเซ‡ เช•เซ‡ เชฒเช•เซเชทเซเชฏ เช†เชงเชพเชฐ เชชเชฐ เช…เชธเชฐ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชฒเซ‹เช• เช‡เชคเชฟเชนเชพเชธ เช…เชจเซ‡ เชŸเซ‡เชฌเชฒ เช†เช‚เช•เชกเชพ เชจเชฅเซ€. เชคเซ‡. เช‰เช•เซ‡เชฒ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช…เชชเซ‚เชฐเซเชฃ เชฌเซ‹เชฒเซ‡ เช›เซ‡: "เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชนเชœเซ€ เชธเซเชงเซ€ เช•เซ‹เชˆ เชคเซˆเชฏเชพเชฐ เชชเซ‡เช•เซ‡เชœ เชจเชฅเซ€. เชธเซเชคเซเชฐเซ‹เชคเซ‹เชจเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพ เช…เชจเซ‡ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเซ‡ เชœเชพเชคเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพเชจเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเชฎเชพเชฐเซ‡ เชชเชนเซ‡เชฒเชพ เชคเชฎเชพเชฐเชพ เชธเชฐเซเชตเชฐ เชฎเชพเชŸเซ‡ "devel" เชชเซ‡เช•เซ‡เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ PATH เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ pg_config เชฎเชพเชŸเซ‡ เชชเชพเชฅ เชธเซ‡เชŸ เช•เชฐเซ‹.".

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชคเซเชฏเชพเช‚ เช˜เชฃเซ€ เชนเชฒเชซเชฒ เช›เซ‡, เช…เชจเซ‡ เช—เช‚เชญเซ€เชฐ เช‰เชคเซเชชเชพเชฆเชจ เชกเซ‡เชŸเชพเชฌเซ‡เชธเซ‡เชธเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชธเชฐเซเชตเชฐ เชธเชพเชฅเซ‡ เช•เช‚เชˆเชชเชฃ เช•เชฐเชตเซเช‚ เชถเช•เซเชฏ เชจเชฅเซ€. เช†เชชเชฃเซ‡ เชซเชฐเซ€เชฅเซ€ เช†เชชเชฃเซ€ เชชเซ‹เชคเชพเชจเซ€ เช•เช‚เชˆเช• เชธเชพเชฅเซ‡ เช†เชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชšเซ‡เชคเชตเชฃเซ€

เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡ เชฎเซ‹เชŸเชพ เชœเชฅเซเชฅเชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช…เชจเซ‡ เช…เชชเซ‚เชฐเซเชฃ เชชเชฐเซ€เช•เซเชทเชฃ เชธเชฎเชฏเช—เชพเชณเชพเชจเซ‡ เชฒเซ€เชงเซ‡, เชฒเซ‡เช– เชฎเซเช–เซเชฏเชคเซเชตเซ‡ เชฎเชพเชนเชฟเชคเซ€เชชเซเชฐเชฆ เชชเซเชฐเช•เซƒเชคเชฟเชจเซ‹ เช›เซ‡, เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡ เชฅเซ€เชธเซ€เชธ เช…เชจเซ‡ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเชพ เชธเชฎเซ‚เชน เชคเชฐเซ€เช•เซ‡.
เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชธเชพเชฎเช—เซเชฐเซ€ เชชเช›เซ€เชฅเซ€ เชญเชพเช—เซ‹เชฎเชพเช‚ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡

เช‰เช•เซ‡เชฒ เชฎเชพเชŸเซ‡ เชกเซเชฐเชพเชซเซเชŸ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹

เชเช• เชธเชพเชงเชจ เชตเชฟเช•เชธเชพเชตเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡:

pg_stat_activity เชœเซ‹เชตเชพเชจเซ‹ เช‡เชคเชฟเชนเชพเชธ
pg_locks เชฆเซƒเชถเซเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชคเซเชฐ เชฒเซ‹เช• เช‡เชคเชฟเชนเชพเชธ

เช‰เช•เซ‡เชฒ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค-เชฒเช•เซเชทเซเชฏ เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเชฐ เช…เชธเชฐ เช“เช›เซ€ เช•เชฐเซ‹.

เชธเชพเชฎเชพเชจเซเชฏ เชตเชฟเชšเชพเชฐ- เชกเซ‡เชŸเชพ เช•เชฒเซ‡เช•เซเชถเชจ เชเชœเชจเซเชŸเชจเซ‡ เชฒเช•เซเชทเซเชฏ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชธเชฟเชธเซเชŸเชฎเชก เชธเซ‡เชตเชพ เชคเชฐเซ€เช•เซ‡ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชนเชพ, เช…เชฎเซเช• เชกเซ‡เชŸเชพ เชจเซเช•เชถเชพเชจ เชถเช•เซเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เช† เชฐเชฟเชชเซ‹เชฐเซเชŸเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชฎเซ‡เชฎเชฐเซ€ เช…เชจเซ‡ เชกเชฟเชธเซเช• เชœเช—เซเชฏเชพเชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เชฒเช•เซเชทเซเชฏ เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเชฐ เช•เซ‹เชˆ เช…เชธเชฐ เชฅเชคเซ€ เชจเชฅเซ€. เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชชเซ‚เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชชเชฐเชจเซ€ เช…เชธเชฐ เชจเซเชฏเซ‚เชจเชคเชฎ เช›เซ‡.

เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเชพ เชคเชฌเช•เซเช•เชพ

1.เชธเซ‡เชตเชพ เช•เซ‹เชทเซเชŸเช•เซ‹

เช•เซ‹เชทเซเชŸเช•เซ‹เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เช…เชฒเช— เชธเซเช•เซ€เชฎเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡เชฅเซ€ เชตเชชเชฐเชพเชฏเซ‡เชฒ เชฎเซเช–เซเชฏ เช•เซ‹เชทเซเชŸเช•เซ‹เชจเชพ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเซ‡ เชœเชŸเชฟเชฒ เชจ เชฌเชจเชพเชตเซ‡.

DROP SCHEMA IF EXISTS activity_hist ;
CREATE SCHEMA activity_hist AUTHORIZATION monitor ;

เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ: เชธเซเช•เซ€เชฎเชพ เชฒเช•เซเชทเซเชฏ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚.

pg_stat_activity เชœเซ‹เชตเชพเชจเซ‹ เช‡เชคเชฟเชนเชพเชธ

เช•เซ‹เชทเซเชŸเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— pg_stat_activity เชตเซเชฏเซเชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เชธเซเชจเซ‡เชชเชถเซ‹เชŸเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡

activity_hist.history_pg_stat_activity :

--ACTIVITY_HIST.HISTORY_PG_STAT_ACTIVITY
DROP TABLE IF EXISTS activity_hist.history_pg_stat_activity;
CREATE TABLE activity_hist.history_pg_stat_activity
(
  timepoint timestamp without time zone ,
  datid             oid  , 
  datname           name ,
  pid               integer,
  usesysid          oid    ,
  usename           name   ,
  application_name  text   ,
  client_addr       inet   ,
  client_hostname   text   ,
  client_port       integer,
  backend_start     timestamp with time zone ,
  xact_start        timestamp with time zone ,
  query_start       timestamp with time zone ,
  state_change      timestamp with time zone ,
  wait_event_type   text ,                     
  wait_event        text ,                   
  state             text ,                  
  backend_xid       xid  ,                 
  backend_xmin      xid  ,                
  query             text ,               
  backend_type      text ,  
  queryid           bigint
);

เชจเชฟเชตเซ‡เชถเชจเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ - เช•เซ‹เชˆ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เช…เชฅเชตเชพ เชชเซเชฐเชคเชฟเชฌเช‚เชงเซ‹ เชจเชฅเซ€.

เช‡เชคเชฟเชนเชพเชธเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชชเชพเชฐเซเชŸเซ€เชถเชจ เช•เชฐเซ‡เชฒ เช•เซ‹เชทเซเชŸเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡:

activity_hist.archive_pg_stat_activity :

DROP TABLE IF EXISTS activity_hist.archive_pg_stat_activity;
CREATE TABLE activity_hist.archive_pg_stat_activity
(
  timepoint timestamp without time zone ,
  datid             oid  , 
  datname           name ,
  pid               integer,
  usesysid          oid    ,
  usename           name   ,
  application_name  text   ,
  client_addr       inet   ,
  client_hostname   text   ,
  client_port       integer,
  backend_start     timestamp with time zone ,
  xact_start        timestamp with time zone ,
  query_start       timestamp with time zone ,
  state_change      timestamp with time zone ,
  wait_event_type   text ,                     
  wait_event        text ,                   
  state             text ,                  
  backend_xid       xid  ,                 
  backend_xmin      xid  ,                
  query             text ,               
  backend_type      text ,
  queryid           bigint
)
PARTITION BY RANGE (timepoint);

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชจเชฟเชตเซ‡เชถเชจเซ€ เช—เชคเชฟ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆ เช†เชตเชถเซเชฏเช•เชคเชพเช“ เชจ เชนเซ‹เชตเชพเชฅเซ€, เช…เชนเซ‡เชตเชพเชฒเซ‹เชจเชพ เชจเชฟเชฐเซเชฎเชพเชฃเชจเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡.

เชธเชคเซเชฐ เช…เชตเชฐเซ‹เชงเชฟเชค เช‡เชคเชฟเชนเชพเชธ

เชธเชคเซเชฐ เชฒเซ‹เช•เชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เชธเซเชจเซ‡เชชเชถเซ‹เชŸเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชทเซเชŸเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡:

activity_hist.history_locking :

--ACTIVITY_HIST.HISTORY_LOCKING
DROP TABLE IF EXISTS activity_hist.history_locking;
CREATE TABLE activity_hist.history_locking
(
	timepoint timestamp without time zone ,
	locktype text ,
	relation oid ,
	mode text ,
	tid xid ,
	vtid text ,
	pid integer ,
	blocking_pids integer[] ,
	granted boolean
);

เช‰เชชเชฐเชพเช‚เชค, เชจเชฟเชตเซ‡เชถเชจเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เช…เชฅเชตเชพ เชชเซเชฐเชคเชฟเชฌเช‚เชงเซ‹ เชจเชฅเซ€.

เช‡เชคเชฟเชนเชพเชธเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชชเชพเชฐเซเชŸเซ€เชถเชจ เช•เชฐเซ‡เชฒ เช•เซ‹เชทเซเชŸเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡:

activity_hist.archive_locking:

DROP TABLE IF EXISTS activity_hist.archive_locking;
CREATE TABLE activity_hist.archive_locking
(
	timepoint timestamp without time zone ,
	locktype text ,
	relation oid ,
	mode text ,
	tid xid ,
	vtid text ,
	pid integer ,
	blocking_pids integer[] ,
	granted boolean	
)
PARTITION BY RANGE (timepoint);

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชจเชฟเชตเซ‡เชถเชจเซ€ เช—เชคเชฟ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆ เช†เชตเชถเซเชฏเช•เชคเชพเช“ เชจ เชนเซ‹เชตเชพเชฅเซ€, เช…เชนเซ‡เชตเชพเชฒเซ‹เชจเชพ เชจเชฟเชฐเซเชฎเชพเชฃเชจเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡.

2. เชตเชฐเซเชคเชฎเชพเชจ เช‡เชคเชฟเชนเชพเชธ เชญเชฐเซ‹

เชตเซเชฏเซ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เชธเซ€เชงเชพ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‡ plpgsql เชซเช‚เช•เซเชถเชจเชจเซ‡ เชšเชฒเชพเชตเซ‡ เช›เซ‡.

get_current_activity.sh

#!/bin/bash
#########################################################
#get_current_activity.sh

ERROR_FILE='/home/demon/get_current_activity'$(date +%Y%m%d-)'T'$(date +%H)$(date +%M)$(date +%S)
host=$1
s_name=$2
s_pass=$3

psql  -A -t -q -v ON_ERROR_STOP=1 -c "SELECT activity_hist.get_current_activity( '$host' , '$s_name' , '$s_pass' )" >/dev/null 2>$ERROR_FILE

line_count=`cat $ERROR_FILE | wc -l`
if [[ $line_count != '0' ]];
then
    rm -f /home/demon/*.err >/dev/null 2>/dev/null
	cp $ERROR_FILE $ERROR_FILE'.err' >/dev/null 2>/dev/null  
fi
rm $ERROR_FILE >/dev/null 2>/dev/null
exit 0

plpgsql dblink เชซเช‚เช•เซเชถเชจ เชฒเช•เซเชทเซเชฏ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฆเซƒเชถเซเชฏเซ‹เชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชธเซ‡เชตเชพ เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚ เชชเช‚เช•เซเชคเชฟเช“ เชฆเชพเช–เชฒ เช•เชฐเซ‡ เช›เซ‡.

get_current_activity.sql

CREATE OR REPLACE FUNCTION activity_hist.get_current_activity( current_host text , current_s_name text , current_s_pass text ) RETURNS BOOLEAN AS $$
DECLARE 
  database_rec record;
  dblink_str text ;
BEGIN   

	EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||current_host||' port=5432 dbname=postgres'||
	                                         ' user='||current_s_name||' password='||current_s_pass|| ' '')';



--------------------------------------------------------------------
--GET pg_stat_activity stats
	INSERT INTO activity_hist.history_pg_stat_activity
	(
		SELECT * FROM dblink('LINK1',
			'SELECT 
			now() , 
			datid             , 
			datname           ,
			pid               ,
			usesysid              ,
			usename              ,
			application_name     ,
			client_addr          ,
			client_hostname      ,
			client_port       ,
			backend_start         ,
			xact_start            ,
			query_start           ,
			state_change          ,
			wait_event_type    ,                     
			wait_event         ,                   
			state              ,                  
			backend_xid         ,                 
			backend_xmin        ,                
			query              ,               
			backend_type   			
		FROM pg_stat_activity
		') 
		AS t (
		    timepoint 		  timestamp without time zone ,			
			datid             oid  , 
			datname           name ,
			pid               integer,
			usesysid          oid    ,
			usename           name   ,
			application_name  text   ,
			client_addr       inet   ,
			client_hostname   text   ,
			client_port       integer,
			backend_start     timestamp with time zone ,
			xact_start        timestamp with time zone ,
			query_start       timestamp with time zone ,
			state_change      timestamp with time zone ,
			wait_event_type   text ,                     
			wait_event        text ,                   
			state             text ,                  
			backend_xid       xid  ,                 
			backend_xmin      xid  ,                
			query             text ,               
			backend_type      text 			
		)
	);

---------------------------------------	
--ACTIVITY_HIST.HISTORY_LOCKING	
	INSERT INTO activity_hist.history_locking
	(
		SELECT * FROM dblink('LINK1',
			'SELECT 
			now() , 
			lock.locktype,
			lock.relation,
			lock.mode,
			lock.transactionid as tid,
			lock.virtualtransaction as vtid,
			lock.pid,
			pg_blocking_pids(lock.pid), 
			lock.granted
			FROM 	pg_catalog.pg_locks lock LEFT JOIN pg_catalog.pg_database db ON db.oid = lock.database
			WHERE NOT lock.pid = pg_backend_pid()	
		') 
		AS t (
			timepoint timestamp without time zone ,
			locktype text ,
			relation oid , 
			mode text ,
			tid xid ,
			vtid text ,
			pid integer ,
			blocking_pids integer[] ,
			granted boolean
		)
	);
	PERFORM dblink_disconnect('LINK1');
	
	RETURN TRUE ;
END
$$ LANGUAGE plpgsql;

เชฆเซƒเชถเซเชฏ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, systemd เชธเซ‡เชตเชพ เช…เชจเซ‡ เชฌเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡:

pg_current_activity.service

# /etc/systemd/system/pg_current_activity.service
[Unit]
Description=Collect history of pg_stat_activity , pg_locks 
Wants=pg_current_activity.timer

[Service]
Type=forking
StartLimitIntervalSec=0
ExecStart=/home/postgres/pgutils/demon/get_current_activity.sh 10.124.70.40 postgres postgres

[Install]
WantedBy=multi-user.target

pg_current_activity.timer

# /etc/systemd/system/pg_current_activity.timer
[Unit]
Description=Run pg_current_activity.sh every 1 second
Requires=pg_current_activity.service

[Timer]
Unit=pg_current_activity.service
OnCalendar=*:*:0/1
AccuracySec=1

[Install]
WantedBy=timers.target

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฎเชพเชŸเซ‡ เช…เชงเชฟเช•เชพเชฐเซ‹ เชธเซ‹เช‚เชชเซ‹:
# chmod 755 pg_current_activity.timer
# chmod 755 pg_current_activity.service

เชšเชพเชฒเซ‹ เชธเซ‡เชตเชพ เชถเชฐเซ‚ เช•เชฐเซ€เช:
# systemctl เชกเชฟเชฎเชจ-เชซเชฐเซ€เชฅเซ€ เชฒเซ‹เชก เช•เชฐเซ‹
# systemctl pg_current_activity.service เชถเชฐเซ‚ เช•เชฐเซ‹

เช†เชฎ, เชฆเซƒเชถเซเชฏเซ‹เชจเซ‹ เช‡เชคเชฟเชนเชพเชธ เชธเซ‡เช•เชจเซเชก-เชฌเชพเชฏ-เชธเซ‡เช•เชจเซเชก เชธเซเชจเซ‡เชชเชถเซ‹เชŸเชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชฒเชฌเชคเซเชค, เชœเซ‹ เชฌเชงเซเช‚ เช›เซ‡ เชคเซ‡เชฎ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡, เชคเซ‹ เช•เซ‹เชทเซเชŸเช•เซ‹ เช–เซ‚เชฌ เชœ เชเชกเชชเชฅเซ€ เช•เชฆเชฎเชพเช‚ เชตเชงเชพเชฐเซ‹ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชตเชงเซ เช•เซ‡ เช“เช›เชพ เช‰เชคเซเชชเชพเชฆเช• เช•เชพเชฐเซเชฏ เช…เชถเช•เซเชฏ เชฌเชจเซ€ เชœเชถเซ‡.

เชกเซ‡เชŸเชพ เช†เชฐเซเช•เชพเช‡เชตเชฟเช‚เช—เชจเซเช‚ เช†เชฏเซ‹เชœเชจ เช•เชฐเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡.

3. เช†เชฐเซเช•เชพเช‡เชตเชฟเช‚เช— เช‡เชคเชฟเชนเชพเชธ

เช†เชฐเซเช•เชพเช‡เชตเชฟเช‚เช— เชฎเชพเชŸเซ‡, เชชเชพเชฐเซเชŸเซ€เชถเชจ เช•เชฐเซ‡เชฒ เช•เซ‹เชทเซเชŸเช•เซ‹ เช†เชฐเซเช•เชพเช‡เชต* เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡.

เชฆเชฐ เช•เชฒเชพเช•เซ‡ เชจเชตเชพ เชชเชพเชฐเซเชŸเซ€เชถเชจเซ‹ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เชœเซ‚เชจเชพ เชกเซ‡เชŸเชพเชจเซ‡ เช‡เชคเชฟเชนเชพเชธ* เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚เชฅเซ€ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เช‡เชคเชฟเชนเชพเชธ* เช•เซ‹เชทเซเชŸเช•เซ‹เชจเซเช‚ เช•เชฆ เชตเชงเซ เชฌเชฆเชฒเชพเชคเซเช‚ เชจเชฅเซ€ เช…เชจเซ‡ เชธเชฎเชฏ เชœเชคเชพเช‚ เชจเชฟเชตเซ‡เชถเชจเซ€ เชเชกเชช เช˜เชŸเชคเซ€ เชจเชฅเซ€.

เชจเชตเชพ เชตเชฟเชญเชพเช—เซ‹เชจเซเช‚ เชจเชฟเชฐเซเชฎเชพเชฃ plpgsql เชซเช‚เช•เซเชถเชจ activity_hist.archive_current_activity เชฆเซเชตเชพเชฐเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช•เชพเชฐเซเชฏเชจเซเช‚ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เช›เซ‡ (เช†เชฐเซเช•เชพเช‡เชต_เชชเซ€เชœเซ€_เชธเซเชŸเซ‡เชŸ_เชเช•เซเชŸเชฟเชตเชฟเชŸเซ€ เช•เซ‹เชทเซเชŸเช• เชฎเชพเชŸเซ‡เชจเชพ เชตเชฟเชญเชพเช—เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡).

เชจเชตเซ‹ เชตเชฟเชญเชพเช— เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชญเชฐเซ‹

EXECUTE format(
'CREATE TABLE ' || partition_name || 
' PARTITION OF activity_hist.archive_pg_stat_activity FOR VALUES FROM ( %L ) TO ( %L ) ' , 
to_char(date_trunc('year', partition_min_range ),'YYYY')||'-'||
to_char(date_trunc('month', partition_min_range ),'MM')||'-'||
to_char(date_trunc('day', partition_min_range ),'DD')||' '||
to_char(date_trunc('hour', partition_min_range ),'HH24')||':00', 
to_char(date_trunc('year', partition_max_range ),'YYYY')||'-'||
to_char(date_trunc('month', partition_max_range ),'MM')||'-'||
to_char(date_trunc('day', partition_max_range ),'DD')||' '||
to_char(date_trunc('hour', partition_max_range ),'HH24')||':00'
);

INSERT INTO activity_hist.archive_pg_stat_activity
(
	SELECT 	* 
	FROM 	activity_hist.history_pg_stat_activity
	WHERE 	timepoint BETWEEN partition_min_range AND partition_max_range 		
);

เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“ เชฌเชจเชพเชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

EXECUTE format	(
'CREATE INDEX '||index_name||
' ON '||partition_name||' ( wait_event_type , backend_type , timepoint )' 
);

EXECUTE format	('CREATE INDEX '||index_name||
' ON '||partition_name||' ( wait_event_type , backend_type , timepoint , queryid )' 
);

History_pg_stat_activity เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€ เชœเซ‚เชจเซ‹ เชกเซ‡เชŸเชพ เชฆเซ‚เชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช

DELETE 
FROM 	activity_hist.history_pg_stat_activity
WHERE 	timepoint < partition_max_range;

เช…เชฒเชฌเชคเซเชค, เชธเชฎเชฏ เชธเชฎเชฏ เชชเชฐ, เชœเซ‚เชจเชพ เชตเชฟเชญเชพเช—เซ‹ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชคเชฐเซ€เช•เซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชฎเซ‚เชณเชญเซ‚เชค เช…เชนเซ‡เชตเชพเชฒเซ‹

เช–เชฐเซ‡เช–เชฐ, เช† เชฌเชงเซเช‚ เชถเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡? Oracle เชจเชพ AWR เชจเซ€ เชฏเชพเชฆ เช…เชชเชพเชตเซ‡ เชคเซ‡เชตเชพ เช…เชนเซ‡เชตเชพเชฒเซ‹ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡.

เช เช‰เชฎเซ‡เชฐเชตเซเช‚ เช…เช—เชคเซเชฏเชจเซเช‚ เช›เซ‡ เช•เซ‡ เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ pg_stat_activity เช…เชจเซ‡ pg_stat_statements เชตเซเชฏเซ‚ เชตเชšเซเชšเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช•เซ‹เชทเซเชŸเช•เซ‹ 'history_pg_stat_activity', 'archive_pg_stat_activity' เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚ 'queryid' เช•เซ‰เชฒเชฎ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ เชฒเชฟเช‚เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช•เซ‰เชฒเชฎ เชฎเซ‚เชฒเซเชฏ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟ เช† เชฒเซ‡เช–เชจเชพ เช…เชตเช•เชพเชถเชจเซ€ เชฌเชนเชพเชฐ เช›เซ‡ เช…เชจเซ‡ เช…เชนเซ€เช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡ - pg_stat_statements + pg_stat_activity + loq_query = pg_ash? .

เชชเซเชฐเชถเซเชจเซ‹ เชฎเชพเชŸเซ‡ เช•เซเชฒ CPU เชธเชฎเชฏ

เชตเชฟเชจเช‚เชคเซ€:

WITH hist AS
(
SELECT 
	aa.query ,aa.queryid ,			
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.archive_pg_stat_activity aa
WHERE timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND  pg_stat_history_end+(current_hour_diff * interval '1 hour')  AND backend_type = 'client backend' AND datname != 'postgres' AND	( aa.wait_event_type IS NULL  ) ANDaa.state = 'active'
GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid		
UNION 
SELECT 
	ha.query ,ha.queryid,
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.history_pg_stat_activity_for_reports ha
WHERE timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour')  AND 	backend_type = 'client backend' AND datname != 'postgres' AND ( ha.wait_event_type IS NULL  )AND ha.state = 'active'
GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid		
)
SELECT 	query , queryid , SUM( duration ) as duration 
FROM hist
GROUP BY  query , queryid 
ORDER BY 3 DESC

เช‰เชฆเชพเชนเชฐเชฃ:

-------------------------------------------------------------------
| TOTAL CPU TIME FOR QUERIES : 07:47:36
+----+----------------------------------------+--------------------
|   #|                                 queryid|            duration
+----+----------------------------------------+--------------------
|   1|                      389015618226997618|            04:28:58
|   2|                                        |            01:07:29
|   3|                     1237430309438971376|            00:59:38
|   4|                     4710212362688288619|            00:50:48
|   5|                       28942442626229688|            00:15:50
|   6|                     9150846928388977274|            00:04:46
|   7|                    -6572922443698419129|            00:00:06
|   8|                                        |            00:00:01
+----+----------------------------------------+--------------------

เชชเซเชฐเชถเซเชจเซ‹ เชฎเชพเชŸเซ‡ เช•เซเชฒ เชฐเชพเชน เชœเซ‹เชตเชพเชจเซ‹ เชธเชฎเชฏ

เชตเชฟเชจเช‚เชคเซ€:

WITH hist AS
(
SELECT 
	aa.query ,aa.queryid ,			
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.archive_pg_stat_activity aa
WHERE timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour')  AND 
	backend_type = 'client backend' AND datname != 'postgres' AND
	( aa.wait_event_type IS NOT NULL  ) 
GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid		
UNION 
SELECT 
	ha.query ,ha.queryid,
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.history_pg_stat_activity_for_reports ha
WHERE timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour')  AND 
	backend_type = 'client backend' AND datname != 'postgres' AND				
	( ha.wait_event_type IS NOT NULL  )
GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid		
)
SELECT 	query , queryid , SUM( duration ) as duration 
FROM hist
GROUP BY  query , queryid 
ORDER BY 3 DESC 

เช‰เชฆเชพเชนเชฐเชฃ:

-------------------------------------------------------------------
| TOTAL WAITINGS TIME FOR QUERIES : 21:55:04
+----+----------------------------------------+--------------------
|   #|                                 queryid|            duration
+----+----------------------------------------+--------------------
|   1|                      389015618226997618|            16:19:05
|   2|                                        |            03:47:04
|   3|                     8085340880788646241|            00:40:20
|   4|                     4710212362688288619|            00:13:35
|   5|                     9150846928388977274|            00:12:25
|   6|                       28942442626229688|            00:11:32
|   7|                     1237430309438971376|            00:09:45
|   8|                     2649515222348904837|            00:09:37
|   9|                                        |            00:03:45
|  10|                     3167065002719415275|            00:02:20
|  11|                     5731212217001535134|            00:02:13
|  12|                     8304755792398128062|            00:01:31
|  13|                     2649515222348904837|            00:00:59
|  14|                     2649515222348904837|            00:00:22
|  15|                                        |            00:00:12
|  16|                     3422818749220588372|            00:00:08
|  17|                    -5730801771815999400|            00:00:03
|  18|                    -1473395109729441239|            00:00:02
|  19|                     2404820632950544954|            00:00:02
|  20|                    -6572922443698419129|            00:00:02
|  21|                     2369289265278398647|            00:00:01
|  22|                      180077086776069052|            00:00:01
+----+----------------------------------------+--------------------

เชชเซเชฐเชถเซเชจเซ‹ เชฎเชพเชŸเซ‡ เชฐเชพเชน เชœเซเช“

เชตเชฟเชจเช‚เชคเซ€เช“:

WITH hist AS
(
SELECT 
	aa.wait_event_type , aa.wait_event 
FROM 	activity_hist.archive_pg_stat_activity aa
WHERE timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND 
	backend_type = 'client backend' AND datname != 'postgres' AND
	aa.wait_event IS NOT NULL 
GROUP BY aa.wait_event_type , aa.wait_event
UNION 
SELECT 
	ha.wait_event_type , ha.wait_event 
FROM 	activity_hist.history_pg_stat_activity_for_reports ha
WHERE timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND 
	backend_type = 'client backend' AND datname != 'postgres' AND
	ha.wait_event IS NOT NULL 
GROUP BY ha.wait_event_type , ha.wait_event		
)
SELECT 	wait_event_type , wait_event 
FROM hist
GROUP BY wait_event_type , wait_event
ORDER BY 1 ASC,2 ASC

----------------------------------------------------------------------

WITH hist AS
(
SELECT 
	aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid ,			
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.archive_pg_stat_activity aa
WHERE timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND 
	backend_type = 'client backend' AND datname != 'postgres' AND
	( aa.wait_event_type = waitings_stat_rec.wait_event_type AND aa.wait_event = waitings_stat_rec.wait_event )
GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid		
UNION 
SELECT 
	ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid,
	count(*) * interval '1 second' AS duration 
FROM 	activity_hist.history_pg_stat_activity_for_reports ha
WHERE timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND 
	backend_type = 'client backend' AND datname != 'postgres' AND				
	( ha.wait_event_type = waitings_stat_rec.wait_event_type AND ha.wait_event = waitings_stat_rec.wait_event )
GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid		
)
SELECT 	query , queryid , SUM( duration ) as duration 
FROM hist
GROUP BY  query , queryid 
ORDER BY 3 DESC

เช‰เชฆเชพเชนเชฐเชฃ:

------------------------------------------------
| WAITINGS FOR QUERIES
+-----------------------------------------------
|                      wait_event_type = Client|
|                       wait_event = ClientRead|
|                        Total time  = 00:46:56|
------------------------------------------------
|    #|             queryid|            duration
+-----+--------------------+--------------------
|    1| 8085340880788646241|            00:40:20
|    2|                    |            00:03:45
|    3| 5731212217001535134|            00:01:53
|    4|                    |            00:00:12
|    5| 9150846928388977274|            00:00:09
|    6| 3422818749220588372|            00:00:08
|    7| 1237430309438971376|            00:00:06
|    8|   28942442626229688|            00:00:05
|    9| 4710212362688288619|            00:00:05
|   10|-5730801771815999400|            00:00:03
|   11| 8304755792398128062|            00:00:02
|   12|-6572922443698419129|            00:00:02
|   13|-1473395109729441239|            00:00:02
|   14| 2404820632950544954|            00:00:02
|   15|  180077086776069052|            00:00:01
|   16| 2369289265278398647|            00:00:01

+-----------------------------------------------
|                          wait_event_type = IO|
|                      wait_event = BufFileRead|
|                        Total time  = 00:00:38|
------------------------------------------------
|    #|             queryid|            duration
+-----+--------------------+--------------------
|    1|   28942442626229688|            00:00:38

+-----------------------------------------------

เชฒเซ‰เช• เช•เชฐเซ‡เชฒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‡เชคเชฟเชนเชพเชธ

เชตเชฟเชจเช‚เชคเซ€:

SELECT 
MIN(date_trunc('second',timepoint)) AS started , 
	count(*) * interval '1 second' as duration ,
	pid , blocking_pids , relation , mode , locktype 	 
FROM 
	activity_hist.archive_locking al 
WHERE 
	timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND
	NOT granted AND 
	locktype = 'relation' 
GROUP BY pid , blocking_pids , relation , mode , locktype			
UNION
SELECT 
	MIN(date_trunc('second',timepoint)) AS started , 
	count(*) * interval '1 second' as duration ,
	pid , blocking_pids , relation , mode , locktype
FROM 
	activity_hist.history_locking 
WHERE 
	timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND
	NOT granted AND 
	locktype = 'relation' 
GROUP BY pid , blocking_pids , relation , mode , locktype			
ORDER BY 1

เช‰เชฆเชพเชนเชฐเชฃ:

-------------------------------------------------- -------------------------------------------------- ---------------------------------- | เชฒเซ‰เช• เช•เชฐเซ‡เชฒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‡เชคเชฟเชนเชพเชธ +------+----------+------+--------------------- ---------------------------------- +------------------------------- +------------------- | #| pid| เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚ | เช…เชตเชงเชฟ| เชฌเซเชฒเซ‹เช•เซ€เช‚เช—_เชชเซ€เชกเซเชธ| เชธเช‚เชฌเช‚เชง| เชฎเซ‹เชก| เชฒเซ‹เช•เชŸเชพเช‡เชช +---------+---------+------+---------- +--------- -----------+------------+---------------------+------ -------------- | 1| 26224| 2019-09-02 19:32:16 | 00:01:45| {26211}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 2| 26390| 2019-09-02 19:34:03 | 00:00:53 | {26211}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 3| 26391| 2019-09-02 19:34:03 | 00:00:53 | {26211}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 4| 26531| 2019-09-02 19:35:27 | 00:00:12 | {26211}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 5| 27284| 2019-09-02 19:44:02 | 00:00:19 | {27276}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 6| 27283| 2019-09-02 19:44:02 | 00:00:19 | {27276}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 7| 27286| 2019-09-02 19:44:02 | 00:00:19 | {27276}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 8| 27423| 2019-09-02 19:45:24 | 00:00:12 | {27394}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 9| 27648| 2019-09-02 19:48:06 | 00:00:20| {27647}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 10| 27650| 2019-09-02 19:48:06 | 00:00:20| {27647}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 11| 27735| 2019-09-02 19:49:08 | 00:00:06 | {27650}| 16541| เชเช•เซเชธเซ‡เชธ เชเช•เซเชธเช•เซเชฒเซเชเชฟเชตเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 12| 28380| 2019-09-02 19:56:03 | 00:01:56| {28379}| 16541| เชเช•เซเชธเซ‡เชธเชถเซ‡เชฐเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | 13| 28379| 2019-09-02 19:56:03 | 00:00:01 | 28377| 16541| เชเช•เซเชธเซ‡เชธ เชเช•เซเชธเช•เซเชฒเซเชเชฟเชตเชฒเซ‹เช•| เชธเช‚เชฌเช‚เชง | | | | | 28376| | 

เช…เชตเชฐเซ‹เชงเชฟเชค เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เช‡เชคเชฟเชนเชพเชธ

เชตเชฟเชจเช‚เชคเซ€เช“:

SELECT 
blocking_pids 
FROM 
	activity_hist.archive_locking al 
WHERE 
	timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND
	NOT granted AND 
	locktype = 'relation' 
GROUP BY blocking_pids 		
UNION
SELECT 
	blocking_pids 
FROM 
	activity_hist.history_locking 
WHERE 
	timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND
	NOT granted AND 
	locktype = 'relation' 
GROUP BY blocking_pids 		
ORDER BY 1

---------------------------------------------------------------

SELECT 
	pid , usename , application_name , datname ,
	MIN(date_trunc('second',timepoint)) as started , 
	count(*) * interval '1 second' as duration ,		 
	state , 
	query
				FROM  	activity_hist.archive_pg_stat_activity
				WHERE 	pid= current_pid AND 
						timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') 						 
				GROUP BY pid , usename , application_name , 
						datname , 
						state_change, 
						state , 
						query 
				UNION
				SELECT 
					pid , usename , application_name , datname ,
					MIN(date_trunc('second',timepoint)) as started , 
					count(*) * interval '1 second' as duration ,		 
					state , 
					query
				FROM  	activity_hist.history_pg_stat_activity_for_reports
				WHERE 	pid= current_pid AND 
						timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') 						 
				GROUP BY pid , usename , application_name , 
						datname , 
						state_change, 
						state , 
						query 
				ORDER BY 5 , 1

เช‰เชฆเชพเชนเชฐเชฃ:

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------- เชฌเซเชฒเซ‹เช•เซ€เช‚เช— เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‡เชคเชฟเชนเชพเชธ +------+--------------------- --+---------+------------+------------ ------------------------------- +------------ -------+----------------------------------------- | #| pid| เช‰เชชเชฏเซ‹เช—เชจเชพเชฎ| เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ_เชจเชพเชฎ| datname| เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚ | เช…เชตเชงเชฟ| เชฐเชพเชœเซเชฏ| เช•เซเชตเซ‡เชฐเซ€ +---------+---------+------------+------+ --------- ------------------------------------------------- ------------------------------------------------ ----------------- | 1| 26211| เชŸเซเชฏเซเชเชฐ| psql| tdb1| 2019-09-02 19:31:54 | 00:00:04 | เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ| | 2| 26211| เชŸเซเชฏเซเชเชฐ| psql| tdb1| 2019-09-02 19:31:58 | 00:00:06 | เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ| เชถเชฐเซ‚เช†เชค; | 3| 26211| เชŸเซเชฏเซเชเชฐ| psql| tdb1| 2019-09-02 19:32:16 | 00:01:45| เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ| เชฒเซ‹เช• เชŸเซ‡เชฌเชฒ เชตเซ‡เชซเชฐ_เชกเซ‡เชŸเชพ; | 4| 26211| เชŸเซเชฏเซเชเชฐ| psql| tdb1| 2019-09-02 19:35:54| 00:01:23 | เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ| เชชเซเชฐเชคเชฟเชฌเชฆเซเชง | 5| 26211| เชŸเซเชฏเซเชเชฐ| psql| tdb1| 2019-09-02 19:38:46 | 00:00:02 | เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ| เชถเชฐเซ‚เช†เชค; | 6| 26211| เชŸเซเชฏเซเชเชฐ| psql| tdb1| 2019-09-02 19:38:54 | 00:00:08 | เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ| เชฒเซ‹เช• เชŸเซ‡เชฌเชฒ เชตเซ‡เชซเชฐ_เชกเซ‡เชŸเชพ; | 7| 26211| เชŸเซเชฏเซเชเชฐ| psql| tdb1| 2019-09-02 19:39:08 | 00:42:42 | เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ| เชชเซเชฐเชคเชฟเชฌเชฆเซเชง | 8| 26211| เชŸเซเชฏเซเชเชฐ| psql| tdb1| 2019-09-03 07:12:07 | 00:00:52 | เชธเช•เซเชฐเชฟเชฏ| เชŸเซ‡เชธเซเชŸ_เชกเซ‡เชฒ ();

เชตเชฟเช•เชพเชธ.

เชฆเชฐเซเชถเชพเชตเซ‡เชฒ เชฎเซ‚เชณเชญเซ‚เชค เชชเซเชฐเชถเซเชจเซ‹ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ€ เช…เชนเซ‡เชตเชพเชฒเซ‹ เชชเชฐเชซเซ‹เชฐเซเชฎเชจเซเชธเชจเซ€ เช˜เชŸเชจเชพเช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชœเซ€เชตเชจเชจเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เช˜เชฃเซเช‚ เชธเชฐเชณ เชฌเชจเชพเชตเซ‡ เช›เซ‡.
เชฎเซ‚เชณเชญเซ‚เชค เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เช†เชงเชพเชฐเซ‡, เชคเชฎเซ‡ เชเช• เชฐเชฟเชชเซ‹เชฐเซเชŸ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡ เช…เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡ Oracleเชจเชพ AWR เชธเชพเชฅเซ‡ เชฎเชณเชคเซ‹ เช†เชตเซ‡ เช›เซ‡.
เชธเชพเชฐเชพเช‚เชถ เช…เชนเซ‡เชตเชพเชฒ เช‰เชฆเชพเชนเชฐเชฃ

+---------------------------------------------------------------- ----------------------------------- | เชชเซเชฐเชตเซƒเชคเซเชคเชฟ เช…เชจเซ‡ เชฐเชพเชน เชฎเชพเชŸเซ‡ เชเช•เซ€เช•เซƒเชค เช…เชนเซ‡เชตเชพเชฒ. 

เชšเชพเชฒเซ เชฐเชนเซ€ เชถเช•เชพเชฏ. เช†เช—เชณเชจเซ€ เชฒเชพเช‡เชจเชฎเชพเช‚ เชฒเซ‹เช• เช‡เชคเชฟเชนเชพเชธ (pg_stat_locks) เชจเซ€ เชฐเชšเชจเชพ เช›เซ‡, เชœเซ‡ เช•เซ‹เชทเซเชŸเช•เซ‹ เชญเชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซเช‚ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹