RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

4.9 Протоколы в MySQL

MySQL имеет несколько различных журналов (протоколов), которые могут помочь Вам выяснить то, что происходит внутри mysqld:

Файл регистрации ошибокПроблемы со стартом, работой или остановкой mysqld.
Файл регистрации isamРегистрирует все изменения для таблиц системы ISAM. Использован только для отладки isam-кода.
Файл регистрации запросовРегистрирует все установленные подключения и выполненные запросы.
Файл регистрации модификацийСохраняет все инструкции, которые изменяют данные.
Двоичный файл регистрацииСохраняет все инструкции, которые изменяет что-либо. Использован также для репликации.
Медленный файл регистрацииСохраняет все запросы, которые заняли времени больше, чем long_query_time для своего выполнения или не использовали индексы.

Все файлы регистрации могут быть найдены в каталоге данных mysqld. Вы можете вынуждать mysqld вновь открывать журналы (или переключаться на новые журналы), выполняя команду FLUSH LOGS. Подробности в разделе "4.5.3 Синтаксис FLUSH".

4.9.1 Файл регистрации ошибок

Сервер mysqld пишет все ошибки на stderr, который скрипт safe_mysqld переназначает в файл с именем 'hostname'.err. В Windows mysqld пишет ошибки в файл с именем \mysql\data\mysql.err.

Этот протокол содержит информацию, указывающую, когда mysqld был запущен и остановлен, а также любые критические ошибки. Если mysqld неожиданно свалился, и safe_mysqld должен перезапустить mysqld, safe_mysqld оставит строку restarted mysqld в этом файле. Этот файл регистрации также сохраняет предупреждение, если mysqld обращает внимание на таблицу, которая должна быть автоматически проверена или восстановлена.

На некоторых операционных системах, файл регистрации ошибок будет содержать трассировку стека для случая падения mysqld. Это может использоваться, чтобы выяснить, где и почему свалился mysqld. Подробности в разделе "6.1.4 Использование трассировки стека".

4.9.2 Файл регистрации запросов

Если Вы хотите знать, что происходит внутри mysqld, Вы должны запустить его с опцией --log[=file]. Это регистрирует все подключения и запросы в журнале (по умолчанию `'hostname'.log'). Этот файл регистрации может быть очень полезен, когда Вы подозреваете ошибку в коде клиента и хотите знать точно, что именно ему передавал mysqld.

По умолчанию скрипт mysql.server запускает сервер MySQL с опцией -l. Если Вы нуждаетесь в лучшей эффективности, когда запускаете MySQL в промышленной среде, Вы можете удалить опцию -l из mysql.server или заменить ее на --log-binary.

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

4.9.3 Файл регистрации модификаций

ОБРАТИТЕ ВНИМАНИЕ: Файл регистрации модификаций заменен двоичным файлом регистрации. Подробности в разделе "4.9.4 Двоичный файл регистрации".

При запуске с опцией --log-update[=file_name] mysqld пишет журнал, содержащий все команды SQL, которые меняют данные. Если имя файла не задано, в качестве значения по умолчанию используется имя хоста. Если имя файла задано, но не содержит путь, файл будет написан в каталоге данных. Если file_name не имеет расширения, mysqld создаст имена журнала так: file_name.###, здесь ### номер, который будет увеличен каждый раз, когда Вы выполняете команды mysqladmin refresh, mysqladmin flush-logs, FLUSH LOGS или перезапускаете сервер.

ОБРАТИТЕ ВНИМАНИЕ: Для работы вышеупомянутой схемы Вы НЕ должны создавать свои собственные файлы с именами, совпадающими с именем файла регистрации модификаций + некоторые расширения, которые могут быть расценены как номер, в каталоге, используемом файлом регистрации модификаций!

Если Вы используете параметры --log или -l, mysqld пишет общий файл регистрации с именем файла `hostname.log'. Перезапуски не создадут новый журнал, просто старый будет закрываться и открываться вновь. В этом случае его можно копировать (в Unix-системах) так:

mv hostname.log hostname-old.log
mysqladmin flush-logs
cp hostname-old.log to-backup-directory
rm hostname-old.log

Регистрация модификаций интеллектуальна потому, что регистрирует только инструкции, которые, действительно, модифицирует данные. Так что команда UPDATE или DELETE с WHERE, которая не находит никаких строк, не будет записана в файл регистрации. Это даже пропускает инструкции UPDATE, которые устанавливают столбец в значение, которое он уже имеет!

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

Если Вы хотите модифицировать базу данных из журналов модификации, Вы могли бы делать следующее (считается, что Ваши файлы регистрации модификаций имеют имена формы `file_name.###'):

shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql

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

Это может быть полезно, если Вы должны возвратиться к файлам копии после аварийной ситуации, и Вы хотите восстановить модификации, которые произошли между резервированием и слетом системы.

4.9.4 Двоичный файл регистрации

В будущем двоичный файл регистрации полностью заменит собой файл регистрации модификаций, так что я рекомендую Вам перейти на этот формат файла регистрации как можно скорее!

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

Двоичный файл регистрации также используется, когда Вы копируете данные на подчиненный компьютер с главного. Подробности в разделе "4.10 Репликация в MySQL".

При запуске с параметром --log-bin[=file_name] mysqld пишет журнал, содержащий все команды SQL, которые меняли данные в базе. Если имя файла не задано, используется имя хоста с суффиксом -bin. Если имя файла задано, но не содержит путь, файл будет записан в каталог данных.

Вы можете использовать следующие параметры для mysqld, чтобы воздействовать на то, что регистрируется в двоичном файле регистрации:

binlog-do-db=database_name Сообщает, что следует регистрировать модификации для определенной базы данных и исключать все другие, не упомянутые явно (например: binlog-do-db=some_database).
binlog-ignore-db=database_name Сообщает, что модификации данной базы данных не должны регистрироваться в двоичном файле регистрации (например: binlog-ignore-db=some_database).

К имени двоичного файла регистрации mysqld конкатенирует расширение, которое является номером, растущим каждый раз, когда Вы выполняете команды mysqladmin refresh, mysqladmin flush-logs, FLUSH LOGS или перезапускаете весь сервер.

Чтобы знать, которые двоичные журналы использовались, mysqld также создает двоичный индексный файл регистрации, который содержит имена всех используемых двоичных журналов. По умолчанию он имеет то же самое имя, что и двоичный журнал, но с расширением '.index'. Вы можете изменять имя двоичного индексного файла опцией --log-bin-index=[filename].

Если Вы используете репликацию, то не должны удалять старые двоичные журналы, пока не будете уверены, что никакой подчиненный сервер не будет когда-либо их использовать. Один способ сделать это состоит в том, чтобы использовать команду mysqladmin flush-logs один раз в день и затем удалять любые файлы регистрации, которые старше трех дней.

Вы можете исследовать двоичный журнал командой mysqlbinlog. Например, Вы можете обновить сервер MySQL из двоичного файла регистрации следующим образом:

mysqlbinlog log-file | mysql -h server_name

Вы можете также использовать программу mysqlbinlog, чтобы читать двоичный файл регистрации непосредственно с удаленного сервера MySQL!

Вызов mysqlbinlog --help даст Вам большее количество информации того, как использовать эту программу.

Если Вы используете BEGIN [WORK] или SET AUTOCOMMIT=0, то Вы должны использовать двоичный файл регистрации MySQL для целей резервирования вместо старого формата файла регистрации модификаций.

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

Все модификации (UPDATE, DELETE или INSERT), которые изменяют транзакционные таблицы (подобные таблицам BDB), кэшируются до COMMIT. Любые модификации в нетранзакционных таблицах будут сохранены в двоичном файле регистрации сразу. Каждый процесс будет на старте распределять буфер binlog_cache_size, чтобы буферизовать запросы. Если запрос больше, чем этот буфер, процесс откроет временный файл, чтобы обработать большой кэш. Временный файл будет удален, когда процесс заканчится.

Параметр max_binlog_cache_size может использоваться, чтобы ограничить максимальный размер буфера, используемого, чтобы кэшировать запрос для нескольких транзакций.

Если Вы используете модификацию или двоичный файл регистрации, параллельные вставки не будут работать вместе с CREATE ... INSERT и INSERT ... SELECT. Это должно гарантировать, что Вы можете пересоздать точную копию Ваших таблиц, применяя регистрацию к резервной копии.

4.9.5 Медленный файл регистрации

При запуске с опцией --log-slow-queries[=file_name] mysqld пишет журнал, содержащий все команды SQL, которые обрабатывались дольше, чем long_query_time. Время, которое понадобилось, чтобы получить начальные блокировки таблицы, не учитывается как время выполнения запроса.

Медленный файл регистрации запроса регистрируется после того, как запрос выполнен, и после того, как все блокировки были сняты. Это может отличаться от порядка выполнения инструкций.

Если никакое имя файла не задано, используется имя хоста с окончанием -slow.log. Если имя файла задано, но не содержит путь, файл будет записан в каталоге данных.

Медленный файл регистрации запроса может использоваться, чтобы найти запросы, которые берут длительное время, и таким образом являются кандидатами на оптимизацию. Имея дело с большим файлом регистрации, который может стать трудной задачей, Вы можете пропустить его через программу mysqldumpslow, чтобы получать резюме запросов, которые появляются в файле регистрации.

Если Вы используете --log-long-format, также будут выведены запросы, не использующие индексы. Подробности в разделе "4.1.1 Параметры командной строки mysqld".

4.9.6 Сопровождение журналов

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

При использовании MySQL с журналами Вы будете время от времени удалять/резервировать старые журналы и сообщать, чтобы MySQL начал регистрацию событий в новых файлах. Подробности есть в разделе "4.4.1 Обновление протоколов ".

В Linux (дистрибутив Redhat) Вы можете для этого использовать скрипт mysql-log-rotate. Если Вы установили MySQL из пакета RPM, нужный скрипт должен быть уже установлен автоматически.

На других системах Вы должны установить скрипт сами так, чтобы он вызывался для обработки журналов из cron.

Вы можете вынуждать MySQL начать использование новых журналов, используя mysqladmin flush-logs или через команду SQL FLUSH LOGS. Если Вы используете MySQL 3.21, Вы должны использовать mysqladmin refresh.

Вышеупомянутая команда делает следующее:

  • Если используется стандартное протоколирование (опция --log) или отслеживание медленных запросов (опция --log-slow-queries), файл протокола будет закрыт и открыт заново (по умолчанию это `mysql.log' и ``hostname`-slow.log').
  • Если используется регистрация модификации (опция --log-update), то закрывается обновленный протокол и открывается новый файл протокола с более высоким номером последовательности.

Если Вы используете только регистрацию модификации, Вы должны только сбросить протокол на диск, переместить его в резервную копию и начать новый файл протокола. Например, таким образом:

shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mysqladmin flush-logs

Поиск

 

Найди своих коллег!