PostgreSQL рдХреЛ рд▓рд╛рдЧрд┐ ASH рдПрдирд╛рд▓рдЧ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕

рд╕рдорд╕реНрдпрд╛рдХреЛ рдЧрдарди

PostgreSQL рдкреНрд░рд╢реНрдирд╣рд░реВ рдЕрдиреБрдХреВрд▓рди рдЧрд░реНрди, рдЧрддрд┐рд╡рд┐рдзрд┐ рдЗрддрд┐рд╣рд╛рд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА, рдкрд░реНрдЦрд╛рдЗ, рд▓рдХ, рд░ рддрд╛рд▓рд┐рдХрд╛ рддрдереНрдпрд╛рдЩреНрдХрд╣рд░реВ, рдзреЗрд░реИ рдЖрд╡рд╢реНрдпрдХ рдЫред

рдЙрдкрд▓рдмреНрдз рдЕрд╡рд╕рд░рд╣рд░реВ

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдпрднрд╛рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рд╡рд╛ "AWR for Postgres": рдПрдХ рдзреЗрд░реИ рд░реЛрдЪрдХ рд╕рдорд╛рдзрд╛рди, рддрд░ 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 рдкреНрд░рдХрд╛рд░реНрдп рдЪрд▓рд╛рдЙрдиреЗ bash рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

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 daemon-reload
# systemctl pg_current_activity.service рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдпрд╕рд░реА, рд╣реЗрд░рд╛рдЗрд╣рд░реВрдХреЛ рдЗрддрд┐рд╣рд╛рд╕ рджреЛрд╕реНрд░реЛ-рд╕реЗрдХреЗрдиреНрдб рд╕реНрдиреНрдпрд╛рдкрд╕рдЯрд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░рд┐рдиреНрдЫред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдпрджрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдпрд╕рд░реА рдЫреЛрдбрд┐рдпреЛ рднрдиреЗ, рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рдЖрдХрд╛рд░рдорд╛ рдзреЗрд░реИ рдЪрд╛рдБрдбреИ рдмрдвреНрдиреЗрдЫ рд░ рдЕрдзрд┐рдХ рд╡рд╛ рдХрдо рдЙрддреНрдкрд╛рджрдХ рдХрд╛рдо рдЕрд╕рдореНрднрд╡ рд╣реБрдиреЗрдЫред

рдпреЛ рдбрд╛рдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдЧрдард┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

3. рдЕрднрд┐рд▓реЗрдЦ рдЗрддрд┐рд╣рд╛рд╕

рдЕрднрд┐рд▓реЗрдЦрдХрд╛ рд▓рд╛рдЧрд┐, рд╡рд┐рднрд╛рдЬрди рдЧрд░рд┐рдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдЕрднрд┐рд▓реЗрдЦ* рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

рдирдпрд╛рдБ рд╡рд┐рднрд╛рдЬрдирд╣рд░реВ рдкреНрд░рддреНрдпреЗрдХ рдШрдгреНрдЯрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреНрдЫ, рдЬрдмрдХрд┐ рдкреБрд░рд╛рдиреЛ рдбреЗрдЯрд╛ рдЗрддрд┐рд╣рд╛рд╕* рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдмрд╛рдЯ рд╣рдЯрд╛рдЗрдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдЗрддрд┐рд╣рд╛рд╕* рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдХреЛ рдЖрдХрд╛рд░ рдзреЗрд░реИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдБрджреИрди рд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЧрддрд┐ рд╕рдордпрдХреЛ рд╕рд╛рде рдШрдЯреНрджреИрдиред

рдирдпрд╛рдБ рдЦрдгреНрдбрд╣рд░реВрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛ plpgsql рдкреНрд░рдХрд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛ рдЧрд░рд┐рдиреНрдЫ activity_hist.archive_current_activityред рдХрд╛рдордХреЛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдзреЗрд░реИ рд╕рд░рд▓ рдЫ (рд╕рдВрдЧреНрд░рд╣_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;

рдЕрд╡рд╢реНрдп рдкрдирд┐, рд╕рдордп-рд╕рдордпрдорд╛, рдкреБрд░рд╛рдирд╛ рдЦрдгреНрдбрд╣рд░реВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдкрдорд╛ рдореЗрдЯрд╛рдЗрдиреНрдЫред

рдЖрдзрд╛рд░рднреВрдд рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ

рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпреЛ рд╕рдм рдХрд┐рди рднрдЗрд░рд╣реЗрдХреЛ рдЫ? 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 | рд╕реБрд░реБ рднрдпреЛ | рдЕрд╡рдзрд┐ | blocking_pids | рд╕рдореНрдмрдиреНрдз | рдореЛрдб | рд▓рдХ рдкреНрд░рдХрд╛рд░ +--------- +---------+------+---------- +--------- -----------+------------ +---------------------------------- +------ -------------- | рез| реиремреиреирек| 1-26224-2019 09:02:19 | 32:16:00 | {01}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | реи| реиремрейрепреж | 45-26211-16541 2:26390:2019 | 09:02:19 | {34}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | рей| реиремрейрепрез | 03-00-00 53:26211:16541 | 3:26391:2019 | {09}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | рек| реиремрелрейрез | 02-19-34 03:00:00 | 53:26211:16541 | {4}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | рел| реиренреиреорек | 26531-2019-09 02:19:35 | 27:00:00 | {реиренреиренрем}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | рем| реиренреиреорей | 12-26211-16541 5:27284:2019 | 09:02:19 | {реиренреиренрем}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | рен| реиренреиреорем | 44-02-00 00:19:27276 | 16541:6:27283 | {реиренреиренрем}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | рео| реиренрекреирей | 2019-09-02 19:44:02 | 00:00:19 | {реиренрейрепрек}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | реп| реиренремрекрео | 27276-16541-7 27286:2019:09 | 02:19:44 | {реиренремрекрен}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | резреж| реиренремрелреж | 02-00-00 19:27276:16541 | 8:27423:2019 | {реиренремрекрен}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | резрез| реиренренрейрел | 09-02-19 45:24:00 | 00:12:27394 | {16541}| резремрелрекрез | AccessExclusiveLock| рд╕рдореНрдмрдиреНрдз | резреи | 9 | 27648-2019-09 02:19:48 | 06:00:00 | {реиреорейренреп}| резремрелрекрез | AccessShareLock | рд╕рдореНрдмрдиреНрдз | резрей | реиреорейренреп | 20-27647-16541 10:27650:2019 | 09:02:19 | реиреорейренрен | резремрелрекрез | 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 | tuser | psql | tdb26211| 1-2019-09 02:19:31 | 54:00:00 | рдирд┐рд╖реНрдХреНрд░рд┐рдп | | реи| 04 | tuser | psql | tdb2| 26211-1-2019 09:02:19 | 31:58:00 | рд▓реЗрдирджреЗрдирдорд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд╕реБрд░реБ | рей| 00 | tuser | psql | tdb06| 3-26211-1 2019:09:02 | 19:32:16 | рд▓реЗрдирджреЗрдирдорд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд▓рдХ рдЯреЗрдмрд▓ wafer_data; | рек| 00 | tuser | psql | tdb01| 45-4-26211 1:2019:09 | 02:19:35 | рдирд┐рд╖реНрдХреНрд░рд┐рдп | рдкреНрд░рддрд┐рдмрджреНрдз; | рел| 54 | tuser | psql | tdb00| 01-23-5 26211:1:2019 | 09:02:19 | рд▓реЗрдирджреЗрдирдорд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд╕реБрд░реБ | рем| 38 | tuser | psql | tdb46| 00-00-02 6:26211:1 | 2019:09:02 | рд▓реЗрдирджреЗрдирдорд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп | рд▓рдХ рдЯреЗрдмрд▓ wafer_data; | рен| 19 | tuser | psql | tdb38| 54-00-00 08:7:26211 | 1:2019:09 | рдирд┐рд╖реНрдХреНрд░рд┐рдп | рдкреНрд░рддрд┐рдмрджреНрдз; | рео| 02 | tuser | psql | tdb19| реирежрезреп-режреп-режрей режрен:резреи:режрен | 39:08:00 | рд╕рдХреНрд░рд┐рдп | test_del();

рд╡рд┐рдХрд╛рд╕ред

рджреЗрдЦрд╛рдЗрдПрдХрд╛ рдЖрдзрд╛рд░рднреВрдд рдкреНрд░рд╢реНрдирд╣рд░реВ рд░ рдирддрд┐рдЬрд╛ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВрд▓реЗ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрджрд╛ рдЬреАрд╡рдирд▓рд╛рдИ рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрдБрджрдЫред
рдЖрдзрд╛рд░рднреВрдд рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рдЖрдзрд╛рд░рдорд╛, рддрдкрд╛рдИрдВрд▓реЗ Oracle рдХреЛ AWR рд╕рдБрдЧ рдЕрд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
рд╕рд╛рд░рд╛рдВрд╢ рд░рд┐рдкреЛрд░реНрдЯ рдЙрджрд╛рд╣рд░рдг

+------------------------------------------------ ----------------------------------- | рдЧрддрд┐рд╡рд┐рдзрд┐ рд░ рдкрд░реНрдЦрд╛рдЗрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдореЗрдХрд┐рдд рд░рд┐рдкреЛрд░реНрдЯред 

рдлреЗрд░рд┐ рдЬрд╛рд░реА рд░рд╛рдЦреМрдВрд▓рд╛ред рдЕрд░реНрдХреЛ рдкрдЩреНрдХреНрддрд┐рдорд╛ рд▓рдХ рдЗрддрд┐рд╣рд╛рд╕ (pg_stat_locks) рдХреЛ рд╕рд┐рд░реНрдЬрдирд╛ рд╣реЛ, рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рднрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдердк рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдгред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди