Программирование >>  Программный интерфейс приложений 

1 ... 172 173 174 [ 175 ] 176 177 178 ... 264


Как исключить возможность одновременного доступа к таблицам сервера MySQL и утилит

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

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

Сервер использует два вида блокировок. Внутренняя блокировка применяется, чтобы избежать взаимного влияния запросов клиентов. Другими словами, она не позволяет запросу SELECT одного клиента выдать неправильные данные из-за одновременной обработки запроса UPDATE второго. Кроме того, сервер применяет и внешнюю блокировку (на уровне файловой системы), которая не позволяет внешним профаммам изменять файлы таблиц, пока с ними работает сервер. Как правило, для одновременной работы с утилитами myisamchk и isamchk в процессе проверки сервер использует именно внешнюю блокировку. Хотя, надо признать, на некоторых системах она оказывается недееспособной из-за своей низкой надежности. Выбор варианта запуска утилит myisamchk и isamchk зависит, в первую очередь, от того, использует ли сервер внешнюю блокировку. Если такой вид защиты не используется, администратору придется применить протокол внутренней блокировки.

Запуск сервера с помощью опции -skip-locking приводит к отключению внешней блокировки. В большинстве систем, включая Linux, эта опция добавляется по умолчанию. Чтобы определить, в состоянии ли сервер использовать внешнюю блокировку, можно воспользоваться командой mysqladmin variables. Просмотрите значение переменной skip locking и выберите один из двух следующих вариантов.

Если переменная skip locking отключена (имеет значение off), внешняя блокировка активизирована. Следовательно, можно смело приступать к проверке таблиц с помощью одной из утилит. Сервер и утилита будут корректно взаимодействовать между собой и совместно разделять доступ к таблицам. Перед запуском утилиты, тем не менее, следует обновить кэш-память таблиц, запустив команду mysqladmin flush-tables. Для восстановления таблиц необходимо использовать протокол блокировки восстановления таблиц.



Если переменная skip locking включена (имеет значение on), внешняя блокировка деактивизирована, и сервер не сможет определить, когда утилиты myisamchk и isamchk выполняют проверку или восстановление таблиц. В этом случае лучше временно приостановить работу сервера. Если ситуация не позволяет это сделать, необходимо по крайней мере убедиться, что клиенты не пытаются получить доступ к проверяемой таблице. Воспользуйтесь соответствующим протоколом блокировки, чтобы сервер вьщелил нужную таблицу и запретил клиентам доступ к ней.

Описываемые в этом разделе протоколы блокировки используют внутренний механизм блокировки сервера для закрытия доступа к таблицам на время работы утилит myisamchk и isamchk. С этой целью достаточно запустить mysql и выполнить оператор lock table для проверяемых или исправляемых таблиц. Затем, не завершая работы сервера mysql (который в это время не выполняет никаких действий), запустите утилиту myisamchk или isamchk. По завершении их работы можно вернуться к сессии mysql и снять блокировку. Сервер с этого момента может нормально продолжать работу

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

Для установки и снятия блокировки протоколами используются операторы lock table и unlock table Кроме того, используются также и операторы flush tables, предписывающие серверу сохранить все внесенные изменения и повторно открыть таблицу после восстановления ее с помощью соответствующей утилиты. Администратор должен выполнить все операторы lock, flush и unlock в течение одной сессии mysql. Если заблокировать и затем выйти из mysql, блокировка будет снята. Запускать утилиты myisamchk или isamchk после этого весьма небезопасно!

Проще всего выполнить процедуры блокировки, открыв одновременно два окна, одно для запуска mysql, а второе - для запуска утилит myisamchk или isamchk. Это позволит легко и быстро переключаться между программами. Если же работа ведется не в оконной среде, для запуска утилит необходимо сначала ее приостановить, а впоследствии возобновить работу mysql с помощью средств управления оболочки. В следующих разделах показаны команды запуска утилит myisamchk или isamchk. Используйте соответствующие своей ситуации команды для проверки и восстановления поврежденных таблиц.



Сокращение времени остановки сервера

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

Будущее утилиты myisamchk

В будущем, а именно в версиях серии MySQL 3.23 функции проверки и восстановления таблиц утилиты myisamchk планируется добавить непосредственно в сервер. Если этим планам суждено сбыться, проверка и восстановление таблиц станет намного проще, ведь вопрос взаимодействия сервера и утилиты как таковой стоять не будет вообще.

Кроме того, можно будет давать указание серверу на проверку таблиц во время загрузки. Соответственно, отпадет необходимость в определении специальных команд, выполняемых при загрузке системы перед запуском сервера. Поскольку эти функции нельзя применять к таблицам ISAM, после получения сервером функций проверки и восстановления, возможно, имеет смысл задуматься над преобразованием своих таблиц из формата ISAM в MylSAM. Более детально о новых разработках в этой области можно узнать в справочном руководстве по MySQL. Для преобразования таблицы можно воспользоваться оператором alter table:

alter table tbl name type = isam

Планирование превентивной поддержки

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

1. Обязательно выполняйте периодическое резервирование баз данных и активизируйте регистрацию обновлений.

2. Организуйте регулярную проверку таблиц. Это снизит вероятность использования архивных файлов для восстановления. Легче всего реализовать это с помощью программы сгоп, которая инициируется файлом crontab. Например, если сервер работает с полномочиями пользователя mysqladm, периодическую проверку таблиц можно запускать из файла crontab учетной записи mysqladm. Ад-



1 ... 172 173 174 [ 175 ] 176 177 178 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика