2009-07-03 9 views
3

J'ai mon fichier journal qui fonctionne, mais je reçois des informations superflues sur chaque ligne comme "29 Query", et je ne sais pas, mais il semble que les requêtes consignées sont l'interprétation de la façon dont MySQL traite chaque requête en interne. Existe-t-il un moyen de consigner automatiquement chaque requête telle qu'elle a été exécutée par l'application sans qu'aucune information supplémentaire ne soit ajoutée au journal par MySQL? Merci!Comment enregistrer uniquement les requêtes brutes dans MySQL?

EDIT:

En tant que partie d'offrir la prime, laissez-moi vous expliquer ma situation. Nous utilisons Magento Commerce, qui a une architecture de base de données EAV. Suivre n'importe quoi, et où il est stocké est un cauchemar absolu. Mon idée était d'insérer un produit dans la base de données de l'application, puis de consigner chaque requête exécutée au cours de ce processus. Cela a bien fonctionné, mais les bûches ont une tonne d'autre cruauté autour des questions. Je ne veux vraiment que quelque chose comme ceci:

1.) SELECT * FROM <TABLE>; 
2.) UPDATE <TABLE> SET <VALUE> = <VALUE>; 
3.) ... 
4.) ... 

Quelque chose de simple qui me dit ce qui a été exécuté pour que je ne dois pas aller passer au crible les contrôleurs et les modèles pour essayer d'obtenir tout cela. Je n'ai pas besoin de dates, d'heures, de numéros de ligne ou de quelque chose en plus.

+0

J'ai beaucoup travaillé avec magento. Si vous avez des questions plus spécifiques, je peux essayer de vous indiquer où sont les données! – benlumley

+1

quelle version de MySQL utilisez-vous? Il y a une approche soignée qui fonctionne seulement avec 5.1 et plus tard et je préfère éviter le temps de l'écrire si vous êtes coincé avec 5.0 ou plus tôt afin qu'il ne puisse pas vous aider. –

+0

http: // stackoverflow.com/questions/513452/mysql-set-names-near-the-top-of-the-slow-query-log – joe

Répondre

9

Pour activer ajouter le journal complet de requête qui suit à votre my.cnf:

log=/var/log/mysqldquery.log 

La volonté ci-dessus Enregistre toutes les requêtes dans le fichier journal. N'oubliez pas de redémarrer le service mysql après avoir apporté des modifications au fichier my.cnf.

Exemple de sortie des actions via SequelPro (client mac):

090721 11:06:45  51 Query  ALTER TABLE `test` ADD `name` varchar(10) DEFAULT NULL 
        51 Query  SHOW COLUMNS FROM `test` 
        51 Query  SHOW INDEX FROM `test` 
090721 11:06:57  51 Query  SHOW COLUMNS FROM `test` 
        51 Query  UPDATE `test` SET `id`='1', `name`='test' WHERE `id` = '1' AND `name` IS NULL LIMIT 1 
        51 Query  SELECT * FROM `test` LIMIT 0,100 
        51 Query  SELECT COUNT(1) FROM `test` 
090721 11:07:00  51 Query  UPDATE `test` SET `id`='2', `name`='test' WHERE `id` = '2' AND `name` IS NULL LIMIT 1 
        51 Query  SELECT * FROM `test` LIMIT 0,100 
        51 Query  SELECT COUNT(1) FROM `test` 

Sur * Les systèmes à base de NIX vous pouvez utiliser grep pour commencer

grep 'SELECT\|INSERT\|UPDATE' querylog.log 

Ou obtenir plus délicate et commencer à faire des choses comme:

grep 'SELECT\|INSERT\|UPDATE' querylog.log | awk '{$1="";$2="";print}' 

Cela vous donnerait quelque chose comme ça, pas parfait mais plus proche:

51 Query UPDATE `test` SET `id`='2', `name`='test' WHERE `id` = '2' AND `name` IS NULL LIMIT 1 
    SELECT * FROM `test` LIMIT 0,100 
    SELECT COUNT(1) FROM `test` 
    51 Query INSERT INTO `test` (`id`,`name`) VALUES ('3','testing') 
    SELECT * FROM `test` LIMIT 0,100 
    SELECT COUNT(1) FROM `test` 
+0

Je préfère remplacer les x premiers caractères après le grep: sed 's/^. {X} //' – soulmerge

1

Si vous faites référence au journal binaire, vous devez utiliser mysqlbinlog pour le transmettre afin d'obtenir une sortie significative.

cat log100.log | mysqlbinlog 
+0

Même en utilisant mysqlbinlog et --short-form option je reçois toujours un tas de déchets. –

+0

Aucune sélection n'est enregistrée dans le journal de la corbeille (à moins que ce soit insert ... select) –

4

Vous pouvez utiliser le fichier journal de requête mysql. Ajoutez ce paramètre lorsque vous démarrez MySQL:

--log=/var/log/mysqld.log 
Questions connexes