Mysqlbinlog - работаем с бинарными логами MySQL

  • user warning: Duplicate entry '30188485' for key 'PRIMARY' query: INSERT INTO accesslog (title, path, url, hostname, uid, sid, timer, timestamp) values('Выбор электрического кабеля', 'node/317', 'http://muff.kiev.ua/content/vybor-elektricheskogo-kabelya', '216.73.216.38', 0, 'jm7i68jmnkal7r98hmftduf8j6', 152, 1767401191) in /usr/local/www/muff.kiev.ua/modules/statistics/statistics.module on line 63.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:6c59a609bb2456d6ae08612355b37942' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><img alt=\"MySQL логотип\" src=\"http://muff.kiev.ua/files/mysql-logo.jpg\" width=\"140\" height=\"102\" jquery1331018338453=\"45\" /></p>\n<p class=\"rtejustify\">Начиная с версии 4.1.3 MySQL записывает все запросы, которые приводят к изменению данных, в бинарный журнал обновлений (binary log). Но эта опция может оказаться и отключенной по умолчанию. Включается поддержка бинарных логов&nbsp;строкой log-bin=mysql-bin в конфигурационном файле (my.cnf). Ведутся логи и в том случае, если MySQL запущен с ключом --log-bin[=file_name].</p>\n<p class=\"rtejustify\">Журнал обновлений обычно хранится в файлах вида mysql-bin. циферки.&nbsp;Пример:&nbsp;<span class=\"Apple-style-span\" style=\"widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 13px \'Times New Roman\'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px\"><span class=\"Apple-style-span\" style=\"text-align: left; font-family: sans-serif; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px\">mysql-bin.000171.</span></span>&nbsp;Если в настройках не задан полный путь, эти файлы будут размещены в директории, в которой MySQL хранит базы данных. По умолчанию размер каждого файла - 1 ГБ.</p>\n<p class=\"rtejustify\">Для работы с бинарными логами понадобится утилита mysqlbinlog. Она идёт в комплекте с MySQL сервером. Утилита обрабатывает файлы журнала и выводит пригодный к использованию SQL код прямо в консоль. Вывод можно перенаправить в файл (mysqlbinlog [параметры] [лог_файлы] &gt; файл .sql), непосредственно в MySQL (mysqlbinlog [параметры] / mysql [параметры] ) или указать файл для вывода в параметрах утилиты. Например:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># mysqlbinlog -s -d db_name -r out.sql mysql-bin.000038</td>\n</tr>\n</tbody>\n</table>\n<p>В данном случае будет обработан файл mysql-bin.000038 (из текущей директории), вывод оправится в out.sql, будут выведены только команды, относящиеся к изменению базы с именем db_name. Параметром -s мы запретили вывод дополнительной служебной информации.</p>\n<p>Более полезный пример:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># mysqlbinlog -s -d db_name -u user_name --start-datetime=&quot;2009-01-23 21:10:00&quot; -t mysql-bin.000001 &gt; out.sql</td>\n</tr>\n</tbody>\n</table>\n<p>Здесь мы, кроме прочего, ограничиваемся выводом запросов, которые выполнялись пользователем user_name начиная с указанной даты. Параметр -t сообщает утилите, что нужно обрабатывать и логи, которые идут после файла mysql-bin.000001. Обратите внимание, что если вы будете перенаправлять вывод сразу в MySQL, то в журнал обновлений добавятся свежие записи и произойдёт зацикливание. Для предотвращения следует добавить ещё и параметр -D, который запрещает ведение лога. Запрет будет доступен только если выполнять команду из под рута. Но&nbsp;перенаправление вывода прямо в мускул не рекомендуется.</p>\n<p>Остальные параметры подсматриваем так же, как и для любой консольной программы:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># mysqlbinlog --help</td>\n</tr>\n</tbody>\n</table>\n<p>Но если все хорошо, восстанавливать из дампов ничего не нужно... А бинарные логи имеют привычку занимать много места не сервере (недавно посмотрел на одном из серверов и ужаснулся - больше 50 гигабайт!). Поэтому советую время от времени создавать дамп всей базы данных MySQL&nbsp;с последующим удалением бинарных логов. Для этого необходимо воспользоваться следующей командой:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># mysqldump --flush-logs --delete-master-logs --all-databases -u&nbsp;user_name&nbsp; -p &gt; out.sql</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Чтобы автоматизировать этот процесс,&nbsp;добавим в my.cnf (в секцию [mysqld] ) такую строку:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>expire_logs_days = 7</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Этой переменной мы указываем, что необходимо хранить записи только за последние 7 дней. После внесения изменений необходимо перезапустить MySQL:</p>\n<p class=\"rtejustify\">\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># sh /usr/local/etc/rc.d/mysql-server restart</td>\n</tr>\n</tbody>\n</table>\n</p>\n<p>Также необходимо дать команду MySQL очистить логи:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>mysql&gt; <strong>flush logs;<br />\n </strong>Query OK, 0 rows affected (0.00 sec)</td>\n</tr>\n</tbody>\n</table>\n<p>&nbsp;</p>\n', created = 1767401200, expire = 1767487600, headers = '', serialized = 0 WHERE cid = '2:6c59a609bb2456d6ae08612355b37942' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a class=\"thickbox\" href=\"/files/imagepicker/1/wake_up_ua.png\"><img alt=\"Вставай, Україно!\" class=\"imgp_img\" src=\"/files/imagepicker/1/thumbs/wake_up_ua.png\" style=\"height:200px; width:150px\" /></a></p>\n', created = 1767401200, expire = 1767487600, headers = '', serialized = 0 WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:cc913d232116f0426090404133377d88' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a href=\"http://muff.kiev.ua/rss.xml\"><img alt=\"RSS\" width=\"160\" height=\"60\" src=\"http://muff.kiev.ua/files/muf-rss.png\" /></a></p>\n', created = 1767401200, expire = 1767487600, headers = '', serialized = 0 WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:39649256b636e3d5ded656bc52bd8c01' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
Версия для печатиОтправить другуPDF version

MySQL логотип

Начиная с версии 4.1.3 MySQL записывает все запросы, которые приводят к изменению данных, в бинарный журнал обновлений (binary log). Но эта опция может оказаться и отключенной по умолчанию. Включается поддержка бинарных логов строкой log-bin=mysql-bin в конфигурационном файле (my.cnf). Ведутся логи и в том случае, если MySQL запущен с ключом --log-bin[=file_name].

Журнал обновлений обычно хранится в файлах вида mysql-bin. циферки. Пример: mysql-bin.000171. Если в настройках не задан полный путь, эти файлы будут размещены в директории, в которой MySQL хранит базы данных. По умолчанию размер каждого файла - 1 ГБ.

Для работы с бинарными логами понадобится утилита mysqlbinlog. Она идёт в комплекте с MySQL сервером. Утилита обрабатывает файлы журнала и выводит пригодный к использованию SQL код прямо в консоль. Вывод можно перенаправить в файл (mysqlbinlog [параметры] [лог_файлы] > файл .sql), непосредственно в MySQL (mysqlbinlog [параметры] / mysql [параметры] ) или указать файл для вывода в параметрах утилиты. Например:

# mysqlbinlog -s -d db_name -r out.sql mysql-bin.000038

В данном случае будет обработан файл mysql-bin.000038 (из текущей директории), вывод оправится в out.sql, будут выведены только команды, относящиеся к изменению базы с именем db_name. Параметром -s мы запретили вывод дополнительной служебной информации.

Более полезный пример:

# mysqlbinlog -s -d db_name -u user_name --start-datetime="2009-01-23 21:10:00" -t mysql-bin.000001 > out.sql

Здесь мы, кроме прочего, ограничиваемся выводом запросов, которые выполнялись пользователем user_name начиная с указанной даты. Параметр -t сообщает утилите, что нужно обрабатывать и логи, которые идут после файла mysql-bin.000001. Обратите внимание, что если вы будете перенаправлять вывод сразу в MySQL, то в журнал обновлений добавятся свежие записи и произойдёт зацикливание. Для предотвращения следует добавить ещё и параметр -D, который запрещает ведение лога. Запрет будет доступен только если выполнять команду из под рута. Но перенаправление вывода прямо в мускул не рекомендуется.

Остальные параметры подсматриваем так же, как и для любой консольной программы:

# mysqlbinlog --help

Но если все хорошо, восстанавливать из дампов ничего не нужно... А бинарные логи имеют привычку занимать много места не сервере (недавно посмотрел на одном из серверов и ужаснулся - больше 50 гигабайт!). Поэтому советую время от времени создавать дамп всей базы данных MySQL с последующим удалением бинарных логов. Для этого необходимо воспользоваться следующей командой:

# mysqldump --flush-logs --delete-master-logs --all-databases -u user_name  -p > out.sql

Чтобы автоматизировать этот процесс, добавим в my.cnf (в секцию [mysqld] ) такую строку:

expire_logs_days = 7

Этой переменной мы указываем, что необходимо хранить записи только за последние 7 дней. После внесения изменений необходимо перезапустить MySQL:

# sh /usr/local/etc/rc.d/mysql-server restart

Также необходимо дать команду MySQL очистить логи:

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)

 

Ваша оценка: Нет Средняя: 4.2 (6 голосов)

Вставай, Україно!

Литература

Если Админ отправляется в главный офис со словами "я пошел размножаться" - это не значит, что он начнет приставать к секретарше, его интересует ксерокс.