2009-03-06 10 views
2

Ich habe ein Problem, wo ich eine Abfrage ausführen und ein mysqld-Prozess beginnt mit 100% CPU-Leistung, ohne zu beenden. Ich möchte diese Abfrage genau lokalisieren. Das Problem ist, dass log/development.log nur Abfragen enthält, die beendet wurden. Irgendeine Idee?Log-Abfrage vor der Ausführung

Antwort

1

Wenn Sie MySQL beurteilen zu können, sollten Sie die SQL-Abfrage

SHOW PROCESSLIST 

Oder von der Kommandozeile:

mysqladmin processlist 

Alternativ kann der beste Weg ist, um die ‚ausführen‘ Methode außer Kraft setzen die ActiveRecord :: Base-Verbindungsinstanz. Dieser Artikel zeigt den allgemeinen Ansatz:

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

Sie diesen Code in application.rb setzen:

# 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

Sie können einen Blick auf Laufen/unfertig Aussagen nehmen über den

show processlist; 

Befehl.

5

Ich denke, Sie haben ein paar Möglichkeiten dafür. Die erste sieht sich wirklich Ihr Development.log an und sieht, welche Aktionen es verursachen. Sehen Sie sich die Abfragen an, nach denen Sie rails suchen, und versuchen Sie, diese bestimmte Abfrage genau zu lokalisieren. Wenn es viel Zeit in Anspruch nimmt, bedeutet das wahrscheinlich, dass Sie so etwas wie das Zurückgeben von n + 1-Abfragen, fehlenden Indizes oder eines anderen Performance-Mörders tun.

Sie sagen, dass das Dev-Protokoll nur Abfragen hat, die abgeschlossen sind. Können Sie nicht herausfinden, was die nächste Abfrage wäre?

Weitere Optionen beinhalten das Start mysqld mit einem log (ich glaube, die Namen einiger dieser geändert haben):

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

die aktuelle Anweisungsliste angezeigt PROCESS mit aus mysql:

show processlist; 

Um zu verhindern, dass so etwas wieder passiert, könntest du dir auch etwas Zeit nehmen, um einen Schienenleistungsmonitor wie RPM von New Relic (http://www.newrelic.com/) zu betrachten.

Ich hoffe, das hilft!

+0

vereinbart - durch im Entwickler log suchen Sie sehen können, welche Controller-Methode aufgerufen wurde, das sollte sagen Sie, welches Modell zu betrachten ist. Zu diesem Zeitpunkt können Sie die Protokollierung bei Bedarf hinzufügen, um Ihnen mitzuteilen, welche Abfrage ausgeführt werden soll. –

Verwandte Themen