Кӯшиши эҷоди аналоги ASH барои PostgreSQL

Тартиб додани масъала

Барои оптимизатсияи дархостҳои PostgreSQL, қобилияти таҳлили таърихи фаъолият, махсусан, интизориҳо, қуфлҳо ва омори ҷадвал хеле зарур аст.

Имкониятҳои мавҷуда

Воситаи таърихии таҳлили сарбории корӣ ё "AWR барои Postgres": ҳалли хеле ҷолиб, аммо таърихи pg_stat_activity ва pg_locks вуҷуд надорад.

васеъшавии pgsentinel :
«Ҳама маълумоти ҷамъшуда танҳо дар хотираи оперативӣ нигоҳ дошта мешаванд ва миқдори истеъмоли хотира аз рӯи шумораи сабтҳои охирини захирашуда танзим карда мешавад.

Майдони queryid илова карда мешавад - ҳамон дархост аз тамдиди pg_stat_statements (насби пешакӣ лозим аст).«

Ин, албатта, ёрии калон ме-расонд, вале аз хама ташвишовар ин нуктаи аввал аст».Ҳама маълумоти ҷамъшуда танҳо дар RAM нигоҳ дошта мешаванд ”, яъне. ба базаи максад таъсир мерасонад. Илова бар ин, таърихи қулф ва омори ҷадвал вуҷуд надорад. Онхое. ҳалли умуман нопурра аст: "Барои монтаж хануз бастаи тайёр нест. Тавсия дода мешавад, ки манбаъҳоро зеркашӣ кунед ва китобхонаро худатон ҷамъ кунед. Шумо аввал бояд бастаи "devel" -ро барои сервери худ насб кунед ва роҳро ба pg_config дар тағирёбандаи PATH таъин кунед.".

Умуман, гавгои зиёд ба амал меояд ва дар мавриди базахои чиддии истехсолй бо сервер ягон кор кардан мумкин нест. Ба мо лозим меояд, ки боз як чизи худамонро ба миён орем.

Огоҳӣ.

Аз сабаби ҳаҷми хеле калон ва аз сабаби нопурра будани давраи санҷиш, мақола асосан хусусияти иттилоотӣ дорад, на ҳамчун маҷмӯи рисолаҳо ва натиҷаҳои мобайнӣ.
Материали муфассалтар баъдтар, кисм-хо тайёр карда мешавад

Лоиҳаи талабот ба ҳалли

Воситаеро таҳия кардан лозим аст, ки ба шумо имкон медиҳад захира кунед:

таърихи дидани 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.Пур кардани таърихи ҷорӣ

Барои мустақиман ҷамъ овардани аксҳои намоишӣ, скрипти bash истифода мешавад, ки функсияи 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 оғоз 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 Oracle хотиррасон мекунанд.

Илова кардан муҳим аст, ки барои қабули гузоришҳо, шумо бояд байни pg_stat_activity ва pg_stat_statements намуди алоқа бунёд кунед. Ҷадвалҳо тавассути илова кардани сутуни 'queryid' ба ҷадвалҳои 'history_pg_stat_activity', 'archive_pg_stat_activity' пайваст карда мешаванд. Усули илова кардани арзиши сутун аз доираи ин мақола берун аст ва дар ин ҷо тавсиф шудааст - 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

Мисол:

---------------------------------- ---------------------------------- --------------------------------- | ТАЪРИХИ РАВАНДХОИ БАСТА +-----+----------+-----+-------- --+------------ --------+-------------------+----- --------------- +------------------- | #| пид| оғоз | давомнок | blocking_pids| муносибат | режим| locktype +----------+----------+-----+---------- +--------- -----------+-----------+------- -------------+----- -------------- | 1| 26224| 2019-09-02 19:32:16| 00:01:45| {26211}| 16541| AccessShareLock| муносибат | 2| 26390| 2019-09-02 19:34:03| 00:00:53| {26211}| 16541| AccessShareLock| муносибат | 3| 26391| 2019-09-02 19:34:03| 00:00:53| {26211}| 16541| AccessShareLock| муносибат | 4| 26531| 2019-09-02 19:35:27| 00:00:12| {26211}| 16541| AccessShareLock| муносибат | 5| 27284| 2019-09-02 19:44:02| 00:00:19| {27276}| 16541| AccessShareLock| муносибат | 6| 27283| 2019-09-02 19:44:02| 00:00:19| {27276}| 16541| AccessShareLock| муносибат | 7| 27286| 2019-09-02 19:44:02| 00:00:19| {27276}| 16541| AccessShareLock| муносибат | 8| 27423| 2019-09-02 19:45:24| 00:00:12| {27394}| 16541| AccessShareLock| муносибат | 9| 27648| 2019-09-02 19:48:06| 00:00:20| {27647}| 16541| AccessShareLock| муносибат | 10| 27650| 2019-09-02 19:48:06| 00:00:20| {27647}| 16541| AccessShareLock| муносибат | 11| 27735| 2019-09-02 19:49:08| 00:00:06| {27650}| 16541| AccessExclusiveLock| муносибат | 12| 28380| 2019-09-02 19:56:03| 00:01:56| {28379}| 16541| AccessShareLock| муносибат | 13| 28379| 2019-09-02 19:56:03| 00:00:01| 28377| 16541| AccessExclusiveLock| муносибат | | | | | 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

Мисол:

---------------------------------- ---------------------------------- ---------------------------------- ----------------------- ТАЪРИХИ РАВАНДИ БАЛККУНИИ +----+----------+------- ---+-------------------+----------+-------------- ------+-------+--------------------- - -------+--------------------------------------- | #| пид| usename| ариза_ном| датнаме| оғоз | давомнок | давлат| пурсиш +----------+----------+----------+-----+ --------- -+-------------------+------------------ --+------ ----------------------------------+---------------- ------- ----------------- | 1| 26211| tuser| psql| тдб1| 2019-09-02 19:31:54| 00:00:04| бекор | | 2| 26211| tuser| psql| тдб1| 2019-09-02 19:31:58| 00:00:06| бекор дар муомилот| Оғоз; | 3| 26211| tuser| psql| тдб1| 2019-09-02 19:32:16| 00:01:45| бекор дар муомилот| ҷадвали қулфи wafer_data; | 4| 26211| tuser| psql| тдб1| 2019-09-02 19:35:54| 00:01:23| бекор | ӯҳдадор шудан; | 5| 26211| tuser| psql| тдб1| 2019-09-02 19:38:46| 00:00:02| бекор дар муомилот| Оғоз; | 6| 26211| tuser| psql| тдб1| 2019-09-02 19:38:54| 00:00:08| бекор дар муомилот| ҷадвали қулфи wafer_data; | 7| 26211| tuser| psql| тдб1| 2019-09-02 19:39:08| 00:42:42| бекор | ӯҳдадор шудан; | 8| 26211| tuser| psql| тдб1| 2019-09-03 07:12:07| 00:00:52| фаъол| test_del-ро интихоб кунед ();

Инкишоф.

Дархостҳои асосии нишон додашуда ва ҳисоботҳои натиҷавӣ аллакай ҳангоми таҳлили ҳодисаҳои иҷроиш ҳаётро хеле осон мекунанд.
Дар асоси дархостҳои асосӣ, шумо метавонед гузорише гиред, ки ба AWR-и Oracle ба таври норавшан шабоҳат дорад.
Намунаи ҳисоботи ҷамъбастӣ

+------------------------------------------------ ---------------------------------- | ХИСОБОТИ МУТТАХИДА БАРОИ ФАЪОЛИЯТ ВА ИНТИЗОРИ. 

Давом дорад. Дар навбати навбатӣ эҷоди таърихи қулф (pg_stat_locks), тавсифи муфассали раванди пур кардани ҷадвалҳо мебошад.

Манбаъ: will.com

Илова Эзоҳ