これで困っています。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 "データベース接続に失敗しました。10 秒後に再試行します"
sleep 10
puts "再試行のタイミングです。 . . "
@client.query(sql, cache_rows: true)
end
end
end
最初の約 500 万件の投稿は正常にインポートされましたが、現在では頻繁に、
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
これで問題を検知して解決できていますが、ほぼすべてのクエリで失敗しています(たまに 3 回、5000 件レコードのクエリが成功することもあります)。ループとして書きましたが、実際には 1 回しか実行されていないように思います。一時的に、別のプロセスが @client を使用して PG クエリを混入させているのではないかと考え、@mysql_client に切り替えましたが、それでは解決しませんでした。
少しググってみましたが、情報は見つかりませんでした。
このハックは機能しているので「解決済み」とは言えますが、いったい何がこのような現象を引き起こしているのか、まだ気になっています。