2009-03-06 6 views
2

У меня возникла проблема, когда я запускаю некоторый запрос, и процесс mysqld начинается с 100% -ной мощности ЦП, не заканчивая. Я хочу точно определить этот запрос. Проблема в том, что log/development.log содержит только завершенные запросы. Есть идеи?Запрос журнала перед его выполнением

ответ

1

Если у вас есть оценки в MySQL, рассмотрим запрос SQL

SHOW PROCESSLIST 

Или из командной строки:

mysqladmin processlist 

Альтернативно, самый мощный способ является переопределить метод «выполнить» из экземпляр ActiveRecord :: Base. В данной статье показан общий подход:

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

Вы поместите этот код в application.rb:

# 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 запросов, отсутствующих индексов или другого убийцы производительности.

Вы говорите, что в журнале разработчиков есть только завершенные запросы. Разве вы не можете решить, что будет делать следующий запрос?

другие Ваши варианты включают начиная туздЫ с бревном (я думаю, что имена некоторых из них изменились):

mysqld --log[=file_name] --log-slow-queries[=file_name] 

Отображение текущего списка выписки по PROCESSLIST внутри MySQL:

show processlist; 

Чтобы предотвратить повторение подобных событий, вы также можете потратить некоторое время на просмотр монитора производительности рельсов, например, RPM от New Relic (http://www.newrelic.com/).

Надеюсь, это поможет!

+0

Согласовано - посмотрев на разработчика журнала вы можете увидеть, какой метод управления был вызван, который должен скажите, на какую модель смотреть. В этот момент вы можете добавить журнал, если необходимо, чтобы указать, какой запрос будет запущен. –

Смежные вопросы