Ребята — большое спасибо за помощь здесь. И @pfaffman, пожалуйста, не оставайтесь работать допоздна из-за меня. Если вам нужно уйти вечером, посетители форума просто подождут.
discourse=# SELECT pid, age(clock_timestamp(), query_start), usename, query
FROM pg_stat_activity
WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%'
ORDER BY query_start desc;
pid | age | usename | query
------+-----------------+-----------+--------------------------------------------------------------------------------------------------------------
47 | | |
50 | | postgres |
48 | | |
46 | | |
45 | | |
3231 | 00:07:57.332835 | discourse | DELETE +
| | | FROM calendar_events ce +
| | | WHERE +
| | | ce.id IN (SELECT DISTINCT(ce3.id) FROM calendar_events ce2 +
| | | LEFT JOIN calendar_events ce3 ON ce3.user_id = ce2.user_id AND ce3.description = ce2.description+
| | | WHERE ce2.start_date >= (ce3.start_date - INTERVAL '1 days') +
| | | AND ce2.start_date <= (ce3.start_date + INTERVAL '1 days') +
| | | AND ce2.timezone IS NOT NULL +
| | | AND ce3.timezone IS NULL +
| | | AND ce3.id != ce2.id +
| | | AND ce2.post_id IS NULL +
| | | AND ce3.post_id IS NULL +
| | | ) +
| | |
3232 | 00:07:57.347747 | discourse | SELECT pg_try_advisory_lock(2859260972035668690)
(7 строк)
О боже
discourse=# select count(*) from calendar_events;
count
----------
69724384
(1 строка)
Вау, что это такое?
Это плагин календаря
Он работает 7 часов или 7 минут?
В прошлый раз оно работало гораздо дольше 7 минут, но не 7 часов, по крайней мере у меня.
Плагин календаря почти не используется — его можно удалить, если это хоть чем-то поможет.
Круто.
Фалько — может, просто удалить плагин?
А потом удалить таблицы плагина?
РЕДАКТИРОВАНО: календарь удалён, база данных перенесена, и ассеты компилируются. Сайт должен заработать ещё через несколько минут.
Меня просто изумляет, что, черт возьми, произошло с календарем, чтобы вызвать такую проблему?!
Оно ЖИВЁТ. Абсолютные легенды.
Я напишу тебе утром, как всё привести в порядок.
Спасибо, что пошли на всё возможное <3
DELETE
FROM calendar_events ce
WHERE
ce.id IN (SELECT DISTINCT(ce3.id) FROM calendar_events ce2
LEFT JOIN calendar_events ce3 ON ce3.user_id = ce2.user_id AND ce3.description = ce2.description
WHERE ce2.start_date >= (ce3.start_date - INTERVAL '1 day')
AND ce2.start_date <= (ce3.start_date + INTERVAL '1 day')
AND ce2.timezone IS NOT NULL
AND ce3.timezone IS NULL
AND ce3.id != ce2.id
AND ce2.post_id IS NULL
AND ce3.post_id IS NULL
)
Нам нужно понять, может ли это всё ещё быть ошибкой в плагине или это уже произошло в прошлом.
Можете ли вы подтвердить, что большинство дубликатов записей относится к прошлому, или же до сих пор слишком много строк с недавним created_at?
Спасибо!
discourse=# select count(*) from calendar_events where created_at > NOW()-INTERVAL '200 days';
count
----------
25970368
(1 row)
discourse=# select count(*) from calendar_events where created_at > NOW()-INTERVAL '100 days';
count
----------
14377700
(1 row)
discourse=# select count(*) from calendar_events where created_at > NOW()-INTERVAL '50 days';
count
---------
7207939
(1 row)
discourse=# select count(*) from calendar_events where created_at > NOW()-INTERVAL '5 days';
count
--------
589938
(1 row)
discourse=# select count(*) from calendar_events where created_at < NOW()-INTERVAL '200 days';
count
----------
43754016
(1 row)