hoʻonui pgsentinel :
«Mālama ʻia nā ʻike i hōʻiliʻili ʻia ma RAM wale nō, a ʻo ka nui o ka hoʻomanaʻo i hoʻopau ʻia e hoʻoponopono ʻia e ka helu o nā moʻolelo i mālama ʻia.
Hoʻohui ʻia ke kahua queryid - ʻo ka queryid like mai ka pg_stat_statements extension (pono e kau mua ʻia).«
ʻOiaʻiʻo, e kōkua nui kēia, akā ʻo ka mea paʻakikī loa ka helu mua.Mālama ʻia nā ʻike i hōʻiliʻili ʻia ma RAM wale nō ”, ʻo ia hoʻi. aia ka hopena ma ke kumu i manaʻo ʻia. Eia kekahi, ʻaʻohe moʻolelo laka a me nā helu helu papa. ʻO kēlā mau. ʻaʻole i piha ka hopena: "ʻAʻohe pūʻolo i mākaukau no ka hoʻokomo ʻana. Manaʻo ʻia e hoʻoiho i nā kumu a hōʻuluʻulu iā ʻoe iho i ka waihona. Pono mua ʻoe e hoʻokomo i ka pūʻolo "devel" no kāu kikowaena a hoʻonohonoho i ke ala i pg_config ma ka ʻano PATH.".
Ma keʻano laulā, nui ka haunaele, a ma keʻano o nāʻikepili hana koʻikoʻi, hikiʻole ke hana i kekahi mea me ke kikowaena. Pono mākou e hana hou i kahi mea no mākou iho.
Pākuʻi
Ma muli o ka nui o ka leo a ma muli o ka manawa hoʻāʻo piha ʻole, ʻo ka ʻatikala ka mea nui o ka ʻike ʻike, ma ke ʻano he hoʻonohonoho o nā theses a me nā hopena waena.
E hoʻomākaukau ʻia nā mea kikoʻī hou aku ma hope, ma nā ʻāpana
E hoʻolālā i nā koi no ka hoʻonā
Pono e hoʻomohala i kahi mea hana e hiki ai iā ʻoe ke mālama:
pg_stat_activity nānā i ka mōʻaukala ʻO ka mōʻaukala laka o ke kau me ka ʻike pg_locks
Koi hoʻonā-e hoʻemi i ka hopena ma ka waihona i manaʻo ʻia.
Manaʻo laulā- ʻaʻole i hoʻokuʻu ʻia ka mea hōʻiliʻili ʻikepili i loko o ka waihona i hoʻopaʻa ʻia, akā i loko o ka waihona kiaʻi ma ke ʻano he lawelawe systemd. ʻAe, hiki ke nalowale kekahi mau ʻikepili, akā ʻaʻole koʻikoʻi kēia no ka hōʻike ʻana, akā ʻaʻohe hopena i ka ʻikepili i hoʻopaʻa ʻia e pili ana i ka hoʻomanaʻo a me ka hakahaka disk. A i ka hihia o ka hoʻohana ʻana i kahi wai hoʻohui, he liʻiliʻi ka hopena i nā kaʻina hana mea hoʻohana.
Nā pae hoʻokō
1. Nā papa lawelawe
Hoʻohana ʻia kahi schema kaʻawale no ka mālama ʻana i nā papa, i ʻole e paʻakikī i ka nānā ʻana o nā papa nui i hoʻohana ʻia.
DROP SCHEMA IF EXISTS activity_hist ;
CREATE SCHEMA activity_hist AUTHORIZATION monitor ;
Mea nui: ʻAʻole i hoʻokumu ʻia ka schema i loko o ka waihona kikoʻī, akā i ka waihona nānā.
pg_stat_activity nānā i ka mōʻaukala
Hoʻohana ʻia kahi pākaukau no ka mālama ʻana i nā kiʻi paʻi o kēia manawa o ka nānā 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
);
No ka wikiwiki i ka hoʻokomo ʻana - ʻaʻohe kuhikuhi a i ʻole kaohi.
No ka mālama ʻana i ka mōʻaukala ponoʻī, hoʻohana ʻia kahi papa ʻāpana:
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);
No ka mea i kēia hihia ʻaʻohe koi no ka wikiwiki hoʻokomo, ua hana ʻia kekahi mau index e wikiwiki i ka hana ʻana i nā hōʻike.
Ka mōʻaukala pale kau
Hoʻohana ʻia kahi papaʻaina no ka mālama ʻana i nā kiʻi paʻi o kēia manawa o nā loka wā:
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
);
Eia kekahi, no ka wikiwiki o ka hoʻokomo ʻana, ʻaʻohe ʻōlelo kuhikuhi a i ʻole kaohi.
No ka mālama ʻana i ka mōʻaukala ponoʻī, hoʻohana ʻia kahi papa ʻāpana:
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);
No ka mea i kēia hihia ʻaʻohe koi no ka wikiwiki hoʻokomo, ua hana ʻia kekahi mau index e wikiwiki i ka hana ʻana i nā hōʻike.
2. Hoʻopiha i ka mōʻaukala o kēia manawa
No ka hōʻiliʻili pololei i nā kiʻi paʻi kiʻi, hoʻohana ʻia kahi palapala bash e holo ana i ka hana plpgsql.
plpgsql Hoʻokomo ka hana dblink i nā manaʻo ma ka waihona i hoʻopaʻa ʻia a hoʻokomo i nā lālani i loko o nā papa lawelawe ma ka waihona nānā.
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;
No ka hōʻiliʻili ʻana i nā kiʻi paʻi kiʻi, hoʻohana ʻia ka lawelawe systemd a me ʻelua mau palapala:
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
Hāʻawi i nā kuleana i nā palapala:
# chmod 755 pg_current_activity.timer
# chmod 755 pg_current_activity.service
E hoʻomaka kākou i ka lawelawe:
# systemctl daemon-hoʻihoʻi hou
# systemctl hoʻomaka pg_current_activity.service
No laila, hōʻiliʻili ʻia ka mōʻaukala o nā manaʻo ma ke ʻano o nā paʻi kiʻi lua-ke-kekona. ʻOiaʻiʻo, inā waiho ʻia nā mea a pau, e piʻi koke nā papa i ka nui a ʻoi aku ka liʻiliʻi o ka hana e lilo i mea hiki ʻole.
Pono e hoʻonohonoho i ka waihona ʻikepili.
3. Ka waihona moʻolelo
No ka hoʻopaʻa ʻana, hoʻohana ʻia nā waihona ʻāpana i ʻoki ʻia.
Hana ʻia nā ʻāpana hou i kēlā me kēia hola, ʻoiai ua wehe ʻia nā ʻikepili kahiko mai nā papa mōʻaukala, no laila ʻaʻole loli nui ka nui o ka mōʻaukala * a ʻaʻole e hoʻohaʻahaʻa ka wikiwiki hoʻokomo i ka manawa.
Hana ʻia ka hana ʻana o nā ʻāpana hou e ka plpgsql function activity_hist.archive_current_activity. He mea maʻalahi ka algorithm o ka hana (e hoʻohana ana i ka laʻana o ka ʻāpana no ka papa kuhikuhi archive_pg_stat_activity).
Hana a hoʻopiha i kahi ʻāpana hou
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
);
Ke hana nei i nā kuhikuhi
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 )'
);
Ke wehe nei i ka ʻikepili kahiko mai ka papaʻaina history_pg_stat_activity
DELETE
FROM activity_hist.history_pg_stat_activity
WHERE timepoint < partition_max_range;
ʻOiaʻiʻo, i kēlā me kēia manawa, holoi ʻia nā ʻāpana kahiko i mea ʻole.
Nā hōʻike kumu
ʻOiaʻiʻo, no ke aha i hana ʻia ai kēia mau mea? No ka loaʻa ʻana o nā hōʻike e like me ka hoʻomanaʻo ʻana o Oracle's AWR.
He mea nui e hoʻohui i ka loaʻa ʻana o nā hōʻike, pono ʻoe e kūkulu i kahi pilina ma waena o nā manaʻo pg_stat_activity a me pg_stat_statements. Hoʻopili ʻia nā papa ma ka hoʻohui ʻana i kahi kolamu 'queryid' i nā papa 'history_pg_stat_activity', 'archive_pg_stat_activity'. ʻO ke ʻano o ka hoʻohui ʻana i ka waiwai kolamu ma waho o ke kiko o kēia ʻatikala a wehewehe ʻia ma aneʻi − pg_stat_statements + pg_stat_activity + loq_query = pg_ash? .
KA HOIKE O KA MANAWA CPU NO NINAU
Noi:
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
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
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
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
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
Pākuhi:
------------------------------------------------- ------------------------------------------------- ------------------------------------------------- ----------------------------------------------------------------------------------+------- ---+--------------------+-----------+-------------- ------------------------------+--------------------- - --------------------------------------- | #| pid| inoa hoʻohana| inoa_palapala| inoa inoa| hoomaka| lōʻihi| mokuʻāina| nīnau +----------+----------+----------+-----+ --------- --------------------------------------- --------------------------+---------------- ------- ----------------- | 1| 26211| tuser| psql| tdb1| 2019-09-02 19:31:54| 00:00:04| hana ole| | 2| 26211| tuser| psql| tdb1| 2019-09-02 19:31:58| 00:00:06| hana ole i ka hana| hoomaka; | 3| 26211| tuser| psql| tdb1| 2019-09-02 19:32:16| 00:01:45| hana ole i ka hana| laka papaʻa wafer_data; | 4| 26211| tuser| psql| tdb1| 2019-09-02 19:35:54| 00:01:23| hana ole| hoʻopaʻa; | 5| 26211| tuser| psql| tdb1| 2019-09-02 19:38:46| 00:00:02| hana ole i ka hana| hoomaka; | 6| 26211| tuser| psql| tdb1| 2019-09-02 19:38:54| 00:00:08| hana ole i ka hana| laka papaʻa wafer_data; | 7| 26211| tuser| psql| tdb1| 2019-09-02 19:39:08| 00:42:42| hana ole| hoʻopaʻa; | 8| 26211| tuser| psql| tdb1| 2019-09-03 07:12:07| 00:00:52| eleu| koho test_del();
Hoʻomohala.
ʻO nā nīnau maʻamau i hōʻike ʻia a me nā hōʻike hopena i ʻoi aku ka maʻalahi o ke ola ke nānā ʻana i nā hanana hana.
Ma muli o nā nīnau maʻamau, hiki iā ʻoe ke loaʻa kahi hōʻike e like me ka AWR o Oracle. Laʻana hōʻike hōʻuluʻulu
+------------------------------------------------ ----------------------------------- | HOIKE HOOKOHUIA NO KA HANA A ME KA KALALI.
E hoʻomau ʻia. ʻO ka mea aʻe ma ka laina ka hana ʻana i kahi mōʻaukala laka (pg_stat_locks), kahi wehewehe kikoʻī o ke kaʻina hana o ka hoʻopiha ʻana i nā papa.