Документация MySQL
| Документация DHTML | Документация Smarty | SVG/VML Графика и JavaScript
| Документация bash |
| Глава 4. Администрирование баз данных | ||
|---|---|---|
| Пред. | След. | |
Глава 4. Администрирование баз данных
Содержание
- 4.1. Конфигурирование MySQL
- 4.2. Общие проблемы безопасности и система привилегий доступа MySQL
- 4.2.1. Общие принципы обеспечения безопасности
- 4.2.2. Как обезопасить MySQL от хакеров
- 4.2.3. Опции запуска
mysqld, относящиеся к безопасности - 4.2.4. Вопросы безопасности, относящиеся к команде LOAD DATA LOCAL
- 4.2.5. Функции, выполняемые системой привилегий
- 4.2.6. Как работает система привилегий
- 4.2.7. Привилегии, предоставляемые MySQL
- 4.2.8. Соединение с сервером MySQL
- 4.2.9. Управление доступом, этап 1: верификация подсоединения
- 4.2.10. Управление доступом, этап 2: верификация запросов
- 4.2.11. Причины появления ошибок
Access denied('в доступе отказано')
- 4.3. Управление учетными записями пользователей MySQL
- 4.3.1. Синтаксис команд
GRANTиREVOKE - 4.3.2. Имена пользователей MySQL и пароли
- 4.3.3. Когда изменения в привилегиях вступают в силу
- 4.3.4. Задание изначальных привилегий MySQL
- 4.3.5. Добавление новых пользователей в MySQL
- 4.3.6. Ограничение ресурсов пользователя
- 4.3.7. Задание паролей
- 4.3.8. Обеспечение безопасности своего пароля
- 4.3.9. Использование безопасных соединений
- 4.3.1. Синтаксис команд
- 4.4. Предотвращение катастроф и восстановление
- 4.4.1. Резервное копирование баз данных
- 4.4.2. Синтаксис
BACKUP TABLE - 4.4.3. Синтаксис
RESTORE TABLE - 4.4.4. Синтаксис
CHECK TABLE - 4.4.5. Синтаксис
REPAIR TABLE - 4.4.6. Использование
myisamchkдля профилактики таблиц и послеаварийного - 4.4.7. Настройка режима профилактики таблиц
- 4.4.8. Получение информации о таблице
- 4.5. Справочник по языку администрирования баз данных
- 4.6. Локализация MySQL и использование национальных алфавитов
- 4.6.1. Набор символов, применяющийся для записи данных и сортировки
- 4.6.2. Сообщения об ошибках на языках, отличных от английского
- 4.6.3. Добавление набора символов
- 4.6.4. Массивы определения символов
- 4.6.5. Поддержка упорядочивания строк
- 4.6.6. Поддержка многобайтовых символов
- 4.6.7. Проблемы с наборами символов
- 4.7. Серверные сценарии и утилиты MySQL
- 4.8. Клиентские сценарии и утилиты MySQL
- 4.8.1. Обзор клиентских сценариев и утилит
- 4.8.2.
mysql, Утилита командной строки - 4.8.3.
mysqladmin, Администрирование MySQL-сервера. - 4.8.4. Использование
mysqlcheckдля сопровождения и аварийного восстановления таблиц. - 4.8.5.
mysqldump, Получение дампов данных и структуры таблицы - 4.8.6.
mysqlhotcopy, Копирование баз данных и таблиц MySQL - 4.8.7.
mysqlimport, импорт данных из текстовых файлов - 4.8.8.
mysqlshow, просмотр баз данных, таблиц и столбцов - 4.8.9.
mysql_config, Получение опций компиляции для компиляции клиентских программ - 4.8.10.
perror, разъяснение кодов ошибок - 4.8.11. Как запускать SQL-команды из текстового файла
- 4.9. Файлы журналов MySQL
- 4.10. Репликация в MySQL
- 4.10.1. Введение
- 4.10.2. Как реализована репликация: обзор
- 4.10.3. Как настроить репликацию
- 4.10.4. Возможности репликации и известные проблемы
- 4.10.5. Опции репликации в файле
my.cnf - 4.10.6. SQL-команды, относящиеся к репликации
- 4.10.7. Часто задаваемые вопросы по репликации
- 4.10.8. Поиск неисправностей репликации
4.1. Конфигурирование MySQL
- 4.1.1. Параметры командной строки
mysqld - 4.1.2. Файлы параметров
my.cnf - 4.1.3. Установка нескольких серверов на один компьютер
- 4.1.4. Запуск нескольких серверов MySQL на одном компьютере
4.1.1. Параметры командной строки mysqld
В большинстве случаев управление
параметрами mysqld осуществляется
при помощи файлов параметров (see
Раздел 4.1.2, «Файлы параметров my.cnf»).
mysqld и mysqld.server
считывают параметры из групп
mysqld и server.
mysqld_safe считывает
параметры из групп mysqld,
server, mysqld_safe и
safe_mysqld. Встроенный
сервер MySQL обычно считывает
параметры из server,
embedded и xxxxx_SERVER,
где xxxxx - имя приложения.
mysqld принимает следующие параметры
командной строки (для получения
полного списка выполните mysqld
--help):
--ansiИспользовать синтаксис ANSI SQL вместо синтаксиса MySQL (see Раздел 1.9.2, «Запуск MySQL в режиме ANSI»).
-b, --basedir=pathПуть к каталогу установки. Все остальные пути обычно определяются относительно этого пути.
--big-tablesПозволяет использовать наборы результатов большого объема за счет сохранения всех временных файлов в одном. Данный параметр позволяет устранить большинство ошибок 'table full' (таблица переполнена), но замедляет обработку запросов, для которых было бы достаточно таблиц, расположенных в памяти. Начиная с версии 3.23.2 в MySQL эта проблема решается автоматически: память используется для небольших временных таблиц, а при необходимости происходит переключение на таблицы, расположенные на диске.
--bind-address=IPIP-адрес, с которым необходимо установить связь.
--consoleПисать журнал сообщений/ошибок в stderr/stdout даже если
--log-errorуказана. На Windows mysqld просто не будет закрывать консольное окно если указана эта опция.--character-sets-dir=pathКаталог, в котором расположены наборы символов (see Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).
--chroot=pathИзменяет корневой каталог программы mysqld во время запуска. Рекомендуемая мера безопасности для MySQL 4.0 (MySQL 3.23 не вполне в состоянии предоставить 100% измененную среду запуска). Эта опция некоторым образом ограничивает использование функций
LOAD DATA INFILEиSELECT ... INTO OUTFILE.--core-fileЗаписывает файл ядра, если происходит аварийное прекращение работы
mysqld. В некоторых системах также необходимо указать--core-file-sizeдля safe_mysqld (see Раздел 4.7.2, «safe_mysqld, оболочкаmysqld»). Обратите внимание на то, что в некоторых системах, таких как Solaris, не удастся записать файл ядра, если используется параметр--user.-h, --datadir=pathПуть к корневому каталогу базы данных.
--debug[...]=Если MySQL настроен при помощи
--with-debug, то этот параметр позволяет получить файл трассировки, в котором отражена работаmysqld(see Раздел E.1.2, «Создание трассировочных файлов»).--default-character-set=charsetЗадает набор символов, принятый по умолчанию (see Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).
--default-table-type=typeЗадает тип таблиц, принятый по умолчанию (see Глава 7, Типы таблиц MySQL).
--delay-key-write[= OFF | ON | ALL]Указывает, как на MyISAM
DELAYED KEYSдолжен обрабатываться. See Раздел 5.5.2, «Настройка параметров сервера».--delay-key-write-for-all-tables; В MySQL 4.0.3 следует использовать --delay-key-write=ALL.Отмена сброса на диск ключевых буферов для всех таблиц
MyISAMмежду записями. See Раздел 5.5.2, «Настройка параметров сервера».--des-key-file=filenameЗадает считывание из файла filename принятых по умолчанию ключей, которые используются для
DES_ENCRYPT()иDES_DECRYPT().--enable-external-locking (было --enable-locking)Включает блокировку доступа к системе. Обратите внимание на то, что если этот параметр используется в системе, где функция
lockdполностью не работает (например, в Linux), это может привести к зависанию mysqld.--enable-named-pipeВключает поддержку для именованных каналов (только в NT/Win2000/XP).
-T, --exit-infoПобитовое маскирование различных флагов, которое применяется для отладки сервера mysqld; не следует использовать этот параметр, если вы хорошо не разбираетесь в том, что именно он делает!
--flushЗадает сброс на диск всех изменений после каждой команды SQL. Обычно MySQL только направляет все изменения на диск после каждой команды SQL, делегируя управление синхронизацией записи на диск операционной системе (see Раздел A.4.1, «Что делать, если работа MySQL сопровождается постоянными сбоями»).
-?, --helpВывод сокращенной справки и завершение выполнения.
--init-file=fileЗадает считывание команды SQL из файла file при запуске.
-L, --language=...Вывод сообщений об ошибках клиента на указанном языке. Может быть задан в виде полного пути (see Раздел 4.6.2, «Сообщения об ошибках на языках, отличных от английского»).
-l, --log[=file]Задает занесение в файл журнала соединений и запросов (see Раздел 4.9.2, «Общий журнал запросов»).
--log-bin=[file]Двоичный журнал обновлений. Сохранение всех запросов, изменяющих данные, в файл. Используется для архивного копирования и репликации. See Раздел 4.9.4, «Бинарный журнал обновлений».
--log-bin-index[=file]Имя индексного файла для двоичного журнала обновлений. See Раздел 4.9.4, «Бинарный журнал обновлений».
--log-error[=file]Писать ошибки и сообщения в этот файл. See Раздел 4.9.1, «Журнал ошибок».
--log-isam[=file]Заносит в файл журнала все изменения
ISAM/MyISAM(используется только при отладкеISAM/MyISAM).--log-slow-queries[=file]Заносит в файл журнала все запросы, выполнение которых заняло больше, чем
long_query_timeсекунд (see Раздел 4.9.5, «Журнал медленных запросов»).--log-update[=file]Заносит в файл журнала обновления
file.#где#представляет собой уникальный номер, если он не был задан (see Раздел 4.9.3, «Журнал обновлений (update)»).--log-long-formatЗаносит в файл журнала обновлений некоторую дополнительную информацию. Если задано
--log-slow-queries, то запросы, не использующие индексов, будут заноситься в журнал медленных запросов.--low-priority-updatesОперациям по изменению таблиц (
INSERT/DELETE/UPDATE) будет назначен более низкий приоритет, чем операциям выбора. Это также можно реализовать при помощи{INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ..., чтобы понизить приоритет только одного запроса, или черезSET LOW_PRIORITY_UPDATES=1, чтобы изменить приоритет в одном потоке (see Раздел 5.3.2, «Вопросы блокирования таблиц»).--memlockФиксирует процесс
mysqldв памяти. Этот параметр работает только в том случае, если ваша система поддерживает системный вызовmlockall(), например Solaris. Такая мера может быть полезной, если операционная система записываетmysqldв файл подкачки на диск.--myisam-recover [=параметр[,параметр...]]]Параметр - это любое сочетание
DEFAULT,BACKUP,FORCEилиQUICK. Если необходимо отключить данную функцию, укажите вместо набора параметров явно"". Если эта функция используется,mysqldпроверит таблицу на предмет того, была ли она отмечена как сбойная или не была закрыта надлежащим образом (последний вариант действует только в том случае, если был включен параметр--skip-external-locking). В любом из этих случаевmysqldпроизведет полную проверку таблицы. Если таблица была повреждена,mysqldпопытается ее восстановить. Приведенные ниже параметры влияют на работу процесса восстановления.Параметр Описание DEFAULT Аналогично отсутствию каких-либо параметров для функции --myisam-recover.BACKUP Если во время восстановления таблица данных была изменена, сохраняется резервная копия файла данных table_name.MYDпод именемtable_name-datetime.BAK.FORCE Запуск восстановления, даже если будет утрачено более одной строки из файла .MYD.QUICK Не проверять строки в таблице, в которых отсутствуют удаленные блоки. Перед автоматическим восстановлением таблицы MySQL добавит запись об этом в журнал ошибок. Если необходимо, чтобы восстановление после большинства ошибок осуществлялось без вмешательства пользователя, следует установить параметры
BACKUPиFORCE. Тогда восстановление будет производиться даже в случае, если некоторые строки будут удалены, но файл данных будет сохраняться в виде резервной копии, поэтому впоследствии всегда можно будет определить, что произошло.--pid-file=pathПуть к pid-файлу используется функцией
safe_mysqld.-P, --port=...Номер порта для прослушивания соединений TCP/IP.
-o, --old-protocolИспользовать протокол 3.20 для совместимости с некоторыми очень старыми клиентами (see Раздел 2.5.5, «Модернизация с версии 3.20 до версии 3.21»).
--one-threadИспользовать только один поток (для отладки в системе Linux) (see Раздел E.1, «Отладка сервера MySQL»).
-O, --set-variable var=optionЗадает значение для переменной.
--help- выводит список переменных. Подробное описание всех переменных можно найти в разделеSHOW VARIABLESэтого руководства (see Раздел 4.5.6.4, «SHOW VARIABLES»).Обратите внимание,
--set-variableморально устарела с версии MySQL 4.0. Просто используйте--var=option. See Раздел 5.5.2, «Настройка параметров сервера».В MySQL 4.0.2 вы можете устанавливать переменную непосредственно с помощью
--variable-name=option, иset-variableбольше не нужна в файлах опций.Если вы хотите ограничить максимальное значение, в которое может быть установлена пемеременная при помощи
SET, определите это значение с помощью опции--maximum-variable-nameSee Раздел 5.5.6, «Синтаксис командыSET».Когда переменная будет устанавливаться в какое-либо значение, MySQL автоматически будет корректировать его, чтобы оно оставалось в указананных рамках; также MySQL может немного корректировать установленное значение с тем, чтобы эффективнее использовались внутренние алгоритмы.
Раздел по настройке параметров сервера включает информацию по их оптимизации (see Раздел 5.5.2, «Настройка параметров сервера»).
--safe-modeПропуск некоторых этапов оптимизации.
--safe-show-databaseПри использовании этого параметра команда
SHOW DATABASESвыдает только те базы данных, для которых у пользователя есть какие-либо привилегии. Начиная с версии 4.0.2 этот параметр является недействительным и больше ни на что не влияет (его значение установлено по умолчанию), так как в новой версии появилась привилегияSHOW DATABASES(see Раздел 4.3.1, «Синтаксис командGRANTиREVOKE»).--safe-user-createКогда этот параметр включен, пользователь не может создавать новых пользователей при помощи команды
GRANT, если он не имеет привилегииINSERTдля таблицыmysql.userили для любого столбца этой таблицы.--skip-bdbЗапретить использование таблиц BDB. Это сэкономит память и может ускорить работу.
--skip-concurrent-insertОтключает возможность одновременного выбора и вставки данных для таблиц
MyISAM(используется только в том случае, если в этой функции найдена ошибка).--skip-delay-key-write; в MySQL 4.0.3 следует использовать --delay-key-write=OFFИгнорирует параметр
DELAY_KEY_WRITEдля всех таблиц (see Раздел 5.5.2, «Настройка параметров сервера»).--skip-grant-tablesВключение данного параметра приводит к тому, что сервер совсем не использует систему привилегий - таким образом полный доступ ко всем базам данных получают все! (Можно дать серверу команду снова использовать таблицы доступа, запустив
mysqladmin flush-privilegesилиmysqladmin reload.)--skip-host-cacheНикогда не использовать кэш имени главного компьютера для быстрого разрешения соответствий имен и IP-адресов, а вместо этого всегда запрашивать DNS-сервер по каждому соединению (see Раздел 5.5.5, «Как MySQL использует DNS»).
--skip-innodbЗапретить использование таблиц InnoDB. Это сэкономит память и может ускорить работу.
--skip-external-locking (было --skip-locking)Не использовать средства системных блокировок. Чтобы воспользоваться функциями
isamchkилиmyisamchk, необходимо выключить сервер (see Раздел 1.4.3, «Насколько стабильным является MySQL?»). Обратите внимание на то, что в MySQL версии 3.23 для восстановления или проверки таблицMyISAMможно использоватьREPAIRиCHECK.--skip-name-resolveНе производится разрешения имен хостов. Все значения в столбце Host в таблицах привилегий должны быть IP-адресами или значениями localhost (see Раздел 5.5.5, «Как MySQL использует DNS»).
--skip-networkingПрослушивание соединений TCP/IP не производится. Связь с
mysqldдолжна осуществляться через сокеты Unix. Этот параметр рекомендуется для систем, в которых разрешены только локальные запросы (see Раздел 5.5.5, «Как MySQL использует DNS»).--skip-newНе использовать новые (возможно, неправильные) операции.
--skip-symlinkНе удалять и не переименовывать файлы, на которые указывает файл
symlinkedв каталоге данных.--skip-safemallocЕсли MySQL настроен при помощи
--with-debug=full, все программы будут проверять память на наличие выхода за границы области памяти при каждом заполнении и освобождении памяти. Поскольку такая проверка осуществляется довольно медленно, от нее можно отказаться, воспользовавшись этим параметром.--skip-show-databaseНе позволяет использовать команду
SHOW DATABASES, если пользователь не имеет привилегииSHOW DATABASES. Начиная с версии 4.0.2 этот параметр больше не нужен, поскольку доступ теперь может быть разрешен при помощи привилегииSHOW DATABASES.--skip-stack-traceНе записывать трассировку стеков. Этот параметр может оказаться полезным, когда
mysqldзапущен под отладчиком. В некоторых системах данный параметр также необходимо использовать для получения файла ядра (see Раздел E.1, «Отладка сервера MySQL»).--skip-thread-priorityОтключает использование приоритетов потока, чтобы уменьшить время ожидания ответа.
--socket=pathФайл канала, который используется для локального соединения вместо файла, принятого по умолчанию,
/tmp/mysql.sock.--sql-mode=параметр[,параметр[,параметр...]]Параметр может представлять собой любое сочетание из:
REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY. Если нужно произвести сброс значения, параметр может быть пустым (""). Указание всех приведенных выше параметров аналогично использованию--ansi. При помощи этого параметра можно включать только необходимые режимы SQL (see Раздел 1.9.2, «Запуск MySQL в режиме ANSI»).--temp-poolПри указании данного параметра для создаваемых временных файлов будет использоваться ограниченный набор имен вместо создания уникального имени для каждого нового файла. Данная функция предназначена для устранения проблемы ядра Linux, возникающей при создании большого количества новых файлов с разными именами. По старой схеме в Linux как бы происходит 'утечка' памяти, так как она распределяется для кэша каталогов вместо дискового кэша.
--transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED |REPEATABLE-READ | SERIALIZABLE } Задает принятый по умолчанию уровень изоляции транзакции (see Раздел 6.7.3, «Синтаксис команды
SET TRANSACTION»).-t, --tmpdir=pathПуть для временных файлов. Может быть полезен, если принятый по умолчанию каталог
/tmpрасположен на слишком маленьком диске и не может вместить все временные таблицы. Начиная с MySQL 4.1, эта опция поддержает указание нескольких путей, разделенных двоеточием:(на Windows - точкой с запятой;). Эти пути будут использованы в ротации.-u, --user= [user_name | userid]Запуск демона
mysqldот имени пользователяuser_nameилиuserid(число). Этот параметр является обязательным при запускеmysqldв качестве главной программы.Начиная с MySQL 3.23.56 и 4.0.12:
Для того, чтобы избежать возможного пробоя в безопасности когда пользователь добавляет опцию
--user=rootв один из файловmy.cnf,mysqldлишь только будет использовать первую указанную опцию--userи давать предупреждение если указано множество таких опций. Имейте в виду, что/etc/my.cnfиdatadir/my.cnfмогут перекрыть опцию командной строки - таким образом, рекомендовано указывать эту опцию именно в/etc/my.cnf.-V, --versionВывод информации по версии программы и завершение выполнения.
-W, --log-warnings (было --warnings)Задает запись таких предупреждений, как
Aborted connection...в файл.err(see Раздел A.2.9, «Коммуникационные ошибки / Оборванные соединения».
Большая часть значений может быть
изменена в процессе работы сервера
с помощью команды SET. See
Раздел 5.5.6, «Синтаксис команды SET».
4.1.2. Файлы параметров my.cnf
Начиная с версии 3.22 MySQL может считывать принятые по умолчанию параметры запуска для сервера и клиентов из файлов параметров.
В Unix считывание принятых по умолчанию параметров MySQL производится из следующих файлов:
| Имя файла | Назначение |
/etc/my.cnf | Общие параметры |
DATADIR/my.cnf | Параметры для сервера |
defaults-extra-file | Файл, указанный при помощи -defaults-extra-file=# |
~/.my.cnf | Параметры для пользователя |
DATADIR является каталогом
данных MySQL (обычно
/usr/local/mysql/data для
бинарной установки или
/usr/local/var для установки
из исходных текстов). Обратите
внимание, что это тот каталог,
который был задан во время
настройки, а не указанный при
помощи --datadir при запуске
mysqld! (--datadir не
оказывает влияния на просмотр
файлов параметров сервером, так
как их просмотр происходит до
обработки аргументов командной
строки).
В Windows считывание принятых по умолчанию параметров MySQL производится из следующих файлов:
| Имя файла | Назначение |
windows-system-directory\my.ini | Общие параметры |
C:\my.cnf | Общие параметры |
Обратите внимание на то, что в Windows
все пути необходимо указывать при
помощи / вместо
\. Если необходимо
использовать \, то его
нужно указать дважды, так как
\ является знаком
перехода в MySQL.
MySQL пытается прочитать файлы параметров в указанном выше порядке. Если существует несколько таких файлов, то параметр, указанный в файле, идущем позже, имеет преимущество над таким же параметром, указанным в файле, расположенном ранее. Параметры, указанные в командной строке, обладают более высоким приоритетом по отношению к параметрам, указанным в любом из файлов параметров. Некоторые параметры можно задавать при помощи переменных окружения. Параметры, указанные в командной строке или в файлах параметров, обладают преимуществом по отношению к переменным окружения (see Приложение F, Переменные окружения).
Приводим список программ,
поддерживающих файлы параметров:
mysql, mysqladmin,
mysqld, mysqld_safe,
mysql.server, mysqldump,
mysqlimport, mysqlshow,
mysqlcheck, myisamchk и
myisampack.
Любой параметр, который может быть
задан в командной строке при
запуске программы MySQL, может быть
также задан в файле параметров (без
предваряющего двойного слэша).
Чтобы получить список доступных
параметров, следует запустить
программу с параметром
--help.
Файлы параметров могут содержать строки следующего вида:
#commentСтроки комментариев начинаются с символа ‘
#’ или ‘;’. Пустые строки игнорируются.[group]группа представляет собой имя программы или группы, для которой необходимо задать параметры. Любые параметры или строки, задающие значения переменных, которые указаны после строки группы, будут относиться к названной группе, пока не закончится файл параметров или же не будет указана другая строка группы.
optionЭквивалент
--optionв командной строке.option=valueЭквивалент
--option=valueв командной строке.set-variable = variable=valueЭквивалент
--set-variable variable=valueв командной строке. Данный синтаксис необходимо использовать для задания переменныхmysqld. Заметьте,--set-variableне используется с MySQL 4.0. Просто используйте--variable=value.
Группа client обеспечивает
возможность задавать параметры,
относящиеся ко всем клиентам MySQL
(кроме самого mysqld). Эта
группа великолепно подходит для
указания пароля, используемого при
подсоединении к серверу (но при
этом следует убедиться, что
разрешение на чтение и запись
этого файла есть только у вас).
Обратите внимание на то, что для
параметров и значений все
введенные перед ними и после них
пробелы автоматически удаляются. В
строках значений можно
использовать такие экранирующие
секвенции: '\b',
'\t', '\n',
'\r', '\\' и
'\s' ('\s' - это
пробел).
Пример типичного глобального файла параметров:
[client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick
Пример типичного файла параметров пользователя:
[client] # Указанный пароль будет направлен всем стандартным клиентам MySQL password=my_password [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysqlhotcopy] interactive-timeout
Если у вас дистрибутив исходного
кода, то примеры конфигурационных
файлов с именами my-xxxx.cnf
можно найти в каталоге
support-files. В случае
бинарного дистрибутива следует
обратиться к каталогу
DIR/support-files, где
DIR - имя каталога
установки MySQL (обычно
/usr/local/mysql). На данный
момент там приведены примеры
файлов конфигурации для малых,
средних, больших и очень больших
систем. Чтобы
поэкспериментировать с файлом,
можно скопировать
my-xxxx.cnf в свой домашний
каталог (переименуйте копию в
.my.cnf).
Все поддерживающие файлы параметров клиенты MySQL принимают следующие параметры:
| Параметр | Описание |
| --no-defaults | Не читать информацию из файлов параметров. |
| --print-defaults | Вывести имя программы и все параметры, которые ей передаются. |
| --defaults-file=full-path-to-default-file | Использовать только указанный файл конфигурации. |
| --defaults-extra-file=full-path-to-default-file | Прочитать этот файл конфигурации после глобального файла конфигурации, но перед файлом конфигурации пользователя. |
Обратите внимание на то, что
указанные выше параметры должны
идти первыми в командной строке!
Однако параметр --print-defaults
может использоваться сразу после
команд --defaults-xxx-file.
Примечание для разработчиков: обработка файла параметров происходит следующим образом: все совпадающие параметры (т.е. параметры в соответствующих группах) обрабатываются перед любыми аргументами командной строки. Этот алгоритм хорошо подходит для программ, которые в случае, если один и тот же параметр указывается несколько раз, используют последний экземпляр параметра. Если же вы работаете со старой программой, которая считывает заданные несколько раз параметры указанным образом, но не читает файлы параметров, необходимо добавить только две строки, чтобы у нее появилась эта возможность. Чтобы увидеть, как это делается, достаточно ознакомиться с исходным кодом любого стандартного клиента MySQL.
В скриптах оболочки для анализа
файлов config можно
использовать команду
my_print_defaults:
shell> my_print_defaults client mysql
--port=3306
--socket=/tmp/mysql.sock
--no-auto-rehash
Приведенные выше выходные данные
содержат все параметры для групп
client и mysql.
4.1.3. Установка нескольких серверов на один компьютер
В некоторых случаях необходимо,
чтобы на одном компьютере работало
несколько различных серверов
mysqld: например, если нужно
запустить для тестирования новую
версию MySQL совместно со старой
версией, которая находится в
работе, или когда разным
пользователям нужно предоставить
доступ к различным серверам
mysqld, с которыми они умеют
обращаться самостоятельно.
Один из способов запустить новый сервер -- указать ему другой канал и порт, например, таким образом:
shell>MYSQL_UNIX_PORT=/tmp/mysqld-new.sockshell>MYSQL_TCP_PORT=3307shell>export MYSQL_UNIX_PORT MYSQL_TCP_PORTshell>scripts/mysql_install_dbshell>bin/safe_mysqld &
Приложение, в котором описаны
переменные окружения, включает
список других переменных
окружения, которые можно
использовать для управления
mysqld (see
Приложение F, Переменные окружения).
В приведенном выше примере представлен грубый быстрый метод, который обычно применяется для тестирования. Преимуществом данного метода является то, что все соединения, которые устанавливаются в указанной выше оболочке, автоматически направляются на новый запущенный сервер!
Если работать с несколькими
серверами необходимо постоянно, то
нужно создать файл параметров для
каждого сервера (see
Раздел 4.1.2, «Файлы параметров my.cnf»). В скрипте
запуска, который выполняется при
каждой загрузке, следует указать
оба сервера:
safe_mysqld
--defaults-file=path-to-option-file
Для серверов должны быть различными по крайней мере следующие параметры:
port=#
socket=path
pid-file=path
Приведенные ниже параметры, если они используются, также должны различаться:
log=path
log-bin=path
log-update=path
log-isam=path
bdb-logdir=path
shared-memory-base-name (Новое в MySQL 4.1)
Если требуется увеличить производительность, необходимо также задать разные значения для следующих параметров:
tmpdir=path
bdb-tmpdir=path
See Раздел 4.1.1, «Параметры командной строки mysqld». Начиная с
MySQL 4.1, в tmpdir могут быть
указаны несколько путей,
разделенных двоеточием :
(точкой с запятой на Windows
;). Эти пути будут
использованы в ротации. Эта
функция может быть использована
для того, чтобы распределить
данные между разными физическими
дисками.
Если производится установка
бинарной версии MySQL (файлы .tar),
которая запускается из
./bin/safe_mysqld, то в
большинстве случаев единственными
параметрами, которые необходимо
добавить/изменить, являются
аргументы socket и
port для safe_mysqld.
See Раздел 4.1.4, «Запуск нескольких серверов MySQL на одном компьютере».
4.1.4. Запуск нескольких серверов MySQL на одном компьютере
Иногда возникают обстоятельства, когда необходимо запустить несколько серверов на одном компьютере. Например, может понадобиться произвести тестирование новой версии MySQL, не изменяя текущей установки программы. Или еще вариант: вы являетесь поставщиком услуг Internet, который хочет предоставить независимые установки MySQL для различных клиентов.
Если необходимо запустить
несколько серверов, то проще всего
скомпилировать серверы с
различными портами TCP/IP и файлами
сокетов (see Раздел 4.7.3, «Mysqld_multi, программа для управления множеством серверов MySQL»).
Предположим, что существующий
сервер настроен на принятые по
умолчанию номер порта и файл
сокета. Настроим новый сервер при
помощи команды configure
следующим образом:
shell>./configure --with-tcp-port=port_number \--with-unix-socket-path=file_name \--prefix=/usr/local/mysql-3.22.9
Здесь port_number и
file_name должны отличаться
от принятого по умолчанию номера
порта и пути файла сокета, а
значение --prefix должно
указывать каталог установки,
который отличается от того, в
котором установлен текущий MySQL.
Проверить сокет, используемый установленным на данный момент сервером MySQL, можно при помощи следующей команды:
shell> mysqladmin -h hostname --port=port_number variables
Обратите внимание: если указать
``localhost'' как имя
удаленного компьютера,
mysqladmin по умолчанию будет
использовать сокеты Unix вместо TCP/IP.
В MySQL 4.1 вы также можете указать
протокол, который надлежит
использовать с помощью опции
--protocol=(TCP | SOCKET | PIPE | MEMORY).
Если на используемом порту находится сервер MySQL, то будет выдан список самых важных настраиваемых переменных в MySQL, включая имя сокета.
Повторно компилировать новый
сервер MySQL нет необходимости, его
просто нужно запустить с другими
параметрами для порта и сокета.
Используемые порт и сокет можно
изменить, указав их как параметры
запуска для safe_mysqld:
shell> /path/to/safe_mysqld --socket=file_name --port=port_number
Модуль mysqld_multi может
также в качестве аргумента
принимать safe_mysqld (или
mysqld) и передавать
параметры из файла конфигурации
для safe_mysqld и дальше для
mysqld.
Если новый сервер запускается на
том же каталоге базы данных, что и
другой сервер с включенной записью
в журналы, необходимо также
указать имена файлов журналов для
safe_mysqld при помощи
параметров --log,
--log-update или
--log-slow-queries. Иначе оба
сервера могут попытаться
осуществить запись в один и тот же
файл журнала.
Предупреждение: обычно нельзя допускать, чтобы два сервера одновременно заносили данные в одну и ту же базу данных! Если ваша операционная система не поддерживает безотказную блокировку доступа, это может привести к возникновению неприятных сюрпризов!
Если для второго сервера
понадобится использовать другой
каталог базы данных, можно
воспользоваться параметром
--datadir=path для
safe_mysqld.
Обратите
внимание: запуск нескольких
серверов MySQL (mysqlds) на
различных компьютерах с доступом к
одному каталогу данных через
сетевую файловую систему обычно не
приводит ни к чему хорошему!
Проблема состоит в том, что сетевая
файловая система становится узким
местом для передачи данных. Она не
предназначена для такого
использования. И даже в этом случае
придется искать решение, которое
позволит обеспечить отсутствие
конфликтов между двумя или более
модулями mysqld. На данный
момент не существует платформы,
которая обеспечивает на 100%
надежную блокировку доступа к
файлам (обычно демон lockd)
во всех возможных ситуациях. Кроме
того, существует еще одна
опасность при использовании
сетевой файловой системы: эта
система может еще больше усложнить
работу программы lockd.
Поэтому лучше смотреть на вещи
проще и забыть об этой идее.
Оптимальным решением будет
использование одного компьютера с
несколькими центральными
процессорами и с операционной
системой, которая эффективно
управляет потоками.
Если нужно подсоединиться к серверу MySQL, который работает с портом, отличным от того, с которым откомпилирован ваш клиент, можно воспользоваться одним из следующих методов:
Запустите клиент с параметрами
--host 'hostname' --port=port_number, чтобы подсоединиться через TCP/IP, или[--host localhost --socket=file_name], чтобы подсоединиться через сокет Unix.Запускайте ваш клиент с
--protocol=tcpдля подключения по TCP/IP и--protocol=socketдля подключения через сокет Unix.В своей программе на языке C или Perl можно задать аргументы порта или сокета при подсоединении к серверу MySQL.
При использовании модуля Perl
DBD::mysqlможно прочитать параметры из файлов параметров MySQL (see Раздел 4.1.2, «Файлы параметровmy.cnf»).$dsn = "DBI:mysql:test;mysql_read_default_group=client; mysql_read_default_file=/usr/local/mysql/data/my.cnf" $dbh = DBI->connect($dsn, $user, $password);
Задайте переменные окружения
MYSQL_UNIX_PORTиMYSQL_TCP_PORT, чтобы указать на сокет Unix и порт TCP/IP до запуска клиентов. Если обычно используются конкретные сокет или порт, команды для задания этих переменных окружения необходимо поместить в свой файл.login(see Приложение F, Переменные окружения).Укажите принятые по умолчанию сокет и порт TCP/IP в файле
.my.cnfв своем домашнем каталоге (see Раздел 4.1.2, «Файлы параметровmy.cnf»).
4.2. Общие проблемы безопасности и система привилегий доступа MySQL
- 4.2.1. Общие принципы обеспечения безопасности
- 4.2.2. Как обезопасить MySQL от хакеров
- 4.2.3. Опции запуска
mysqld, относящиеся к безопасности - 4.2.4. Вопросы безопасности, относящиеся к команде LOAD DATA LOCAL
- 4.2.5. Функции, выполняемые системой привилегий
- 4.2.6. Как работает система привилегий
- 4.2.7. Привилегии, предоставляемые MySQL
- 4.2.8. Соединение с сервером MySQL
- 4.2.9. Управление доступом, этап 1: верификация подсоединения
- 4.2.10. Управление доступом, этап 2: верификация запросов
- 4.2.11. Причины появления ошибок
Access denied('в доступе отказано')
MySQL имеет развитую, но нестандартную систему обеспечения безопасности и привилегий доступа. В этом разделе дается описание ее работы.
4.2.1. Общие принципы обеспечения безопасности
С данным разделом должны ознакомиться все, кто использует MySQL на компьютерах, подключенных к Internet, - чтобы избежать наиболее распространенных ошибок, приводящих к нарушению безопасности системы.
При обсуждении вопросов безопасности мы акцентируем внимание на необходимости защиты всего серверного хоста (а не одного лишь сервера MySQL) от всех возможных типов атак: перехвата, внесения изменений, считывания и отказа в обслуживании. Данный раздел не охватывает всех аспектов готовности к работе и отказоустойчивости.
Используемая в MySQL система безопасности для всех подключений, запросов и иных операций, которые может пытаться выполнить пользователь, базируется на списках контроля доступа ACLs (Access Control Lists). Обеспечивается также некоторая поддержка SSL-соединений между клиентами и серверами MySQL. Многие из рассматриваемых здесь концепций не относятся исключительно к MySQL; те же общие соображения применимы практически ко всем приложениям.
При работе в MySQL старайтесь следовать приведенным ниже инструкциям:
Не предоставляйте никому (за исключением пользователя
mysqlпод именемroot) доступа к таблицеuserв базе данныхmysql! Это чрезвычайно важно. В MySQL зашифрованный пароль является реальным паролем. Узнав пароль, занесенный в таблицуuser, и имея доступ к удаленному компьютеру, занесенному в соответствующую учетную запись, войти в систему под именем зарегистрированного владельца пароля легко может кто угодно.Изучите систему прав доступа MySQL. Для управления доступом к MySQL служат команды
GRANTиREVOKE. Предоставляйте ровно столько прав, сколько необходимо, и не больше. Никогда не предоставляйте права всем хостам. Полезно проводить следующие контрольные проверки:Выполните команду
mysql -u root. Если удается успешно установить соединение с сервером без получения запроса пароля, значит, у вас имеются проблемы. Это означает, что кто угодно может подсоединиться к вашему серверу MySQL как клиент MySQL под именемroot, получая таким образом право неограниченного доступа! Проанализируйте инструкцию по инсталляции MySQL, обращая особое внимание на ту часть, которая касается задания пароля пользователяroot.С помощью команды
SHOW GRANTSпроверьте, кто и к каким ресурсам имеет доступ. Воспользуйтесь командойREVOKE, отмените права доступа, которые не являются необходимыми.
Не храните в базе данных незашифрованных паролей. Если злоумышленнику удастся получить доступ на ваш компьютер, то в его руках окажется полный список паролей, которыми он может воспользоваться. Применяйте для шифрования
MD5(),SHA1()или другие односторонние хеш-функции.Не используйте в качестве пароля слова из словарей. Для взлома такого рода паролей имеются специальные программы. Даже слова типа ``xfish98'' - это очень плохие пароли. Куда лучше ``duag98'': здесь используется то же слово ``fish'', но при этом буквы в нем заменены ближайшими к ним слева буквами клавиатуры QWERTY. Еще один метод - составить парольное слово из первых букв слов какого либо словосочетания, например ``Mhall'' - по фразе ``Mary had a little lamb.'' Такой пароль легко запоминается и его легко вводить. А вот разгадать его тому, кто не знает ключевой фразы, будет непросто.
Приобретите брандмауэр. Эта мера обеспечит защиту как минимум от половины всех видов несанкционированного использования любого ПО, с которым вы работаете. Разместите MySQL за брандмауэром или в демилитаризованной зоне (demilitarised zone - DMZ). Полезно проводить следующие контрольные проверки:
Попробуйте просканировать ваши порты из Internet с помощью утилиты типа
nmap. MySQL использует по умолчанию порт 3306. Этот порт должен быть недоступен с неблагонадежных компьютеров. Еще один простой способ проверить, открыт или нет ваш MySQL-порт, - попытаться выполнить с какой либо удаленной машины следующую команду, гдеserver_host- имя хоста, на котором установлен ваш сервер MySQL:shell>
telnet server_host 3306Если соединение будет установлено, и вы получите какие-либо бессмысленные символы, это будет означать, что порт открыт, и его нужно закрыть на брандмауэре или маршрутизаторе (если, конечно, нет действительно веских причин держать его открытым). Если же
telnetпросто зависнет или в подсоединении будет отказано, тогда все в порядке: порт заблокирован.Не доверяйте никаким данным, которые вводят пользователи. Возможны попытки перехитрить вашу программу путем ввода последовательностей специальных или экранированных символов в веб-формы, URL-ы или любое приложение, созданное вами. Убедитесь, что защита вашего приложения не будет нарушена, если пользователь введет что-нибудь типа "
'; DROP DATABASE mysql;''. Это крайний случай, но действия хакеров, использующих подобную технологию, могут привести к потере информации и появлению брешей в системе безопасности, если вы не готовы к ним. Не следует также забывать о необходимости проверки цифровых данных (распространенной ошибкой является защита только строк). Некоторые полагают, что если в базе данных хранятся только открытые данные, то в ее защите нет необходимости. Это неверно. Такие базы могут стать объектом успешных атак типа отказа от обслуживания. Простейший способ защиты от взломов такого типа - заключать числовые константы в кавычки:SELECT * FROM table WHERE ID='234', а неSELECT * FROM table WHERE ID=234. MySQL автоматически преобразует эту строку в число и выбросит из нее все нецифровые символы. Полезно проводить следующие контрольные проверки:Для всех веб-приложений:
Попробуйте ввести во все ваши веб-формы одинарные и двойные кавычки - ‘
'’ и ‘"’. Если MySQL выдаст любое сообщение об ошибке, немедленно разберитесь, в чем дело.Попробуйте видоизменять динамические URL, добавляя в них
%22(‘"’),%23(‘#’), и%27(‘'’).Попробуйте модифицировать типы данных в динамических URL - замените числовые на символьные, используя символы из предыдущих примеров. Ваше приложение должно быть устойчиво к подобного рода атакам.
Попробуйте вводить в числовые поля вместо цифр буквы, пробелы и специальные символы. Ваше приложение должно либо удалять их до передачи в MySQL, либо выдавать сообщение об ошибке. Пропускать в MySQL значения без проверки очень опасно!
Проверяйте размер данных перед тем, как они будут переданы в MySQL.
При подключении приложения к базе данных лучше использовать имя пользователя, отличное от того, которое вы используете для целей администрирования. Не предоставляйте своим приложениям больше прав доступа, чем это необходимо.
Пользователям PHP:
Проверьте функцию
addslashes(). Что касается PHP 4.0.3, то в нем имеется функцияmysql_escape_string(), базирующаяся на функции с тем же именем из MySQL C API.
Пользователям MySQL C API:
Проверьте API-вызов
mysql_real_escape_string().
Пользователям MySQL++:
Проверьте такие модификаторы, как
escapeиquote, - для потоков запросов.
Пользователям Perl DBI:
Проверьте метод
quote()или используйте для проверки заполнители.
Пользователям Java JDBC:
Используйте для проверки объект
PreparedStatementи символы-заполнители.
Не передавайте по Internet открытые (незашифрованные) данные. Они могут оказаться у кого угодно, имеющего достаточно времени и возможностей для того, чтобы перехватить их и использовать в своих целях. Используйте вместо этого протоколы с шифрованием данных, такие как SSL и SSH. MySQL, начиная с версии 4.0.0, поддерживает собственные SSL-соединения. Пересылка по SSH (SSH Port Forwarding) может быть использована для создания туннеля передачи данных с шифрованием и сжатием.
Научитесь пользоваться утилитами
tcpdumpиstrings. В большинстве случаев проверить, являются ли потоки данных MySQL зашифрованными, можно с помощью команды, подобной той, которая приведена ниже:shell>
tcpdump -l -i eth0 -w - src or dst port 3306 | strings(Она работает под Linux, и будет, с незначительными изменениями, работать под другими системами.) Предупреждение: если вы не видите данных, это еще не гарантирует того, что они зашифрованы. Если требуется высокий уровень безопасности, обратитесь к экспертам в этой области.
4.2.2. Как обезопасить MySQL от хакеров
При подключении к серверу MySQL используется, как правило, пароль. По линии связи пароль не передается в виде открытого текста, но алгоритм шифрования не очень сложный. Толковый хакер, если ему удастся перехватить трафик между клиентом и сервером, при определенной настойчивости может взломать пароль. Поэтому если связь между клиентом и сервером осуществляется по ненадежной сети, для шифрования связи следует использовать SSH-туннель.
Вся остальная информация
передается в текстовом виде и
может быть прочитана кем угодно,
кто в состоянии отлеживать
подключение. Если это вас
беспокоит, можно воспользоваться
протоколом со сжатием данных (в MySQL
3.22 и последующих версиях), что
значительно затруднит подобные
действия. Чтобы еще более повысить
безопасность связи, следует
использовать протокол
ssh. Open
source-клиент ssh
доступен на веб-сайте
http://www.openssh.org/,
а коммерческий ssh-клиент
можно получить на веб-сайте
http://www.ssh.com/. С
помощью такого протокола можно
обеспечить зашифрованную связь по
протоколу TCP/IP между сервером MySQL и
клиентом MySQL.
Если вы используете MySQL 4.0, то можете также использовать предусмотренную в этой версии поддержку протокола OpenSSL. Обратитесь к разделу See Раздел 4.3.9, «Использование безопасных соединений».
Для обеспечения безопасности MySQL-системы необходимо строго придерживаться следующих рекомендаций:
У всех пользователей MySQL должны быть пароли. Для приложений клиент/сервер является общепринятым, что клиент может указывать любое имя пользователя, но если для
other_userне задан пароль, то кто угодно может зайти под любым именем, просто введяmysql -u other_user db_name. Чтобы этого избежать, можно