Chicos: Agradezco mucho la ayuda aquí y @pfaffman: por favor, no trabajes hasta tarde por mi cuenta. Los asistentes al foro simplemente tendrán que esperar si necesitas desconectarte por la noche.
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 rows)
¡¡¡Dios mío!!!
discourse=# select count(*) from calendar_events;
count
----------
69724384
(1 row)
¿Whoa qué es eso?
Ese es el plugin de calendario
¿Está funcionando durante 7 horas o 7 minutos?
Se ejecutó mucho más tiempo que 7 minutos la última vez, pero no 7 horas, al menos para mí.
El plugin de calendario apenas se usa; se puede eliminar si eso ayuda en algo.
Genial.
Falco: ¿Quizás simplemente eliminar el plugin?
¿Y luego eliminar las tablas del plugin?
EDITAR: con el calendario eliminado, la base de datos migrada y los activos precompilando. El sitio debería estar en línea en unos minutos más.
¡Tengo mucha curiosidad por saber qué demonios le pasó al calendario para causar ese tipo de problema!
ESTÁ VIVO. Leyendas absolutas.
Te avisaré por la mañana sobre cómo limpiar las cosas.
Gracias por hacer un esfuerzo adicional <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 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
)
Así que eso parece al menos una operación O(n^2), ¿verdad? Hay 69.724.384 filas en esa tabla, así que no parece una muy buena idea.
@Sikamikanico. Si quieres que el plugin de calendario vuelva, creo que lo que hay que hacer es simplemente eliminar todos los eventos del calendario y puedes empezar de nuevo. Lo otro que podríamos hacer sería ejecutar esa consulta en el servidor activo y ver si alguna vez termina.
La causa raíz, creo, es un error en el plugin que duplicaba eventos cuando cambiaba la zona horaria.
La tabla calendar_events tiene 11 GB:
discours=# SELECT pg_size_pretty( pg_total_relation_size('calendar_events') );
pg_size_pretty
----------------
11 GB
(1 row)
Aquí están las tablas más grandes:
relation | total_size
----------------------+------------
calendar_events | 11 GB
post_timings | 6884 MB
posts | 2292 MB
user_auth_token_logs | 1240 MB
user_actions | 1055 MB
(5 rows)
Solo calendar_events es claramente extraño.
Necesitamos entender si esto todavía puede ser un error en el plugin o simplemente algo que sucedió en el pasado.
¿Puede confirmar si la mayor parte de las entradas duplicadas son del pasado o si todavía hay demasiadas filas con una created_at reciente?
¡Gracias!
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)
iscourse=# select count(*) from calendar_events where created_at < NOW()-INTERVAL '200 days';
count
----------
43754016
(1 row)