Архив рубрики «mysql»

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

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

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

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

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

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

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

В 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.

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

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

mysqlbinlog logfile > updates.sql

Весьма желательно взглянуть на этот файл перед тем, как повторно запускать соответствующие запросы, — вполне возможно, что какие-то из них вы повторять не пожелаете. Возможно, что какой-то плохо продуманный запрос SQL и привел к тому, что вам пришлось обратиться к резервной копии.

Например, однажды среди множества строк мы обнаружили, что кто-то из программистов ввел

update user set password3password” ;

Естественно, что при восстановлении таблицы мы не пожелали снова вво­дить этот запрос и устанавливать для всех пользователей нашей системы пароль password!

Какой бы метод резервирования вы ни выбрали, очень важно проверить полу­ченную копию или, точнее, возможность восстановления данных. Нередко встре­чаются администраторы, которые добросовестно и регулярно создают резервные копии, но никогда не проверяют, смогут ли они в случае необходимости восста­новить с помощью этих копий данные.

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

Очень важной составляющей системы MySQL в целом и процесса резервиро­вания в частности является журнал двоичной регистрации. По умолчанию запись


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

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

MySQL предлагает три способа проверки таблиц: с помощью CHECK TABLE, myisamchk (или isamchk) либо mysqlcheck. Затем можно устранить обна­руженные в таблицах проблемы с помощью REPAIR TABLE или с помощью myisamchk (либо isamchk), или mysqlcheck.

Существует ряд факторов, которые следует учитывать при выборе каждого из указанных вариантов. Команды CHECK и REPAIR можно использовать в рамках MySQL, тогда как остальные должны применяться из командной строки. Коман­ды CHECK и REPAIR работают как с таблицами MylSAM, так и с таблицами InnoDB. Сценарий isamchk применим к таблицам ISAM, тогда как myisamchk и mysqlcheck могут использоваться с таблицами MylSAM.

Нельзя применять myisamchk или isamchk к таблицам, которые в тот мо­мент используются. Лучше всего перед использованием этих сценариев завер­шить работу сервера, однако можно ограничиться и блокировкой таблиц. Если использовать указанные сценарии с таблицами, используемыми другими потока­ми MySQL, данные могут быть повреждены. Команды CHECK, REPAIR и mysqlcheck можно использовать и тогда, когда сервер находится в работе, а таблицы — в использовании.

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

Фото
dc3.jpg