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 start pg_current_activity.service

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рджреГрд╢реНрдпрд╛рдВрдЪрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╕реЗрдХрдВрдж-рдмрд╛рдп-рд╕реЗрдХрдВрдж рд╕реНрдиреЕрдкрд╢реЙрдЯреНрд╕рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдЧреЛрд│рд╛ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рдЕрд░реНрдерд╛рдд, рд╕рд░реНрд╡рдХрд╛рд╣реА рдЬрд╕реЗ рдЖрд╣реЗ рддрд╕реЗ рд╕реЛрдбрд▓реНрдпрд╛рд╕, рдЯреЗрдмрд▓реНрд╕ рдЦреВрдк рд▓рд╡рдХрд░ рдЖрдХрд╛рд░рд╛рдд рд╡рд╛рдврддреАрд▓ рдЖрдгрд┐ рдЕрдзрд┐рдХ рдХрд┐рдВрд╡рд╛ рдХрдореА рдЙрддреНрдкрд╛рджрдХ рдХрд╛рд░реНрдп рдЕрд╢рдХреНрдп рд╣реЛрдИрд▓.

рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рдг рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

3. рдЗрддрд┐рд╣рд╛рд╕ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ

рд╕рдВрдЧреНрд░рд╣рдгрд╛рд╕рд╛рдареА, рд╡рд┐рднрд╛рдЬрд┐рдд рд╕рд╛рд░рдгреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣рдг* рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддрд╛рдд.

рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд╕рд╛рд▓рд╛ рдирд╡реАрди рд╡рд┐рднрд╛рдЬрдиреЗ рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рддрд╛рдд, рддрд░ рдЬреБрдирд╛ рдбреЗрдЯрд╛ рдЗрддрд┐рд╣рд╛рд╕* рд╕рд╛рд░рдгреНрдпрд╛рдВрдордзреВрди рдХрд╛рдвреВрди рдЯрд╛рдХрд▓рд╛ рдЬрд╛рддреЛ, рддреНрдпрд╛рдореБрд│реЗ рдЗрддрд┐рд╣рд╛рд╕* рд╕рд╛рд░рдгреНрдпрд╛рдВрдЪрд╛ рдЖрдХрд╛рд░ рдлрд╛рд░рд╕рд╛ рдмрджрд▓рдд рдирд╛рд╣реА рдЖрдгрд┐ рд╡реЗрд│реЛрд╡реЗрд│реА рдЕрдВрддрд░реНрднреВрдд рдХрд░рдгреНрдпрд╛рдЪреА рдЧрддреА рдХрдореА рд╣реЛрдд рдирд╛рд╣реА.

рдирд╡реАрди рд╡рд┐рднрд╛рдЧрд╛рдВрдЪреА рдирд┐рд░реНрдорд┐рддреА plpgsql рдлрдВрдХреНрд╢рди activity_hist.archive_current_activity рджреНрд╡рд╛рд░реЗ рдХреЗрд▓реА рдЬрд╛рддреЗ. рдХрд╛рдорд╛рдЪреЗ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ (archive_pg_stat_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;

рдЕрд░реНрдерд╛рдд, рд╡реЗрд│реЛрд╡реЗрд│реА рдЬреБрдиреЗ рд╡рд┐рднрд╛рдЧ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдореНрд╣рдгреВрди рд╣рдЯрд╡рд▓реЗ рдЬрд╛рддрд╛рдд.

рдореВрд▓рднреВрдд рдЕрд╣рд╡рд╛рд▓

рдЦрд░реЗ рддрд░ рд╣реЗ рд╕рд░реНрд╡ рдХрд╛ рдХреЗрд▓реЗ рдЬрд╛рдд рдЖрд╣реЗ? рдУрд░реЕрдХрд▓рдЪреНрдпрд╛ 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}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | 26211| реиремрейрепреж| 16541-2-26390 2019:09:02| 19:34:03| {00}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | рей| реиремрейрепрез| 00-53-26211 16541:3:26391| 2019:09:02| {19}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | 34| реиремрелрейрез| 03-00-00 53:26211:16541| 4:26531:2019| {09}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | рел| реиренреиреорек| 02-19-35 27:00:00| 12:26211:16541 | {реиренреиренрем}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | рем| реиренреиреорей| 5-27284-2019 09:02:19| 44:02:00 | {реиренреиренрем}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | рен| реиренреиреорем| 00-19-27276 16541:6:27283| 2019:09:02 | {реиренреиренрем}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | рео| реиренрекреирей| 19-44-02 00:00:19| 27276:16541:7| {реиренрейрепрек}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | реп| реиренремрекрео| 27286-2019-09 02:19:44| 02:00:00| {реиренремрекрен}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | 19| реиренремрелреж| 27276-16541-8 27423:2019:09| 02:19:45| {реиренремрекрен}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | 24| реиренренрейрел| 00-00-12 27394:16541:9| 27648:2019:09| {02}| резремрелрекрез| AccessExclusiveLock| рд╕рдВрдмрдВрдз | резреи| реиреорейреореж| 19-48-06 00:00:20| 27647:16541:10| {реиреорейренреп}| резремрелрекрез| AccessShareLock| рд╕рдВрдмрдВрдз | 27650| реиреорейренреп| 2019-09-02 19:48:06| 00:00:20| реиреорейренрен| резремрелрекрез| AccessExclusiveLock| рд╕рдВрдмрдВрдз | | | | | реиреорейренрем| | 

рдмреНрд▓реЙрдХрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрддрд┐рд╣рд╛рд╕

рд╡рд┐рдирдВрддреНрдпрд╛:

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| tuser| psql| tdb1| 2019-09-02 19:31:54| 00:00:04| рдирд┐рд╖реНрдХреНрд░рд┐рдп | | 2| 26211| tuser| psql| tdb1| 2019-09-02 19:31:58| 00:00:06| рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд╕реБрд░реВ; | рей| 3| tuser| psql| tdb26211| 1-2019-09 02:19:32| 16:00:01| рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд▓реЙрдХ рдЯреЗрдмрд▓ wafer_data; | 45| 4| tuser| psql| tdb26211| 1-2019-09 02:19:35| 54:00:01| рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд╡рдЪрдирдмрджреНрдз | рел| 23| tuser| psql| tdb5| 26211-1-2019 09:02:19| 38:46:00| рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд╕реБрд░реВ; | рем| 00| tuser| psql| tdb02| 6-26211-1 2019:09:02| 19:38:54| рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд▓реЙрдХ рдЯреЗрдмрд▓ wafer_data; | рен| 00| tuser| psql| tdb00| 08-7-26211 1:2019:09| 02:19:39| рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд╡рдЪрдирдмрджреНрдз | рео| 08| tuser| psql| tdb00| 42-42-8 26211:1:2019| 09:03:07| рд╕рдХреНрд░рд┐рдп| test_del() рдирд┐рд╡рдбрд╛;

рд╡рд┐рдХрд╛рд╕.

рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдШрдЯрдирд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛рдирд╛ рджрд░реНрд╢рд╡рд┐рд▓реЗрд▓реНрдпрд╛ рдореВрд▓рднреВрдд рдХреНрд╡реЗрд░реА рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдореА рдЕрд╣рд╡рд╛рд▓ рдЖрдзреАрдЪ рдЬреАрд╡рди рдЦреВрдк рд╕реЛрдкреЗ рдХрд░рддрд╛рдд.
рдореВрд▓рднреВрдд рдкреНрд░рд╢реНрдирд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд, рддреБрдореНрд╣рд╛рд▓рд╛ рдУрд░реЕрдХрд▓рдЪреНрдпрд╛ AWR рд╕рд╛рд░рдЦрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдЕрд╣рд╡рд╛рд▓ рдорд┐рд│реВ рд╢рдХрддреЛ.
рд╕рд╛рд░рд╛рдВрд╢ рдЕрд╣рд╡рд╛рд▓ рдЙрджрд╛рд╣рд░рдг

+---------------------------------------------------------------- ----------------------------------- | рдХреНрд░рд┐рдпрд╛рдХрд▓рд╛рдк рдЖрдгрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛рд╕рд╛рдареА рдПрдХрддреНрд░рд┐рдд рдЕрд╣рд╡рд╛рд▓. 

рдкреБрдвреЗ рдЪрд╛рд▓реВ. рдкреБрдвреАрд▓ рдУрд│реАрдд рд▓реЙрдХ рдЗрддрд┐рд╣рд╛рд╕ (pg_stat_locks) рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╣реЗ, рдЯреЗрдмрд▓ рднрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛