Администрирование базы данных
Теперь, когда у вас есть свежеустановленная и запущенная 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.

Удаление базы данных
В процессе разработки приложения вам, вероятно, потребуется создать несколько баз данных для поддержки процесса разработки. Например, обычной практикой в разработке приложений баз данных является создание отдельных баз данных для разработки, тестирования и работы. По завершении разработки следует избавиться от этих промежуточных баз данных. Утилита 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 |
|||||
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')
Первый созданный нами пользователь, «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 сортирует данные следующим образом:
В предыдущем примере пользователь сначала будет сравниваться с «nobody» из «athens.imagmary.com», поскольку «athens.imaginary.com» в порядке сортировки стоит выше «% ». Поскольку имена компьютеров сортируются раньше имен пользователей, значения привилегий для компьютера, с которого вы подключаетесь, имеют приоритет перед любыми конкретными правами, которые у вас могут быть. Например, если таблица user содержит записи:
Host |
User |
||
% athens .imaginary .com |
jane |
||
Таблица 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 продолжает поиск в следующих таблицах в указанном порядке:
Если таблица 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.