Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

сети:бинарный_журнал_обновлений_mysql [2013/10/03 10:19] (текущий)
Строка 1: Строка 1:
 +====== бинарный журнал обновлений mysql ======
 +Применимость:​ Linux, MySQL
  
 +Слова для поиска:​ бинарные логи, mysql-bin
 +----
 +===== Задача:​ =====
 +  - Нужно средство восстановления данных в случае повреждения базы данных или нарушения ее целостности.
 +  - Я обнаружил в /​var/​log/​mysql множество огромных файлов с именами типа mysql-bin.000001,​ mysql-bin.000002. Как их удалить?​
 +
 +===== Решение:​ =====
 +
 +Если данные на вашем сервере представляют некую ценность,​ то будет разумно обеспечить условия для возможности восстановления данных в случае их повреждения.
 +
 +В этом случае резервное копирование нужно обязательно,​ но нередко и резервная копия может оказаться неработоспособной,​ неактуальной и т.п.
 +
 +В MySQL предусмотрена возможность ведения бинарного журнала обновлений который содержит всю информацию об измененных данных с начала ведения журнала. Это может быть использовано для репликации данных между серверами или, в случае необходимости,​ для восстановления данных. Например,​ у вас периодичность ​ резервного копирования один раз в неделю или в день, но если у вас есть бинарный журнал,​ то вы сможете восстановить состояние базы и на момент более поздний чем имеющаяся резервная копия.
 +
 +==== Конфигурация ====
 +
 +Активируем бинарные логи в секции **[mysqld]** файла **/​etc/​my.cnf** (/​etc/​mysql/​my.cnf)
 +
 +<​code|/​etc/​my.cnf>​
 +#​включить журнал
 +log-bin=mysql-bin
 +
 +# Хранить 7 дней.
 +expire_logs_days = 7
 +
 +# Кэш бинарного лога
 +binlog-cache-size = 128K
 +
 +# Синхронная запись в файл журнала. Замедляет работу,​ но опция необходима если ваш сервер не имеет источник бесперебойного питания или возможно некорректное завершение работы сервера по другим причинам.
 +sync-binlog = 1
 +
 +# лимит размера лога "​файла"​
 +max-binlog-size = 350M
 +
 +# максимальный размер кэша.
 +max-binlog-cache-size = 90M
 +</​code>​
 +
 +После перезагрузки mysql  вы увидите в /​var/​lib/​mysql ​ файл mysqld-bin.00001
 +
 +==== Восстановление базы ====
 +
 +
 +Для работы с бинарными логами понадобится утилита mysqlbinlog. ​
 +Утилита обрабатывает файлы журнала и выводит пригодный к использованию SQL код прямо в консоль. ​
 +Вывод можно перенаправить в файл ​
 +  mysqlbinlog [параметры] [лог_файлы] > файл.sql
 +или непосредственно в MySQL 
 +  mysqlbinlog [параметры] | mysql [параметры]
 +
 +<note important>​Не рекомендуется загружать данные из логов непосредственно в базу. В некоторых случаях это приводит к порче базы. Ниже сказано об этом. </​note>​
 +
 +Можно указать файл журнала для вывода в параметрах утилиты. Например:​
 +
 +  mysqlbinlog -s -d db_name -r out.sql mysql-bin.000012
 +
 +В данном случае будет обработан файл mysql-bin.000012 (из текущей директории),​ вывод оправится в out.sql, будут выведены только команды,​ относящиеся к изменению базы с именем db_name. Параметром -s мы запретили вывод дополнительной служебной информации.
 +
 +Ещё пример:​
 +
 +  mysqlbinlog -D -s -d NAME_BD -u USER_BD --start-datetime="​2013-05-08 19:​35:​15"​ -t mysql-bin.000001 > my_new_bd.sql
 +
 +  * -s запрещаем вывод дополнительной служебной информации.
 +  * -d база-данных имя.
 +  * -u пользователь базы-данных.
 +  * -D который запрещает ведение лога.
 +  * -t говорим,​ что обрабатывать и логи нужно.
 +
 +Здесь мы ограничиваем вывод запросов,​ которые выполнялись пользователем USER_BD начиная с указанной даты. Параметр -t сообщает утилите,​ что нужно обрабатывать и логи, которые идут после файла mysql-bin.000001. ​
 +<note important>​Обратите внимание,​ что если вы будете перенаправлять вывод сразу в MySQL, то в журнал обновлений добавятся свежие записи и произойдет зацикливание.</​note> ​
 +Для предотвращения добавим еще и параметр -D, который запрещает ведение лога. Этот запрет будет доступен только если выполнять команду из под рута.
 +
 +Теперь можно загрузить в базу восстановленные из журнала данные.
 +
 +  mysql -u root -p < my_new_bd.sql
 +
 +==== Удаление файлов журнала ====
 +
 +Если у вас проблемы с дисковым пространством и файлы логов надо будет срочно удалить...
 +
 +**Различные варианты удаления:​**
 +
 +Удалить логи до mysql-bin.010
 +  echo 'PURGE BINARY LOGS TO '​mysql-bin.010';'​ | mysql -u root -pPASSWORD
 +
 +Удалить логи до 2008-04-02 22:46:26
 +  echo 'PURGE BINARY LOGS BEFORE '​2008-04-02 22:​46:​26';'​ | mysql -u root -pPASSWORD
 +Удалить логи старше 3-х дней
 +  echo 'PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;' | mysql -u root -pPASSWORD
 +
 +Удалить все логи
 +  echo 'FLUSH LOGS;' | mysql -u root -pPASSWORD
 +  echo 'RESET MASTER;'​ | mysql -u root -pPASSWORD
 +
 +Если нужно изменить параметр срока хранения логов без перезагрузки сервера:​
 +  echo 'SET GLOBAL expire_logs_days=7;'​ | mysql -u root -pPASSWORD
 +  echo 'RESET MASTER;'​ | mysql -u root -pPASSWORD
 +
 +
 +
 +
 +
 +===== Смотрите также: =====
 +  * [[сети/​недостаточно_производительности_сервера_mysql]]
 +  * [[сети/​резервное_копирование_mysql]]
 +  * [[http://​www.mysql.ru/​docs/​man/​Binary_log.html|Бинарный журнал обновлений]]
 +  * [[http://​dev.mysql.com/​doc/​refman/​5.6/​en/​mysqlbinlog-backup.html|Using mysqlbinlog to Back Up Binary Log Files]]
 +  * [[http://​www.pythian.com/​blog/​mysqlbinlog-tips-and-tricks/​|mysqlbinlog Tips and Tricks]]
 +
 +---- 
 +Актуальность:​ 2013/10/03 10:41 
 +
 +{{tag>​mysql backup советы}}