2010-06-13 5 views
0

J'ai sept fichiers binlog 1G MySQL que je dois utiliser pour récupérer des informations "perdues". J'ai juste besoin d'obtenir certaines instructions INSERT du journal (par exemple, où l'instruction commence par "INSERT INTO table SET field1 ="). Si je lance un mysqlbinlog (même si par base de données et en utilisant --short-form), j'obtiens un fichier texte de plusieurs centaines de mégaoctets, ce qui rend presque impossible l'analyse de tout autre programme.Récupération de requête MySQL BinLog

Existe-t-il un moyen de récupérer simplement certaines instructions sql du journal? Je n'ai pas besoin de l'information auxiliaire (horodatage, numéro d'auto-incrémentation, etc.). J'ai juste besoin d'une liste d'instructions SQL qui correspondent à une certaine chaîne. Idéalement, je voudrais avoir un fichier texte qui répertorie seulement les instructions SQL, telles que:

INSERT INTO table SET field1='a'; 
INSERT INTO table SET field1='tommy'; 
INSERT INTO table SET field1='2'; 

je pourrais obtenir ce en exécutant mysqlbinlog dans un fichier texte, puis analyse les résultats sur la base d'une chaîne, mais le le fichier texte est beaucoup trop gros. Il expire juste n'importe quel script que je cours et le rend même impossible à ouvrir dans un éditeur de texte.

Merci pour votre aide à l'avance.

Répondre

2

Je n'ai jamais reçu de réponse, mais je vais vous dire ce que j'ai fait pour m'en sortir. 1. Ran mysqlbinlog dans un fichier texte 2. Création d'un script PHP utilisant des fgets pour lire chaque ligne du journal 3. Lors de la lecture de chaque ligne, le script l'analyse à l'aide de la fonction stristr 4. Si la ligne correspond à la ligne chaîne que je recherche, il enregistre la ligne dans un fichier

Il faut un certain temps pour exécuter mysqlbinlog et le script PHP, mais il ne tarde plus. J'ai d'abord utilisé fread en PHP, mais cela lit le fichier entier dans la mémoire et a causé le crash du script sur de gros fichiers journaux (1G). Maintenant, cela prend plusieurs minutes (je mets aussi la variable max_execution_time à plus grande taille), mais ça fonctionne comme un charme. fgets obtient une ligne à la fois, donc il ne prend pas presque autant de mémoire.