2014-05-25 2 views
4

Il s'agit d'une question de réglage purement MySQL sur la journalisation des tentatives SQL échouées. J'ai besoin d'une solution pour consigner les SQLs ayant échoué sur la base de données MySQL.Le journal MySQL a échoué aux tentatives de requête

Le MySQL general query log ne fonctionne pas ici, car il enregistrera uniquement les requêtes réussies. J'ai besoin de connaître les échecs dans un fichier journal différent.

Mon scénario est le suivant: j'ai besoin de nettoyer un gros SQL et des scripts PHP désordonnés (littéralement, environ 7 000 SQLs sont exécutés par page). Puisque les erreurs sont supprimées sur le serveur, même les requêtes SQL échouées continueront et montreront le bon contenu sur le site Web. Mais je suis sûr, il y a beaucoup d'erreurs SQL. J'ai trouvé 2 liens mais je ne peux pas réessayer. This one et writing server side audit plugin dans MySQL.

Utilise Kontrolbase comme réponse mentioned here.

+0

Vous pouvez consigner les erreurs du côté PHP dans le journal des erreurs Apache. Ou y a-t-il une raison pour que ce ne soit pas une alternative viable? –

+0

Non Lorenz, il n'y a rien à propos de PHP, mais vous pointez pour vérifier que le journal est bon. Je veux enregistrer une requête non valide en cours d'exécution sur le serveur DB. –

Répondre

0

Percona Server 5.5.37 et 5.6.17 incluent une implémentation d'un plugin d'audit libre et open-source. Lisez à ce sujet ici: http://www.percona.com/doc/percona-server/5.6/management/audit_log_plugin.html

Le plug-in d'audit enregistre à la fois les requêtes réussies et les requêtes erronées. Voici un exemple où j'interrogé ma table foo et une table inexistante foobar:

<AUDIT_RECORD 
    "NAME"="Query" 
    "RECORD"="489_2014-05-23T14:06:09" 
    "TIMESTAMP"="2014-05-23T14:08:13 UTC" 
    "COMMAND_CLASS"="select" 
    "CONNECTION_ID"="32709" 
    "STATUS"="0" 
    "SQLTEXT"="select * from foo" 
    "USER"="root[root] @ localhost []" 
    "HOST"="localhost" 
    "OS_USER"="" 
    "IP"="" 
/> 
<AUDIT_RECORD 
    "NAME"="Query" 
    "RECORD"="490_2014-05-23T14:06:09" 
    "TIMESTAMP"="2014-05-23T14:08:19 UTC" 
    "COMMAND_CLASS"="select" 
    "CONNECTION_ID"="32709" 
    "STATUS"="1146" 
    "SQLTEXT"="select * from foobar" 
    "USER"="root[root] @ localhost []" 
    "HOST"="localhost" 
    "OS_USER"="" 
    "IP"="" 
/> 

STATUS=1146 est indiqué pour la requête d'erreur ci-dessus. Voir http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html pour référencer les erreurs du serveur. Par exemple, 1146 est ER_NO_SUCH_TABLE.

Si vous ne pouvez pas utiliser cette solution, vous devrez modifier votre code PHP pour supprimer la suppression des erreurs et consigner les erreurs.

+0

Très bien, et merci. Il semble que c'est bon pour les requêtes réussies. J'ai besoin de connaître les requêtes qui n'ont pas pu être exécutées. La liste des erreurs est également importante. Pouvons-nous modifier la configuration du serveur et vider les requêtes échouées dans un fichier journal? –

+0

@BimalPoudel, dans mon exemple ci-dessus, il enregistre les requêtes qui entraînent une erreur, et la valeur de l'erreur est entrée dans le journal d'audit dans le champ STATUS. Qu'est-ce que je rate? –

Questions connexes