Документация MySQL


Глава 4. Администрирование баз данных
Пред.   След.

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

Содержание

4.1. Конфигурирование MySQL
4.1.1. Параметры командной строки mysqld
4.1.2. Файлы параметров my.cnf
4.1.3. Установка нескольких серверов на один компьютер
4.1.4. Запуск нескольких серверов 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.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.5.1. Синтаксис команды OPTIMIZE TABLE
4.5.2. Синтаксис команды ANALYZE TABLE
4.5.3. Синтаксис команды FLUSH
4.5.4. Синтаксис команды RESET
4.5.5. Синтаксис команды KILL
4.5.6. Синтаксис команды SHOW
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.7.1. Обзор серверных сценариев и утилит
4.7.2. safe_mysqld, оболочка mysqld
4.7.3. Mysqld_multi, программа для управления множеством серверов MySQL
4.7.4. myisampack, MySQL-генератор сжатых таблиц (только для чтения)
4.7.5. mysqld-max, расширенный сервер mysqld
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.9.1. Журнал ошибок
4.9.2. Общий журнал запросов
4.9.3. Журнал обновлений (update)
4.9.4. Бинарный журнал обновлений
4.9.5. Журнал медленных запросов
4.9.6. Обслуживание файлов журналов
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=IP

    IP-адрес, с которым необходимо установить связь.

  • --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-name See Раздел 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.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> scripts/mysql_install_db
shell> 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. Чтобы этого избежать, можно