Декабрь 2009

MySQL хранит множество файлов журналов (регистрации событий), которые могут оказаться для вас полезными. По большей части эти файлы по умолчанию не создаются, поэтому, если вы хотите их иметь, необходимо активизировать за­пись файлов журнала. Включить запись любого из файлов журнала можно с помо­щью опций командной строки при запуске сервера или с помощью команды set.

Ниже приведен список журналов, которые можно создать.

Журнал регистрации ошибок. Отслеживает все возникающие ошибки. Един­ственный из журналов, запись в который по умолчанию включена, размеща­ется в вашем каталоге данных. Файл называется hostname.err в Linux и mysql. err в Windows. Можно назначить ему любое другое располо­жение, используя опцию 1од-еггог=имя_файла в файле конфигурации my. ini (или ту. cnf).

Журнал регистрации запросов. Регистрирует все запросы, выполняемые си­стемой. Можно включить запись этого журнала и указать его расположение с помощью опции 1од=имя_файла.

Журнал двоичной регистрации. Регистрирует все запросы, изменяющие дан­ные. Заменил журнал регистрации обновлений, который все еще существу­ет и будет существовать до версии MySQL 5.0. Можно включить запись этого журнала и указать его расположение с помощью опции log-bin=

имя_файла. •. ‘.

Журнал регистрации медленных запросов. Регистрирует все запросы, время выполнения которых оказалось больше, чем значение, хранимое переменной long_query_time. Можно включить запись этого журнала и указать его расположение с помощью опции log-slow-queries=*»<ts_$aJ&ia.

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

mysqlbinlog logfile

Использование журнала регистрации медленных запросов будет обсуждаться в главе 19, “Оптимизация запросов”.

Файлы журналов регистрации будут со временем разрастаться, поэтому же­лательно на регулярной основе менять файлы журналов. В среде Linux система

MySQL предлагает сценарий mysql-log-rotate, избавляющий от необходи­мости делать это вручную.

При использовании другой операционной системы вы можете переместить старые файлы журналов в другое место на диске вручную и дать указание MySQL начать использование новых файлов журналов с помощью команды

mysqladmin flush-logs

Программа mysqladmin имеет очень много опций, польза и частота приме­нения которых весьма различны.

Некоторые задачи могут быть выполнены как с помощью команд SQL, так и с помощью mysqladmin — например, создание и уничтожение баз данных:

mysqladmin create имяБД

mysqladmin drop имяБД

Типичным примером использования mysqladmin является получение ин­формации о сервере и его текущем состоянии. Такая информация может быть как очень простой (”Доступен ли сервер?” — ping), так и существенно более подроб­ной, например, включающей список всех доступных переменных или процессов. Ниже приводится несколько примеров использования mysqladmin.

Чтобы выяснить, включен ли сервер, используйте

mysqladmin ping

Чтобы выяснить, какая версия программного обеспечения сервера MySQL установлена на вашей машине, используйте

mysqladmin version

Чтобы получить короткое или длинное сообщение о статусе сервера, исполь­зуйте

mysqladmin status mysqladmin extended-status

Чтобы получить список активных потоков в рамках данного сервера, исполь­зуйте

mysqladmin processlist

Получив список процессов (потоков), вы можете принудительно завершить выполнение некоторых из них по вашему усмотрению, используя команду

mysqladmin kill idl,id2,id3…

Чтобы напечатать значения переменных MySQL, используйте

mysqladmin variables

Сервер можно запустить с помощью mysqladmin, с помощью запуска ис­полняемого файла mysqld или с помощью Диспетчера сервисов Windows.

Завершить работу сервера можно с помощью mysql. server stop или mysqladmin shutdown.

Используйте mysqlshow или SHOW для получения информации о текущем состоянии базы данных и сервера MySQL.

Установить переменные можно с помощью set переменная-значение;.

я Увидеть список выполняемых потоков можно с помощью show processlist, а завершить их выполнение — с помощью kill id_npoiiecca.

я Очистить кэши можно с помощью FLUSH и RESET.

Увеличить скорость работы объединений можно с помощью analyze table имя_ та блицы;.

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

В этой главе описывается, как резервировать (т.е. делать копии баз данных),

как перемещать их на другую машину и восстанавливать в случае каких бы то ни было неполадок в системе.

Мы рассмотрим следующие вопросы.

Резервирование баз данных.

Восстановление с помощью резервных копий.

Проверка и восстановление таблиц.

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

В MySQL имеется несколько вариантов резервирования баз данных.

Применение сценария mysql dump для создания дампа, т.е. файла, содер­жащего операторы SQL, необходимые для воссоздания базы данных.

Применение сценария mysqlhotcopy для создания файла данных. Этот сценарий непосредственно копирует файлы данных конкретной базы дан­ных.

Непосредственное создание резервной копии файлов данных вручную. Это фактически эквивалентно применению mysqlhotcopy, но в данном слу­чае все делается вручную. Если вы предпочтете использовать этот вариант, необходимо перед копированием прекратить работу базы данных или обно­вить и блокировать все таблицы, чтобы обеспечить их внутреннюю согласо­ванность. И mysqldump, и mysqlhotcopy обновят и блокируют таблицы за вас, поэтому применение указанных сценариев является более простым и безопасным.

■ Использование команд BACKUP TABLE и RESTORE TABLE для резерви­рования или восстановления конкретной таблицы или множества таблиц.

Мы рассмотрим каждый из этих вариантов по очереди.

Не забывайте также о том, что хотя резервирование и является жизненно .важ­ным для нормальной работы базы данных, на время выполнения резервирования доступ пользователей к базе данных ограничивается. Зачем? Чтобы получить со­гласованный “снимок” базы данных, таблицы должны быть обновлены и во время копирования должны оставаться в неизменном состоянии. Этого можно добиться, заблокировав таблицы (как это и бывает в большинстве случаев) или выключив сервер (чего делать не рекомендуется), но в любом случае на время выполнения резервирования приходится уменьшить способность базы данных к реагированию на запросы.

Одним из решений этой проблемы является использование репликации. Вы получаете возможность отключить один компонент системы и выполнить резерв­ное копирование, в то время как пользователи продолжают счастливо делать свое дело. Мы обсудим использование репликации достаточно подробно в главе 16, “Репликация баз данных”.

Проще и удобнее всего выполнить резервирование базы данных с помощью сценария mysqldump, запустив его из командной строки. Этот сценарий обеспе­чивает соединение с сервером MySQL и создание файла дампа SQL. Файл дампа содержит операторы SQL, необходимые для воссоздания соответствующей базы данных.

Ниже приведен типичный пример использования этого сценария.

Прочитать остальную часть записи »

Сценарий mysqlhotcopy отличается от mysqldump тем, что копирует непо­средственно файлы данных базы данных, а не данные, необходимые для восста­новления, с помощью соединения с сервером. При этом связь с сервером все равно требуется, чтобы обновить и блокировать таблицы базы данных, но по­скольку данный сценарий в основном использует операции с файловой системой, а не запросы к базе данных, он должен в целом выполняться несколько быстрее, чем сценарий mysqldump.

Данный сценарий можно использовать так, как показано ниже.

mysqlhotcopy имя_пользователя имяБД размещение_копии

Этот сценарий является сценарием Perl. Если вы используете Unix или подоб­ную ей операционную систему, у вас почти наверняка где-то уже есть исполняе­мый файл perl. В Windows, чтобы использовать Perl, вам нужно установить его. Если установщика Perl для Windows у вас еще нет, загрузите его с узла ActiveState:

www.activestate.com/Products/ActivePerl

Файлы, создаваемые mysqlhotcopy, — это точные копии файлов данных ба­зы данных. Чтобы использовать эти копии, необходимо остановить работу сервера MySQL и заменить файлы данных в каталоге данных MySQL соответствующими файлами-копиями.

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

Это значит, что сначала придется открыть сеанс MySQL. Затем можно ввести команду LOCK TABLES, чтобы блокировать все таблицы, которые планируется резервировать:

lock tables employee read, department read, client read, assignment read, employeeSkills read;

Оператор LOCK TABLES в качестве параметров получает список имен таб­лиц и тип блокировки, который необходимо применить: READ или WRITE. Для резервирования блокировки для чтения обычно бывает достаточно. Это означает, что другие потоки (связывающиеся объекты) могут продолжать читать данные таблиц, но не смогут записывать в них данные, пока резервирование не будет завершено.

Блокировка в таких ситуациях очень важна, поскольку копирование может занять достаточно много времени. В нашем случае будет катастрофой, если, на­пример, после копирования таблицы employee, но еще перед копированием таб­лицы department, кто-то удалит информацию о всех служащих какого-то отдела и информацию о самом отделе. Полученная в результате квпия будет несогласо­ванной, поскольку будет содержать информацию о служащих несуществующего отдела.

Затем следует применить команду FLUSH TABLES: flush tables;

Если необходимо резервировать все базы данных, можно совместить эти два шага, используя команду

flush tables with read lock;

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

По завершении копирования файлов следует, конечно, разблокировать таблицы:

unlock tables;

Эта процедура аналогична сценарию mysqlhotcopy, и точно так же вы можете восстановить базу данных.

Альтернативу только что рассмотренным вариантам составляют два оператора SQL, которые можно использовать для получения тех же результатов. Это — опера­торы BACKUP TABLE и RESTORE TABLE. Соответствующие команды работают только с таблицами MylSAM.

Вы можете создать резервную копию таблицы MylSAM с помощью команды

backup table tl to ‘путь/к/копии‘;

Обратите внимание на то, что в Windows необходимо также указать букву дисковода, например,

backup table tl to ‘с:/путь/к/копии’;

В результате файлы, представляющие указанную таблицу MylSAM, будут ско­пированы в указанное место. Таблица будет заблокирована для чтения, пока будет выполняться копирование.

Можно также указать список таблиц, разделенный запятыми, однако каждая из таких таблиц будет блокироваться и копироваться отдельно, по очереди. Если необходимо получить согласованный набор таблиц, следует сначала применить оператор LOCK TABLES (о том, как это сделать, говорилось в предыдущем раз­деле, “Резервирование и восстановление вручную”).

Чтобы восстановить данные с помощью копии, введите

restore table tl’from 1c:/tmp’;

Это сработает только в том случае, если восстанавливаемых таблиц в теку­щей базе данных не существует. Если уже имеется таблица с соответствующим именем, перед использованием оператора RESTORE следует применить команду DROP TABLE.

И подчеркнем еще раз, RESTORE работает только с таблицами MylSAM.

Фото
two 3d humans give their hand for handshake