2009-03-06 11 views
2

일부 쿼리를 실행하고 mysqld 프로세스가 100 % CPU 성능을 사용하여 종료하지 않고 문제가 발생했습니다. 나는이 쿼리를 정확하게 지적하고자한다. 문제는 log/development.log에 완료된 쿼리 만 포함되어 있다는 것입니다. 어떤 생각?실행 전 쿼리 실행

답변

1

, SQL 쿼리를 고려

SHOW PROCESSLIST 

또는 명령 줄에서

:

mysqladmin processlist 

다른 방법으로, 가장 강력한 방법의 '실행'메소드를 오버라이드 (override)하는 것입니다 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 --log[=file_name] --log-slow-queries[=file_name] 

MySQL의 내부에서 PROCESSLIST를 사용하여 현재 문 목록보기 :

show processlist; 

귀하의 다른 옵션은 로그 (내가 이들 중 일부의 이름이 변경된 생각)으로 mysqld를 시작 것을 포함

이런 일이 다시 일어나지 않도록하려면 New Relic (http://www.newrelic.com/)의 RPM과 같은 레일 성능 모니터를 살펴볼 시간이 필요합니다.

도움이 되었기를 바랍니다. 당신이 MySQL로 평가하는 경우

+0

합의 - dev에보고하는 경우, 당신이 호출 된 제어 방법을 볼 수 있습니다 로그인 보고 싶은 모델을 알려주세요. 이 시점에서 필요할 경우 로깅을 추가하여 실행할 쿼리를 알려줄 수 있습니다. –