2010-06-13 5 views
0

У меня есть семь файлов binlog 1G MySQL, которые я должен использовать для получения некоторой «утерянной» информации. Мне нужно только получить определенные инструкции INSERT из журнала (например, где оператор начинается с «INSERT INTO table SET field1 =»). Если я просто запустил mysqlbinlog (даже если для каждой базы данных и с использованием --short-form), я получаю текстовый файл размером несколько сотен мегабайт, что делает невозможным его синтаксический анализ с любой другой программой.Вывод журнала MySQL BinLog

Есть ли способ получить некоторые SQL-заявления из журнала? Мне не нужна какая-либо вспомогательная информация (временные метки, автоинкремент № и т. Д.). Мне просто нужен список операторов sql, которые соответствуют определенной строке. В идеале я хотел бы иметь текстовый файл, который только перечисляет эти SQL заявления, такие как:

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

я мог бы получить, что запустив mysqlbinlog в текстовый файл, а затем синтаксический анализ результатов на основании строки, но текстовый файл слишком велик. Он просто лишает какой-либо скрипт, который я запускаю, и даже делает невозможным открытие в текстовом редакторе.

Спасибо за вашу помощь заранее.

ответ

2

Я никогда не получал ответа, но я расскажу вам, что я сделал, чтобы пройти. 1. Ran mysqlbinlog в текстовый файл. 2. Создал скрипт PHP, который использует fgets для чтения каждой строки журнала. 3. Прокручивая каждую строку, скрипт анализирует ее с помощью функции stristr 4. Если строка соответствует строка, которую я ищу, он записывает строку в файл

Требуется некоторое время, чтобы запустить mysqlbinlog и PHP-скрипт, но он больше не работает. Первоначально я использовал fread в PHP, но читал весь файл в памяти и приводил к сбою сценария в больших файлах журнала (1G). Теперь для запуска требуется несколько минут (я также устанавливаю максимальную переменную max_execution_time), но она работает как шарм. fgets получает по одной строке за раз, поэтому она не занимает почти столько же памяти.