Isso está me deixando sem saída. Aqui está o mysql_query:
def mysql_query(sql)
begin
#puts "Query: \n#{sql}"
@client.query(sql, cache_rows: true)
rescue Exception => ex
begin
ActiveRecord::Base.connection.reconnect!
rescue
puts "Falha na conexão com o banco de dados, tentando novamente em 10 segundos"
sleep 10
puts "Hora de tentar novamente..."
@client.query(sql, cache_rows: true)
end
end
end
Os primeiros ~5 milhões de posts foram importados OK, mas agora, com bastante frequência,
posts = mysql_query(query).to_a
retorna, não o resultado do MySQL, mas sim:
[#<PG::Result:0x0000563f3ee6d8d0 status=PGRES_COMMAND_OK ntuples=0 nfields=0 cmd_tuples=0>]
Acabei recorrendo a isso:
while !posts[-1].is_a?(Hash)
puts "Posts: #{posts}"
ActiveRecord::Base.connection.reconnect!
@mysql_client = Mysql2::Client.new(
host: DB_HOST,
username: DB_USER,
password: DB_PW,
database: DB_NAME
)
posts = mysql_query(query).to_a
end
Isso está detectando o problema e resolvendo, mas ainda falha em quase todas as consultas (às vezes, até 3 consultas de 5.000 registros são bem-sucedidas). Eu escrevi como um loop, mas acho que ele nunca é executado mais de uma vez. Por um momento, pensei que talvez algo mais estivesse usando @client e inserindo uma consulta PG nele, então mudei para @mysql_client, mas isso não resolveu.
Pesquisei um pouco no Google, mas não encontrei nada.
Meu “gambiarra” está funcionando, então imagino que esteja “consertado”, mas ainda tenho curiosidade sobre o que poderia estar causando isso.