Como registrar todos os Magento SQL?

23

Existe alguma maneira fácil de registrar todas as consultas executadas pelo Magento?

O objetivo é imprimir todo o SQL executado, por exemplo, durante o carregamento da página

Fra
fonte

Respostas:

43

Se você quiser ter certeza de que todo o SQL está realmente logado, sugiro usar um software de terceiros:

  • O Neon Profile SQL é realmente gratuito e funciona bem
    (você precisa editar o local.xml para anexar o Magento ao Neon ... ele funciona como um tipo de proxy SQL que registra tudo o que passa por ele)

Em alternativa, uma abordagem nativa do Magento / Varien poderia ser a seguinte:

  1. editar lib/Varien/Db/Adapter/Pdo/Mysql.php
  2. altere as seguintes propriedades para true(linha 103)
  3. você terá um arquivo de log a ser criado aqui var/debug/pdo_mysql.log

Aqui a linha deve ser alterada: (os comentários são auto-explicativos)

 /**
     * Write SQL debug data to file
     *
     * @var bool
     */
    protected $_debug               = true;

    /**
     * Minimum query duration time to be logged
     *
     * @var float
     */
    protected $_logQueryTime        = 0.05;

    /**
     * Log all queries (ignored minimum query duration time)
     *
     * @var bool
     */
    protected $_logAllQueries       = true;

    /**
     * Add to log call stack data (backtrace)
     *
     * @var bool
     */
    protected $_logCallStack        = true;

O log produzido é semelhante ao seguinte:

## 2014-06-26 12:18:47
## 10258 ## QUERY
SQL: SELECT `adminnotification_inbox`.* FROM `adminnotification_inbox` WHERE (title = 'Customize your order and invoice numbers to protect your sales using Order Number Customizer by XTENTO.') AND (url = 'http://www.xtento.com/magento-extensions/order-number-customizer.html?utm_source=feed&utm_medium=feed&utm_campaign=order_number_customizer')
AFF: 1
TIME: 0.0008

Caso tenha ativado, $_logCallStackvocê também terá uma parte do TRACE

TRACE: #1 Varien_Db_Adapter_Pdo_Mysql#00000000644036ff00007f14137095e6#->_debugStat(2, 'SELECT `adminnot...', array(), &Varien_Db_Statement_Pdo_Mysql#000000006440371700007f14137095e6#) called at [lib/Varien/Db/Adapter/Pdo/Mysql.php:424]
#2 Varien_Db_Adapter_Pdo_Mysql#00000000644036ff00007f14137095e6#->query(&Varien_Db_Select#000000006440371800007f14137095e6#, array()) called at [lib/Zend/Db/Adapter/Abstract.php:753]
#3 Varien_Db_Adapter_Pdo_Mysql[Zend_Db_Adapter_Abstract]#00000000644036ff00007f14137095e6#->fetchRow(&Varien_Db_Select#000000006440371800007f14137095e6#) called at [app/code/core/Mage/AdminNotification/Model/Resource/Inbox.php:116]
#4 Mage_AdminNotification_Model_Resource_Inbox#00000000644034c500007f14137095e6#->parse(&Mage_AdminNotification_Model_Inbox#00000000644034e900007f14137095e6#, array(array('severity' => 4, 'date_added' => '2013-10-23 13:00...', 'title' => 'Customizing your...', 'description' => 'Easily add new c...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-04-09 17:00...', 'title' => 'Customize your o...', 'description' => 'Customize your M...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-05-06 17:00...', 'title' => 'Process orders i...', 'description' => 'Process all your...', 'url' => 'http://www.xtent...'))) called at [app/code/core/Mage/AdminNotification/Model/Inbox.php:118]
#5 Mage_AdminNotification_Model_Inbox#00000000644034e900007f14137095e6#->parse(array(array('severity' => 4, 'date_added' => '2013-10-23 13:00...', 'title' => 'Customizing your...', 'description' => 'Easily add new c...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-04-09 17:00...', 'title' => 'Customize your o...', 'description' => 'Customize your M...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-05-06 17:00...', 'title' => 'Process orders i...', 'description' => 'Process all your...', 'url' => 'http://www.xtent...'))) called at [app/code/local/Xtento/XtCore/Model/Feed.php:57]
#6 Xtento_XtCore_Model_Feed#000000006440348500007f14137095e6#->checkUpdate(&Varien_Event_Observer#00000000644034d900007f14137095e6#) called at [app/code/core/Mage/Core/Model/App.php:1338]
#7 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->_callObserverMethod(&Xtento_XtCore_Model_Feed#000000006440348500007f14137095e6#, 'checkUpdate', &Varien_Event_Observer#00000000644034d900007f14137095e6#) called at [app/code/core/Mage/Core/Model/App.php:1317]
#8 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->dispatchEvent('controller_actio...', array('controller_actio...' => &Fishpig_Wordpress_Adminhtml_WordpressController#000000006440364a00007f14137095e6#)) called at [app/Mage.php:451]
#9 Mage::dispatchEvent('controller_actio...', array('controller_actio...' => &Fishpig_Wordpress_Adminhtml_WordpressController#000000006440364a00007f14137095e6#)) called at [app/code/core/Mage/Core/Controller/Varien/Action.php:528]
#10 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Core_Controller_Varien_Action]#000000006440364a00007f14137095e6#->preDispatch() called at [app/code/core/Mage/Adminhtml/Controller/Action.php:160]
#11 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Adminhtml_Controller_Action]#000000006440364a00007f14137095e6#->preDispatch() called at [app/code/core/Mage/Core/Controller/Varien/Action.php:408]
#12 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Core_Controller_Varien_Action]#000000006440364a00007f14137095e6#->dispatch('checkVersion') called at [app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:250]
#13 Mage_Core_Controller_Varien_Router_Admin[Mage_Core_Controller_Varien_Router_Standard]#00000000644036ae00007f14137095e6#->match(&Mage_Core_Controller_Request_Http#000000006440365c00007f14137095e6#) called at [app/code/core/Mage/Core/Controller/Varien/Front.php:176]
#14 Mage_Core_Controller_Varien_Front#000000006440365700007f14137095e6#->dispatch() called at [app/code/core/Mage/Core/Model/App.php:354]
#15 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->run(array('scope_code' => '', 'scope_type' => 'store', 'options' => array())) called at [app/Mage.php:687]
#16 Mage::run('', 'store') called at [index.php:87]
Fra
fonte
15

Ative o Zend SQL Profiler com o seguinte nó no seu app/etc/local.xml

<resources>
 <default_setup>
  <connection>
   <profiler>1</profiler>

Em seguida, você pode acessar o criador de perfil em algum lugar do seu código e recuperar muitas informações sobre todas as consultas executadas:

$profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();

Para simplesmente gerar todas as consultas:

print_r($profiler->getQueryProfiles());

Você pode adicionar essas duas linhas no final de index.phppara ver todas as consultas na parte inferior de cada página. Esteja ciente de que isso interromperá as solicitações AJAX que retornam uma resposta JSON; portanto, considere registrar as consultas em vez de imprimi-las, com este código (novamente, adicione-o no final de index.php):

$profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();
Mage::log(print_r($profiler->getQueryProfiles(), true), null, 'queries.log', true);

Então você encontrará todas as consultas em var/log/queries.log

Não se esqueça de remover as linhas novamente depois de concluir a depuração!

Fabian Schmengler
fonte
2

Não tenho 100% de certeza de que isso irá capturar todas as consultas, mas a maioria executa o método de consulta Zend_Db_Adapter_Abstract no

lib / Zend / Db / Adapter / Abstract.php

Com isso em mente, você pode adicionar temporariamente algumas instruções de depuração (a uma cópia feita em

app / code / local / Mage

estar seguro)

public function query($sql, $bind = array())
{
    // connect to the database if needed
    $this->_connect();

    // is the $sql a Zend_Db_Select object?
    if ($sql instanceof Zend_Db_Select) {
        if (empty($bind)) {
            $bind = $sql->getBind();
        }

        $sql = $sql->assemble();
    }
    echo '$sql' . "\n<br />\n";
    var_dump($bind);
TBI Infotech
fonte
2
Eu acho que eu usei uma abordagem similar uma vez, mas eu achei mais agradável o método sugerido por mim :)
Fra
"adiciona temporariamente algumas instruções de depuração para segurança". Não há nada seguro nessa abordagem.
Kevin Schroeder
2

Se você tem acesso ao servidor mysql e não possui outros projetos que executam consultas, tente adicionar o log geral do mysql. Veja aqui como fazer isso /programming/6479107/how-to-enable-mysql-query-log porque ele grava todas as consultas que o arquivo de log pode obter muito rapidamente, portanto, certifique-se de ativar depois que você terminar.

Emi
fonte