рд▓реЗрдЦ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреВрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ
PostgreSQL рдХреЗ рд▓рд┐рдП ASH рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ред
рдХрд╛рд░реНрдп
рдЖрдкрдХреЛ рдЗрддрд┐рд╣рд╛рд╕ рдЗрддрд┐рд╣рд╛рд╕ pg_stat_statemenets, pg_stat_activity рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, log_query рд╕реЗрд╡рд╛ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪреЗрддрд╛рд╡рдиреАред
рд╡рд┐рд╖рдп рдХреА рдирд╡реАрдирддрд╛ рдФрд░ рдЕрдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдЕрд╡рдзрд┐ рдХреЗ рдХрд╛рд░рдг, рд▓реЗрдЦ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдФрд░ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИред
рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛
History_pg_stat_activity рддрд╛рд▓рд┐рдХрд╛ Pg_stat_db_queries рддрд╛рд▓рд┐рдХрд╛ CREATE TABLE pg_stat_db_queries ( database_id integer , queryid bigint , query text , max_time double precision );(
Mvw_pg_stat_queries рдХрд╛ рднреМрддрд┐рдХ рджреГрд╢реНрдп CREATE MATERIALIZED VIEW public.mvw_pg_stat_queries AS SELECT t.queryid, t.max_time, t.query FROM public.dblink('LINK1'::text, 'SELECT queryid , max_time , query FROM pg_stat_statements WHERE dbid=(SELECT oid FROM pg_database WHERE datname=current_database() ) AND max_time >= 0 '::text) t(queryid bigint, max_time double precision, query text) WITH NO DATA;
Log_query рддрд╛рд▓рд┐рдХрд╛ CREATE TABLE log_query ( id integer , queryid bigint , query_md5hash text , database_id integer , timepoint timestamp without time zone , query text , explained_plan text[] , plan_md5hash text , explained_plan_wo_costs text[] , plan_hash_value text , ip text, port text , pid integer );
рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
Pg_stat_db_queries рддрд╛рд▓рд┐рдХрд╛ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ
рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ рд╕рд╛рдордЧреНрд░реА рджреЗрдЦреЗрдВ mvw_pg_stat_queries CREATE OR REPLACE FUNCTION refresh_pg_stat_queries_list( database_id int) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; BEGIN SELECT * INTO database_rec FROM endpoint e JOIN database d ON e.id = d.endpoint_id WHERE d.id = database_id ; IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_id; return TRUE ; END IF ; EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||database_rec.host||' port=5432 dbname='||database_rec.name|| ' user='||database_rec.s_name||' password='||database_rec.s_pass|| ' '')'; REFRESH MATERIALIZED VIEW mvw_pg_stat_queries ; PERFORM dblink_disconnect('LINK1'); RETURN result; END $$ LANGUAGE plpgsql;
Pg_stat_db_queries рддрд╛рд▓рд┐рдХрд╛ рдЖрдмрд╛рдж рдХрд░реЗрдВ CREATE OR REPLACE FUNCTION refresh_pg_stat_db_queries( ) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; pg_stat_rec record ; BEGIN TRUNCATE pg_stat_db_queries; FOR database_rec IN SELECT * FROM database d LOOP IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_rec.id; CONTINUE ; END IF ; PERFORM refresh_pg_stat_queries_list( database_rec.id ) ; FOR pg_stat_rec IN SELECT * FROM mvw_pg_stat_queries LOOP INSERT INTO pg_stat_db_queries ( database_id , queryid , query , max_time ) VALUES ( database_rec.id , pg_stat_rec.queryid , pg_stat_rec.query , pg_stat_rec.max_time); END LOOP; END LOOP; RETURN TRUE; END $$ LANGUAGE plpgsql;
рдирддреАрдЬрддрди, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреНрд╡реЗрд░реА рдкрд╛рда, рдХреНрд╡реЗрд░реАрдб, рд╡рд░реНрддрдорд╛рди рд╕рдордп рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп (рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╣реЛрддрд╛ рд╣реИред
Log_query рднрд░рдирд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдмрдирд╛рдирд╛ред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрд░реЛрдз рдкрд╛рда рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рднрд╛рдЧреЛрдВ, рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдХреНрд░реЛрди рдореЗрдВ рдореЙрдирд┐рдЯрд░ рд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рд╣реЛрд╕реНрдЯ рд╕реЗ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ред рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╣реЛрд╕реНрдЯ рд╕реЗ рд╣реЛрд╕реНрдЯ рддрдХ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреА рддреБрдЪреНрдЫрддрд╛ рдХреЗ рдХрд╛рд░рдг, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред
рдПрдХ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдкрд╛рда рдирд┐рдХрд╛рд▓рдирд╛ Log_query рддрд╛рд▓рд┐рдХрд╛ рднрд░рдиреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрд░реЛрдз рдкрд╛рда, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛рдПрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХрд╛ рд╣реИрд╢ рдорд╛рди, рдЕрдиреБрд░реЛрдз рдкрд╛рда рдХрд╛ рд╣реИрд╢ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред
History_pg_stat_activity рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреНрд╡реЗрд░реА рдорд╛рди рднрд░реЗрдВ
update_history_pg_stat_activity_by_queryid.sql рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХреЗ рдХреНрд╡реЗрд░реА рдорд╛рди рдХреЗ рдЕрдиреБрд░реВрдк рдХреНрд╡реЗрд░реА рдорд╛рди рд╣реЛрддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо
Pg_stat_activity, pg_stat_statements, log_query рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдХреЗ, рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ред
- рд╕реАрдкреАрдпреВ-рдЯрд╛рдЗрдо рдЕрдиреБрд░реЛрдз рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ред
- рдкреНрд░рддреАрдХреНрд╖рд╛ рдЗрддрд┐рд╣рд╛рд╕ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред
рдбреЗрдЯрд╛ рдФрд░ рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд┐рдХрд╛рд╕
рдЙрдкрд▓рдмреНрдз рд╕реВрдЪрдирд╛ рдХреЛ pg_locks рджреГрд╢реНрдп рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рд╕реЗ рдЬреЛрдбрд╝рдХрд░, рдЖрдк рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдереЗ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдЕрдиреБрд░реЛрдз) рдЗрд╕ рддрд╛рд▓реЗ рдХреЛ рдкрдХрдбрд╝реЗ рд╣реБрдП рдереАред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╢реЛрдзрди рдХрд╛ рдХрд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИред