2009-03-06 16 views
2

私はいくつかのクエリを実行して、mysqldプロセスが終了せずに100%のCPUパワーを使い始めるという問題に遭遇しました。私はこの質問を正確に指摘したい。問題は、log/development.logには完了したクエリだけが含まれていることです。何か案が?実行前のクエリのログ

答えて

1

、SQLクエリを考えてみ

SHOW PROCESSLIST 

またはコマンドラインから

mysqladmin processlist 

また、最も強力な方法は、の「実行」メソッドをオーバーライドすることですActiveRecord :: Base接続インスタンスあなたはapplication.rbにこのコードを入れ

http://www.misuse.org/science/2006/12/12/sql-logging-in-rails/

:この記事では一般的なアプローチを示して

# define SQL_LOG_FILE, SQL_LOG_MAX_LINES 

connection = ActiveRecord::Base.connection 
class << connection 
    alias :original_exec :execute 
    def execute(sql, *name) 
     # try to log sql command but ignore any errors that occur in this block 
     # we log before executing, in case the execution raises an error 
     begin 
      lines = if File::exists?(SQL_LOG_FILE) then IO::readlines(SQL_LOG_FILE) else [] end 
      log = File.new(SQL_LOG_FILE, "w+") 
      # keep the log to specified max lines 
      if lines.length > SQL_LOG_MAX_LINES 
       lines.slice!(0..(lines.length-SQL_LOG_MAX_LINES)) 
      end 
      lines << Time.now.strftime("%x %I:%M:%S %p")+": "+sql+"n" 
      log.write(lines) 
      log.close 
      $sql_log = sql 
     rescue Exception => e 
      ; 
     end 
     # execute original statement 
     original_exec(sql, *name) 
    end # def execute 
end # class << 
2

あなたは

show processlist; 

コマンドで/未完成の文を実行しているを見てみることができます。

5

私はこれにはいくつかの選択肢があると思います。最初は、あなたのdevelopment.logを実際に見て、それを引き起こしているアクションを見ています。レールの実行を求めるクエリを見て、その特定のクエリを特定しようとします。大量の時間がかかる場合は、おそらく、n + 1回のクエリを返したり、インデックスやその他のパフォーマンスを低下させるようなことをしていることを意味します。

devログには終了したクエリしかないと言います。次のクエリを実行するにはどうすればいいですか?

あなたの他のオプションは、ログ(私はこれらのいくつかの名前が変更されていると思います)でmysqldを開始伴う:

のmysql内からPROCESSLISTを使用して、現在のステートメントのリストを表示
mysqld --log[=file_name] --log-slow-queries[=file_name] 

show processlist; 

このようなことが起こらないようにするには、New Relic(http://www.newrelic.com/)のRPMのようなレール性能モニタを見るのに時間がかかるかもしれません。

こちらがお役に立てば幸いです。あなたは、MySQLに評価している場合

+0

合意 - devのを見て、これはすべき、あなたが呼び出されたコントローラメソッド見ることができますログインしますどのモデルを見るか教えてください。その時点で、必要に応じてログを追加して、どのクエリを実行しようとしているかを伝えることができます。 –