Los índices TOAST no se pueden eliminar de esta manera;
Tuve que hacer lo siguiente:
su postgres
psql
\connect discourse
drop index pg_toast.pg_toast_309322_index_ccnew;
drop index pg_toast.pg_toast_309322_index_ccnew1;
Lo anterior solo aplica a pg_toast porque el usuario de Discourse no tiene acceso a ese índice. PG::InsufficientPrivilege: ERROR: permission denied for schema pg_toast
Resultó que tenía nada menos que 30 de ellos, todos en la tabla incoming_referers. Así que verifiqué que todos los índices ccnew fueran realmente duplicados mediante la columna indexdef en esta consulta.
select indexname,indexdef from pg_indexes where tablename = 'incoming_referers';
DROP INDEX incoming_referers_pkey_ccnew;
DROP INDEX incoming_referers_pkey_ccnew_ccnew;
DROP INDEX incoming_referers_pkey_ccnew1;
...y así sucesivamente con los 30
En ese momento, reindexé todo el esquema nuevamente y, una vez más, no pudo reconstruir dos de los mismos índices ccnew de incoming_referers, además de encontrar tres índices pg_toast. Los eliminé y luego reindexé todo el esquema de nuevo; otra vez más errores, encontré muchos índices ccnew adicionales en el esquema discourse, reindexé por tercera vez…
No puedo completar un reindexado completo sin errores; sigue creando y luego fallando al reconstruir nuevos índices ccnew cada vez. Después de 4 reconstrucciones completas, eliminé los índices ccnew y finalmente desistí. Supongo que podría intentar reconstruirlos de forma no concurrente, pero eso causaría bastante tiempo de inactividad.
En cualquier caso, mi suposición es que la mayoría de los usuarios que actualizan de PG10 a PG12 y que intentaron reindexar después tienen estos índices ccnew adicionales y deberían eliminarse todos. Solo ocuparán espacio y multiplicarán las operaciones de escritura en disco sin ningún beneficio.
Ejecuté su equivalente en Data-Explorer. Fue un poco más fácil de gestionar.
Lo que hice fue tomar todos los índices ccnew/ccnew1/ccnew2…ccnewn, eliminarlos y volver a indexar. Eso lo solucionó para mí.
c cnew es una característica de PostgreSQL para marcar los índices y creo que es alguna ineficiencia en el proceso lo que hace que estos queden si la indexación falla por alguna razón.
Solo puedo sugerirte que primero trabajes en la causa raíz del problema. Yo tenía etiquetas duplicadas que tuve que eliminar antes de proceder a eliminar los índices. Si me hubiera quedado incluso una sola etiqueta duplicada, no se indexaría correctamente y crearía otro índice ccnew'n' y fallaría.
Tienes razón, todavía tengo duplicados: no puedo reconstruir los índices que no son de ccnew de forma no concurrente. Necesito eliminar estas filas duplicadas.
discourse=# reindex index index_incoming_referers_on_path_and_incoming_domain_id;
ERROR: no se pudo crear el índice único "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL: La clave (path, incoming_domain_id)=(/search/, 3433) está duplicada.
discourse=# reindex index index_incoming_referers_on_path_and_incoming_domain_id;
ERROR: no se pudo crear el índice único "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL: La clave (path, incoming_domain_id)=(/search/, 1861) está duplicada.
Lo realmente extraño es que solo veo una fila con cada uno de esos valores de incoming_domain_id en incoming_referer. ¿Entonces por qué están duplicados?
discourse=# select * from incoming_referers where path='/search/' AND incoming_domain_id IN (1861,3433);
id | path | incoming_domain_id
-------+----------+--------------------
42845 | /search/ | 1861
40763 | /search/ | 3433
(2 filas)
@sam o @riking, ¿debería eliminar estas dos filas de la siguiente manera:
DELETE FROM incoming_referers WHERE path='/search/' AND incoming_domain_id IN (1861,3433);
… Supongo que al fin estoy aprendiendo postgres, jaja.
Créalo o no, más fallos. En el primer intento, encontré otra clave duplicada en /m/search que, por alguna razón, no fue detectada por el comodín %/search/ y la eliminé. Vuelví a reindexar (cada vez tardando casi una hora) y aparecieron más fallos indicando una clave duplicada en users(username_lower).
discourse=# reindex index index_users_on_username_lower;
ERROR: no se pudo crear el índice único "index_users_on_username_lower"
DETALLE: La clave (username_lower)=(john_smith) está duplicada.
Pero lo cierto es que solo había una fila con username_lower=john_smith. ¡A ponerse el sombrero de detective.
Al revisar la interfaz de administración del foro, vimos dos usuarios distintos llamados “john_smith” y “John_Smith”— nota la diferencia en las mayúsculas. Así que eliminé el que estaba todo en minúsculas a nivel del foro, ya que no había estado activo en 4 años, y luego ese índice se reconstruyó correctamente.
Ejecuté otra reconstrucción completa, cada una tardando casi una hora, y FINALMENTE creo que ya estamos bien: solo un error, pero sin duplicados, solo un pg_toast ccnew. Lo eliminé.
discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING: no se puede reindexar concurrentemente el índice inválido "pg_toast.pg_toast_2783329_index_ccnew", omitiendo
REINDEX
Listar los índices inválidos usando SELECT pg_class.relname FROM pg_class, pg_index WHERE pg_index.indisvalid = false AND pg_index.indexrelid = pg_class.oid;
Eliminar cada índice inválido listado anteriormente usando DROP INDEX <indexname>;
Después de ejecutar la actualización a 2.5.0beta5 y seguir las instrucciones posteriores a la actualización para reindexar la base de datos, obtengo esto:
discourse=# REINDEX SCHEMA CONCURRENTLY public;
ERROR: no se pudo crear el índice único "index_plugin_store_rows_on_plugin_name_and_key_ccnew"
DETALLE: La clave (plugin_name, key)=(discourse-data-explorer, q:-10) está duplicada.
Prefiero no experimentar con esto… entonces, ¿cómo elimino de forma segura el duplicado?
No. La actualización no corrompe tu índice, simplemente señala que tu índice ya está corrupto. Puedes verificarlo intentando restaurar tu copia de seguridad en otro servidor (incluso uno que ejecute pg10) o intentando reconstruir el índice en tu instalación actual. No está claro qué está causando los índices corruptos, pero hay esperanzas de que pg12 sea menos propenso a que esto ocurra.
Hay algunas mejoras de rendimiento en la actualización, pero posponerla no es una mala idea.