Это меня ставит в тупик. Вот код 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 "Database connection failed, retrying in 10 seconds"
sleep 10
puts "Time to retry. . . "
@client.query(sql, cache_rows: true)
end
end
end
Первые ~5 млн записей импортировались нормально, но теперь довольно часто:
posts = mysql_query(query).to_a
возвращает не результат MySQL, а вот это:
[#<PG::Result:0x0000563f3ee6d8d0 status=PGRES_COMMAND_OK ntuples=0 nfields=0 cmd_tuples=0>]
Я прибег к следующему решению:
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
Это позволяет отловить проблему и решить её, но запросы всё равно падают почти каждый раз (иногда удаётся выполнить до трёх запросов по 5000 записей подряд). Я написал это как цикл, но, кажется, он никогда не выполняется более одного раза. Коротко я подумал, что, возможно, кто-то другой использует @client и помещает туда запрос PG, поэтому я переключился на @mysql_client, но это не помогло.
Я немного погуглил, но ничего не нашёл.
Мой хак работает, так что, видимо, проблема «решена», но мне всё ещё интересно, что именно может вызывать такое поведение.