MySQL BinLog Извлечение оператора - PullRequest
0 голосов
/ 13 июня 2010

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

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

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

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

Заранее спасибо за помощь.

1 Ответ

2 голосов
/ 16 июня 2010

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

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

...