سؤال

لدي سبعة ملفات 1G MySQL Binlog التي يجب أن أستخدمها لاسترداد بعض المعلومات "المفقودة". أحتاج فقط إلى الحصول على بعض عبارات إدراج من السجل (على سبيل المثال ، حيث يبدأ العبارة بـ "إدراج في مجموعة الجدول Field1 ="). إذا قمت فقط بتشغيل mysqlbinlog (حتى لو كان لكل قاعدة بيانات ومع استخدام-short-for) ، أحصل على ملف نصي يزيد عدة مئات من ميغابايت ، مما يجعل من المستحيل تقريبًا تحليل أي برنامج آخر.

هل هناك طريقة لاسترداد بعض عبارات SQL من السجل؟ لا أحتاج إلى أي من المعلومات المساعدة (الطوابع الزمنية ، أو التلقائي #S ، وما إلى ذلك). أنا فقط بحاجة إلى قائمة من عبارات SQL التي تتطابق مع سلسلة معينة. من الناحية المثالية ، أود الحصول على ملف نصي يسرد فقط عبارات SQL هذه ، مثل:

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

يمكنني الحصول على ذلك من خلال تشغيل mysqlbinlog إلى ملف نصي ثم تحليل النتائج بناءً على سلسلة ، ولكن الملف النصي كبير جدًا. إنه لأمر فقط أي برنامج نصي أقوم بتشغيله ويجعل من المستحيل فتحه في محرر نصوص.

شكرا لمساعدتكم مقدما.

هل كانت مفيدة؟

المحلول

لم أتلق إجابة أبدًا ، لكنني سأخبرك بما فعلته للحصول على. 1. قم بتشغيل mysqlbinlog إلى textfile 2. إنشاء برنامج نصي php يستخدم fgets لقراءة كل سطر من السجل 3. أثناء التحلق من خلال كل سطر ، يقوم البرنامج النصي بتحليله باستخدام وظيفة Strister 4. إذا كان الخط يطابق السلسلة التي أبحث عنها ل ، يسجل السطر إلى ملف

يستغرق الأمر بعض الوقت لتشغيل mysqlbinlog ونص PHP ، لكنه لم يعد في الخارج. لقد استخدمت في الأصل Fread في PHP ، لكن هذا يقرأ الملف بأكمله في الذاكرة وتسبب في تعطل البرنامج النصي على ملفات السجل الكبيرة (1G). الآن ، يستغرق تشغيل عدة دقائق (قمت أيضًا بتعيين متغير Max_Execution_Time ليكون أكبر) ، لكنه يعمل مثل السحر. تحصل FGETS على سطر واحد في كل مرة ، لذلك لا يستغرق ما يقرب من الذاكرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top