Migración de base de datos vBulletin 5 - Errores en el script de importación

Me gustaría empezar pidiendo disculpas a cualquiera que se sienta atacado por esta publicación porque, para ser honesto, he estado lidiando con estos problemas desde el lunes y, en este punto, estoy cansado de depurar/corregir el código de Discourse.

Después del enésimo intento (dejé de contar después del séptimo), creo que me rendiré porque parece que la migración no es algo en lo que Discourse haya invertido mucho tiempo para admitir.

Creo que el mayor problema es que el conjunto de caracteres utilizado en esta enorme base de datos es utf8mb4, que no es compatible con el script (¿?).

Usar utf8 (predeterminado) simplemente genera muchos errores que se informan, pero no está claro qué está sucediendo, ya que el script continúa de todos modos. ¿Se omite la entrada en la base de datos? ¿Se copia con caracteres no compatibles (los cuadrados clásicos)?

Además de eso, las tres últimas ejecuciones diferentes (utilizando los importadores masivos), siguiendo exactamente el mismo conjunto de instrucciones, tienen resultados diferentes. Esta última ejecución llegó a la importación de temas, comenzó a informar errores de inmediato pero continuó (???):

Cargando aplicación...
Iniciando...
Pre-cargando I18n...
Corrigiendo los números de publicación más altos...
Cargando IDs de grupos importados...
Cargando IDs de usuarios importados...
Cargando IDs de categorías importadas...
Cargando IDs de temas importados...
Cargando IDs de publicaciones importadas...
Cargando índices de grupos...
Cargando índices de usuarios...
Cargando índices de categorías...
Cargando índices de temas...
Cargando índices de publicaciones...
Cargando índices de acciones de publicaciones...
Importando categorías...
Importando categorías principales...
      5 -   1104/segERROR:  la violación de la restricción de clave única \"unique_index_categories_on_name\"
DETALLE:  La clave (COALESCE(parent_category_id, '-1'::integer), name)=(-1, Armata Brancaleone) ya existe.
CONTEXTO: COPY categories, line 69
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:204:in `get_last_result'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:204:in `copy_data'
/var/www/discourse/script/bulk_import/base.rb:720:in `create_records'
/var/www/discourse/script/bulk_import/base.rb:361:in `create_categories'
script/bulk_import/vbulletin5.rb:291:in `import_categories'
script/bulk_import/vbulletin5.rb:69:in `execute'
/var/www/discourse/script/bulk_import/base.rb:98:in `run'
script/bulk_import/vbulletin5.rb:779:in `<main>'
Importando temas...
    600 -   4073/seg
ERROR: método indefinido `[]' para nil:NilClass
/var/www/discourse/script/bulk_import/base.rb:513:in `process_topic'
/var/www/discourse/script/bulk_import/base.rb:724:in `block (2 levels) in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/script/bulk_import/base.rb:721:in `block in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:196:in `copy_data'
/var/www/discourse/script/bulk_import/base.rb:720:in `create_records'
/var/www/discourse/script/bulk_import/base.rb:364:in `create_topics'
script/bulk_import/vbulletin5.rb:321:in `import_topics'
script/bulk_import/vbulletin5.rb:70:in `execute'
/var/www/discourse/script/bulk_import/base.rb:98:in `run'
script/bulk_import/vbulletin5.rb:779:in `<main>'

Hasta que finalmente se bloquea en este:

script/bulk_import/vbulletin5.rb:779:in `<main>'
 572329 -    531/seg
Importando respuestas...
client_loop: send disconnect: Connection reset

Pero no sin antes spammar constantemente estos dos errores:

ERROR: método indefinido `gsub!' para nil:NilClass
script/bulk_import/vbulletin5.rb:727:in `preprocess_raw'
script/bulk_import/vbulletin5.rb:369:in `block in import_topic_first_posts'
/var/www/discourse/script/bulk_import/base.rb:723:in `block (2 levels) in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/script/bulk_import/base.rb:721:in `block in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:196:in `copy_data'
/var/www/discourse/script/bulk_import/base.rb:720:in `create_records'
/var/www/discourse/script/bulk_import/base.rb:367:in `create_posts'
script/bulk_import/vbulletin5.rb:361:in `import_topic_first_posts'
script/bulk_import/vbulletin5.rb:71:in `execute'
/var/www/discourse/script/bulk_import/base.rb:98:in `run'
script/bulk_import/vbulletin5.rb:779:in `<main>'

y

ERROR: secuencia de bytes inválida en UTF-8
script/bulk_import/vbulletin5.rb:727:in `gsub!'
script/bulk_import/vbulletin5.rb:727:in `preprocess_raw'
script/bulk_import/vbulletin5.rb:369:in `block in import_topic_first_posts'
/var/www/discourse/script/bulk_import/base.rb:723:in `block (2 levels) in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/script/bulk_import/base.rb:721:in `block in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:196:in `copy_data'
/var/www/discourse/script/bulk_import/base.rb:720:in `create_records'
/var/www/discourse/script/bulk_import/base.rb:367:in `create_posts'
script/bulk_import/vbulletin5.rb:361:in `import_topic_first_posts'
script/bulk_import/vbulletin5.rb:71:in `execute'
/var/www/discourse/script/bulk_import/base.rb:98:in `run'
script/bulk_import/vbulletin5.rb:779:in `<main>'

Tenga en cuenta que he ido paso a paso comentando qué función ejecutar, luego ejecutando rake import:ensure_consistency antes de continuar comentando las que ya se ejecutaron y así sucesivamente, porque si simplemente dejo que todo el script vuelva a ejecutar pasos anteriores, simplemente falla al encontrar IDs duplicados.

Antes de que salga el argumento habitual de “no puedes quejarte del software libre”, quiero aclarar que estoy contribuyendo a otros proyectos de código abierto y también estoy creando software gratis, pero para mí es primordial que si lanzo algo, ese algo funcione y esté bien documentado (incluso solo para evitar los miles de mensajes que preguntan legítimamente ‘cómo funciona esto’) o estoy listo para corregir cualquier error que surja.

Si bien Discourse parece tener una gran experiencia lista para usar, debe quedar claro que estamos en 2022 y las comunidades existieron mucho antes que este producto. La “adopción” necesitaría un sólido soporte de migración y no parece ser el estado actual de Discourse.

Reconozco que una base de datos de 20 GB es un caso extremo, pero aquí no tenemos problemas con el tamaño, sino con el conjunto de caracteres o quién sabe qué, ya que ni siquiera hay un error constante y la mayoría de la información: no hay documentación más allá de buscar hilos y publicaciones dejadas por quienes han pasado por la misma terrible experiencia en el pasado, esperando que se encontrara una solución y que el código fuente no haya cambiado mucho desde entonces.

En este punto, recomendaría encarecidamente a cualquiera que venga de vBulletin que espere cualquier migración hasta que se complete lo que parece ser una revisión del script de migración (¿en curso, al parecer?).