Peço desculpas a quem se sentir ofendido por esta postagem porque, para ser honesto, estou lidando com esses problemas desde segunda-feira e, neste ponto, estou cansado de fazer depuração/correção para o código do Discourse.
Após a enésima tentativa (parei de contar depois da sétima), acho que vou desistir porque parece que a migração não é algo que o Discourse tenha investido muito tempo para suportar.
Acredito que o maior problema é que o conjunto de caracteres usado neste enorme banco de dados é utf8mb4, que não é suportado pelo script(?).
Usar utf8 (padrão) simplesmente gera muitos erros que estão sendo relatados, mas não está claro o que está acontecendo, pois o script continua mesmo assim. A entrada no banco de dados está sendo ignorada? Copiada com alguns caracteres não suportados (os quadrados clássicos)?
Além disso, as três execuções mais recentes (usando os importadores em massa), com o mesmo conjunto exato de instruções seguidas, têm resultados diferentes. Esta última execução atingiu a importação de tópicos, começou imediatamente a relatar erros, mas continuou (???):
Carregando aplicação...
Iniciando...
Pré-carregando I18n...
Corrigindo os maiores números de postagens...
Carregando IDs de grupos importados...
Carregando IDs de usuários importados...
Carregando IDs de categorias importados...
Carregando IDs de tópicos importados...
Carregando IDs de postagens importados...
Carregando índices de grupos...
Carregando índices de usuários...
Carregando índices de categorias...
Carregando índices de tópicos...
Carregando índices de postagens...
Carregando índices de ações de postagem...
Importando categorias...
Importando categorias pai...
5 - 1104/segERROR: duplicate key value violates unique constraint "unique_index_categories_on_name"
DETAIL: Key (COALESCE(parent_category_id, '-1'::integer), name)=(-1, Armata Brancaleone) already exists.
CONTEXT: 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 tópicos...
600 - 4073/seg
ERROR: undefined method `[]' for 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>'
Até finalmente travar neste:
script/bulk_import/vbulletin5.rb:779:in `<main>'
572329 - 531/seg
Importando respostas...
client_loop: send disconnect: Connection reset
Mas não antes de basicamente spammar constantemente esses dois erros:
ERROR: undefined method `gsub!' for 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>'
e
ERROR: invalid byte sequence in 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>'
Por favor, note que fui passo a passo comentando qual função executar, depois executando o rake import:ensure_consistency antes de continuar comentando as que acabaram de ser executadas e assim por diante, porque se eu apenas deixar o script inteiro reexecutar os passos anteriores, ele simplesmente falha ao encontrar IDs duplicados.
Antes que o argumento usual de “você não pode reclamar de software livre” surja, quero esclarecer que estou contribuindo para outros projetos de código aberto e também estou fazendo software de graça, mas é de suma importância para mim que, se eu lançar algo, esse algo funcione e seja bem documentado (mesmo que apenas para que eu possa evitar as milhares de mensagens perguntando legitimamente ‘como isso funciona’) ou estou pronto para corrigir qualquer bug que apareça.
Embora o Discourse pareça ter uma ótima experiência “out-of-the-box”, deve ficar bem claro que é 2022 e as comunidades existiam muito antes deste produto. A “adoção” precisaria ter um forte suporte de migração e não parece ser o estado atual para o Discourse.
Reconheço que um banco de dados de 20 GB é um caso extremo, mas não estamos tendo problemas com o tamanho aqui, mas sim com o conjunto de caracteres ou quem sabe o quê, pois nem mesmo há um erro constante e a maioria das coisas: não há documentação além de caçar threads e posts deixados por quem passou pela mesma provação no passado, esperando que uma solução alternativa tenha sido encontrada e que o código-fonte não tenha mudado muito desde então.
Neste ponto, eu recomendaria fortemente a qualquer pessoa que venha do vBulletin que suspenda qualquer migração até que o que parece ser uma reformulação do script de migração (em andamento, parece?) seja concluída.