Eliminar campos de Drupal con grandes tablas MySQL
Me acabo de encontrar con el caso que he de eliminar varios campos de un tipo de contenido en un Drupal 9.
Esos es simple de hacer, ¿no?
En tu local usar la interfaz de usuario de Drupal, eliminar los campos y exportar la configuración. Luego en la web de producción importar la configuración y automáticamente se eliminaran los campos, sus tablas y sus datos de mysql. ¿No es así de simple?
Pues no, no es tan simple cuando tienes miles de nodos y las tablas de esos campos pesan varios GB en la base de datos.
¿Qué problemas me he encontrado yo?
Básicamente Drupal primero intenta hacer un truncate de cada una de las tablas (y su correspondiente tabla de revisiones).
Esto es un problema, porque un truncate de una tabla muy grande tarda bastante tiempo. Por lo que Drupal tardará muchísimo tiempo en intentar eliminar esos campos.
Tarda tanto tiempo que el comando "drush cim" da error y me deja la base de datos bloqueada.
¿Cómo lo he solucionado yo?
Truncar tablas grandes, con millones de filas, en InnoDB puede ser muy lento. Afortunadamente, hay un pequeño truco para acelerar esto. (Gracias Google)
El truco consiste en crear primero una tabla que tenga la misma estructura que la tabla que estás truncando:
CREATE TABLE `new_table` LIKE `bigtable`;
Luego puedes cambiar la tabla que se va a truncar por la tabla vacía:
RENAME TABLE `bigtable` TO `old_table`, `new_table` TO `bigtable`;
Después de esto, su sistema usará la tabla nueva (y vacía), y puede eliminar rápidamente la tabla grande anterior:
DROP TABLE `old_table`;
Listo, has truncado con éxito tu enorme tabla.
Por tanto, en Drupal he de hacer esas querys para vaciar las tablas de los campos que quiero eliminar, luego puedo hacer el "drush cim" para importar la configuración de drupal, la cual eliminará las tablas.
¿Por qué no hacer un Drop?
Si haces un drop directamente de las tablas, entonces Drupal puede darte error al importar la configuración, ya que no encuentra las tablas.
Aparte de que si es la web de producción, entonces van a salir errores a los usuarios que están intentando ver las páginas de esos nodos. Has eliminado tablas antes de importar la configuración de Drupal, por tanto, Drupal va a intentar obtener esos datos de los campos que ya no existen en base de datos. Lo que lleva a que los usuarios de la web vean muchos errores o que la web directamente no cargue.
¿Tienes algún proyecto en mente?
Si quieres hacer algo en Drupal tal vez puedas contratarme.
Ya sea para consultoría, desarrollo o mantenimiento de sitios web Drupal.