Глава №4.

MySQL

MySQL является, возможно, самым ярким программным проектом после выхода Linux. В то время как mSQL заслуживает уважения за то, что столкнула дело управления базами данных с мертвой точки, MySQL умело воспользовалась моментом. Сейчас она не больше и не меньше, как серьезный конкурент большим СУБД в области разработки баз данных малого и среднего масштаба. В самом начале MySQL просто стала заменой устаревающему ядру mSQL версии 1. Как отмечалось в Главе 1, признаки старения mSQL проявились в виде проблем со стабильностью и неспособностью удовлетворить растущие требования, которые обрушились на нее благодаря успеху. MySQL использовала основы проекта mSQL и теперь превосходит ее по набору характеристик и одновременно по производительности.

Проект

Опираясь на наследство, полученное от mSQL, TcX решила, что MySQL должна быть не медленнее mSQL, обладая при этом большим набором возможностей. В то время mSQL задавала тон в производительности баз данных, так что задачу себе ТсХ поставила непростую. Особыми целями проектирования MySQL были скорость, надежность и простота использования. Чтобы достичь такой производительности, в ТсХ приняли решение сделать многопоточным внутренний механизм MySQL. Многопоточное приложение одновременно выполняет несколько задач - так, как если бы одновременно выполнялось несколько экземпляров приложения.

Сделав MySQL многопоточной, ТсХ дала пользователям много выгод. Каждое входящее соединение обрабатывается отдельным потоком, при этом еще один всегда выполняющийся поток управляет соединениями, поэтому клиентам не приходится ждать завершения выполнения запросов других клиентов. Одновременно может выполняться любое количество запросов. Пока какой-либо поток записывает данные в таблицу, все другие запросы, требующие доступа к этой таблице, просто ждут, пока она освободится. Клиент может выполнять все допустимые операции, не обращая внимания на другие одновременные соединения. Управляющий поток предотвращает одновременную запись какими-либо двумя потоками в одну и ту же таблицу.

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

Другое преимущество многопоточной обработки присуще всем многопоточным приложениям. Несмотря на то что потоки совместно используют память процесса, они выполняются раздельно. Благодаря этому разделению выполнение потоков на многопроцессорных машинах может быть распределено по нескольким ЦП. На рис. 4-1 показана эта многопоточная природа сервера MySQL.

Рис. 4-1. Клиент-серверная архитектура MySQL

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

MySQL фактически расширяет ANSI SQL несколькими новыми возможностями. В их числе новые функции (ENCRYPT, WEEKDAY, IF и другие), возможность инкрементирования полей (AUTO_INCREMENT и LAST_INSERT_ID), а также возможность различать верхний и нижний регистры.

ТсХ намеренно опустила некоторые возможности SQL, встречающиеся в больших базах данных. Наиболее заметно отсутствие транзакций и встроенных процедур. Как и Дэвид Хьюз в mSQL, ТсХ решила, что реализация этих возможностей нанесет слишком сильный удар по производительности. Однако ТсХ продолжает работу в этом направлении, но так, чтобы от потери производительности страдали только те пользователи, которым такие возможности действительно необходимы.

С 1996 года ТсХ использует MySQL в среде, где имеется более 40 баз данных, содержащих 10 000 таблиц. Из этих 10 000 более 500 таблиц имеют, в свою очередь, более 7 миллионов записей - около 100 Гбайт данных.

Установка MySQL

Прежде чем использовать MySQL, ее необходимо установить. MySQL работает почти на любой известной Unix-платформе, а также под управлением Windows 9x, Windows NT и OS/2. Для Windows 9x и Windows NT требуется приобрести лицензию. Если вы хотите лишь протестировать работу этой СУБД, имеется более старая бесплатная версия.

Дистрибутив MySQL существует как в двоичном виде, так и в виде исходного текста. Если вы не прочь внести свой вклад в проект MySQL, добавить к нему свои усовершенствования или просто не можете найти двоичного дистрибутива для своей платформы, то необходимо взять дистрибутив с исходным кодом. Большинству пользователей, впрочем, следует брать двоичный дистрибутив. Самые свежие дистрибутивы - двоичные и в виде исходных текстов - можно найти на http://www.mysql.com

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

Запуск MySQL

Как правило, сервер баз данных работает постоянно. В конце концов, какой смысл иметь базу данных, если нельзя получить данные. ТсХ создавала MySQL, имея это в виду, поэтому MySQL работает под Unix как демон, и как служба — под Windows NT. В Windows 95 есть только грубый аналог, реализуемый помещением ярлыка исполняемого приложения в папку Автозагрузка (StartUp). Важной особенностью работы под Windows 95 является то, что при создании каждого потока происходит утечка примерно 200 байт оперативной памяти. Поэтому под Windows 95 не следует надолго оставлять MySQL работающей. К Windows 98 и Windows NT это не относится.

Запуск MySQL осуществляется с помощью сценария safe_mysqld. Под Unix этот файл устанавливается по умолчанию как /usr/local/bin/ safe_mysqld. Это сценарий для командного процессора Борна, и вы можете редактировать его, чтобы изменять принятые по умолчанию параметры. Все параметры, которые вы зададите в safe_mysqld, будут переданы непосредственно демону MySQL.

MySQL — ветвящийся демон. Когда вы ее запускаете, программа создает свою копию и выполняется как фоновый процесс. Поэтому вам не нужно ничего делать, чтобы заставить MySQL выполняться в фоновом режиме. Если же для запуска MySQL вы используете сценарий safe_mysqld, то вы должны перевести его в фоновый режим:

/usr/local/mysql/bin/safe_mysqld &

Причина, по которой вы должны запускать safe_mysqld в фоновом режиме (и по которой нужно запускать именно safe_mysqld, а не mysqld) в том, что сценарий safe_mysqld запускает mysqld, а затем непрерывно проверяет, выполняется ли mysqld. Если выполнение MySQL неожиданно прекратится, safe_mysqld ее перезапустит.

Теперь, когда вы знаете, как запускать MySQL, нужно сделать так, чтобы MySQL стартовала и заканчивала работу вместе с компьютером, на котором она выполняется. Под Windows NT, конечно, достаточно установить MySQL как службу. Под Windows 9x нужно поместить ярлык сценария запуска MySQL в папку Startup. Под Unix, как и почти всегда бывает в этом мире, заставить MySQL стартовать и завершаться вместе с системой несколько сложнее. Unix-системы обычно ищут сценарии начального запуска где-то в каталоге /etc - в /etc/rc.d или /etc/ init.d. Вы должны узнать у системного администратора или в документации, куда именно нужно помещать сценарии запуска/завершения. Дистрибутив MySQL содержит в каталоге support_j'lies файл mysql.ser-ver. Этот сценарий и будет служить сценарием запуска/завершения.

Администрирование базы данных

Теперь, когда у вас есть свежеустановленная и запущенная MySQL, нужно первым делом поменять пароль суперпользователя сервера, выполнив из каталога, в который установлена MySQL, команду:

./bin/mysqladmin -u root password 'mynewpasswd'

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

Утилита mysqladmin

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

Создание баз данных

Ваш сервер бесполезен, пока нет баз данных, которые он обслуживает. С помощью mysqladmin можно создавать новые базы данных:

mysqladmin -p create DATABASENAME

Параметр указывает, что вы хотите, чтобы было выдано приглашение для ввода пароля суперпользователя, который вы задали раньше. Если вы введете правильный пароль, то mysqladmin создаст новую пустую базу данных с именем, которое вы указали. Поскольку в MySQL база данных - это каталог с группой файлов, команда mysqladmin create создает новый каталог, который будет содержать файлы базы данных. Например, если вы создали базу данных с именем «mydata», в каталоге data, содержащемся в директории, в которую установлена MySQL, будет создан каталог mydata.

Поскольку базы данных и таблицы MySQL хранятся как файлы файловой системы, вы столкнетесь с неприятными различиями -в поведении реализаций для Unix и Win32. Именно, все файловые системы для Win32 нечувствительны к регистру, в то время как файловые системы Unix различают регистр. В результате имена баз данных и таблиц различаются по регистру в Unix и не различаются в Win32.

Удаление базы данных

В процессе разработки приложения вам, вероятно, потребуется создать несколько баз данных для поддержки процесса разработки. Например, обычной практикой в разработке приложений баз данных является создание отдельных баз данных для разработки, тестирования и работы. По завершении разработки следует избавиться от этих промежуточных баз данных. Утилита mysqladmin позволяет удалить базу данных с помощью параметра «drop»:

mysqladmin -p drop DATABASENAME

Как и в команде mysqladmin create, DATABASENAME является именем базы данных, которую нужно уничтожить. MySQL не позволит вам случайно удалить базу данных. После ввода этой команды она предупредит вас, что удаление базы данных потенциально очень опасно и попросит вас подтвердить свое намерение. После удаления базы данных вы можете убедиться в том, что в каталоге data больше нет каталога, служившего ранее этой базой данных.

Переименование и копирование баз данных

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

Состояние сервера

В утилите mysqladmin очень много команд, позволяющих контролировать состояние сервера MySQL. Ввод команды mysqladmin status обеспечивает выдачу состояния сервера в одной строке, которая выглядит следующим образом:

Uptime: 395 Threads: 1 Questions: 14 Slow queries: 0

Opens: 10 Flush tables: 1 Open tables: 6

Выводимые величины означают следующее: Uptime

Число секунд, в течение которых сервер запущен и работает. Threads

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

Questions

Число запросов, переданных базе данных с момента запуска.

Slow queries

Число запросов, выполнение которых потребовало больше времени, чем время, указанное в конфигурации. Соответствующий ключ в конфигурации - long_query_tiroe . Мы рассмотрим параметры конфигурации далее в этой главе.

Opens

Число таблиц, открытых с момента запуска сервера.

Flush tables

Количество команд flush, refresh и reload.

Open tables

Число таблиц, открытых в данный момент. Поскольку MySQL мно-гопоточна, каждая таблица одновременно может быть открыта несколько раз. Например, можно одновременно выполнять любое число команд SELECT по одной и той же таблице. По этой причине число открытых таблиц может быть больше, чем общее число таблиц в системе.

Если компиляция MySQL производилась с параметром --with-debug , то mysqladmin status показывает также текущую и максимальную величину используемой памяти.

Если вас интересует более общая статическая информация, то выполните команду mysqladmin version. Она выдает на экран следующее:

bin/mysqladmin Ver 7.8 Distrib 3.22.17, for sun-solaris2.6 on spare TCX Datakonsult AB, by Monty

Server version 3.22.17

Protocol version 10

Connection Localhost via Unix socket

Unix socket /tmp/;ny3ql. sock

Uptime: 23 mm 58 sec

Threads: 1 Questions: 15 Slow queries: 0 Opens: 10 Flush tables: 1 Open tables: 6

Последняя строка совпадает, конечно, с теми данными, которые показывает mysqladmin status. Остальные данные совершенно другие.

Server version

Версия запущенного сервера MySQL. Protocol version

Версия коммуникационного протокола MySQL, который поддерживает сервер. Если у вас возникли трудности с инструментарием, который использует коммуникационный протокол MySQL, вы можете сравнить это значение с тем, которое ожидает ваша программа.

Connection

Метод подключения к серверу. В нашем примере клиент общается с MySQL через сокет Unix. Если вы обращаетесь к удаленному серверу, в этой позиции будет имя машины, с которой вы подключились.

Unix socket

Имя файла сокета, который вы используете для обмена данными с сервером. Если вы связываетесь с MySQL через TCP/IP, вместо этого пункта будет указан пункт TCP port с номером порта MySQL.

Uptime

Суммарное время работы сервера.

Две другие команды, mysqladmin variables и mysqladmin extended-status, предлагают дополнительную информацию.

Поскольку MySQL многопоточна, отследить активность процесса с помощью команды Unix ps не просто. Несмотря на то что выполняется несколько потоков, в списке процессов будет указан только один процесс. MySQL позволяет справиться с этим с помощью команды mysqladmin processlist, которая перечисляет все активные потоки в виде чудесно представленной таблички:

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

Id

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

User

Пользователь, подключенный к серверу через этот поток.

Host

Имя узла, с которого подключился пользователь.

db

База данных, к которой подключен пользователь.

Command

Тип команды, выполняемой потоком. Команда может иметь один из следующих типов:

Sleep

Поток ждет ввода пользователя. Большинство процессов должно находиться в этом состоянии.

Quit

Поток в процессе завершения.

Init DB

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

Query

Поток выполняет реальный запрос. Хотя наибольшая часть взаимодействия с базой данных происходит в виде запросов, эти команды производятся очень быстро и редко появляются в выдаче.

Field list

Поток создает список полей в таблице.

Create DB

Поток создает новую базу данных.

Drop DB

Поток удаляет базу данных.

Reload

Поток перезагружает таблицы доступа MySQL. После перезагрузки все новые потоки будут использовать обновленные таблицы доступа.

Shutdown

Поток находится в процессе завершения всех других потоков и закрытия сервера.

Statistics

Поток генерирует статистику.

Processes

Этот поток анализирует другие потоки. С этим значением будет показан поток, выполняющий данную команду.

Connect

Поток в процессе установления входящего соединения с клиентом.

Kill

Этот поток завершает другой поток.

Refresh

Поток очищает все буферы и сбрасывает журнальные файлы.

Файлы журналов MySQL дают еще один способ получения полезной информации для администрирования сервера. MySQL создает главный журнал, если mysqld запускается с параметром --log. Этот журнал ведется в файле /usr/local/var/HOSTNAME.log, где HOSTNAME - имя машины, на которой запущен MySQL. В этот журнал записываются подключения к серверу и команды, посылаемые ему клиентами.

Задав параметр -debug для mysqld (или safe_mysqld), вы заставите MySQL посылать в журнал дополнительную информацию. Пакет отладки, используемый MySQL, имеет десятки параметров, большинство из которых вы никогда не будете использовать. Наиболее часто используется установка -d:t:o,FILENAME, где FILENAME - имя журнала отладки, который вы хотите использовать. При задании этого параметра в журнал будут заноситься практически все действия сервера, шаг за шагом.

MySQL поддерживает еще один журнал, пригодный для чтения. Если запустить MySQL с параметром -log-update, будет создан файл с именем HOSTNAME. #, где HOSTNAME имя машины, a #- уникальное число. В этом журнале содержатся все изменения, вносимые в таблицы баз данных. Этот журнал создается в виде SQL, поэтому все операции можно воспроизвести на другом сервере баз данных.

Завершение работы сервера

Следующая команда производит корректное завершение работы сервера MySQL:

mysqladmin -p shutdown

Эта команда - самый правильный способ завершения работы сервера. Если вы запустили MySQL с помощью safe_mysqld и пытаетесь закрыть сервер каким-либо другим способом, safe_mysqld просто запустит еще один экземпляр сервера. Можно также безопасно закрыть сервер традиционной Unix-командой kill, но никогда не пользуйтесь kill-9.

Параметры командной строки для mysqladmin

Утилита mysqladmin - очень богатый инструмент со множеством параметров командной строки. Общий ее формат

mysqladmin OPTIONS COMMAND1 COMMAND2 . . . COMMANDn

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

mysqladmin -p create silly drop silly

Эта команда одним махом создаст и уничтожит базу данных «silly». Вот перечень команд, которые можно передать mysqladmin:

create DATABASENAME

Создает новую базу данных с указанным именем.

drop DATABASENAME

Удаляет базу данных с указанным именем.

extended-status

Выдает расширенное сообщение о статусе сервера.

flush-hosts

Немедленно записывает все буферизованные изменения на удаленных компьютерах.

flush-logs

Немедленно записывает все буферизованные изменения в журналы.

flush-tables

Немедленно записывает все буферизованные изменения в таблицы.

flush-privileges

То же, что reload.

killID1,ID2.....IDn

Завершает потоки с заданными IDs.

password NEWPASSWORD

Заменяет пароль на новое значение.

ping

Проверяет, работает ли еще mysqld.

processlist

Выдает список активных потоков.

reload

Заново загружает все таблицы доступа.

refresh

Записывает буферизованные изменения во все таблицы и закрывает и открывает все журналы.

shutdown

Завершает работу сервера.

status

Выдает краткое сообщение о состоянии сервера.

variables

Выдает значения имеющихся переменных.

version

Выдает данные о версии сервера.

Кроме команд поддерживаются также следующие параметры:

-# LOG

Выдача отладочной информации в журнал. Часто это 'd:t:o,FILENAME'.

-f

Не запрашивать подтверждение на удаление таблицы и переходить к следующей команде даже при невозможности выполнить эту.

-? или --help

Выдача подсказки по использованию утилиты msqladmin.


Использовать сжатие в протоколе клиент/сервер.

-Н HOST

Подключиться к указанному компьютеру.

-р [PASSWORD]

Использовать указанный пароль для проверки прав пользователя.

Если пароль не указан, пользователю будет выдано приглашение для ввода пароля.

-Р PORT

Использовать для подключения указанный порт.

-i SECONDS

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

-s

Выйти без сообщений, если соединение с сервером невозможно установить.

-S SOCKET

Файл для использования в качестве сокета Unix.

-t TIMEOUT

Тайм-аут для соединения.

-u USER

Имя для регистрации пользователя, если оно отлично от текущего.

-V

Выдать информацию о версии и завершить работу.

-w COUNT

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

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

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

В главе 5 «mSQL» приводится подробное изложение роли команды msqldump при резервировании данных mSQL. MySQL поддерживает почти идентичную функциональность в виде команды mysqldump. Мы рекомендуем изучить этот пункт, чтобы понять роль mysqldump при полном резервировании баз данных. В данном параграфе мы остановимся на следующем наиболее важном виде резервирования - инкре-ментном резервировании.

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

При использовании MySQL инкрементное резервирование можно производить, используя такую возможность сервера баз данных, как «update log» - журнал изменений MySQL. Если сервер баз данных mysqld запущен с параметром --log-update, то все изменения в базе данных будут сохраняться в файле в виде команд SQL. Изменения будут сохраняться в порядке их производства. В результате получается файл, который, будучи обработан монитором mysql, воспроизведет все действия, произведенные над базой данных. Если журнал хранится с самого образования базы данных, то будет восстановлен весь жизненный цикл базы данных, который приведет ее в текущее состояние.

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

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

Система безопасности

Вам не только нужно иметь надежный доступ к своим данным, но и быть уверенным, что у других нет никакого доступа к ним. MySQL использует собственный сервер баз данных для обеспечения безопасности. При первоначальной установке MySQL создается база данных под названием «mysql». В этой базе есть пять таблиц: db, host, user, tab-les_priv, и columns_priv . Более новые версии MySQL создают также базу данных с названием func, но она не имеет отношения к безопасности. MySQL использует эти таблицы для определения того, кому что позволено делать. Таблица user содержит данные по безопасности, относящиеся к серверу в целом. Таблица host содержит права доступа к серверу для удаленных компьютеров. И наконец, db, tables_priv и со-lumns_priv управляют доступом к отдельным базам данных, таблицам и колонкам.

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

Таблица user

Таблица user имеет вид, показанный в Таблице 4-1:

Таблица 4-1. Таблица user

Поле

Тип

Null

Ключ

Значение

Примеч.





по умолчанию


Host

char(60)


PRI



User

char(16)


PRI



Поле

Тип

Null

Ключ

Значение

Примеч.





по умолчанию


Password

char(16)





Select_priv

enum('N','Y')



N


Insert priv enum('N','Y')     N  

Update_priv

enum('N','Y')



N


Delete_priv

enum('N','Y')



N


Create_priv

enum('N','Y')



N


Drop priv

enum('N','Y')



N


Reload priv

enum('N','Y')



N


Shutdown_priv

enum('N','Y')



N


Process_priv

enum('N','Y')



N


File_priv

enum('N','Y')



N


Grant_priv

enum('N','Y')



N


References_priv

enum('N','Y')



N


Index_priv

enum('N','Y')



N


Alter_priv

enum('N','Y')



N


В колонках Host и User можно использовать символ «% », заменяющий произвольную последовательность символов. Например, имя узла «chem%lab» включает в себя «chembiolab», «chemtestlab» и т. д. Специальное имя пользователя «nobody» действует как одиночный «% », то есть охватывает всех пользователей, не упомянутых где-либо в другом месте. Ниже разъясняется смысл различных прав доступа:

Select_priv

Возможность выполнять команды SELECT.

Insert__priv

Возможность выполнять команды INSERT.

Update_priv

Возможность выполнять команды UPDATE.

Delete_priv

Возможность выполнять команды DELETE.

Createjyriv

Возможность выполнять команды CREATE или создавать базы данных.

Drop_priv

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

Reload_priv

Возможность перезагружать информацию о доступе с помощью mysqladmin reload.

Shutdown_priv

Возможность останавливать сервер через mysqladmin shutdown.

Process_priv

Возможность управлять процессами сервера.

File_priv

Возможность читать и записывать файлы с помощью команд типа SELECT INTO OUTFILE и LOAD DATA INFILE.

Grant_priv

Возможность давать привилегии другим пользователям.

Index_priv

Возможность создавать и уничтожать индексы.

Alter_priv

Возможность выполнять команду ALTER TABLE.

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

INSERT INTO user (Host, User, Password, Select_priv,

Insert_priv, Update_priv, Dclete_priv)

VALUES ('%', 'bob', password('mypass'), 'Y', 'Y', 'Y'.'Y')

INSERT INTO user (Host, User, Password, Select_priv)

VALUES ('athens.imaginary.com', 'jane', '', 'Y')

INSERT INTO user (Host, User, Password)

VALUES ('%', 'nobody', ")

INSERT INTO user (Host, User, Password, Select_pnv,

Insert_priv, Updatejriv, Delete_priv)

VALUES ('athens.imaginary.com', 'nobody',

password('thispass'), 'Y', 'Y', 'Y', 'Y')

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

Первый созданный нами пользователь, «bob», может подключаться к базе данных с любого компьютера и выполнять команды SELECT, INSERT, UPDATE и DELETE. Второй пользователь, «jane», может подключаться с «athens.imaginary.com», не имеет пароля и может выполнять только SELECT. Третий пользователь - «nobody» - с любой машины.'Этот пользователь вообще ничего не может делать. Последний пользователь -«nobody» - с машины «athens.imaginary.com», он может выполнять SELECT, INSERT, UPDATE и DELETE, как и пользователь «bob.»

Как MySQL производит сопоставление? Возможно, вы обратили внимание, что некоторое имя может соответствовать на деле нескольким записям. Например, «nobody@athens.imaginary.com» соответствует и «nobody@%», и «nobody@athens.imaginary.com». Прежде чем осуществлять поиск в таблице user, MySQL сортирует данные следующим образом:

  1. Сначала ищется соответствие для узлов, не содержащих масок « % », при этом пустое поле Host трактуется как «% ».
  2. Для одного и того же узла сначала проверяется соответствие имен, не содержащих масок. Пустое поле User трактуется как содержащее «%».
  3. Первое найденное соответствие считается окончательным.

В предыдущем примере пользователь сначала будет сравниваться с «nobody» из «athens.imagmary.com», поскольку «athens.imaginary.com» в порядке сортировки стоит выше «% ». Поскольку имена компьютеров сортируются раньше имен пользователей, значения привилегий для компьютера, с которого вы подключаетесь, имеют приоритет перед любыми конкретными правами, которые у вас могут быть. Например, если таблица user содержит записи:

Host

User

%

athens .imaginary .com

jane

и jane подключается с «athens.imaginary.com», то MySQL будет использовать привилегии, данные «athens.imaginary.com».

Таблица db

Вы могли обратить внимание, что в таблице user не упоминаются конкретные базы данных и таблицы. Таблица user управляет сервером в целом. Однако на сервере обычно находится несколько баз данных, которые служат различным целям и, соответственно, обслуживают разные группы пользователей. Права доступа к отдельным базам данных хранятся в таблице db. Эта таблица имеет структуру, представленную в таблице 4-2:

Таблица 4-2. Таблица db

Поле

Тип

Null

Ключ

Значение по умолчанию

Примеч.

Host

char(60)


PRI



Db

char(32)


PRI



User

char(16)


PRI



Select priv

enum('N','Y')



N


Insert_priv

enum('N','Y')



N


Update_priv

enum('N','Y')



N


Delete priv

enum('N','Y')



N


Create_priv

enum('N','Y')



N


Drop_priv

enum('N','Y')



N


Referen-

enum('N','Y')



N


ces_priv






Index_priv

enum('N','Y')



N


Alter_priv

enum('N','Y')



N


Эта таблица во многом похожа на таблицу user. Основное отличие в том, что вместо колонки Password имеется колонка Db. Таблица управляет правами пользователей в отношении определенных баз данных. Поскольку привилегии, указанные в таблице user, относятся ко всему серверу в целом, права, присвоенные пользователю в таблице user, перекрывают права, присвоенные тому же пользователю в таблице db. Например, если пользователю в таблице user разрешают доступ типа INSERT, это право действует в отношении всех баз данных, вне зависимости от того, что указано в таблице db.

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

Те же правила, которые действуют в отношении колонок User и Host в таблице user, действуют и в таблице db, но с некоторой особенностью. Пустое поле Host вынуждает MySQL найти запись, соответствующую имени узла пользователя, в таблице host. Если такой записи не найдено, MySQL отказывает в доступе. Если соответствие найдено, MySQL определяет права как пересечение прав, определяемых таблицами host и db. Иными словами, в обеих записях разрешение должно иметь значение «Y», иначе в доступе отказывается.

Таблица host

Таблица host служит особой цели. Ее структура показана в таблице 4-3:

Таблица 4-3. Таблица Host

Поле

Тип

Null

Ключ

Значение по умолчанию

Примеч.

Host

char(60)


PRI



Db

char(32)


PRI



Select_priv

enum('N','Y')



N


Insert_priv

enum('N','Y')



N


Update_priv

enum('N','Y')



N


Delete_priv

enum('N','Y')



N


Create_priv

enum('N','Y')



N


Drop_priv

enum('N','Y')



N


Grant_priv

enum('N','Y')



N


Referen-

enum('NYY')



N


ces_priv






Index_priv

enum('N','Y')



N


Alter_priv

enum('N','Y')



N


Таблица host позволяет задать основные разрешения на межкомпьютерном уровне. При проверке прав доступа MySQL ищет в таблице db соответствие имени пользователя и его машине. Если он находит запись, соответствующую имени пользователя, поле host которой пусто, MySQL обращается к таблице host и использует пересечение обоих прав для определения окончательного права доступа. Например, у вас может быть группа серверов, которые вы считаете менее защищенными, чем остальная часть сети. Вы можете запретить для них все права записи. Если «bob» заходит с одной из таких машин, и его запись в таблице db содержит пустое поле host, ему будет запрещена операция записи, даже если она разрешена ему согласно таблице db.

Таблицы tables_priv и colums_priv

Эти две таблицы, по сути, уточняют данные, имеющиеся в таблице db. Именно, право на всякую операцию сначала проверяется по таблице db, затем по таблице tables_priv , затем по таблице columns_priv . Операция разрешается, если одна из них дает разрешение. С помощью этих таблиц можно сузить область действия разрешений до уровня таблиц и колонок. Управлять этими таблицами можно через команды SQL GRANT и REVOKE.

Последовательность контроля доступа

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

При подключении проводятся две проверки. Сначала MySQL проверяет, есть ли в таблице user запись, соответствующая имени пользователя и машины, с которой он подключается. Поиск соответствия основывается на правилах, которые мы обсудили раньше. Если соответствие не найдено, в доступе отказывается. В случае когда соответствующая запись найдена и имеет непустое поле Password , необходимо ввести правильный пароль. Неправильный пароль приводит к отклонению запроса на подключение.

Если соединение установлено, MySQL переходит к этапу верификации запроса. При этом сделанные вами запросы сопоставляются с вашими правами. Эти права MySQL проверяет по таблицам user, db, host, tables_priv и columns__priv . Как только найдено соответствие в таблице user с положительным разрешением, команда немедленно выполняется. В противном случае MySQL продолжает поиск в следующих таблицах в указанном порядке:

  1. db
  2. tables_priv
  3. columns_priv

Если таблица db содержит разрешение, дальнейшая проверка прекращается и выполняется команда. Если нет, то MySQL ищет соответствие в таблице tables_priv . Если, к примеру, это команда SELECT, объединяющая две таблицы, то пользователь должен иметь разрешения для обеих этих таблиц. Если хотя бы одна из записей отказывает в доступе или отсутствует, MySQL точно таким же способом проверяет все колонки в таблице columns_priv .

Утилита mysqlaccess

Освоение системы защиты MySQL поначалу может показаться вам затруднительным. Несколько упрощает дело имеющаяся в MySQL утилита mysqlaccess. Эта команда является сценарием на языке Perl , который, исходя из имен машины, пользователя и базы данных, точно показывает, что данный пользователь может делать и почему. Например, команда mysqlaccess nobody isp.com mydata может вывести следующее:

Access-rights

for USER 'nobody', from HOST 'isp.com', to DB 'mydata'

BEWARE: Everybody can access your DB as user 'nobody'

: from host 'isp.com' WITHOUT supplying a password. : Be very careful about it!!

The following rules are used: db : 'isp.com','mydata','nobody','Y','Y','Y','Y','N',

'N','N','N','N','N'

host : 'Not processed: host-field is not empty in db-table.'

user : '%', 'nobody', ", 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N'

(Выводится, в частности, предупреждение о том, что база доступна любому, регистрирующемуся как «nobody» с машины «isp.com» без ввода пароля, в связи с чем нужно проявлять осторожность.)

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

Изменение прав доступа

MySQL загружает таблицы доступа при запуске сервера. Преимуществом такого подхода по сравнению с динамическим обращением к таблицам является скорость. Отрицательная сторона состоит в том, что изменения, производимые в таблицах доступа MySQL, не сразу начинают действовать. Для того чтобы сервер увидел эти изменения, необходимо выполнить команду mysqladmin reload. Если таблицы изменяются с помощью SQL-команд GRANT или REVOKE, явно перегружать таблицы не требуется.

По каким-то причинам в некоторых дистрибутивах MySQL сценарий mysqlaccess указывает на нестандартное расположение исполняемых файлов Perl. Если при попытке выполнить mysqlaccess вы получаете сообщение «command not found», то это, скорее всего, ваш случай. Вам необходимо изменить строку 1 сценария mysqlaccess, чтобы она указывала на правильный путь к Perl, обычно /usr/local/bin/perl.

Утилиты MySQL

ТсХ распространяет MySQL с большим набором вспомогательных утилит, однако набор утилит, предлагаемых сторонними разработчиками, еще богаче. В этом параграфе мы постараемся дать краткий обзор этих инструментов, отложив полное описание до главы 18 «Справочник по РНР и Lite».

Утилиты командной строки (Command Line Tools)

isamchk

Производит проверку файлов, содержащих данные базы. Эти файлы называются ISAM-файлами (ISAM - метод индексированного последовательного доступа). Эта утилита может устранить большую часть повреждений ISAM-файлов. Мы подробнее опишем ее ниже.

isamlog

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

mysql

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

mysqlaccess

Модифицирует таблицы прав доступа MySQL и отображает их в

удобном для чтения виде. Использование этой утилиты — хороший способ изучения структуры таблиц доступа MySQL.

mysqladmin

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

mysqlbug

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

mysqldump

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

mysqlimport

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

mysqlshow

Выводит на экран структуру баз данных, имеющихся на сервере, и таблицы, из которых они состоят.

Утилиты сторонних разработчиков

Ни один поставщик или разработчик не может самостоятельно предоставить все необходимые для программного продукта средства поддержки. Продукты с открытым исходным кодом, такие как Linux, имели столь потрясающий успех не только благодаря проделанной Линусом Торвальдсом работе по созданию ядра Linux, но и благодаря сотням, если не тысячам, программ для Linux сторонних разработчиков. MySQL также значительно выиграл от работы подобных добровольцев. Хотелось бы перечислить все имеющиеся программы, но этот перечень ежедневно меняется. Ниже мы попытались составить представление о том, что имеется в наличии. За самым свежим списком обратитесь на домашнюю страницу MySQL: http://www.mysql.com/Contrib.

Утилиты преобразования баз данных

access_to_mysql

Преобразует базы данных Microsoft Access в таблицы MySQL. Включается в Access в виде функции, позволяющей сохранять таблицы в формате, позволяющем экспортировать их в MySQL.

dbf2mysql

Конвертирует файлы dBASE (DBF) в таблицы MySQL. Хотя dBASE утратил популярность, формат DBF установился как наиболее распространенный для передачи данных между различными приложениями баз данных. Все главные настольные приложения баз данных могут читать и писать DBF-файлы. Это приложение полезно для экспорта/импорта данных в коммерческие настольные базы данных.

Export sql/Importsql

Конвертирует базы данных Microsoft Access в MySQL и обратно. Эти утилиты являются функциями Access, которые можно использовать для экспорта таблиц Access в формате, пригодном для чтения MySQL. С их помощью можно также преобразовывать SQL-выход MySQL в вид, пригодный для чтения Access.

Интерфейсы CGI

РНР

Создает HTML-страницы с использованием специальных тегов, распознаваемых анализатором РНР. РНР имеет интерфейсы к большинству основных баз данных, включая MySQL и mSQL. Мы более подробно расскажем о РНР в главе 12 «РНР и другие средства поддержки управления HTML со стороны баз данных».

Mysql-webadmin

Осуществляет веб-администрирование баз данных MySQL. Используя это средство, можно просматривать таблицы и изменять их содержимое с помощью HTML-форм.

Mysqladm

Осуществляет веб-администрирование баз данных MySQL. Эта CGI-программа позволяет просматривать таблицы через WWW, добавлять таблицы и изменять их содержимое.

www-sql

Создает HTML-страницы из таблиц баз данных MySQL. Эта программа осуществляет разбор HTML-страниц в поисках специальных тегов и использует извлеченные данные для выполнения команд SQL на сервере MySQL.

Клиентские приложения

Mysqlwinadmn

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

xmysql

Обеспечивает полный доступ к таблицам баз данных MySQL для клиента X Window System. Поддерживает групповые вставки и удаления.

xmysqladmin

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

Интерфейсы программирования

MyODBC

Реализует ODBC API к MySQL в Windows.

Db.py

Обеспечивает доступ MySQL к сценариям Python. Для повышения производительности этот модуль осуществляет буферизацию извлекаемых данных. Программирование на Python для MySQL мы излагаем в главе 11, а подробное справочное руководство по Python представлено в главе 20.

Vdb-dflts

Реализует библиотеку Vdb для MySQL. Vdb - не зависящий от типа базы данных API для С, позволяющий единому клиенту иметь доступ к различным серверам баз данных. Клиенты Vdb могут использовать этот API для досупа к базам данных MySQL.

Delphi-interface

Предоставляет API доступа к MySQL для среды Delphi, выпускаемой Inprise. С помощью этого API любое приложение Delphi получает доступ к базам данных MySQL.

dump2h

Преобразует структуры таблиц MySQL в файлы заголовков С. Эта программа принимает обычный файл, создаваемый mysqldump и генерирует заголовочный файл С, описывающий таблицу в виде структуры (st ruct) на С.

mm.mysql.jdbc

Реализует стандартный API JDBC (Java Database Connectivity -доступ к базам данных из Java). В главе 14 «Java и JDBC» подробно обсуждается программирование на Java с использованием этого API, а в главе 22 «Справочник по JDBC» представлено полное справочное руководство по JDBC 2.0.

twzJdbcForMysql

Реализация JDBC API для Java.

Mysqltcl

Реализует интерфейс Tel к MySQL.

MySQLmodule

Реализует доступ к MySQL из Python.

Mysql-c++

Объектно-ориентированная оболочка MySQL С API для доступа из приложений на C++.

MySQL++

Обеспечивает объектно-ориентированный доступ к MySQL для приложений на C++,

Pike-mysql

Позволяет пользователям известного веб-сервера Roxen разрабатывать интернет-приложения с доступом к MySQL.

Sqlscreens

Генерирует экраны баз данных на Tcl/Tk на основе баз данных MySQL. Позволяет разработчикам строить специализированные . GUI, привязанные к таблицам MySQL.

Squile

Позволяет создавать сценарии на Guile для доступа к таблицам MySQL.

Wintcl

Поддерживает встраивание кода Tel в HTML-файлы. С помощью этого средства легко разрабатывать веб-приложения, способные осуществлять доступ к базам данных MySQL.

Разное

Emacs-sql-mode

Адаптирует стандартный режим SQL для Emacs для поддержки особенностей синтаксиса SQL в MySQL. Вводит отступы, выделяет синтаксис и довершает команды, что облегчает работу с SQL.

findres

Отыскивает в таблицах MySQL зарезервированные слова. Эта-программа ищет в таблицах MySQL зарезервированные слова SQL, которые могут нарушить правильную работу других баз данных, поддерживающих SQL.

Hyalog

Сохраняет в таблице MySQL исходящие факсимильные сообщения. Эта программа отслеживает факсы, отправляемые программой HylaFax, и сохраняет их копии в базе данных MySQL.

mod_auth_mysql

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

mod_log_mysql

Регистрирует трафик WWW, проходящий через сервер Apache, в базе данных MySQL.

mysqlpasswd

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

Mysql_watchdog

Осуществляет контроль за MySQL с целью обеспечения его непрерывного функционирования с нормальными параметрами.

Nsapi_auth_mysql

Аутентифицирует пользователей на веб-сервере Netscape.

Pam_mysql

Предоставляет интерфейс РАМ (Pluggable Authentication Module -подключаемый модуль аутентификации) к MySQL. РАМ обеспечивает проверку пользователей для ряда служб, включая стандартную регистрацию в системе.

Wuftpd-mysql

Позволяет регистрировать в базе данных MySQL трафик FTP через демон WuFTP.

Настройка производительности

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

MySQL имеет три потенциальных «узких места» при любом подключении. Во-первых, это сетевое соединение клиента с сервером. Во-вторых, это время решения таких задач, как, скажем, построение индексов. И наконец, проблема может быть связана с дисковым вводом/выводом. MySQL предоставляет доступ к переменным, с помощью которых ее функционирование можно настроить в соответствии со средой приложения. Все эти переменные можно установить, используя параметр в команде mysqld. Например, переменная back_log принимает значение 15 в результате добавления к mysqld параметра -О backjtog=15. Ниже следует список полезных переменных.

bach_log

Количество одновременных подключений по TCP/IP в очереди. При наличии большого числа удаленных пользователей, одновременно подключающихся к вашей базе данных, может потребоваться увеличить это число. Отрицательной стороной большого значения является некоторый рост использования памяти и загрузки ЦП.

key_buffer

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

max Connections

Число одновременных соединений, разрешенное сервером баз данных. Если при активной работе пользователи иногда получают отказ в доступе, возможно, это число следует увеличить. Отрицательное последствие - увеличение загрузки сервера, то есть рост использования ЦП, расхода памяти и дискового ввода/вывода.

table_cache

Буфер, используемый для хранения данных, к которым происходит частое обращение. Если выделить под них память, то резко сокращается объем обращений к диску. Отрицательный эффект - существенное увеличение расхода памяти.

Структура хранения данных в MySQL

Для хранения каждой таблицы MySQL используется три файла. Например, средних размеров таблица mytable может выглядеть так:

-rw-rw-- - 1 root root 1034155 Jun 3 17:08 mytable.ISD

-rw-rw---- 1 root root 50176 Jun 3 17:08 mytable.ISM

-rw-rw-- - 1 root root 9114 Jun 3 14:24 mytable.frm

В файле ISD хранятся фактические данные. В файле ISM хранятся данные о ключах и прочие внутренние данные, необходимые MySQL для быстрого поиска данных в файле ISD. Файл f rm содержит структуру самой таблицы.

Файл ISM наиболее важен для функционирования MySQL. Он настолько важен, что ему посвящена целая утилита isamchk. Запуск isamchk -d выводит сведения о таблице:

# isamchk -d mytable

ISAM file: mytable

Data records: 1973 Deleted blocks: 0

Recordlength: 343

Record format: Packed

table description:

Key Start Len Index Type

1 2 50 unique text packed stripped

Важное поле, которое нужно отметить, это «Deleted blocks» (удаленные блоки). Если его значение слишком велико, то файл понапрасну занимает много лишнего места. К счастью, это пространство можно освободить. В результате выполнения следующей команды таблица будет просмотрена и создана заново, при этом будут в большинстве своем устранены ошибки и высвобождено свободное пространство:

isamchk -r mytable

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

Восстановление поврежденных таблиц

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

isamchk mytable

При запуске isamchk во время работы сервера может потребоваться выполнить mysqladmin reload, чтобы сервер «увидел» исправленную таблицу.

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

isamchk -rq mytable

Эта команда осуществляет быструю проверку и при необходимости исправление только файла ISM, файл ISD при этом не проверяется.

isamchk -e mytable

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

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

Удаление и замена ключей

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

В этих случаях оказывается полезным временное удаление ключей из таблицы и воссоздание их после завершения опасной работы. Следующая команда удаляет ключи из таблицы:

isamchk -rq -k0

Если вы готовы снова вставить ключи, это можно сделать командой:

isamchk -rq

Прежде чем ввести команду isamchk с параметром -r, завершите работу сервера, иначе таблица может оказаться повреждений.

Команда isamchk предоставляет столько возможностей, что вам, вероятно, станет сложно разобраться во всех них. Следует, однако, руководствоваться следующими соображениями:

Устранение неполадок

Даже в самых совершенных программах возникают проблемы. К счастью, многие из проблем, с которыми вы можете столкнуться, уже с кем-то случались. Ниже приводится ряд часто встречавшихся проблем при администрировании MySQL.

Изменения в таблицах доступа не действуют.

Не забывайте выполнять команду mysqladmin reload после внесения изменений в таблицы доступа.

При высокой загрузке MySQL отказывает в подключении.

  1. Сначала уточните число соединений, допускаемых сервером. Команда mysqladmin variables покажет его значение в поле max_connec-tions. Можно увеличить это число, запустив mysqld с параметром -О max_connections=###, где ### - предел, который вы хотите установить.
  2. Можно также проверить значение back_log , которое определяет размер очереди, создаваемой MySQL для входящих соединений, равное 5 по умолчанию. Версии MySQL до 3.22 позволяли увеличить это значение до 64, но в более поздних версиях его можно увеличить до 1024. Однако оно может быть ограничено до 64 вашей операционной системой.
  3. Наконец, эта проблема может быть вызвана ограничением числа дескрипторов файлов. Симптомом этого является полный отказ в подключениях при запуске MySQL большого числа потоков. Unix-системы позволяют устанавливать число дескрипторов файлов разными способами, поэтому следует справиться в системной документации о том, как это сделать.

MySQL сообщает о невозможности найти файл, который явно существует, или сообщает об ошибках во время его чтения.

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

Число потоков начинает расти, и потоки не завершаются,

В некоторых системах с установленным NFS, а также в Linux, есть проблемы с механизмом блокировки файлов. Результатом может быть замораживание потоков. Команда mysqladmin processlist поможет выявить эту проблему. Если в поле «Command» против замороженных потоков стоит «System lock», запустите mysqld с параметром --skip_ locking.