Ðй, запÑоÑ! Ð¢Ñ Ð¶Ð¸Ð²Ð¾Ð¹? Ðак легко обÑабоÑаÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки в PostgreSQL
/ инженеÑ-пÑогÑаммиÑÑ
18 ÑнваÑÑ, 2017
ÐобÑое вÑÐµÐ¼Ñ ÑÑÑок! ÐдминиÑÑÑиÑование и ÑопÑовождение ÑелÑÑионнÑÑ Ð±Ð°Ð· даннÑÑ ÑаÑе вÑего ÑвлÑеÑÑÑ Ð½ÐµÑÑивиалÑной задаÑей. Ðногда запÑоÑÑ, ÑабоÑавÑие бÑÑÑÑо, внезапно наÑинаÑÑ Â«ÑоÑмозиÑÑ» по непонÑÑнÑм пÑиÑинам, ÑÐ°Ð·Ð¼ÐµÑ ÑÐ°Ð±Ð»Ð¸Ñ ÑаÑÑÐµÑ Ð¸ в Ñелом пÑоизводиÑелÑноÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ÑнижаеÑÑÑ.
ЧаÑÑо пÑиÑиной Ñакого Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑвлÑÑÑÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑие в базе блокиÑовки ÑазлиÑнÑÑ ÑеÑÑÑÑов, и ÑооÑвеÑÑÑвенно â вÑÑаÑÑаÑÑее вÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ ÑÑÐ¸Ñ ÑеÑÑÑÑов. ÐапÑимеÑ, ÑложноÑÑи наÑинаÑÑÑÑ Ð² ÑиÑÑаÑиÑÑ , когда два или более запÑоÑа в ÑазнÑÑ ÑеанÑÐ°Ñ Ð¿ÑÑаÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно измениÑÑ Ð¾Ð´Ð½Ð¸ и Ñе же даннÑе в ÑаблиÑÐ°Ñ Ð¸Ð»Ð¸ ÑÐ°Ð¼Ñ ÑÑÑÑкÑÑÑÑ ÑаблиÑÑ.
ЧÑÐ¾Ð±Ñ ÑазобÑаÑÑÑÑ Ð² ÑложивÑейÑÑ ÑиÑÑаÑии, админиÑÑÑаÑоÑÑ ÐÐ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ понÑÑÑ, какой пÑоÑеÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÑÐµÑ Ð¸ какой пÑоÑеÑÑ ÑвлÑеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÑемÑм, а Ñакже имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾ÑмениÑÑ Ð¸Ð»Ð¸ «ÑбиÑÑ» блокиÑÑÑÑий пÑоÑеÑÑ Ð¸ в конÑе пÑовеÑиÑÑ ÑезÑлÑÑаÑ.
Ð ÑÑой ÑÑаÑÑе Ñ Ñ Ð¾ÑÑ ÐºÐ¾ÑнÑÑÑÑÑ ÑÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок в PostgreSQL и ÑаÑÑказаÑÑ Ð¾Ð± инÑÑÑÑменÑÐ°Ñ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð½Ð¸Ð¼Ð¸. Ðо ÑнаÑала попÑобÑем ÑазобÑаÑÑÑÑ Ð² Ñамой Ñеме.
ЧÑо же Ñакое блокиÑовки в ÐÐ? ÐÐ¸ÐºÐ¸Ð¿ÐµÐ´Ð¸Ñ Ð¿ÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÑледÑÑÑее опÑеделение: âÐлокиÑовка (англ. lock) в СУÐÐ â оÑмеÑка о Ð·Ð°Ñ Ð²Ð°Ñе обÑекÑа ÑÑанзакÑией в огÑаниÑеннÑй или иÑклÑÑиÑелÑнÑй доÑÑÑп Ñ ÑелÑÑ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð»Ð¸Ð·Ð¸Ð¹ и поддеÑÐ¶Ð°Ð½Ð¸Ñ ÑелоÑÑноÑÑи даннÑÑ .â
PostgeSQL поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑелоÑÑноÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , ÑеализÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ MVCC. MVCC (MultiVersion Concurrency Control) â один из Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð² обеÑпеÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑаллелÑного доÑÑÑпа к ÐÐ, заклÑÑаÑÑийÑÑ Ð² пÑедоÑÑавлении ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ñак назÑваемого «Ñнимка» ÐÐ. ÐÑобое «ÑвойÑÑво» Ñакого Ñнимка в Ñом, ÑÑо вноÑимÑе полÑзоваÑелем Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÐÐ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñ Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелей до моменÑа ÑикÑаÑии ÑÑанзакÑии.
PostgreSQL гаÑанÑиÑÑÐµÑ ÑелоÑÑноÑÑÑ Ð´Ð°Ð¶Ðµ Ð´Ð»Ñ Ñамого ÑÑÑогого ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑий, иÑполÑзÑÑ Ð¸Ð½Ð½Ð¾Ð²Ð°ÑионнÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии SSI (Serializable Snapshot Isolation, СеÑиализÑÐµÐ¼Ð°Ñ Ð¸Ð·Ð¾Ð»ÑÑÐ¸Ñ Ñнимков).
ÐÐ»Ñ Ð±Ð¾Ð»ÑÑего Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ ÑÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ поÑиÑаÑÑ ÑÑаÑÑÑ Ð½Ð° ХабÑе на ХабÑе и ÑÑаÑÑÑ Ð² блоге ÐлекÑандÑа ÐÑÑавлÑва о блокиÑÐ¾Ð²ÐºÐ°Ñ , Ð¸Ñ ÑабоÑе и конкÑÑенÑном доÑÑÑпе вообÑе.
Ð ÑожалениÑ, возникаÑÑ ÑиÑÑаÑии, когда ÑеализованнÑе Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи даннÑÑ Ð²ÑÑ Ñавно не могÑÑ ÑпÑавиÑÑÑÑ Ñ Ð¿Ð¾ÑÑÑпаÑÑими запÑоÑами без Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок. ÐÑÐ²Ð°ÐµÑ ÑÑо Ñедко, но еÑли Ñж Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ ÑиÑÑаÑиÑ, ÑÑо какой-нибÑÐ´Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñовал ÑелÑÑ ÑаблиÑÑ Ð½Ð° пÑодолжиÑелÑное вÑемÑ, Ñо ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к непÑиÑÑноÑÑÑм.
ÐапÑимеÑ, еÑли запÑÑÑиÑÑ Ð´Ð¾Ð»Ð³Ð¾ обÑабаÑÑваемÑй запÑÐ¾Ñ Ðº ÑаблиÑе c 1000 запиÑей, к коÑоÑой в ÑекÑÐ½Ð´Ñ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸Ñ 100 UPDATE запÑоÑов, Ñо за 5-6 ÑаÑов ÑÐ°Ð·Ð¼ÐµÑ ÑаблиÑÑ ÑвелиÑиÑÑÑ Ð´Ð¾ 1.8 миллионов запиÑей, ÑооÑвеÑÑÑвенно, ÑизиÑеÑкий ÑÐ°Ð·Ð¼ÐµÑ ÑаблиÑÑ Ñоже ÑвелиÑиваеÑÑÑ (Ñак как ÐÐ Ñ ÑÐ°Ð½Ð¸Ñ Ð²Ñе веÑÑии ÑÑÑок, пока Ð´Ð»Ð¸Ð½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð½Ðµ завеÑÑÐ¸Ñ ÑÐ²Ð¾Ñ ÑабоÑÑ.
РаÑÑмоÑÑим ÑакÑÑ ÑиÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´Ñобнее.
ÐÑÑÑÑ Ð² некоÑоÑой ÐÐ Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑаблиÑа pgsqlblocks_testing и Ñ Ð½ÐµÑ ÐµÑÑÑ Ð¿Ñавило rule_pgsqlblocks_testing. ÐмÑлиÑÑем к Ð½ÐµÐ¼Ñ âдолгийâ запÑÐ¾Ñ Ð½Ð° 10 минÑÑ, к пÑимеÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ SQL ÑедакÑоÑа pgAdmin:
SELECT * FROM public.pgsqlblocks_testing LIMIT 1000; SELECT pg_sleep(600);
Pid пÑоÑеÑÑа 16728
DROP RULE rule_pgsqlblocks_testing ON public.pgsqlblocks_testing;
Pid пÑоÑеÑÑа 16726
Ð Ð²Ð¾Ñ DROP RULE блокиÑÑеÑÑÑ SELECT запÑоÑом. MVCC в данном ÑлÑÑае не Ñмог обойÑиÑÑ Ð±ÐµÐ· Ñвной блокиÑовки ÑаблиÑÑ pgsqlblocks_testing
Ðак же нам пÑоÑмоÑÑеÑÑ Ð¸Ð¼ÐµÑÑиеÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки? Ðожно ÑÐ°Ð¼Ð¾Ð¼Ñ Ð¿Ð¸ÑаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð´Ð»Ñ ÑаблиÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок pg_locks и пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ pg_stat_activity или иÑполÑзоваÑÑ Ð²ÑÑÑоеннÑй в pgAdmin инÑÑÑÑменÑ.
pgAdmin пÑедÑÑавлÑÐµÑ Ñобой доÑÑаÑоÑно Ñдобное и пÑоÑÑое ÐÐ Ð´Ð»Ñ ÑабоÑÑ Ñ ÐÐ PostgreSQL. Ðа даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð°ÐºÑÑалÑнÑми веÑÑиÑми ÑвлÑÑÑÑÑ pgAdmin III и вÑÑедÑий ÑолÑко в конÑе ÑенÑÑбÑÑ pgAdmin IV.
ÐÑобÑажение инÑоÑмаÑии о блокиÑÐ¾Ð²ÐºÐ°Ñ Ð¸ акÑивнÑÑ Ð¿ÑоÑеÑÑÐ°Ñ Ð² pgAdmin III ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ adminpack в базе даннÑÑ . ÐоÑле ÑÑÑановки ÑÑого ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ñжное нам окно оÑкÑÑваеÑÑÑ ÑеÑез Ð¼ÐµÐ½Ñ ÐнÑÑÑÑменÑÑ â СоÑÑоÑние ÑеÑвеÑа
Ð ÑÑом окне Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼ ÑаблиÑÑ Ñ Ð¿ÑоÑеÑÑами и ÑаблиÑÑ Ñ Ð¸Ð¼ÐµÑÑимиÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовками в ÐÐ. ЧÑÐ¾Ð±Ñ Ð½Ðµ ÑаÑÑеÑÑÑÑÑÑ ÑÑеди болÑÑого колиÑеÑÑва пÑоÑеÑÑов, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ наÑÑÑоиÑÑ ÑвеÑа пÑоÑеÑÑов в завиÑимоÑÑи Ð¾Ñ Ð¸Ñ ÑÑаÑÑÑа: акÑивнÑй, заблокиÑованнÑй, бездейÑÑвÑÑÑий или «медленнÑй».
Ð ÑаблиÑе каждÑй блокиÑÑÑÑий и блокиÑÑемÑй пÑоÑеÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð¾ÑделÑнÑми ÑÑÑоками, и Ð½ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи бÑÑÑÑо опÑеделиÑÑ, кÑо кого блокиÑÑеÑ. ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ ÑÑой задаÑи нам пÑидеÑÑÑ ÑопоÑÑавлÑÑÑ ÑазнÑе ÑÑÑоки Ð¼ÐµÐ¶Ð´Ñ Ñобой в попÑÑке найÑи ÑÑÑоки, обÑединеннÑе обÑим знаÑением колонки relation и оÑлиÑнÑми знаÑениÑми колонки granted.
ÐÐ»Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð¸Ð»Ð¸ ÑеÑминиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑбÑанного пÑоÑеÑÑа в окне имеÑÑÑÑ Ð´Ð²Ðµ кнопки. ÐоÑле ÑеÑминиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾-либо из пÑоÑеÑÑов нÑжно обновиÑÑ Ð¾ÐºÐ½Ð¾ и Ñнова ÑопоÑÑавиÑÑ ÑÑÑоки, ÑÑÐ¾Ð±Ñ Ð¾ÑениÑÑ ÑезÑлÑÑаÑ.
ÐÑак, pgAdmin III Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован как инÑÑÑÑÐ¼ÐµÐ½Ñ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовками, но Ð¾Ð±Ð»Ð°Ð´Ð°ÐµÑ Ð¿Ð°Ñой минÑÑов: ÑÑебÑÐµÑ Ð¿ÑедваÑиÑелÑной наÑÑÑойки ÐРи показÑÐ²Ð°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки в плоÑком виде (без дÑевовидного оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÑÑÑÐ¸Ñ -блокиÑÑемÑÑ Ð¿ÑоÑеÑÑов), ÑÑо оÑложнÑÐµÑ Ð¿Ð¾Ð¸Ñк пÑоблемнÑÑ Ð¿ÑоÑеÑÑов и оÑÐµÐ½ÐºÑ Ð¸Ñ ÑеÑминиÑованиÑ. ÐÑо Ð´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ не ÑамÑм ÑдобнÑм инÑÑÑÑменÑом Ð´Ð»Ñ Ð½Ð°ÑÐ¸Ñ Ð·Ð°Ð´Ð°Ñ
ÐоÑле ÑÑÑановки и запÑÑка pgAdmin IV Ð¼Ñ Ñможем поÑмоÑÑеÑÑ ÑÑÑеÑÑвÑÑÑие блокиÑовки в Ñом же виде, как ÑÑо бÑло в pgAdmin III.
Ðо⦠ÑÑо вÑе, ÑÑо Ð¼Ñ Ñможем ÑделаÑÑ Ð·Ð´ÐµÑÑ. Ð pgAdmin IV пÑопала Ð¿Ð°Ð½ÐµÐ»Ñ Ð¸Ð½ÑÑÑÑменÑов Ð´Ð»Ñ Ð´ÐµÐ¹ÑÑвий над пÑоÑеÑÑами, и Ð¼Ñ Ñже не можем оÑмениÑÑ Ð¸Ð»Ð¸ ÑеÑминиÑоваÑÑ Ð¿ÑоÑеÑÑÑ Ð¸Ð· ÑÑого вида, ÑÑо Ð´ÐµÐ»Ð°ÐµÑ pgAdmin IV неÑдобнÑм инÑÑÑÑменÑом ÑабоÑÑ Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовками.
Ð ÑеÑи еÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑазнÑÑ ÑеализаÑий запÑоÑов Ð´Ð»Ñ Ð¿ÑоÑмоÑÑа заблокиÑованнÑÑ Ð¸ блокиÑÑÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов в ÐÐ
ÐеÑвÑй же ÑезÑлÑÑÐ°Ñ Ð² поиÑковике по запÑоÑÑ âpg_locks monitoringâ вÑÐ´Ð°ÐµÑ ÑÑÑÐ»ÐºÑ Ñ Ð²Ð°ÑианÑом запÑоÑа:
ÐапÑÐ¾Ñ 1:
SELECT blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement,
blocking_activity.query AS current_statement_in_blocking_process
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid =
blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks
ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.GRANTED;
ÐÑкÑÑваем ÑедакÑÐ¾Ñ Ð¸ вводим запÑоÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ блокиÑÐ¾Ð²ÐºÐ°Ñ :
ÐÑглÑÐ´Ð¸Ñ Ð´Ð¾ÑÑаÑоÑно Ñложно, но ÑезÑлÑÑÐ°Ñ Ð¿ÑиÑÑен Ð´Ð»Ñ Ð³Ð»Ð°Ð·. ÐообÑе, ÑообÑеÑÑво PostgreSQL Ñоздало и поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´Ð¾ÑÑаÑоÑно много ÑеÑÑÑÑов, коÑоÑÑе помогаÑÑ Ð¸ облегÑаÑÑ Ð¿Ð¾Ð¸Ñк инÑоÑмаÑии ÑÑдовÑм админиÑÑÑаÑоÑам ÐÐ. ÐапÑимеÑ, Ñа же вики wiki.postgresql.org
ÐÑак, видим кÑо и кого блокиÑÑеÑ. ÐÑÑÑ ÐµÑÑ Ð²Ð°ÑианÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ Ð·Ð°Ð¿ÑоÑов, где можно вÑвеÑÑи инÑоÑмаÑÐ¸Ñ Ð¸ о Ñом, как долго Ñже пÑоÑеÑÑ Ð¶Ð´ÐµÑ Ñвоей оÑеÑеди, и Ñд.
ÐÑоÑÐ°Ñ ÑÑÑлка (из оÑиÑиалÑной, Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоÑим, докÑменÑаÑии) пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÑовÑем Ñж пÑоÑÑой запÑоÑ:
ÐапÑÐ¾Ñ 2:
SELECT * FROM pg_locks pl LEFT JOIN pg_stat_activity psa
ON pl.pid = psa.pid;
СмÑÑл вÑÐµÑ ÑÑÐ¸Ñ Ð²Ð°ÑиаÑий по ÑÑÑи одного и Ñого же запÑоÑа: вÑвод инÑоÑмаÑии о блокиÑÐ¾Ð²ÐºÐ°Ñ . ÐÑжнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¼Ñ Ð¿Ð¾Ð»ÑÑили, но оÑÐ²ÐµÑ Ð½Ðµ Ð»ÐµÐ¶Ð¸Ñ Ð¿ÑÑмо на повеÑÑ Ð½Ð¾ÑÑи. ÐÑобенно еÑли к ÐРоÑÑÑеÑÑвлÑеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ запÑоÑов. Сиди и ÑазбиÑайÑÑ Ñам, кÑо кого и поÑÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÑеÑ! ÐоÑÑÑоиÑÑ Ð³ÑÐ°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑованнÑÑ ÑеÑÑÑÑов Ñ ÑÐµÐ±Ñ Ð² голове Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°Ð»ÐµÐºÐ¾ не каждÑй!
Ð ÑÐ¾Ð¼Ñ Ð¶Ðµ, нам надо ÑниÑÑожиÑÑ Ð¸Ð»Ð¸ оÑÑановиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÑÑÑий пÑоÑеÑÑ. Рда, ÑÑо пÑидеÑÑÑ Ð²ÑÑÑнÑÑ, ÑеÑез дÑÑгой запÑÐ¾Ñ Ñ Ñказанием pid пÑоÑеÑÑа â
select pg_backend_pid(16728);
или
select pg_terminate_backend(16728);
ЧÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ ÑезÑлÑÑаÑ, Ñнова запÑÑкаем ÐапÑÐ¾Ñ 1 или
SELECT * FROM pg_catalog.pg_stat_activity WHERE pid=16728;.
ХоÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð²Ð°Ð¼ еÑÑ Ð¾Ð´Ð¸Ð½ инÑÑÑÑÐ¼ÐµÐ½Ñ Ð¸ поделиÑÑÑÑ, Ñем он Ñак Ñдобен, â pgSqlBlocks. ÐнÑÑÑÑÐ¼ÐµÐ½Ñ pgSqlBlocks напиÑан нами Ð´Ð»Ñ ÑебÑ, и Ñоздан именно Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð»ÐµÐ³ÑиÑÑ ÑеÑение пÑоблем Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовками в PostgreSQL, коÑоÑÑм Ð¼Ñ Ð¿Ð¾Ð»ÑзÑемÑÑ Ñже болÑÑе года.
ÐÐ¾Ñ Ñак вÑглÑÐ´Ð¸Ñ Ð¾ÐºÐ½Ð¾ pgSqlBlocks в ÑлÑÑае наÑего пÑимеÑа Ñ Ð´Ð²ÑÐ¼Ñ Ð¿ÑоÑеÑÑами (здеÑÑ Ð¾Ð½Ð¸ имеÑÑ pid 29981 (SELECT) и 28710 (DROP RULE)).
Рлевой ÑаÑÑи окна имееÑÑÑ ÑпиÑок баз даннÑÑ , в коÑоÑом оÑобÑажаеÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑоÑÑоÑнии подклÑÑÐµÐ½Ð¸Ñ Ðº ÐÐ (Ñоединен, оÑклÑÑен, обновление инÑоÑмаÑии, оÑибка ÑоединениÑ, имеÑÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки в ÐÐ).
ÐÑновнÑÑ ÑаÑÑÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð´ÐµÑево пÑоÑеÑÑов, коÑоÑÑе на даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÐµÑÑÑ Ð² вÑбÑанной ÐÐ. ÐлокиÑованнÑе пÑоÑеÑÑÑ Ð¸Ð¼ÐµÑÑ Ð¸ÐºÐ¾Ð½ÐºÑ Ð·Ð°ÐºÑÑÑого ÑеÑого замка и ÑвлÑÑÑÑÑ Ð¿Ð¾Ñомками блокиÑÑÑÑÐ¸Ñ Ð¿ÑоÑеÑÑов, ÑÑÑ Ð¸ÐºÐ¾Ð½ÐºÐ° â кÑаÑнÑй замок. Ðконка обÑÑнÑÑ Ð¿ÑоÑеÑÑов â Ð·ÐµÐ»ÐµÐ½Ð°Ñ ÑоÑка
Такое пÑедÑÑавление пÑоÑеÑÑов позволÑÐµÑ Ð½Ð°Ð¼ легко оÑиенÑиÑоваÑÑÑÑ Ð² Ð½Ð¸Ñ , полÑÑаÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ блокиÑÑÑÑÐ¸Ñ Ð¸ ожидаÑÑÐ¸Ñ Ð¿ÑоÑеÑÑÐ°Ñ , а Ñакже об Ð¸Ñ Ð¾ÑноÑении дÑÑг к дÑÑгÑ. Ðожно Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑей наглÑдноÑÑи ÑкÑÑÑÑ Ð¾Ð±ÑÑнÑе (не заблокиÑованнÑе и не блокиÑÑÑÑие) пÑоÑеÑÑÑ.
ÐаглÑдно видим, ÑÑо пÑоÑеÑÑ Ñ pid 29981 Ñ Ð´Ð¾Ð»Ð³Ð¸Ð¼ SELECT-запÑоÑом блокиÑÑÐµÑ Ð¿ÑоÑеÑÑ Ñ pid 28710.
ÐÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи можно поÑлаÑÑ Ñигнал оÑÐ¼ÐµÐ½Ñ Ð¸Ð»Ð¸ ÑниÑÑожении лÑбого пÑоÑеÑÑа. ÐапÑимеÑ, еÑли ÑниÑÑожиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÑемÑй пÑоÑеÑÑ 28710, Ñо инÑоÑмаÑÐ¸Ñ Ð² деÑеве пÑоÑеÑÑов ÑÑÑ Ð¶Ðµ обновиÑÑÑ Ð¸ Ð¼Ñ Ñвидим ÑезÑлÑÑÐ°Ñ â пÑоÑеÑÑ 29981 Ñ Ð´Ð¾Ð»Ð³Ð¸Ð¼ SELECT-запÑоÑом болÑÑе никого не блокиÑÑеÑ. ÐÑÑÑÑо и Ñдобно.
ÐÑе из Ð¼ÐµÐ»ÐºÐ¸Ñ Ð¸ пÑиÑÑнÑÑ ÑÐ¸Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ оÑмеÑиÑÑ:
Ð ÑиÑÑеме должна бÑÑÑ Ð¿ÑедÑÑÑановлена JRE 8.
ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ по адÑеÑÑ github.com/technology16/pgsqlblocks/releases/latest и вÑбиÑаем поÑледнÑÑ Ð°ÐºÑÑалÑнÑÑ Ð²ÐµÑÑÐ¸Ñ Ð¿ÑогÑаммÑ. Рпапке бÑдÑÑ Ð»ÐµÐ¶Ð°ÑÑ 4 jar-Ñайла. ÐÑбиÑаем ÑоÑ, коÑоÑÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð´ ÐС и ÑазÑÑдноÑÑÑ ÐаÑей ÑиÑÑемÑ. СкаÑиваем, запÑÑкаем и вÑалÑ!
ÐÑо вÑÑ, ÑÑо нÑжно Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка пÑиложениÑ. ÐÑÑ ÑабоÑÐ°ÐµÑ âиз коÑобкиâ.
ÐÐ»Ñ Ð½Ð°Ñала ÑабоÑÑ Ñ Ð¿Ñиложением ÑÑÐ¾Ð¸Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸ÑÑ ÑпиÑок Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ даннÑÑ . ÐÐ»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÐРнажмиÑе Ð¸ÐºÐ¾Ð½ÐºÑ ÐÐ Ñо знаÑком "+" над ÑпиÑком ÐРи заполниÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе даннÑе в поÑвивÑемÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³Ðµ. ÐаÑÐ¾Ð»Ñ Ð»ÑÑÑе Ñ ÑаниÑÑ Ð² pgpass Ñайле.
ÐÑоÑеÑÑиÑовано на веÑÑиÑÑ 9.2-9.6 PostgreSQL.
ÐополниÑелÑно можно наÑÑÑоиÑÑ ÑаÑÑоÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии из ÐÐ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ idle пÑоÑеÑÑÑ, ÑпиÑок оÑобÑажаемÑÑ ÐºÐ¾Ð»Ð¾Ð½Ð¾Ðº.
ÐÑоблема поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÑÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов в ÐÐ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÐµÐ½Ñ ÑеÑÑезной и пÑиводиÑÑ Ðº замеÑÐ½Ð¾Ð¼Ñ Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸Ñ ÑабоÑÑ ÐРи иÑÑеÑÐ¿Ð°Ð½Ð¸Ñ Ð´Ð¸Ñкового пÑоÑÑÑанÑÑва. ÐоÑÑÐ¾Ð¼Ñ Ð²Ð°Ð¶Ð½Ð¾ имеÑÑ ÑдобнÑй и бÑÑÑÑÑй инÑÑÑÑÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð´ÐµÑекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок и пÑинÑÑÐ¸Ñ (иногда) опеÑаÑивнÑÑ Ð´ÐµÐ¹ÑÑвий.
Таким инÑÑÑÑменÑом Ð´Ð»Ñ Ð½Ð°Ñ ÑвлÑеÑÑÑ pgSqlBlocks â ÑÑо пÑиложение, коÑоÑое позволÑÐµÑ Ð»ÐµÐ³ÐºÐ¾ оÑиенÑиÑоваÑÑÑÑ ÑÑеди пÑоÑеÑÑов и полÑÑаÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ блокиÑÑÑÑÐ¸Ñ Ð¸ ожидаÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑÐ°Ñ .
РпÑеимÑÑеÑÑвам его можно оÑнеÑÑи наглÑдноÑÑÑ Ð¿ÑедоÑÑавленной инÑоÑмаÑии, а Ñакже ÑдобÑÑво вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑипиÑнÑÑ Ð·Ð°Ð´Ð°Ñ â пÑоÑмоÑÑа инÑоÑмаÑии о пÑоÑеÑÑÐ°Ñ , поиÑка пÑоблем ÑÑеди ÑпиÑка пÑоÑеÑÑов, оÑÐ¼ÐµÐ½Ñ Ð¸Ð»Ð¸ ÑеÑминиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑоÑеÑÑа и оÑенки ÑезÑлÑÑаÑа. ÐÑоме Ñого, пÑиÑÑной возможноÑÑÑÑ ÑвлÑеÑÑÑ ÑÐ¾Ñ Ñанение иÑÑоÑии блокиÑовок в Ñайл Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего ÑазбоÑа ÑложивÑейÑÑ ÑиÑÑаÑии. ÐÑÑ ÑÑо Ð´ÐµÐ»Ð°ÐµÑ Ð²Ð°ÑÑ ÑабоÑÑ Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовками в ÐÐ PostgreSQL бÑÑÑÑой и Ñдобной.
P.S.: Ð²Ð´Ð¾Ñ Ð½Ð¾Ð²ÐµÐ½Ð¸ÐµÐ¼ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑого пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑÑала ÑÑилиÑа MSSQL Blocks. Ðо она пÑедназнаÑена именно Ð´Ð»Ñ ÑабоÑÑ Ñ ÐÐ MSSQL. ÐÐ»Ñ PostgreSQL его аналогов не оказалоÑÑ.
â СкаÑаÑÑ Ð¿Ð¾ÑледнÑÑ Ð²ÐµÑÑÐ¸Ñ Ð´Ð»Ñ Ñвоей ÐС можно ÑÑÑ.