Das bringt mich auf den Holzweg. Hier ist 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 "Datenbankverbindung fehlgeschlagen, neuer Versuch in 10 Sekunden"
sleep 10
puts "Zeit für einen neuen Versuch. . . "
@client.query(sql, cache_rows: true)
end
end
end
Die ersten ca. 5 Millionen Beiträge wurden erfolgreich importiert, aber jetzt liefert
posts = mysql_query(query).to_a
nicht das MySQL-Ergebnis zurück, sondern stattdessen:
[#<PG::Result:0x0000563f3ee6d8d0 status=PGRES_COMMAND_OK ntuples=0 nfields=0 cmd_tuples=0>]
Ich bin jetzt zu folgendem Trick gegriffen:
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
Das fängt das Problem ab und löst es, aber es schlägt immer noch bei fast jeder Abfrage fehl (manchmal schaffen es sogar 3 Abfragen mit je 5000 Datensätzen). Ich habe es als Schleife geschrieben, aber ich vermute, dass sie nie mehr als einmal durchläuft. Kurzzeitig dachte ich, vielleicht würde etwas anderes @client verwenden und eine PG-Abfrage dort hineinstecken, also bin ich zu @mysql_client gewechselt, aber das hat das Problem nicht behoben.
Ich habe ein wenig im Internet gesucht, aber nichts gefunden.
Mein Hack funktioniert, also ist es wohl „behoben“, aber ich bin immer noch neugierig, was genau das verursacht.