MySQL BinLog Извлечение оператора
У меня есть семь файлов 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 ответ
Я никогда не получал ответ, но я расскажу вам, что я сделал, чтобы пройти. 1. Запустил mysqlbinlog в текстовый файл 2. Создал PHP-скрипт, который использует fgets для чтения каждой строки журнала 3. При циклическом просмотре каждой строки скрипт анализирует его с помощью функции stristr 4. Если строка соответствует искомой строке для, он записывает строку в файл
Для запуска mysqlbinlog и PHP-скрипта требуется некоторое время, но оно больше не истекает. Первоначально я использовал fread в PHP, но он считывает весь файл в память и вызывает сбой сценария на больших (1G) файлах журнала. Теперь для запуска требуется несколько минут (я также установил большую переменную max_execution_time), но она работает как шарм. fgets получает по одной строке за раз, поэтому он не занимает почти столько же памяти.