RUS - MySQL Administrators Guide
RUS - MySQL Administrators Guide
Руководаво администратора
M y S Q L
A d m i n i s t r a t o r ' s G u i d e
MySQLAB
M y S Q L
Press
Руководство администратора
Компания MySQL AB
ББК 32.973.26-018.2.75
Authorized translation from the English language edition published by MySQL Press, Copyright © 2004
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic
or mechanical, including photocopying, recording or by any information storage retrieval system, without permission
from the Publisher.
Russian language edition published by Williams Publishing House according to the Agreement with R&I
Enterprises International, Copyright © 2005
Об этой книге 14
От издательства 14
Глава 1. Общая информация 15
Глава 2. Установка MySQL 76
Глава 3. Использование программ MySQL 202
Глава 4. Администрирование баз данных 212
Глава 5. Репликация в MySQL 365
Глава 6. Оптимизация MySQL 402
Глава 7. Клиентские программы и утилиты MySQL 460
Глава 8. Механизмы хранения и типы таблиц в MySQL 498
Глава 9. Механизм хранения InnoDB 523
Глава 10. Введение в MaxDB 582
Приложение А. Поиск и устранение неполадок в программах MySQL 588
Приложение Б. Переменные окружения 612
Предметный указатель 614
Содержание
Об этой книге 14
От издательства 14
Глава 1. Общая информация 15
1.1. Что собой представляет это руководство 15
1.1.1. Соглашения, используемые в руководстве 16
1.2. Что такое система управления базами данных MySQL 18
1.2.1. История MySQL 19
1.2.2. Основные возможности MySQL 20
1.2.3. Стабильность MySQL 22
1.2.4. Размеры таблиц MySQL 23
1.2.5. Решение "проблемы 2000 года" 25
1.3. Компания MySQL AB 26
1.3.1. Бизнес-модель и услуги, оказываемые MySQL AB 27
1.3.2. Контактная информация 30
1.4. Поддержка и лицензирование MySQL 31
1.4.1. Поддержка, предоставляемая компанией MySQL AB 31
1.4.2. Авторские права и лицензии на MySQL 32
1.4.3. Лицензии на MySQL 32
1.4.4. Логотипы и торговые марки MySQL AB 35
1.5. План разработки MySQL 37
1.5.1. Кратко о MySQL 4.0 37
1.5.2. Кратко о MySQL 4.1 39
1.5.3. MySQL 5.0: Очередной разрабатываемый выпуск 41
1.6. MySQL и будущее (списки TODO) 41
1.6.1. Новые средства, запланированные для версии 4.1 41
1.6.2. Новые средства, запланированные для версии 5.0 42
1.6.3. Новые средства, запланированные для версии 5.1 43
1.6.4. Новые средства, запланированные на ближайшее будущее 43
1.6.5. Новые средства, запланированные на отдаленное будущее 46
1.6.6. Новые средства, которые не планируются к реализации 47
1.7. Источники информации по MySQL 48
1.7.1. Списки рассылки MySQL 48
1.7.2. Поддержка сообщества пользователей MySQL в IRC 56
1.8. Соответствие стандартам MySQL 56
1.8.1. Стандарты, которым соответствует MySQL 57
1.8.2. Выбор режимов SQL 57
1.8.3. Запуск MySQL в режиме ANSI 57
1.8.4. Расширения стандартного SQL в MySQL 58
1.8.5. Отличия MySQL от стандартного SQL 61
1.8.6. Как MySQL работает с ограничениями 68
1.8.7. Известные ошибки и недостатки дизайна MySQL 70
Содержание 7
От издательства
Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ваше
мнение и хотим знать, что было сделано нами правильно, что можно было сделать луч-
ше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и любые
другие замечания, которые вам хотелось бы высказать в наш адрес.
Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумаж-
ное или электронное письмо, либо просто посетить наш Web-сервер и оставить свои за-
мечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравит-
ся или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги
более интересными для вас.
Посылая письмо или сообщение, не забудьте указать название книги и ее авторов, а
также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обяза-
тельно учтем его при отборе и подготовке к изданию последующих книг.
Наши координаты:
E-mail: [email protected]
WWW: http: //www.williamspublishing.com
Информация для писем из:
России: 115419, Москва, а/я 783
Украины: 03150, Киев, а/я 152
1
Общая информация
миллионов Тбайт (2 6 3 байт). На практике это означает, что максимальные размеры таб-
лиц теперь определяются ограничениями, накладываемыми операционной системой на
размеры файлов, а не внутренними ограничениями MySQL.
Механизм хранения таблиц InnoDB поддерживает таблицы InnoDB внутри таблич-
ных пространств, которые могут состоять из нескольких файлов. Это позволяет таблице
превысить максимальный размер отдельного файла. Табличное пространство может
включать неразмеченные дисковые разделы (находящиеся вне файловой системы ОС),
что позволяет иметь чрезвычайно большие таблицы. Максимальный размер табличного
пространства составляет 64 терабайта.
В табл. 1.1 приведены некоторые примеры ограничений на размеры файлов, налагае-
мые операционными системами.
Таблица 1.1. Ограничения на размеры файлов со стороны операционных систем
Операционная система Ограничение размера файла
Linux-Intel, 32-разрядная 2 Гбайт, при использовании файловой системы LFS
значительно больше
Linux-Alpha 8 Тбайт (?)
Solaris 2.5.1 2 Гбайт (4 Гбайт с обновлениями)
Solaris 2.6 4 Гбайт (может быть изменено с помощью флагов)
Solaris 2.7 Intel 4 Гбайт
Solaris 2.7 UltraSPARC 512 Гбайт
NetWare с файловой системой NSS 8 Тбайт
В Linux 2.2 можно иметь таблицы My ISAM размером свыше 2 Гбайт, если воспользо-
ваться обновлением LFS (Large Files Support - поддержка больших файлов) для файло-
вой системы ext2. В Linux 2.4 существуют также обновления поддержки больших фай-
лов для файловой системы ReiserFS. Большинство современных дистрибутивов Linux
базируются на ядре 2.4 и уже оснащены всеми необходимыми обновлениями LFS. Одна-
ко максимально доступный размер файлов по-прежнему зависит от ряда факторов, один
из которых - это тип файловой системы, используемой для хранения таблиц MySQL.
Детальный обзор LFS для Linux можно найти на странице Андреаса Джаегера
(Andreas Jaeger) "Large File Support in Linux" ("Поддержка больших файлов в Linux") no
адресу http://www.suse.de/~aj/linux_lfs.html.
По умолчанию MySQL создает таблицы My ISAM с внутренней структурой, разреша-
щей максимальный размер таблицы в 4 Гбайт. Максимальный размер таблицы можно
проверить с помощью команды SHOW TABLE STATUS или myisamchk -dv имя_таблицы.
Если необходимо работать с таблицами My ISAM размером свыше 4 Гбайт (и ваша опе-
рационная система поддерживает файлы упомянутого размера), на этот случай в опера-
торе CREATE TABLE предусмотрены опции AVG_ROW__LENGTH и MAX_R0WS. Эти опции также
можно изменить с помощью команды ALTER TABLE уже после создания таблицы, и таким
образом увеличить ее максимально допустимый размер.
Ниже представлены другие способы преодоления ограничений на размер таблиц
My ISAM, налагаемых операционной системой.
• Если большая таблица используется только для чтения, с помощью утилиты
myisampack ее можно сжать. Как правило, эта утилита сжимает таблицу примерно
1.2. Что такое система управления базами данных MySQL 25
1.3.1.1. Поддержка
Компанией MySQL AB владеют и управляют учредители и основные разработчики
СУБД MySQL. Наши разработчики взяли на себя обязательство осуществлять поддерж-
ку клиентов и других пользователей с тем, чтобы постоянно быть в курсе их нужд и
проблем. Вся поддержка выполняется только квалифицированным персоналом. На са-
мые каверзные вопросы отвечает сам Майкл Монти Видениус - автор и идеолог сервера
MySQL.
Коммерческие клиенты получают высококачественную поддержку непосредственно
от MySQL AB. Компания также поддерживает множество списков рассылки, в которых
любой может задать вопрос на интересующую его тему.
Более подробная информация о поддержке разного уровня содержится в разделе 1.4.
1.3.1.3. Консультации
Компания MySQL AB и ее авторизованные партнеры предоставляют консалтинговые
услуги пользователям сервера MySQL и тем, кто встраивает сервер MySQL в собствен-
ные приложения, по всему миру.
1.3. Компания MySQL AB 29
1.3.1.5. Партнерство
Компания MySQL AB поддерживает глобальную партнерскую программу, вклю-
чающую обучающие курсы, консультирование и поддержку, публикации, продажу и
распространение MySQL и связанных с ним продуктов. Партнеры MySQL AB указаны
на нашем Web-сайте по адресу http://www.mysql.com/. Там же имеется информация о
правах на использование специальных версий торговых марок MySQL для идентифика-
ции партнерских продуктов и продвижения их на рынке.
Если вы заинтересованы в том, чтобы стать партнером MySQL AB, обращайтесь к
нам по адресу partner@mysql. com.
Слово "MySQL" и логотип с дельфином MySQL являются торговыми марками ком-
пании MySQL AB (см. раздел 1.4.4). Признание и узнаваемость этих торговых марок
говорят о значительном вкладе основателей MySQL в технологии СУБД с открытым
исходным кодом.
30 Глава 1. Общая информация
• mysqldoc
Эта рассылка для тех, кто работает над созданием документации MySQL: людей
из MySQL AB, переводчиков и других членов сообщества.
• mysqldoc-digest
Это рассылка mysqldoc в форме дайджеста.
• benchmarks
Это рассылка для тех, кого интересуют вопросы производительности. Дискуссии
сосредоточены вокруг производительности СУБД (не только MySQL), а также ка-
саются более широких категорий, включая производительность ядра, файловых
систем, дисковых систем и так далее.
• benchmarks-digest
Это рассылка benchmarks в форме дайджеста.
• packagers
Это рассылка для дискуссий об объединении в пакеты и распространении MySQL.
В данном форуме участвуют те, кто занимается поддержкой распространения для
обмена идеями о том, как формировать пакеты MySQL и как добиваться того,
чтобы MySQL выглядел и работал насколько возможно единообразно на всех
платформах и операционных системах.
• packagers-digest
Это рассылка packagers в форме дайджеста
• Java
Это рассылка для дискуссий, связанных с сервером MySQL и языком Java. В ос-
новном здесь обсуждаются JDBC-драйвера, включая MySQL Connector/J.
• java-digest
Это рассылка j ava в форме дайджеста.
• Win32
Этот список предназначен для обсуждения всего, что касается использования
MySQL под управлением операционных систем семейства Microsoft, таких как
Windows 9x, Me, NT, 2000 и ХР.
• win32-digest
Это рассылка Win32 в форме дайджеста.
• myodbc
Эта рассылка относится ко всему, что связано с подключением к MySQL через
ODBC.
• myodbc-digest
Это рассылка myodbc в форме дайджеста.
• gui-tools
Здесь обсуждаются инструменты MySQL с графическим интерфейсом пользова-
теля, включая MySQL Administrator и графический клиент MySQL Control Center.
• gui-tools-digest
Это рассылка gui-tools в форме дайджеста.
• plusplus
Этот список рассылки касается вопросов программирования на C++ для MySQL.
50 Глава 1. Общая информация
• plusplus-digest
Это рассылка plusplus в форме дайджеста.
• msql-mysql-modules
Эта рассылка для всех вопросов, связанных с поддержкой MySQL языка Perl, в
частности, модулем DBD:mysql.
• msql-mysql-modules-digest
Это рассылка msql-mysql-modules в форме дайджеста.
Если вы не можете получить ответ на заданный вопрос в списках рассылки MySQL,
выходом может быть заключение договора поддержки с компанией MySQL AB. Это
позволит вам напрямую контактировать с разработчиками MySQL (см. раздел 1.4.1).
Ниже представлен перечень списков рассылки MySQL на других языках (кроме анг-
лийского). Эти рассылки компанией MySQL AB не управляются.
• [email protected]
Список рассылки на французском языке.
• [email protected]
Список рассылки на корейском языке. Для подписки отправьте по адресу списка
сообщение subscribe mysql ваш@почтовый, адрес.
• [email protected]
Список рассылки на немецком языке. Для подписки отправьте по адресу списка
сообщение subscribe mysql-de ваш@почтовый. адрес. Дополнительную информа-
цию об этом списке можно найти по адресу h t t p : //www. 4t2.com/mysql.
• [email protected]
Список рассылки на португальском языке. Для подписки отправьте по адресу
списка сообщение subscribe mysql-br ваш@почтовый.адрес.
• [email protected]
Список рассылки на испанском языке. Для подписки отправьте по адресу списка
сообщение subscribe mysql ваш@почтовый.адрес.
Одна из главных задач при разработке этого продукта состоит в том, чтобы продол-
жать работу в направлении максимального соответствия стандарту SQL, однако, не
жертвуя при этом производительностью и надежностью. Мы не боимся добавлять собст-
венные расширения к SQL или поддерживать не-SQL средства, если это значительно
увеличивает удобство применения сервера MySQL для большого сегмента нашей поль-
зовательской базы. Примером такой стратегии может служить интерфейс HANDLER в сер-
вере MySQL 4.O.
Мы будем продолжать поддержку транзакционной и не-транзакционной баз данных,
чтобы удовлетворить запросы как тех пользователей, которым нужна работа с ответст-
венными данными по схеме "24 часа в сутки, 7 дней в неделю", так и тех, кому необхо-
дима напряженная работа с Web и регистрацией.
Изначально сервер MySQL разрабатывался для баз данных средних размеров (10-100
миллионов записей, или около 100 Мбайт на таблицу) в малых компьютерных системах.
Сегодня сервер MySQL обслуживает терабайтные базы данных, но его код по-прежнему
может быть скомпилирован в ограниченную версию, применимую в портативных и
встроенных системах. Компактный дизайн сервера MySQL делает возможным продол-
жение разработки в обоих направлениях, без каких-либо конфликтов в дереве исходного
кода.
В настоящее время мы не планируем поддержку систем реального времени, но, не-
смотря на это, средства репликации MySQL уже предлагают достаточно развитую функ-
циональность.
Поддержка кластеризованных баз данных планируется на основе интеграции приоб-
ретенной нами технологии NDB-кластеров с новым механизмом хранения, который стал
доступным в 2004 году.
Мы также готовимся предоставить поддержку XML на сервере баз данных.
1.8.5.1. Подзапросы
MySQL 4.1 поддерживает подзапросы и вторичные таблицы. Подзапрос - это опера-
тор SELECT, вложенный в другой оператор. Вторичная таблица (неименованное пред-
ставление) - это подзапрос в конструкции FROM другого оператора. Для более старых
версий MySQL большинство подзапросов могут быть переписаны в виде объединений
или с использованием других методов.
ние не удачно, это если кто-то прервет поток приложения во время обновления. В
таком случае все блокировки будут сняты, но часть обновлений останется невы-
полненной.
• Можно также использовать функции для обновления записей за одну операцию.
Можно получить весьма эффективные приложения, применяя следующую технику:
• Модифицировать столбцы в соответствии с их текущими значениями.
• Обновлять только те столбцы, которые изменились.
Например, когда выполняется обновление информации о заказчиках, мы обновля-
ем только те данные, что изменились, либо данные, зависящие от измененных
данных, сравнив их новые значения с исходными. Проверка измененных данных
делается в конструкции WHERE оператора UPDATE. Если в результате запись не из-
менилась, потребуется выдать клиенту сообщение наподобие: "Некоторые из из-
меняемых вами данных изменены другим пользователем". Затем следует отобра-
зить старую и новую версии записи о клиенте, чтобы пользователь решил, какую
из них принять.
Это обеспечивает механизм, подобный блокировке столбца, но на самом деле да-
же лучше, потому что мы обновляем только некоторые из столбцов, используя
новые значения, зависящие от их текущих значений. Это означает, что типовые
операторы UPDATE должны выглядеть, как показано ниже:
UPDATE tablename SET pay_back=pay_back+125;
UPDATE customer
SET
customer_date='current_date',
address='new address',
phone='new phone',
money_owed_to_us=money_owed_to_us-125
WHERE
customer_id=id AND address='old address' AND phone='old phone';
Такой подход весьма эффективен и работает, даже если другой клиент изменяет
значения столбцов pay_back и money_owed_to_us.
• Во многих случаях пользователи хотят применять LOCK TABLES и/или ROLLBACK
для целей управления уникальными идентификаторами. Это также можно обра-
ботать гораздо более эффективно без блокировок и откатов, используя столбцы
AUTO_INCREMENT И либо SQL-фунКЦИЮ LAST_INSERT_ID(), либо функцию С API С
именем mysql_insert_id ().
Обычно можно написать код, обслуживающий ситуации, когда требуется блоки-
ровка уровня строки. В некоторых ситуациях это действительно необходимо, и
таблицы innoDB поддерживают такие блокировки. Для таблиц My ISAM можно вос-
пользоваться столбцами-флагами и поступить примерно так:
UPDATE имя_таблицы SET row_flag = 1 WHERE id = ID;
MySQL вернет 1 в качестве количества обновленных записей, если строка найде-
на и rowf lag не был равен 1 в исходной строке.
Можете думать об этом, как если бы сервер MySQL изменил предыдущий запрос
на такой:
UPDATE имя_таблицы SET row_flag = 1 WHERE id = ID AND row_flag <> 1;
1.8. Соответствие стандартам MySQL 65
1.8.5.6. Представления
Представления в настоящее время реализованы и появятся в версии 5.0 сервера
MySQL. Неименованные представления {вторичные таблицы, подзапросы в конструк-
ции FROM оператора SELECT) уже реализованы в версии 4.1.
Исторически сложилось так, что сервер MySQL больше всего использовался в при-
ложениях и Web-системах, где разработчик имел полный доступ к используемой базе
данных. Однако ситуация постепенно менялась, и теперь мы обнаружили, что все воз-
растающее число пользователей считают представления очень важным и полезным
средством.
Представления применяются для того, чтобы предоставить пользователям доступ к
группе таблиц таким образом, как будто это одна таблица и тем самым ограничить дос-
туп к ним. Представления также можно использовать для ограничения доступа к стро-
кам таблицы (выделяя, таким образом, подмножество записей). Для ограничения досту-
па к столбцам представления не нужны, поскольку сервер MySQL обладает развитой
системой привилегий.
1.8. Соответствие стандартам MySQL 67
• В строковом столбце сервер MySQL сохранит либо пустую строку, либо самую
длинную, которая может поместиться в данный столбец.
• Если вы попытаетесь вставить строку, начинающуюся не с цифры, в числовой
столбец, MySQL запишет туда 0.
• Если попытаться вставить значение NULL в столбец, не допускающий значений
NULL, MySQL вставит вместо этого 0 в числовой столбец и пустую строку - в
символьный. (Однако такое поведение при вставке одиночных записей может
быть изменено, если скомпилировать сервер MySQL с опцией компиляции
-DONT_USE_DEFAULT_FIELDS.) Это заставит операторы INSERT генерировать ошиб-
ки, если только вы явно не зададите значения для всех столбцов, которые требуют
значений NOT NULL.
• MySQL позволит сохранить некоторые неправильные значения даты в столбцы
типа DATE и DATETIME (например '2000-02-31' или '2000-02-00'). Идея состоит в
том, что проверка корректности дат не является обязанностью сервера SQL. Если
MySQL может сохранять значение даты и извлекать точно такое значение, он со-
храняет его таким, как получил. Если дата абсолютно неправильная (за пределами
возможностей сервера сохранить ее), то вместо нее сохраняется специальное зна-
чение '0000-00-00'.
Причина существования изложенных правил заключается в том, что мы не можем
проверить эти условия до тех пор, пока не начнется выполнение запроса. Мы не можем
выполнить откат изменений, если сталкиваемся с проблемой после того, как несколько
строк уже обновлены, поскольку данный тип таблиц может не поддерживать транзак-
ции. Выбор в пользу прерывания выполнения оператора представляется неудачным - в
этом случае получается, что обновление выполнено наполовину, что приводит к наи-
худшему сценарию. В этом случае предпочтительнее сделать "лучшее из возможного" и
затем продолжить, как будто ничего не произошло.
Это означает, что не стоит полагаться на MySQL в смысле проверки корректности
данных столбцов. Вместо этого приложение само должно заботиться о том, чтобы от-
правлять серверу MySQL только правильные данные.
В MySQL 5.0 мы планируем провести улучшения, выдавая предупреждения, когда
происходит автоматическое преобразование столбцов, плюс опцию, позволяющую отка-
тить оператор, который пытается выполнить запрещенное присваивание данных до тех
пор, пока используются только транзакционные таблицы.
версии 5.0, заставив оператор DROP TABLE ожидать до тех пор, пока таблица ис-
пользуется хотя бы в одной транзакции.
• При вставке больших целочисленных значений (между 2 6 3 и 2 6 4 - 1) в десятичный
или строковый столбец, оно вставляется как отрицательное значение, поскольку
число оценивается в контексте целого со знаком. Мы планируем исправить это в
MySQL 4.1.
• FLUSH TABLES WITH READ LOCK не блокирует CREATE TABLE ИЛИ COMMIT, ЧТО может
привести к проблемам с позицией в бинарном протоколе при выполнении полного
резервного копирования таблиц и бинарного протокола.
• ANALYZE TABLE для таблиц BDB в некоторых случаях может приводить к тому, что
таблицы становятся недоступными до тех пор, пока не будет перезапущен mysqld.
Если это случается, в файл ошибок MySQL добавляется такая строка:
001207 22:07:56 bdb: log_flush: LSN past current end-of-log
• MySQL принимает скобки в конструкции FROM оператора SELECT, но молча игно-
рирует их. Причина того, что сообщения об ошибках не выдаются, состоит в том,
что очень многие клиенты при автоматической генерации запросов добавляют
скобки в конструкцию FROM, даже если в этом нет необходимости.
• Объединение многих RIGHT JOIN или комбинаций LEFT JOIN и RIGHT JOIN в од-
ном запросе могут не приводить к корректному результату, потому что MySQL
генерирует строки NULL для таблицы, следующей за LEFT JOIN или перед RIGHT
JOIN. Это будет исправлено в 5.0, одновременно мы добавим поддержку скобок в
предложение FROM.
• Не выполняйте ALTER TABLE для таблицы BDB, участвующей в многотабличных
транзакциях, до тех пор, пока все они не завершатся. (Транзакции могут быть
проигнорированы.)
• Команды ANALYZE TABLE, OPTIMIZE TABLE И REPAIR TABLE могут вызывать про-
блемы в таблицах, в которых используется INSERT DELAYED.
• Выполнение LOCK TABLE... и FLUSH TABLES... не гарантирует, что в таблице не
окажется наполовину завершенных транзакций.
• Таблицы BDB открываются несколько медленно. Если в базе данных есть много
таблиц BDB, потребуется немало времени, чтобы запустить клиент mysql с опцией
-А или выполнить rehash. В особенности это касается тех случаев, когда имеется
большой табличный кэш.
• Репликация использует протоколирование уровня запросов. Реплицируемая база
фиксирует выполняемые запросы в бинарном протоколе. Это очень быстрый,
компактный и эффективный метод протоколирования, который в большинстве
случаев работает превосходно. Однако, хотя нам и не известны такие случаи, су-
ществует теоретическая возможность того, что данные в исходной и целевой базе
окажутся разными, если запрос составлен таким образом, что модификация дан-
ных будет недетерминированной. Это остается на совести оптимизатора запросов.
(Вообще говоря, это очень плохая практика, даже за рамками темы репликации!).
Например:
• Операторы CREATE... SELECT или INSERT... SELECT, которые вставляют нуле-
вые или NULL-значения в столбцы AUTO INCREMENT.
72 Глава 1. Общая информация
SELECT RPAD(tl.columnl, 50, ' ') AS f2, RPAD(t2.column2, 50, ' ') AS fl
FROM tablel as t l LEFT JOIN table2 AS t2 ON tl.record=t2.joinID
ORDER BY t2.record;
Вследствие этой ошибки вы не получите завершающих пробелов в результирую-
щих значениях. Эта проблема также относится ко всем остальным строковым
функциям, добавляющим пробелы справа.
Причиной является то, что НЕАР-таблицы, которые используются вначале для вре-
менных таблиц, не могут работать со столбцами типа VARCHAR.
Подобное поведение присуще всем версиям MySQL и будет исправлено в одном
из выпусков в рамках серии 4.1.
• Из-за способа хранения файла определений таблиц невозможно использовать
символ 255 (CHAR (255)) в именах таблиц, столбцов или перечислений. Исправле-
ние запланировано в версии 5.1, когда мы будем иметь новый формат файлов оп-
ределения таблиц.
• При использовании SET CHARACTER SET невозможно использовать переведенные
символы в именах баз данных, таблиц и столбцов.
• Невозможно использовать шаблонные символы '_', '%' вместе с ESCAPE в LIKE...
ESCAPE.
• Если есть столбец типа DECIMAL, в котором одно и то же число сохраняется в раз-
ных форматах (например, +01.00, 1.00, 01.00), то GROUP BY может рассматривать
такие значения как различные.
• Невозможно собрать сервер в другом каталоге при использовании потоков MIT-
pthreads. Поскольку для этого нужно изменять потоки MIT-pthreads, по всей ви-
димости, исправлять мы это не будем.
• Значения типа BLOB не могут "надежно" применяться в GROUP BY, ORDER BY или
DISTINCT. В этих случаях для сравнения значений BLOB используются только пер-
вые max_sort_length байт. Значение по умолчанию max_sort_length равно 1024
байта. Это может быть изменено во время запуска сервера. Чтобы обойти это ог-
раничение, в большинстве случаев можно применить подстроки, например:
SELECT DISTINCT LEFT {столбец_ЫоЬ, 2048) FROM имя_таблицы
• Вычислительные операции выполняются над типами BIGINT и DOUBLE (оба они
обычно имеют длину 64 байта). Какую точность вы получите, зависит от функ-
ции. Общее правило звучит так: поразрядные функции выполняются с точностью
BIGINT, IF и ELT () - с точностью BIGINT или DOUBLE, все остальные - с точностью
DOUBLE. Старайтесь избегать применения беззнаковых длинных значений, если
они могут оказаться длиной более 63 бит (9223372036854775807) во всех случаях,
кроме битовых полей. Версия MySQL 4.0 лучше справляется с BIGINT, чем версия
MySQL 3.23.
• У всех строковых столбцов, кроме BLOB и TEXT, при извлечении из базы автомати-
чески удаляются завершающие пробелы. Для типа CHAR это нормально. Ошибка
состоит в том, что столбцы VARCHAR обрабатываются точно так же.
• В одной таблице можно иметь не более 255 столбцов типа ENUM и SET.
74 Глава 1. Общая информация
• В MIN (), МАХ () и других агрегатных функциях в настоящее время столбцы типов
ENUM и SET сравниваются по их строковым значениям вместо того, чтобы делать
это по относительному положению строки в наборе.
• mysqld_saf e перенаправляет все сообщения от mysqld в журнал mysqld. Одна свя-
занная с этим проблема состоит в том, что если запустить mysqladmin refresh для
закрытия и повторного открытия журнала, стандартный поток вывода stdout и
стандартный поток ошибок stderr остаются перенаправленными в старый жур-
нал. Если —log применяется интенсивно, нужно отредактировать mysqld_safe,
чтобы он выводил протокол в имя_хоста.еп вместо имя_хоста.log. В этом слу-
чае можно легко использовать дисковое пространство, занятое старым журналом,
удалив его и запустив mysqladmin refresh.
• Оператор UPDATE обновляет столбцы слева направо. Если вы ссылаетесь на обнов-
ляемые столбцы, то получаете их новые значения вместо старых. Например, сле-
дующий оператор увеличит значение KEY на 2, а не на 1:
mysql> UPDATE имя_таблицы SET KEY=KEY+1,KEY=KEY+1;
• Можно обращаться к множеству временных таблиц в одном запросе, но нельзя
обращаться к одной и той же временной таблице более одного раза. Например,
приведенный ниже оператор не работает:
mysql> SELECT * FROM temp_table, temp_table AS t 2 ;
ERROR 1137: Can't reopen table: 'temp_table f
(ERROR 1137: Невозможно повторно открыть таблицу: 'temp table')
• Оптимизатор может обрабатывать DISTINCT по-разному, когда используются
"скрытые" столбцы в объединении и когда они не используются. Скрытые столб-
цы в объединении считаются частью результата (даже если они не показываются),
тогда как в нормальных запросах скрытые столбцы не участвуют в сравнениях
для DISTINCT. Возможно, мы исправим это в будущем, чтобы скрытые столбцы
никогда не участвовали в вычислении DISTINCT.
Ниже представлены соответствующие примеры:
SELECT DISTINCT mp3id FROM band_downloads
WHERE u s e r i d = 9 ORDER BY id DESC;
• До версии сервера MySQL 3.23 значения всех числовых типов трактовались как
числа с фиксированной запятой. Это означало, что нужно было явно указывать,
сколько десятичных знаков должно иметь поле с плавающей запятой. Все резуль-
таты возвращались с корректным количеством знаков.
2
Установка MySQL
тично замороженное состояние" означает, что мы можем внести какие-то мелкие изме-
нения, которые "почти наверняка не повлияют на то, что уже работает". Естественно,
исправления существенных ошибок в ранних версиях распространяются и на более
поздние серии продукта.
Как правило, если вы только впервые начинаете использовать MySQL или пытаетесь
перенести его в систему, для которой не существует бинарного дистрибутива, мы реко-
мендуем обратиться к серии производственных выпусков. В настоящее время это MySQL
4.0. Все выпуски MySQL, даже те, что относятся к сериям, пребывающим в разработке, до
выхода в свет обязательно проверяются с помощью тестов производительности.
Если вы эксплуатируете старую систему и хотите произвести обновление, но желае-
те, чтобы этот процесс прошел как можно более безболезненно, вам стоит обновить ее
до последнего выпуска той серии, к которой относится и ваша система (следует обра-
щать внимание на последнюю часть номера версии выпуска). Мы стараемся исправлять
только критические ошибки и вносить небольшие, относительно безопасные изменения
в эту версию.
Если вы хотите использовать новые средства, которые еще не входят в выпуски про-
изводственной серии, можете взять версию из серии, находящейся на стадии разработки.
Но при этом нужно помнить, что такие выпуски не настолько стабильны, как производ-
ственные.
Если вы хотите иметь самые последние исходные тексты, которые содержат все те-
кущие исправления, можете воспользоваться одним из наших репозиториев исходного
кода BitKeeper. Это еще не будет выпуском в полном смысле, однако даст предвари-
тельное представление о коде, на котором будут базироваться будущие выпуски.
Схема именования выпусков, принятая в MySQL, состоит из трех номеров и суффик-
са, например, mysql-4.1.2-alpha. Цифры в наименовании выпуска интерпретируются
следующим образом:
• Первое число (4) обозначает номер главной версии и также описывает формат
файлов. Все выпуски версии 4 используют один и тот же формат файлов.
• Второй номер (1) - это уровень выпуска. Взятые вместе номер главной версии и
уровень выпуска составляют номер серии выпуска.
• Третий номер (2) - это номер версии в серии выпусков. Эта цифра увеличивается
с каждым новым выпуском. Обычно вам нужна самая последняя версия из вы-
бранной серии.
С каждым небольшим обновлением последний номер версии увеличивается. Когда
добавляются существенные новые средства либо появляется малейшая несовместимость
с предыдущими версиями, увеличивается второй номер. Когда меняется формат файлов,
увеличивается первый номер.
Наименование выпуска включает также суффикс, указывающий на уровень его ста-
бильности. Имена выпусков в серии проходят через последовательность суффиксов, от-
ражающих рост уровня стабильности. Ниже описаны возможные суффиксы.
• alpha (альфа) означает, что выпуск содержит некоторую крупную часть нового кода,
который пока еще не был на 100% протестирован. Известные ошибки (обычно их еще
нет) должны быть документированы в разделе новостей (News) онлайнового спра-
вочного руководства по адресу http://dev.mysql.com/doc/mysql/en/News.html. В
большинстве альфа-выпусков появляются новые команды и расширения. Актив-
ная разработка, которая может включать изменения в основном коде, может осу-
2.1. Общие вопросы установки 81
• Вы хотите изучить (или изменить) исходный код MySQL на С и C++. Для этой
цели потребуется получить исходный дистрибутив, поскольку исходный код - это
первичное и наиболее исчерпывающее руководство.
• Исходные дистрибутивы содержат больше тестов и примеров, чем бинарные.
• IBM AIX 4.3.3 ррс с компилятором xlC_r (IBM Visual Age C/C++ 6.0):
CC=xlc_r CFLAGS="-ma -02 -qstrict -qoptimize=2 -qmaxmem=8192" CXX=xlC_r
CXXFLAGS ="-ma -02 -qstrict -qoptimize=2 -maxmem=8192" ./configure
—prefix=/usr/local/mysql —localstatedir=/usr/local/mysql/data
—libexecdir=/usr/local/mysql/bin —with-extra-charsets=complex
—enablethread-safe-client —enable-local-infile —with-named-z-libs=
no -disableshared —with-innodb
• I B M A I X 5.1.0 ррс с компилятором gcc 3.3:
CFLAGS="-02 -mcpu=powerpc -Wa,-many" CXX=gcc CXXFLAGS="-02 -mcpu=
powerpc -Wa, -many -felide-constructors -fno-exceptions -fno-rtti"
./configure —prefix=/usr/local/mysql —with-extra-charsets=complex
—enable-thread-safeelient —enable-local-infile —with-named-z-libs=
no —disable-shared
• I B M A I X 5.2.0 ррс с компилятором x l C r (IBM Visual Age C/C++ 6.0):
CC=xlc_r CFLAGS="-ma -02 -qstrict -qoptimize=2 -qmaxmem=8192" CXX=xlC_r
CXXFLAGS="-ma -02 -qstrict -qoptimize=2 -qmaxmem=8192" ./configure
—prefix=/usr/local/mysql —localstatedir=/usr/local/mysql/data
—libexecdir=/usr/local/mysql/bin —with-extra-charsets=complex
—enablethread-safe-client —enable-local-infile —with-named-z-libs=
no -disableshared —with-embedded-server —with-innodb
• H P - U X 10.20 pa-riscl.l с компилятором gcc 3.1:
CFLAGS="-DHPUX -I/opt/dce/include -03 -fPIC" CXX=gcc CXXFLAGS=
"-DHPUX -I/opt/dce /include -felide-constructors -fno-exceptions
-fno-rtti -03 -fPIC" ./configure —prefix=/usr/local/mysql
—with-extra-charsets=complex —enablethread-safe-client
—enable-local-infile —with-pthread —with-named-threadlibs=
-Idee —with-lib-ccflags=-fPIC —disable-shared
• H P - U X 11.00 pa-risc с компилятором aCC (HP ANSI C + + B3910B A.03.50):
CC=cc CXX=aCC CFLAGS=+DAportable CXXFLAGS=+DAportable ./configure
—prefix=/usr/local/mysql —localstatedir=/usr/local/mysql/data
—libexecdir=/usr/local/mysql/bin —with-extra-charsets=complex
—enablethread-safe-client —enable-local-infile —disable-shared
—with-embeddedserver —with-innodb
• H P - U X 11.11 pa-risc2.0 64bit с компилятором aCC (HP A N S I C + + B3910B A.03.33):
CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure
—prefix=/usr/local/mysql —with-extra-charsets=complex
—enable-thread-safe-client —enable-local-infile —disable-shared
• H P - U X 11.11 pa-risc2.0 32bit с компилятором aCC (HP ANSI C + + B3910B A.03.33):
CC=cc CXX=aCC CFLAGS="+DAportable" CXXFLAGS=ll+DAportable" ./configure
—prefix=/usr/local/mysql —localstatedir=/usr/local/mysql/data
—libexecdir=/usr/local/mysql/bin —with-extra-charsets=complex
—enable-threadsafe- client —enable-local-infile —disable-shared
—with-innodb
• H P - U X 11.22 ia64 64bit с компилятором aCC (HP aC++/ANSI С В3910В A.05.50):
88 Глава 2. Установка MySQL
• Compaq Tru64 OSF/1 V5.1 732 alpha с компилятором сс/схх (Compaq С V6.3-029i /
DIGITAL C++V6.1-027):
CC="cc -pthread" CFLAGS="-04 -ansi_alias -ansi_args -fast -inline speed
-speculate a l l " CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -fast
-inline speed -speculate a l l -noexceptions -nortti" ./configure
—prefix=/usr/local/mysql —with-extra-charsets=complex
—enable-thread-safe-client —enable-local-infile —with-prefix=
/usr/local/mysql —with-named-thread-libs="-lpthread -lmach -lexc - l c "
—disable-shared —with-mysqld-ldflags=-all-static
• SGI Irix 6.5 IP32 с компилятором gcc 3.0.1:
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3
-fno-omit-framepointer -felide-constructors -fno-exceptions -fno-rtti"
./configure —prefix=/usr/local/mysql —with-extra-charsets=complex
—enable-thread-safeclient —enable-local-infile —disable-shared
• FreeBSD/sparc64 5.0 с компилятором gcc 3.2.1:
CFLAGS=-DHAVEJ3ROKEN_REALPATH ./configure —prefix=/usr/local/mysql
—localstatedir=/usr/local/mysql/data —libexecdir=/usr/local/mysql/bin
—with-extracharsets=complex —enable-thread-safe-client
—enable-local-infile -disableshared —with-innodb
Следующие опции компиляции использовались компанией MySQL AB для сборки
бинарных пакетов в прошлом. Эти бинарные пакеты больше не обновляются, тем не
менее, мы приводим опции компиляторов в справочных целях.
• Linux 2.2.хх SPARC с компилятором egcs 1.1.2:
CC=gcc CFLAGS="-03 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3
-fno-omitframe-pointer -felide-constructors -fno-exceptions -fno-rtti"
./configure —prefix=/usr/local/mysql —with-extra-charsets=complex
—enable-thread-safeclient —enable-local-infile —enable-assembler
—disable-shared
• Linux 2.2.x with x686 с компилятором gcc 2.95.2:
CFLAGS="-03 -mpentiumpro" CXX=gcc CXXFLAGS="-03 -mpentiumpro
-felideconstructors -fno-exceptions -fno-rtti" ./configure
—prefix=/usr/local/mysql —enable-assembler —with-mysqld-ldflags=
- a l l - s t a t i c —disable-shared —withextra-charsets=complex
• SunOS 4.1.4 2 sun4c с компилятором gcc 2.7.2.1 :
CC=gcc CXX=gcc CXXFLAGS="-03 -felide-constructors" ./configure —prefix=
/usr/local/mysql —disable-shared —with-extra-charsets=complex
—enable-assembler
• SunOS 5.5.1 (и предшествующие версии) sun4u с компилятором egcs 1.0.3а или
2.90.27, либо gcc 2.95.2 и более новой версии:
CC=gcc CFLAGS="-03" CXX=gcc CXXFLAGS="-O3 -felide-constructors
-fno-exceptions -fno-rtti" ./configure —prefix=/usr/local/mysql
—with-low-memory —withextra-charsets=complex —enable-assembler
• SunOS 5.6 i86pc с компилятором gcc 2.8.1:
90 Глава 2. Установка MySQL
На заметку!
Если вы используете RPM 4.1, и он выдает сообщение вида: "(GPG) NOT OK (MISSING KEYS:
GPG#5072e1f5)"f даже если открытый ключ MySQL уже импортирован в ваше собственное хра-
нилище ключей GPG, вначале потребуется выполнить импорт его в хранилище ключей RPM. Де-
ло в том, что RPM 4.1 больше не использует хранилище ключей GPG (как и самого GPG). Вместо
этого он поддерживает свое собственное хранилище, поскольку это приложение уровня системы,
а хранилище ключей GPG - файл, специфичный для каждого пользователя. Чтобы импортировать
открытый ключ MySQL в хранилище ключей RPM, вначале получите его, как описано в предыдущем
разделе. Затем воспользуйтесь командой rpm —import для импорта ключа. Например, если от-
крытый ключ хранится в файле mysql_pubkey. as с, команда импорта будет выглядеть так:
s h e l l > rpm —import mysql_pubkey.asc
Подкаталог Содержит
bin Клиентские программы и сервер mysqld.
data Файлы журналов и баз данных.
Docs Документация.
examples Примеры программ и сценариев.
include Включаемые файлы заголовков.
lib Библиотеки.
scripts Сценарии утилит.
share Файлы сообщений об ошибках.
94 Глава 2. Установка MySQL
• WinZip или другой Windows-инструмент, способный читать файлы .zip, для рас-
паковки файла дистрибутива.
• Достаточный объем свободного пространства на жестком диске, чтобы распако-
вать, установить и создать базы данных в соответствии с существующими по-
требностями.
• Если планируется подключение к серверу MySQL через интерфейс ODBC, пона-
добится также драйвер MyODBC.
• Если понадобится оперировать с таблицами размером более 4 Гбайт, устанавли-
вайте MySQL в раздел NTFS или более новой файловой системы. Не забывайте
при создании таблиц использовать MAXROWS и AVGROWLENGTH.
После того, как сервер MySQL установлен и сконфигурирован как служба, он будет
автоматически стартовать при запуске Windows. Его также можно запустить немедленно
с помощью утилиты Services либо по команде NET START MySQL. Команда NET не чувст-
вительна к регистру символов.
Когда сервер MySQL выполняется как служба, он не имеет доступа к консольному
окну, поэтому нельзя увидеть никаких сообщений от него. Если mysqld не запустился,
просмотрите журнал ошибок на предмет поиска причин проблемы. Журнал ошибок хра-
нится в каталоге С: \mysql\data и представляет собой файл с расширением .err.
Если mysqld выполняется как служба, его можно остановить той же утилитой
Services, командой NET STOP MySQL или командой mysqladmin shutdown. Если на мо-
мент завершения работы Windows служба функционирует, она будет остановлена авто-
матически.
Начиная с MySQL 3.23.44, имеется выбор устанавливать сервер как службу Manual,
если вы не хотите, чтобы сервер MySQL запускался автоматически при загрузке систе-
мы. Для этого вместо опции - - i n s t a l l укажите опцию —install-manual:
С:\> С:\mysql\bin\mysqld —install-manual
Чтобы удалить сервер, установленный как служба, сначала остановите его. Затем
воспользуйтесь опцией --remove для его удаления:
С:\> С:\mysql\bin\mysqld —remove
С версиями MySQL до 3.23.49 была связана одна проблема с автоматической оста-
новкой службы, а именно: ОС Windows ожидала всего несколько секунд ее завершения,
затем, по истечении некоторого лимита времени, прерывала процесс сервера. Это потен-
циально могло привести к возникновению проблем (например, механизму хранения
InnoDB при следующем запуске приходилось выполнять восстановление после аварий-
ного завершения). Начиная с MySQL 3.23.49, Windows ожидает завершения работы сер-
вера MySQL дольше. Если вы обнаружите, что этого недостаточно, будет безопаснее не
запускать сервер MySQL в виде службы. Вместо этого запускайте его из командной
строки и останавливайте с помощью mysqladmin shutdown.
Возможность увеличения времени для ожидания останова службы существует в
Windows 2000 и ХР. Это не работает в Windows NT, где система ожидает останова службы
всего 20 секунд, после чего прерывает процесс. Вы можете увеличить это время ожидания,
открыв редактор системного реестра \winnt\system32\regedt32.exe и изменив значение
WaitToKillServiceTimeout в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
дерева реестра. Время указывается в миллисекундах (например, значение 120000 соот-
ветствует 120-секундному ожиданию).
Если вы не хотите выполнять mysqld в виде службы, запускайте его в командной
строке. Соответствующие инструкции можно найти в разделе 2.2.1.6.
вает количество открытых файлов MySQL числом 1024, а это означает, что вы не
сможете запустить так же много параллельных потоков под NT, 2000 и ХР, как
под Unix.
• Блокирующее чтение. MySQL применяет блокирующее чтение для каждого со-
единения, что приводит к следующим последствиям, если включены соединения
по именованным каналам:
• Соединение не будет автоматически прервано через восемь часов, как это про-
исходит в Unix-версии MySQL.
• Если соединение "зависло", невозможно прервать его без прерывания MySQL.
• mysqladmin k i l l не работает на спящих соединениях.
• mysqladmin shutdown не может остановить сервер, пока есть спящие со-
единения.
Мы планируем решить эти проблемы, когда наши Windows-разработчики подго-
товят хороший "обходной путь".
• ALTER TABLE. Пока выполняется оператор ALTER TABLE, таблица заблокирована от
использования другими потоками. Это обусловлено тем, что в Windows нельзя
удалить файл, который используется другим потоком. Возможно, в будущем мы
найдем, как обойти эту проблему.
• DROP TABLE. Оператор DROP TABLE для таблицы, используемой в таблице MERGE, не
работает под Windows, поскольку MERGE делает отображение таблиц скрытым от
верхнего уровня MySQL. Так как Windows не позволяет удалять открытые файлы,
вам сначала надо сбросить таблицы MERGE (командой FLUSH TABLE), или удалить
таблицу MERGE до выполнения DROP TABLE. Мы исправим это вместе с внедрением
представлений.
• DATA DIRECTORY и INDEX DIRECTORY. Опции DATA DIRECTORY И INDEX DIRECTORY
команды CREATE TABLE в Windows-версии MySQL игнорируются, поскольку
Windows не поддерживает символические ссылки. Эти опции также игнорируют-
ся в системах, имеющих не функциональный вызов r e a l p a t h ().
• DROP DATABASE. Невозможно удалить базу данных, которую использует какой-то
поток.
• Прерывание MySQL из диспетчера задач (Task Manager). Нельзя уничтожить
MySQL с помощью диспетчера задач или утилиты shutdown в Windows 95. Вы
должны это делать командой mysqladmin shutdown.
• Имена, чувствительные к регистру символов. Имена файлов в Windows не
чувствительны к регистру символов, поэтому имена баз данных и таблиц MySQL
в Windows также не чувствительны к регистру. Единственным ограничением яв-
ляется требование, что имя базы данных и таблицы должно указываться в одном и
том же регистре на протяжении всего SQL-оператора.
• Символ 'V для разделения имен каталогов в пути. Имена путей в Windows 95
разделяются символом ' \ \ который интерпретируется MySQL как управляющий.
Если вы используете LOAD DATA INFILE или SELECT.. .INTO OUTFILE, применяйте
разделители V в стиле Unix, например:
mysql> LOAD DATA INFILE 'Ci/tmp/skr.txt' INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'Cr/tmp/skr.txt f FROM skr;
106 Глава 2. Установка MySQL
На заметку!
Прежде чем приступать к инсталляции, убедитесь, что все экземпляры серверов MySQL оста-
новлены. Это делается либо с помощью приложения MySQL Manager Application (в Mac OS X
Server), либо по команде mysqladmin shutdown из командной строки.
Если вы ранее работали с пакетом MySQL для Mac OS X от Марка Лайанейджа (Marc
Liyanage) (http://www.entropy.ch), можете просто следовать инструкциям для пакетов с
бинарной раскладкой файлов, описанным на сайте h t t p : //www. entropy. ch.
Если вы обновляете версии 3.23.x MySQL для Mac OS X от Марка или версию
MySQL, которая поставляется с Mac OS X Server, до официального пакета MySQL PKG,
вам потребуется преобразовать существующие таблицы привилегий MySQL в совре-
менный формат, поскольку сейчас появились новые привилегии безопасности (см. раз-
дел 2.5.8).
Если вы предпочитаете, чтобы MySQL автоматически стартовал при запуске систе-
мы, вам нужно будет установить приложение MySQL Startup Item. Начиная с MySQL
4.0.15, эта часть образа инсталляционного диска имеет форму отдельного инсталляцион-
ного пакета. Просто выполните двойной щелчок на пиктограмме MySQLStartupItem.pkg,
после чего следуйте инструкциям по установке.
Обратите внимание на то, что приложение Startup Item нужно установить только од-
нажды! Нет необходимости устанавливать его при каждом обновлении пакета MySQL.
Приложение Startup Item устанавливается в каталог /Library/StartupItems/MySQLCOM.
(До версии MySQL 4.1.2 его местоположением был каталог /Library/StartupItems/MySQL,
что конфликтовало с MySQL Startup Item, установленным с системой Mac OS X Server.)
Установка Startup Item добавляет переменную MYSQLCOM=-YES- в файл конфигурации
системы /etc/hostconfig. Если необходимо отключить автоматический запуск сервера
MySQL, просто измените значение этой переменной на MYSQLCOM=-NO-.
В системе Mac OS X Server установка MySQL по умолчанию использует переменную
MYSQL в файле /etc/hostconfig. Установщик Startup Item от компании MySQL AB от-
ключает эту переменную, устанавливая MYSQL=-NO-. Это позволяет избежать конфликта
с переменной MYSQLCOM, которую использует Startup Item от MySQL AB. Однако это не
останавливает сервер MySQL, если он уже запущен. Останов потребуется выполнить
самостоятельно.
После установки MySQL можно запустить сервер MySQL, выдав в терминальном ок-
не приведенные ниже команды. Вы должны иметь привилегии администратора.
Если есть установленное приложение Startup Item:
shell> sudo /Library/StartupItems/MySQL/MySQL s t a r t
(Enter your password, if necessary)
(Press Control-D or enter "exit" to exit the shell)
(При необходимости введите пароль)
(Нажмите Control-D или введите "exit" для завершения оболочки)
Если же Startup Item нет, воспользуйтесь следующей последовательностью команд:
shell> cd /usr/local/mysql
shell> sudo ./bin/mysqld_safe
(Enter your password, if necessary)
(Press Control-Z)
(При необходимости введите пароль)
(Нажмите Control-Z)
shell> bg
(Press Control-D or enter "exit" to exit the shell)
(Нажмите Control-D или введите "exit" для завершения оболочки)
Теперь у вас можете подключиться к серверу, например, запустив
/usr/local/mysql/bin/mysqld.
112 Глава 2. Установка MySQL
|1 На заметку!
Щ Пользовательские учетные записи, перечисленные в таблицах привилегий MySQL, изначально
§f не имеют паролей. После запуска сервера вы должны установить для них пароли, как описано в
Щ разделе 2.4.
Если хотите, чтобы NetWare вместо этого закрывал экран автоматически, вос-
пользуйтесь опцией —autoclose, например:
# S t a r t s t h e MySQL 4 . 0 . x d a t a b a s e s e r v e r
#3апуск с е р в е р а б а з данных MySQL 4 . 0 . x
SEARCH ADD SYS:MYSQL\BIN
MYSQLD_SAFE — a u t o c l o s e
^ Примечание!
/Л На самом деле максимальный размер таблицы не превышен, а сообщение вызвано ошибкой в
/ старых версиях bison.
Версии MySQL, предшествующие 4.1, могут также компилироваться с другими
реализациями уасс (например, BSD yacc 91.7.30). Для более новых версий необ-
ходим GNU bison.
В приведенном примере представлена типичная последовательность команд, не-
обходимая для конфигурирования исходного дерева. Первая команда cd меняет
текущий каталог на корневой каталог дерева. Замените при необходимости имя
каталога mysql-4.0 в аргументе команды.
shell> cd mysql-4.0
shell> bk -r edit
shell> aclocal; autoheader; autoconf; automake
shell> (cd innobase; aclocal; autoheader; autoconf; automake)
shell> (cd bdb/dist; sh s_all)
shell> ./configure # Добавьте здесь необходимые опции
shell> make
Командные строки, изменяющие текущий каталог на innobase и bdb/dist, нужны
для конфигурирования механизмов хранения innoDB и Berkley DB (BDB). Если вам
не нужна поддержка InnoDB и BDB, эти строки можно опустить.
Если вы получите какие-то непонятные сообщения об ошибках на этой стадии,
проверьте, установлена ли у вас библиотека libtool.
Коллекция наших стандартных конфигурационных сценариев находится в подка-
талоге BUILD/. Возможно, вы сочтете более удобным запускать сценарий
BUILD/compile-pentium-debug вместо приведенной выше последовательности
команд. Для компиляции на другой архитектуре исправьте сценарий, удалив все
флаги, специфичные для процессора Pentium.
5. Когда сборка будет завершена, введите команду make i n s t a l l . Будьте осторожны
с этим на рабочей машине. Так вполне можно перезаписать актуальную установку
сервера. Если у вас на машине есть другой установленный экземпляр MySQL, ре-
комендуется запускать ./configure с другими значениями опций —prefix,
--with-tcp-port и --unix-socket-path, нежели те, которые использовались для
вашего рабочего сервера.
6. Интенсивно поработайте с новой установкой, попытайтесь вызвать сбой новых
средств. Начните с запуска make test.
7. Если вы дошли до стадии make и дистрибутив не компилируется, пришлите сооб-
щение об этом в нашу базу ошибок на h t t p : //bugs .mysql. com. Если вы установи-
ли новейшие версии необходимых инструментов GNU и они терпят крах при по-
пытке обработать наши конфигурационные файлы, сообщите и об этом тоже. Од-
нако если вы запускаете команду aclocal и получаете в ответ not found (не
найдена) или какую-то подобную ошибку, не уведомляйте об этом. Вместо этого
убедитесь, что все необходимые инструменты установлены, а значение перемен-
ной окружения PATH задано таким образом, что командный интерпретатор может
их найти.
2.3. Установка MySQL из исходного дистрибутива 127
• В среде Debian Linux 3.0 вам нужно установить gawk вместо поставляемой по
умолчанию mawk, если вы хотите компилировать MySQL 4.1 и выше с поддержкой
Berkley DB.
• Если необходимо отлаживать mysqld или клиенты MySQL, запустите configure с
опцией —with-debug, затем перекомпилируйте и скомпонуйте ваши программы с
новой клиентской библиотекой.
• Если во время компиляции в среде Linux (например, SuSE Linux 8.1 или Red Hat
Linux 7.3) выдаются сообщения об ошибках, похожие на следующие:
libmysql.c:1329: warning: passing arg 5 of 4 gethostbyname_r' from
incompatible pointer type
libmysql.c:1329: too few arguments to function 4 gethostbyname_r'
libmysql.c:1329: warning: assignment makes pointer from integer
without a cast
make[2]: *** [libmysql.lo] Error 1
то это вызвано тем, что по умолчанию сценарий configure пытается определить
правильное число аргументов, используя компилятор C++ GNU g++. Эта проверка
дает неверные результаты, если не установлен д++. Существуют два способа
обойти эту проблему:
• Необходимо убедиться, что д++ из комплекта GNU C++ установлен. В некото-
рых дистрибутивах Linux требуемый пакет называется дрр, в других - дсс-с++.
• Следует использоваться дсс в качестве компилятора C++, следующим образом
установив значение переменной окружения СХХ:
export CXX="gcc"
Не забудьте после этого перезапустить configure.
Для сборки MySQL под Windows вам понадобятся следующий компилятор и ресур-
сы, доступные в системе Windows:
• Компилятор VC++ 6.0 (обновленный с использованием пакетов обновлений Ser-
vice Pack 4 и Service Pack 5, а также пакета препроцесора). Пакет препроцессора
необходим макроассемблеру. Дополнительную информацию можно найти по ад-
ресу:
http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/faq.aspx.
• Около 45 Мбайт дискового пространства.
• 64 Мбайт оперативной памяти.
Вам также понадобится исходный дистрибутив MySQL для Windows. Существуют
два способа получить исходный дистрибутив MySQL 4.1 и выше:
1. Получить исходный дистрибутив, упакованный компанией MySQL AB для кон-
кретной версии MySQL, в которой вы заинтересованы. Предварительно упако-
ванные исходные дистрибутивы версий официальных релизов MySQL доступны
для загрузки по адресу http://dev.mysql.com/downloads.
2. Подготовить исходный дистрибутив самостоятельно из последнего дерева исход-
ных текстов, хранящихся в репозитории BitKeeper. Если вы планируете поступить
так, вам придется создать пакет в системе Unix, а затем перенести его в среду
Windows. (Причина состоит в том, что некоторые шаги конфигурирования и
сборки требуют использования инструментов, которые доступны только в Unix.)
Подход с BitKeeper требует наличия:
• системы на базе Unix или Linux;
• установленного в этой системе BitKeeper 3.0. Его можно получить по адресу
http://www.bitkeeper.com.
Если у вас имеется исходный дистрибутив для Windows, вы можете перейти непо-
средственно к разделу 2.3.6.1. Для сборки из дерева BitKeeper обратитесь к разделу
2.3.6.2.
Если вы обнаружите, что что-то не работает, как ожидалось, или у вас есть предло-
жения по усовершенствованию текущего процесса сборки под Windows, присылайте
свои предложения в список рассылки Win32 (см. раздел 1.7.1.1).
134 Глава 2. Установка MySQL
I Databases |
+ +
I mysql |
I test I
+ +
С:\> C:\mysql\bin\mysqlshow mysql
Database: mysql
I Tables |
+
+
I columns_priv
I db
I func
host
tables_priv
user |
+ +
C:\> C:\mysql\bin\mysql -e "SELECT Host,Db,User FROM db" mysql
| host | db | user |
I % | test% | |
138 Глава 2. Установка MySQL
Можно указать другой каталог для временных файлов и файла сокета, выполнив
приведенные ниже команды до запуска mysql_install_db или mysqld:
shell> TMPDIR=/временный_каталог/
she 11 > MYSQLJJNIX_PORT=/some_tmpjiir/mysql. sock
shell> export TMPDIR MYSQLJJNIX_PORT
В качестве параметра временный_каталог должен быть указан полный путь к ка-
талогу, для которого имеется доступ по записи.
После этого у вас появится возможность выполнить mysql_install_db и запус-
тить сервер:
shell> bin/mysql_install_db —user=mysql
shell> bin/mysqld_safe —user=mysql &
Если mysql_install_db находится в каталоге scripts, поменяйте в первой коман-
де bin на scripts.
За дополнительной информацией обращайтесь в раздел А.4.5 и в приложение Б.
Прежде чем запустить сервер, mysql. server изменяет текущий каталог на каталог ус-
тановки MySQL, после чего вызывает mysqld_saf е. Если требуется запускать сервер от
имени какого-то специфического пользователя, добавьте соответствующую позицию
user в раздел [mysqld] файла опций /etc/my, cnf, как показано ниже в настоящем разде-
ле. (Возможно, вам придется отредактировать сценарий mysql.server, если бинарный
дистрибутив MySQL был установлен в нестандартное место. Модифицируйте упомяну-
тый сценарий так, чтобы перед запуском mysqldsafe по команде cd выполнялся пере-
ход в нужный каталог. Если это было сделано, то при будущих обновлениях измененная
версия mysql.server может быть перезаписана, поэтому отредактированный вариант
сценария необходимо скопировать в безопасное место.)
mysql.server останавливает сервер, посылая ему сигнал. Сервер можно остановить
также b вручную, выполнив команду mysqladmin shutdown.
Чтобы MySQL запускался и останавливался автоматически на вашем сервере, необ-
ходимо добавить команды запуска и останова в соответствующие места в файлах
/etc/rc*.
Если используется RPM-пакет сервера для Linux (MySQL-server-ВЕРСЯЯ.грт), сцена-
рий mysql.server автоматически устанавливается в каталог /etc/init.d под именем
mysql. Нет необходимости устанавливать его вручную. Более подробная информация о
пакетах RPM для Linux представлена в разделе 2.2.2.
Некоторые поставщики предлагают RPM-пакеты, которые устанавливают сценарий
запуска под другим именем, например, mysqld.
Если вы устанавливаете MySQL из исходного дистрибутива либо используете бинар-
ный дистрибутив в формате, который не выполняет автоматическую установку
mysql.server, можете сделать это вручную. Сценарий расположен в подкаталоге
support-files каталога установки MySQL или в дереве исходных текстов.
Чтобы установить mysql.server вручную, скопируйте его в каталог / e t c / i n i t . d под
именем mysql и сделайте его исполняемым:
shell> cp mysql.server /etc/init.d/mysql
shell> chmod +x /etc/init.d/mysql
Более старые системы Red Hat используют каталог /etc/rc.d/init.d вместо
/etc/init.d. В этих системах соответствующим образом уточните предыдущие коман-
ды. В качестве альтернативного решения, сначала создайте /etc/init.d как символиче-
скую ссылку, которая будет указывать на /etc/rc.d/init.d:
shell> cd /etc
shell> In -s re.d/init.d .
После установки сценария команды его активизации зависят от используемой опера-
ционной системы. В Linux для этого применяется команда chkconf ig:
shell> chkconfig —add mysql
В некоторых Linux-системах для полной активизации сценария потребуется выдать
следующую команду:
shell> chkconfig —level 345 mysql on
В системе FreeBSD сценарии запуска обычно должны устанавливаться в
/usr/local/etc/rc.d/. Страницы man-руководства гс(8) указывают, что сценарии из
этого каталога выполняются, только если их имена соответствуют шаблону *.sh. Все
146 Глава 2. Установка MySQL
Если mysqld уже работает, узнать текущие установки путей можно с помощью сле-
дующей команды:
shell> mysqladmin variables
или
shell> mysqladmin -h имя_хоста variables
Здесь имя_хоста - это имя хоста, на котором работает сервер MySQL.
Если при запуске mysqld выдается ошибка Err code 13 ("Permission denied" - "Нару-
шение прав доступа"), это означает, что установленные привилегии для каталога данных
или его содержимого не позволяют серверу получить к нему доступ. В этом случае из-
мените права доступа к каталогу и файлам, чтобы сервер смог работать с ними. Вы так-
же можете запустить сервер от имени root, но это подвергает систему риску нарушения
безопасности, поэтому такого способа следует избегать.
В среде Unix перейдите в каталог данных и проверьте права владения для этого ката-
лога и его содержимого, дабы убедиться, что сервер имеет к нему доступ. Например,
если каталогом данных является /usr/local/mysql/var, введите команду:
shell> Is -la /usr/local/mysql/var
Если каталог данных, его файлы или подкаталоги не принадлежат пользователю опе-
рационной системы, от имени которого запущен сервер, измените их права владения:
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql/var
Если сервер не может стартовать корректно, проверьте файл журнала ошибок на
предмет наличия в нем объяснения причины. Файлы журналов размещаются в каталоге
данных (обычно C:\mysql\data под Windows, /usr/local/mysql/data - для бинарных
дистрибутивов Unix и /usr/local/var - для исходных дистрибутивов Unix). Ищите в
этом каталоге файлы с именами имя_хоста. e r r и имя^хоста. log, где имя_хоста - это имя
хоста вашего сервера. (Старые серверы под Windows в качестве имени файла журнала
ошибок использовали mysql.err.) Затем просмотрите несколько последних строк этих
файлов. В Unix для вывода нескольких последних строк можно воспользоваться коман-
дой t a i l :
shell> t a i l имя_хоста.етг
shell> t a i l имя_хоста.log
Журнал ошибок содержит информацию о том, почему сервер не смог запуститься.
Например, вы можете увидеть там нечто вроде:
000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed
000729 14:50:10 bdb: warning: . / t e s t / t l . d b : No such f i l e or directory
000729 14:50:10 Can't i n i t databases
Это означает, что вы не запустили mysqld с опцией — bdb-no-recover, а механизм
хранения Berkley DB обнаружил, что у него что-то не так с собственными журнальными
файлами, когда попытался восстановить базу данных. Чтобы продолжить работу, вам
нужно переместить старые журнальные файлы Berkley DB из каталога данных в какое-
нибудь другое место, где их можно будет позже просмотреть. Журнальные файлы BDB
называются последовательно, начиная с log.0000000001, где номер увеличивается каж-
дый раз.
2.4. Настройки и тестирование после установки 149
Если вы запускаете mysqld с поддержкой таблиц BDB, и он выдает сбой во время стар-
та, это может быть вызвано проблемами с журналом восстановления BDB. В этом случае
можно попробовать запустить его с опцией —bdb-no-recover. Если это поможет, удали-
те все журнальные файлы BDB из каталога данных и попробуйте снова запустить mysqld
без опции —bdb-no-recover.
Если возникает одна из следующих ошибок, это означает, что какая-то другая про-
грамма (возможно, другой сервер mysqld) уже использует порт TCP/IP или Unix-сокет,
которые пытается открыть mysqld:
Can't s t a r t server: Bind on TCP/IP port: Address already in use
Can't s t a r t server: Bind on unix socket...
С помощью команды ps проверьте, не запущен ли на машине другой сервер mysqld.
Если да, остановите его. (Если другой сервер выполняется, и вы действительно хотите,
чтобы на машине функционировало несколько серверов, ознакомьтесь с информацией,
представленной в разделе 4.9.)
Если никакой другой сервер не запущен, попробуйте выполнить команду telnet
имя-вашего-хоста номер-порта-tcp-ip (по умолчанию MySQL использует порт 3306),
затем нажмите клавишу <Enter> несколько раз. Если вы не получите сообщение об
ошибке вроде t e l n e t : Unable to connect to remote host: Connection refused
("telnet: Невозможно подключиться к удаленному хосту: Подключение отклонено"),
значит, какая-то другая программа использует порт TCP/IP, который пытается открыть
mysqld. Разберитесь, что это за программа, и отключите ее, или же с помощью опции
—port сообщите mysqld, что он должен использовать другой порт. В этом случае номер
порта также потребуется сообщать всем клиентским программам для подключения к
серверу через TCP/IP.
Другая причина, по которой порт оказывается недоступным, может быть связана с
брандмауэром, которые блокирует соединения с портом. Если это так, измените на-
стройки брандмауэра, чтобы разрешить доступ к требуемому порту.
Если сервер запускается, но вы не можете подключиться к нему, убедитесь в наличии
в файле /etc/hosts такой строки:
127.0.0.1 localhost
Эта проблема возникает только в системах, которые не имеют работающей библио-
теки поддержки потоков и для которых MySQL должен быть сконфигурирован с под-
держкой MIT-pthreads.
Если вы не можете заставить mysqld стартовать, попытайтесь создать трассировоч-
ный файл, чтобы затем найти причину проблемы, запустив mysqld с опцией —debug.
Изменения в клиентах:
• mysqldump теперь имеет опции --opt и —quote-names, включенные по умолча-
нию. Вы можете выключить их с помощью —skip-opt и --skip-quote-names.
Изменения в SQL:
• Сравнение строк теперь работает в соответствии с требованиями стандарта SQL:
вместо удаления завершающих пробелов перед сравнением, более короткая стро-
ка теперь дополняется пробелами. Однако в связи с этим появилась проблема, что
' а' > f a \ t ' , чего ранее не было. Если у вас есть таблицы со столбцами типа CHAR
или VARCHAR, в которых завершающий символ может быть меньше, чем ASCII (32),
вы должны использовать в отношении них REPAIR TABLE или myisamchk, чтобы
гарантировать корректность этих таблиц.
• В многотабличных операторах DELETE вместо имен таблиц, из которых нужно
удалять, должны использоваться псевдонимы. Например, вместо DELETE t e s t
FROM t e s t AS t l , test2 WHERE . . . следует использовать:
DELETE t l FROM test AS t l , test2 WHERE . . .
• TIMESTAMP теперь возвращается в виде строки в формате Y ' YYY-MM-DD HH:MM:SS\
(Начиная с версии 4.0.12, может быть использована опция —new, чтобы заставить
сервер 4.0 вести себя подобно 4.1.) Если вы хотите получить результат в виде
числа (как это делает 4.0), то должны добавлять в запросах к имени столбца +0:
mysql> SELECT ts_col + О FROM tbl_name;
Отображаемая ширина столбцов TIMESTAMP больше не поддерживается. Напри-
мер, если вы объявили столбец как TIMESTAMP (10), то (10) игнорируется.
Эти изменения были необходимы для обеспечения совместимости со стандартом
SQL. В будущих версиях будут внесены и дальнейшие изменения (обратно со-
вместимые с этим), позволяющие длине столбцов TIMESTAMP отражать требуемое
количество разрядов в долях секунды.
• Двоичные значение, такие как OxFFDF, теперь рассматриваются как строки, а не
числа. Это решает некоторые проблемы с символьными наборами, когда удобно
вводить строки как бинарные значения. В связи с этим изменением вы должны
использовать CAST (), если хотите сравнивать двоичные значения как целые числа:
mysql> SELECT CAST(0xFEFF AS UNSIGNED INTEGER)
-> < CAST(0xFF AS UNSIGNED INTEGER);
-> 0
Если не применять CAST (), выполняется лексикографическое сравнение:
mysql> SELECT OxFEFF < OxFF;
-> 1
Использование двоичных значений в числовом контексте или сравнение их с по-
мощью операции = должно работать как ранее. (Начиная с версии 4.0.13, может
быть использована опция --new, чтобы заставить сервер 4.0 вести себя подобно
4.1.)
• Для функций, которые возвращают значения типа DATE, DATETIME и TIME, тип воз-
врата приведен к единому временному типу. Например, в MySQL 4.1 вы получите
такой результат:
158 Глава 2. Установка MySQL
• Убедитесь, что у вас нет каких-то клиентов MySQL, которые используют разде-
ляемые библиотеки (вроде модуля Perl DBD: :mysql). Если такие есть, их потребу-
ется перекомпилировать, потому что структуры данных, от которых зависит
libraysqlclient.so, также изменились. То же касается других интерфейсов
MySQL, например, модуля Python MySQLdb.
MySQL 4.0 будет работать, даже если вы не выполните перечисленных действий, од-
нако вы не сможете использовать новые привилегии доступа MySQL 4.0 и столкнетесь с
проблемами позже, при модернизации до версии MySQL 4.1 или более новой. Формат
файлов ISAM по-прежнему работает в серии MySQL 4.0, но считается устаревшим, по-
этому его поддержка по умолчанию не компилируется. Вместо него должны применять-
ся таблицы My ISAM.
Старые клиенты должны работать с версией 4.0 без проблем.
Даже если вы выполните все описанные выше действия, у вас все равно остается
возможность вернуться к версии MySQL 3.23.52 или более новой, если вы столкнетесь с
проблемами в серии MySQL 4.O. В этом случае необходимо с помощью mysqldump под-
готовить дамп все таблицы, использующих полнотекстовые индексы, и перезагрузить
файл дампа в сервер MySQL 3.23. Это необходимо, поскольку в версии 4.0 используется
новый формат полнотекстовых индексов.
В следующем списке описываются изменения, которые могут повлиять на приложе-
ния, и на которые следует обратить особое внимание при переходе на версию 4.0.
Изменения в сервере:
• MySQL 4.0 имеет множество новых привилегий в таблице mysql.user (см. раздел
4.4.3).
Чтобы заставить новые привилегии работать, необходимо обновить таблицы при-
вилегий. Соответствующая процедура описана в разделе 2.5.8. До тех пор, пока
вы не сделаете этого, все учетные записи будут иметь привилегии SHOW
DATABASES, CREATE TEMPORARY TABLES И LOCK TABLES. П р и в и л е г и и SUPER И EXECUTE
п о л у ч а ю т СВОИ З н а ч е н и я ИЗ PROCESS. REPLICATION SLAVE И REPLICATION CLIENT
берут свои значения из FILE.
Если имеются сценарии, создающие новых пользователей MySQL, может понадо-
биться изменить их так, чтобы они выдавали создаваемым пользователям новые
привилегии. Если вы не применяете команду GRANT в этих сценариях, то это впол-
не подходящий момент, чтобы воспользоваться ею вместо прямого изменения
данных в таблицах привилегий.
Начиная с версии 4.0.2, опция --safe-show-database считается устаревшей
(и больше ничего не делает). См. раздел 4.3.3.
Если вы получаете сообщение об ошибке "Access denied" ("Доступ запрещен")
для новых пользователей в версии 4.0.2 и выше, проверьте, не нужно ли восполь-
зоваться какими-то новыми привилегиями, которые не применялись ранее. В ча-
стности, потребуется привилегия REPLICATION SLAVE (вместо FILE) для новых
подчиненных серверов.
• safe_mysqld переименован в mysqld_safе. Для достижения обратной совместимо-
сти бинарные дистрибутивы иногда включают в себя символические ссылки
safejnysqld, которые указывают на mysqld_safе.
2.5. Модернизация MySQL и возврат к старой версии 161
• SHOW SLAVE STATUS теперь возвращает пустой набор, если подчиненная база дан-
ных не инициализирована.
• SHOW INDEX имеет дополнительных две столбца, которых не было в версии 3.23
(Null и Index_type).
• Изменился формат SHOW OPEN TABLES.
• ORDER BY имя_столбца DESC выводит значения NULL в конце, начиная с версии
MySQL 4.0.11. В версии 3.23 и более ранних выпусках 4.0 так было не всегда.
• CHECK, LOCALTIME и LOCALTIMESTAMP отныне являются зарезервированными словами.
• DOUBLE и FLOAT теперь при хранении учитывают флаг UNSIGNED (ранее для таких
столбцов он игнорировался).
• Результат всех бинарных операций (|, &, « , » и ~) теперь целое число без знака.
Это может вызвать проблемы, если вы применяете эти операции в контексте, в
котором ожидается результат со знаком.
Щ На заметку!
;
fy Когда выполняется вычитание целых чисел, причем одно из них UNSIGNED, результат будет без-
\yl знаковым. Другими словами, прежде чем модернизировать сервер до версии MySQL 4.0, необ-
|| ходимо проверить существующие приложение на случаи вычитания из беззнакового целого,
Щ когда ожидается отрицательное значение, или вычитания беззнакового целого из целочислен-
':;г- ного столбца. Вы можете отключить такое поведение с помощью опции —sql-mode=
£' NO_UNSIGNED_SUBSTRACTION при запуске mysqld. См. раздел 4.2.2.
• Вы должны использовать TRUNCATE TABLE, когда хотите удалить все строки таб-
лицы и не нуждаетесь в их подсчете. (DELETE FROM имя_таблицы возвращает в вер-
сии 4.0 количество удаленных записей, a TRUNCATE TABLE работает быстрее.)
• При попытке выполнить TRUNCATE TABLE или DROP DATABASE, когда существуют
активные транзакции или блокировки таблиц, вы получите ошибку.
• Чтобы использовать полнотекстовый поиск MATCH.. .AGAINST (...IN BOOLEAN
MODE) в ваших таблицах, необходимо пересоздать их индексы с помощью REPAIR
TABLE имя_таблицы USE_FRM. Если попытаться применить булевский полнотек-
стовый поиск без такого пересоздания индексов, получится неверный результат.
• Функции LOCATE () и INSTR () чувствительны к регистру, если одним из аргумен-
тов является бинарная строка. В других случаях упомянутые функции к регистру
не чувствительны.
• Функция STRCMP () при сравнении строк теперь использует текущий набор симво-
лов. Это делает сравнение строк по умолчанию чувствительным к регистру, если
только один или оба аргумента не являются бинарными строками.
2.5. Модернизация MySQL и возврат к старой версии 163
Изменения в клиентах:
• Стандартный MySQL-клиент mysqld теперь по умолчанию запускается с опцией
—no-named-commands (-g). Ее можно отключить, указав —enable-named-commands (-G).
В некоторых случаях это может привести к проблемам совместимости, например,
в SQL-сценариях, которые используют именованные команды без точек с запятой.
Длинный формат команд по-прежнему работает с первой строки.
• Если вы хотите, чтобы ваши файлы mysqldump были совместимы между версиями
MySQL 3.22 и MySQL 3.23, не следует при запуске mysqldump указывать опции
—opt и — a l l .
Изменения в SQL:
• Если выполнить DROP DATABASE для базы данных, указанной через символическую
ссылку, то удаляется как сама база, так и эта ссылка. Этого не происходило в
MySQL 3.22, потому что configure не мог определить доступность системного
вызова readlink().
• OPTIMIZE TABLE теперь работает только для таблиц My ISAM. Для других типов таб-
лиц с целью оптимизации можно применять ALTER TABLE. Во время выполнения
OPTIMIZE TABLE таблица блокируется, чтобы предотвратить обращение к ней из
других потоков сервера.
• Функции работы с датами, которые имеют дело с частью значения даты (подоб-
ные MONTH()), теперь возвращают 0 для даты 0000-00-00. В MySQL 3.22 они воз-
вращали NULL.
• Тип возврата по умолчанию функции IF () теперь зависит от обоих аргументов, а
не от одного.
• Столбцы AUTO_INCREMENT не должны использоваться для хранения отрицательных
значений. Причина состоит в том, что отрицательные числа приводили к пробле-
мам, когда обращались из -1 в 0. Вы также не должны сохранять значения 0 в
столбцах AUTO_INCREMENT. CHECK TABLE будет предупреждать о значениях 0, по-
скольку они могут измениться, если таблицу выгрузить в дамп и потом загрузить
обратно. AUTO_INCREMENT для таблиц MylSAM теперь обрабатываются на более низ-
ком уровне и значительно быстрее, нежели ранее. Вдобавок, в таблицах My ISAM ста-
рые значения больше не используются, даже если вы удалите строки из таблицы.
• CASE, DELAYED, ELSE, END, FULLTEXT, INNER, RIGHT, THEN И WHEN теперь ЯВЛЯЮТСЯ за-
резервированными словами.
• FLOAT (p) теперь возвращает значение с плавающей точкой, а не с фиксированным
количеством разрядов, как ранее.
• При объявлении столбцов типа DECIMAL [длина, дес_точка) аргумент длина от-
ныне не включает в себя места под знак или десятичную точку.
• Строка TIME должна быть теперь в одном из следующих форматов:
[[[ДЕНЬ] [Ч]Ч:]ММ:]СС[.доли_сек] или [[[[[Ч]Ч]Ч]Ч]ММ]СС[.доли_сек].
• LIKE теперь сравнивает строки, используя те же правила сравнения, что и опера-
ция =. Если нужно вернуть старое поведение, скомпилируйте MySQL с флагом
CXXFLAGS=-DLIKE CMP TOUPPER.
2.5. Модернизация MySQL и возврат к старой версии 165
• SUM() теперь возвращает NULL вместо 0, если нет подходящих строк. Этого требу-
ет стандарт SQL.
• Операции AND или OR со значениями NULL теперь возвращают NULL вместо 0. Это в
основном касается запросов, использующих NOT в выражениях AND/OR как NOT
NULL = NULL.
Простейший (но не самый быстрый) способ переместить базу данных между двумя
машинами предполагает запуск следующих команды на машине, на которой расположе-
на база данных:
shell> mysqladmin -h 'имя другого хоста* create имя_базы_данных
shell> mysqldump —opt db_name | mysql -h 'имя другого хоста' имя_базы_данных
Если вы хотите скопировать базу данных с удаленной машины через медленную
сеть, можно поступить так:
shell> mysqladmin create имя_базы_данных
shell> mysqldump -h 'имя другого хоста1 —opt —compress имя_базы_данных |
mysql имя_базы_данных
Вы можете также сохранить результат в файле, затем переместить этот файл на дру-
гую машину и там загрузить его в базу данных. Например, вы можете поместить базу
данных в дамп на исходной машине следующим образом:
shell> mysqldump —quick имя_базы_данных | gzip > имя_ базы_ да иных, con ten ts.gz
Файл, полученный подобным образом, является сжатым. Переместите файл, содержа-
щий данные из базы, на целевую машину и выполните там приведенные ниже команды:
shell> mysqladmin create имя_базы_данных
shell> gunzip < имя_базы_данных.contents.gz | mysql имя_базы_данных
Для переноса базы данных можно также использовать mysqldump и mysql import. В
случае больших таблиц это может оказаться значительно быстрее, чем при простом
применении mysqldump. В следующем примере КАТАЛОГ_ДАМПА представляет собой пол-
ное имя пути к каталогу, куда помещается вывод mysqldump.
Вначале создайте каталог для выходных файлов и постройте дамп базы данных:
s h e l l > mkdir КАТАЛОГ_ДАМПА
s h e l l > mysqldump —ЬаЬ=КАТАЛОГ_ДАМПА имя_базы_данных
Если вы используете наш бинарный дистрибутив или RPM-модуль версии 3.23.25 или
более поздней, можете устанавливать значение max_connections равным 1500, предпо-
лагая, что не будет больших буферов ключей или таблиц куч с большим объемом дан-
ных. Чем сильнее вы ограничиваете STACKSIZE в LinuxThreads, тем больше потоков
сможете создать. Мы рекомендуем выбирать значение между 128 Кбайт и 256 Кбайт.
Если вы используете множество параллельных соединений, то можете пострадать от
свойства ядра 2.2, которое пытается предотвратить атаки типа "fork bomb", наказывая
процессы, порождающие много своих клонов или дочерних процессов. Это ограничива-
ет возможности масштабирования MySQL при увеличении количества параллельных
клиентов. В однопроцессорных системах мы обнаружили, что это проявляется очень
медленным порождением потоков, и подключение к серверу может длиться очень долго
(вплоть до одной минуты), и так же долго длится отключение. В многопроцессорных
системах мы наблюдали постепенное снижение скорости выполнения запросов при уве-
личении количества клиентов. В процессе поиска решения проблемы мы получили ис-
правление от одного из наших пользователей, который использовал его во время прове-
дения множества исправлений в своей системе. Это исправление доступно по адресу
http://www.mysql.com/Downloads/Patches/linuxfork.patch. Мы провели интенсивное
тестирование упомянутого исправления, как на тестовых, так и на рабочих системах. Он
существенно увеличивает производительность MySQL, не вызывая никаких побочных
эффектов, и мы рекомендуем его тем нашим пользователям, которые эксплуатируют
сильно загруженные серверы на базе ядра 2.2.
Этот недостаток был исправлен в ядре 2.4, поэтому, если вы не удовлетворены суще-
ствующей производительностью своей системы, вместо исправления ядра 2.2 может
быть проще провести модернизацию ядра до версии 2.4. В SMP-системах модернизация
также приведет к повышению производительности симметричной многопроцессорной
обработки в дополнение к исправлению дефекта.
Мы протестировали MySQL с ядром версии 2.4, работающим на двухпроцессорной
машине, и обнаружили, что масштабирование MySQL стало значительно лучше. Не бы-
ло практически никакого замедления при выполнении запросов любого типа с ростом
числа клиентских подключений до 1000, и фактор масштабирования MySQL (вычисляе-
мый как отношение производительности при обслуживании максимальном числе клиен-
тов к производительности при обслуживании одного клиента) составил 180%. Тот же
результат мы получили и на четырехпроцессорной системе: практически никакого за-
медления при росте количества клиентов до 1000 и фактор масштабирования 300%. На
основании этих результатов, для сильно загруженных SMP-серверов, работающих на
базе ядре 2.2, мы определенно рекомендуем модернизацию ядра до версии 2.4.
Мы открыли, что важно запускать процесс mysqld на ядре 2.4 с максимально воз-
можным приоритетом для достижения наивысшей производительности. Это может быть
сделано добавлением команды renice -20 $$ в сценарий mysqld_safe. Наше тестирова-
ние на четырехпроцессорной системе показало, что повышение приоритета увеличивает
производительность на 60% при нагрузке в 400 клиентов.
В настоящее время мы пытаемся собрать больше информации о том, насколько хо-
рошо работает MySQL на четырех- и восьмипроцессорных системах. Если вы имеете
доступ к таким системам и выполняли на них тестирования производительности, пожа-
луйста, присылайте нам информацию о результатах по электронной почте на адрес
[email protected].
176 Глава 2. Установка MySQL
Если вы видите мертвый процесс mysqld в листинге команды ps, обычно это означа-
ет, что вы нашли ошибку в MySQL, или же у вас имеется поврежденная таблица. См.
раздел А.4.2.
Чтобы получить дамп памяти в Linux в случае зависания mysqld с сигналом
SIGSEGV, запустите mysqld с опцией — c o r e - f i l e . Обратите внимание на то, что,
возможно, вам придется увеличить допустимый размер файла дампа памяти, добавив
строку ulimit -с 1000000 в сценарий mysqld_safe или запустив mysqld_safe с опцией
--core-f ilesize=1000000. См. раздел 4.1.3.
Если mysqld сбрасывает дамп памяти при запуске, проблема может быть вызвана
старой библиотекой / l i b / l i v e . а. Попробуйте переименовать ее, затем удалите
sql/mysqld, заново выполните make i n s t a l l и попробуйте запустить mysqld снова. Об
этой проблеме также сообщалось для некоторых установок Slackware.
Если вы получаете следующие сообщения об ошибках во время компоновки mysqld,
это означает, что у вас не установлена правильно библиотека libg++. a:
/usr/lib/libc.a(putc.o): In function 4 _I0_putc':
putc.o (.text+OxO): multiple definition of v_IO_putc'
/usr/lib/libc.a (putc.o) : В функции y_IO_putc ':
putc.o(.text+OxO): множественное объявление y_IO_putc'
Вы можете исключить использование libg++.a, запустив configure таким образом:
shell> CXX=gcc ./configure
Если mysqld терпит крах немедленно, а у вас установлена система Red Hat 5.0 с вер-
сией glibc, предшествующей 2.0.7-5, убедитесь, что установлены все необходимые ис-
правления glibc. Много информации об этом можно найти в почтовых архивах MySQL,
доступных в по адресу http://lists.mysql.com/.
2.6.1.6. Замечания по Linux SPARC
В некоторых реализациях вызов readdir_r() неустойчив. Симптом заключается в
том, что команда SHOW DATABASES всегда возвращает пустой набор. Это может быть ис-
правлено удалением HAVE_READDIR_R из config.h после конфигурирования и до компи-
ляции.
—with-extra-charsets=complex —enable-thread-safe-client \
—with-mysqld-ldflags=-non_shared —with-client-ldflags=-non_shared
Если вы хотите использовать egcs, то подойдет следующая строка configure:
CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc \
CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors \
-fno-exceptions - f n o - r t t i " \
./configure —prefix=/usr/local/mysql —disable-shared
Ниже перечислены некоторые известные проблемы при работе MySQL на Linux-
Alpha:
• Отладка многопоточных приложений, подобных MySQL, в gdb 4.18 не работает.
Используйте вместо этого gdb 5.1.
• Если вы пытаетесь компоновать mysqld статически при использовании дсс, то ре-
зультирующий код приводит к выгрузке дампа памяти немедленно при старте.
Другими словами, не используйте — with-mysqld-ldf lags=-all-static с дсс.
COgcc CFLAGS="-03" \
CXX=gcc CXXFLAGS="-03 - f e l i d e - c o n s t r u c t o r s -fno-exceptions - f n o - r t t i " \
./configure —prefix=/usr/local/mysql —with-low-memory \
—enable-assembler
Если вы работаете в системе UltraSPARC, то можете получить производительность
на 4% выше, добавив -mcpu=v8 -Wa,-xarch=v8plusa к переменным окружения CFLAGS и
CXXFLAGS.
В случае использования компилятора Sun Forte 5.0 (или более новой версии)
configure можно запускать так:
СС=сс CFLAGS="-Xa -fast -native -xstrconst -mt" \
CXX=CC CXXFLAGS="-noex -mt11 \
./configure —prefix=/usr/local/mysql —enable-assembler
Для получения 64-разрядного бинарного кода с помощью компилятора Sun Forte при-
меняйте следующие опции конфигурации:
СС=сс CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9" \
CXX=CC CXXFLAGS="-noex -mt -xarch=v9" ASFLAGS=fl-xarch=v9lf \
./configure —prefix=/usr/local/mysql —enable-assembler
Чтобы получить 64-разрядный бинарный код Solaris с помощью компилятора дсс,
добавьте -тб4 к CFLAGS и CXXFLAGS и удалите —enable-assembler из строки configure.
Это работает только с MySQL 4.0 и выше. MySQL 3.23 не содержит требуемых модифи-
каций для поддержки этого.
Во время тестирования производительности MySQL мы получили прирост скорости
в 4% на UltraSPARC с компилятором Forte 5.0 в 32-разрядном режиме по сравнению с
дсс 3.2 с флагом -mcpu.
Если вы собираете 64-разрядный бинарный код mysqld, то обнаружите, что он на 4%
медленнее, чем 32-разрядный вариант, но поддерживает больше потоков и памяти.
Если вы получите проблемы с fdatasync или sched_yield, можете исправить это, до-
бавив LIBS=-lrt в строку configure.
Для компиляторов, предшествующих Workshop 5.3, возможно, потребуется отредак-
тировать строку configure. Измените строку:
#if ! defined (_STDC__) | | _STDC_ != 1
на
#if !defined(__STDC_J
Если вы включите STDC с помощью опции -Хс, компилятор Sun не сможет вклю-
чить файл pthread.h. Это ошибка Sun (поврежден компилятор или заголовочный файл).
Если mysqld во время запуска выдает приведенное ниже сообщение об ошибке, зна-
чит, вы попытались скомпилировать MySQL компилятором Sun без опции -mt:
libc internal error: _rmutex_unlock: rmutex not held
Добавьте -mt к CFLAGS и CXXFLAGS и перекомпилируйте.
Если вы используете SFW-версию дсс (которая поставляется вместе с Solaris 8), то
должны добавить /opt/swf/lib к переменной окружения LD_LIBRARY_PATH до запуска
configure.
2.6. Замечания по поводу конкретных операционных систем 181
Для того чтобы обойти это, можете попробовать запустить сервер с опцией
—back_log=50. (До версии MySQL 4.0 используйте -0 back_log=50.)
Solaris не поддерживает файлы образов памяти для приложений с вызовами
setuid (), поэтому вы не сможете получить этот файл от raysqld, если указываете опцию
—user.
./configure —prefix=/usr/local \
—localstatedir=/var/mysql \
—sysconfdir=/etc/mysql \
—sbindir='/usr/local/bin' \
—libexecdir='/usr/local/bin 1 \
—enable-thread-safe-client \
—enable-large-files
Перечисленные опции используются для компиляции дистрибутива MySQL, который
можно найти по адресу http://www-frec.bull.com/.
Если в предыдущей строке configure вы замените -03 на -02, то должны будете так-
же удалить опцию - q s t r i c t . Это ограничение компилятора С от IBM.
Если вы применяете дсс или egcs для компиляции MySQL, то должны использовать
флаг -fno-exceptions, потому что поддержка исключений у gcc/egcs небезопасна в от-
ношении потоков. (Проверено для egcs 1.1.) Существуют также некоторые проблемы с
ассемблером IBM, из-за которых он генерирует неудачный код при работе с дсс. Мы
советуем использовать следующую строку configure с egcs и дсс 2.95 на AIX:
СС="дсс -pipe -mcpu=power -Wa,-many" \
СХХ="дсс -pipe -mcpu=power -Wa,-many" \
CXXFLAGS="-felide-constructors -fno-exceptions - f n o - r t t i " \
. / c o n f i g u r e — p r e f i x = / u s r / l o c a l / m y s q l —with-low-memory
Опции -Wa и -many необходимы для успешной компиляции. В компании IBM знают
об этой проблеме, однако не торопятся ее исправлять, поскольку существует возмож-
ность ее обхода. Мы не знаем, нужна ли опция -fno-exceptions для дсс 2.95, но так как
код MySQL не использует исключений, и эта опция генерирует более быстрый код, ре-
комендуем всегда ее применять с компиляторами gcc/egcs.
Если вы столкнетесь с проблемами в ассемблерном коде, попробуйте изменить зна-
чение опции -гасри=ххх, чтобы оно соответствовало типу вашего процессора. Возможно,
понадобится указать power2, power или powerpc. Как альтернатива, может понадобиться
604 или 604е. Мы не на сто процентов уверены, но предполагаем, что значение power
должно оказаться безопасным в большинстве случаев, даже если у вас машина power2.
Если вы не знаете, какой тип процессора установлен, выполните команду uname -m.
Она выдаст строку, которая выглядит как 000514676700, в формате xxyyyyyymmss, где хх
и ss - всегда 00, уууууу - уникальный системный идентификатор и mm - идентификатор
процессора. Описание этих значений доступно по адресу:
http://publib.boulder.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm
Это предоставит информацию о типе и модели машины, которую вы можете
использовать для определения типа центрального процессора.
Если возникают проблемы с сигналами (MySQL неожиданно зависает при высокой
нагрузке), возможно, они связаны с ошибками операционной системы, которые касают-
ся механизма потоков и сигналов. В этом случае вы можете указать MySQL не исполь-
зовать сигналы, сконфигурировав его следующим образом:
CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \
CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti \
-DDONT_USE_THR_ALARM" \
./configure —prefix=/usr/local/mysql —with-debug \
—with-low-memory
190 Глава 2. Установка MySQL
CFLAGS=-DDONT_USE_THR_ALARM \
CXXFLAGS=-DDONT_USE_THR_ALARM \
./configure ...
Последнее не повлияет на производительность MySQL, однако приведет к побочно-
му эффекту - вы не сможете уничтожать спящие процессы клиентов, подключенные к
серверу, с помощью команды mysqladmin k i l l или mysqladmin shutdown. Клиент завис-
нет при выдаче очередной команды.
При работе с компилятором дсс 2.95.2, возможно, вы получите следующее сообще-
ние об ошибке:
sql_acl.cc:1456: Internal compiler error in 4scan_region',
at except.c:2566
Please submit a full bug report.
Чтобы это исправить, потребуется перейти в каталог sql и вырезать, а затем вставить
последнюю строку вызова дсс, изменив -03 на -00 (или добавив -00 сразу после дсс,
если в строке вызова компилятора опции -0 отсутствуют). После того, как это будет сде-
лано, нужно вернуться в каталог верхнего уровня и запустить make снова.
- На заметку!
; В связи с ограничениями, накладываемыми OS/2, длина имен модулей UDF не должна превы-
шать 8 символов (без расширения). Модули расположены в каталоге /mysql2/udf. Сценарий
- safe-mysqld.cmd помещает этот каталог в переменную окружения BEGINLIBPATH. При ис-
' пользовании UDF-модулей указанные расширения имен игнорируются. Предполагается, что они
'-' всегда будут .udf. Например, в Unix разделяемый модуль может иметь имя example.so и
функции из него будет загружаться следующим образом:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME ' e x a m p l e . s o ' ;
Установка DBD: :mysql выполняет множество тестов. Эти тесты должны иметь воз-
можность подключаться к локальному серверу MySQL от имени анонимного пользова-
теля без пароля. Если вы уже удалили анонимные учетные записи или назначили им па-
роли, тесты не запустятся. С помощью force i n s t a l l DBD: rraysql можно проигнориро-
вать тесты, завершившиеся неудачей.
DBI требует наличия модуля Data::Dumper. Возможно, он уже установлен. Если нет,
его нужно установить до установки DBI.
Можно также загрузить дистрибутивы модулей в форме сжатого архива t a r и со-
брать их вручную. Например, процедура распаковки и сборки дистрибутив DBI выглядит
следующим образом:
1. Распакуйте дистрибутив в текущем каталоге:
shell> gunzip < DBI-ВЕРСИЯ.tar.gz | tar xvf -
Эта команда создает каталог по имени DBI-ВЕРСИЯ.
2. Перейдите в корневой каталог распакованного дистрибутива:
shell> cd ЬЫ-ВЕРСИЯ
3. Выполните сборку дистрибутива с компиляцией всех кодов:
shell> perl Makefile.PL
shell> make
shell> make test
shell> make install
Команда make t e s t важна, поскольку она проверяет работоспособность модуля.
Помните, что когда вы запускаете эту команду во время установки модуля DBD: :mysql,
сервер MySQL должен быть запущен, иначе тесты не пройдут.
Неплохо переустанавливать DBD::mysql всякий раз, когда устанавливается новый
выпуск MySQL, особенно, если вы видите, что ваши DBI-сценарии перестали работать
после обновления MySQL.
Если у вас нет прав доступа для установки модулей Perl в системный каталог, или ес-
ли вы хотите установить их локально, следующая ссылка может в этом помочь:
http://servers.digitaldaze.com/extensions/perl/modules.htrallmodules.
Читайте материал под заголовком "Installing New Modules that Require Locally
Installed Modules" ("Установка новых модулей, которые требуют локально установлен-
ных модулей").
LD = Id LD = gee -G -fpic
LDDLFLAGS = -G -L/usr/local/lib LDDLFLAGS = -L/usr/local/lib
LDFLAGS = -belf -L/usr/local/lib LDFLAGS = -L/usr/local/lib
LD = Id LD = gec -G -fpic
OPTIMISE = -Od OPTIMISE = -01
Старый:
CCCFLAGS = -belf -dy -wO -U M_XENIX -DPERL_SC05 -I/usr/local/include
Новый:
CCFLAGS = -U M_XENIX -DPERL_SC05 -I/usr/local/include
или:
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
/usr/progressive/lib:/usr/skunk/lib
LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
/usr/progressive/lib:/usr/skunk/lib
MANPATH=scohelp:/usr/man:/usr/locall/man:/usr/local/man:\
/usr/skunk/man:
Сначала выполните сборку Perl, включающую скомпонованный статически модуль
DBI, запустив в каталоге, в котором находится дистрибутив DBI, следующие команды:
shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl
Затем необходимо установить новую версию Perl. Вывод команды make perl пока-
жет явно все команды make, которые нужно выполнить для целей установки. В среде
SCO это будет make -f Makefile.aperl inst_perl MAP_TARGET=perl.
После этого, используя только что собранную версию Perl, создайте другую версию
Perl, которая статически включает модуль DBD: :mysql, выполнив приведенные ниже ко-
манды в каталоге, в котором расположен дистрибутив DBD: :mysql:
shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl
И, наконец, установите этот новый вариант Perl. Опять-таки, вывод make perl пока-
жет все команды make, которые необходимо будет выполнить для установки.
3
Использование
программ MySQL
• set-variable = имя_переменной=значение
Устанавливает определенное значение программной переменной имя_переменной.
Данная форма эквивалентна —зеЬчаг1аЫе=имя_переменной=значение в команд-
ной строке. Пробелы можно ставить перед и после первого знака '=', но никак не
перед и после второго. Начиная с версии MySQL 4.0, такой синтаксис считается
устаревшим. Для получения более подробной информации об установке про-
граммных переменных обратитесь в раздел 3.3.4.
Пробельные символы в начале и в конце имен и значений опций автоматически уда-
ляются. Для отображения символов забоя, табуляции, новой строки, возврата каретки,
обратной косой черты и пробела в значениях опций можно использовать следующие
управляющие последовательности: *\b\ ' \ t ' , '\n\ '\г', '\\' и '\s\
В среде Windows путь должен указываться в опции с использованием разделителя
7 \ а не '\\ Если требуется применять символ *\\ его необходимо удвоить, то есть '\\\
поскольку символ ' \' в MySQL является управляющим.
Если название группы опций и название программы совпадают, опции, указанные в
группе, будут применяться конкретно для данной программы.
Группа опций [client] считывается всеми клиентскими программами (но не mysqld).
Это позволяет задавать в ней опции, которые будут применяться для каждого клиента.
Например, группа [client] идеально подходит для того, чтобы указать в ней пароль,
который используется вами для подключения к серверу. (Обязательно убедитесь, что
доступ по чтению и записи имеется только у вас, чтобы другие пользователи не смогли
узнать ваш пароль.) Прежде чем вносить опцию в группу [client], проверьте, распозна-
ется ли она всеми используемыми клиентскими программами. Те программы, которым
данная опция неизвестна, после запуска сразу же завершат работу, предварительно вы-
дав сообщение об ошибке.
Начиная с версии MySQL 4.0.14, можно создавать группы опций, которые должны
считываться только одной конкретной серией впусков сервера mysqld, используя для
этих групп имена наподобие [mysqld-4.0], [mysqld-4.1 ] и так далее. Следующая груп-
па указывает, что опция —new должна применяться только серверами MySQL с номера-
ми версий 4.0.x:
[mysqld-4.О]
new
Ниже показан пример типичного файла глобальных опций:
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M
[mysqldump]
quick
В этом файле опций используется синтаксис имя_переменной= значение для строк,
устанавливающих значения переменных key_buffer_size и max_allowed_packet.
3.3. Задание опций программы 209
. На заметку!
р. Разработчикам стоит помнить следующее. Анализ файлов опций выполняется в клиентской биб-
§ лиотеке С просто путем обработки всех совпадающих опций (то есть опций, находящихся в COOT-
IE ветствующих группах) до обработки любых аргументов, указываемых в командной строке. Это
| прекрасно подходит для программ, использующих последний из всех встречающихся экземпля-
|| ров опции, которая была задана несколько раз. При наличии программы С или C++, которая мо-
%'t жет обрабатывать многочисленные заданные опции, но не может считывать файлы опций, по-
§- требуется добавить только две строки, чтобы предоставить ее возможность делать это. Про-
Й смотрите исходный код любого из стандартных клиентов MySQL, чтобы узнать, как добиться
jf такого результата.
Администрирование
баз данных
I Variable_name | Value |
+ + +
I have_bdb | NO I
I have_crypt | YES |
I have_innodb | YES |
I have_isam | NO |
I have_raid | NO |
I have_symlink | DISABLED |
I have_openssl | NO |
I have_query_cache | YES |
+ + +
Значения во втором столбце указывают уровень поддержки сервером той или иной
функции:
Значение Описание
YES Функция поддерживается и активна.
N0 Функция не поддерживается.
DISABLED Функция поддерживается, но была отключена.
• Если сервер и базы данных не могут быть найдены относительно рабочего ката-
лога, mysqldsafe пытается найти их по абсолютным именам путей, обычно это
/usr/local/libexec и /usr/local/var. Фактическое местонахождение сервера и
базы данных определяется через значения, заданные в дистрибутиве во время его
сборки. Они будут корректными, если MySQL установлен в каталоге, указанном
во время конфигурирования.
Поскольку mysqld_safe будет пытаться найти сервер и базы данных относительно
своего собственного рабочего каталога, бинарный MySQL можно установить в любое
место, при этом запуск mysqld_safe должен осуществляться из каталога установки
MySQL:
shell> cd каталог_установки_тузд1
shell> bin/mysqld_safe &
Если не удается запустить mysqld_safe даже из каталога установки MySQL, можно
задать опции —ledir и -datadir, чтобы указать каталоги, где в вашей системе разме-
щаются сервер и базы данных.
Обычно редактировать сценарий mysqld_safe не нужно. Вместо этого конфигуриро-
вание mysqldsafe осуществляется с помощью опций командной строки или опций в
разделе [mysqld_safe] файла my.cnf. Лишь в редких случаях может понадобиться ре-
дактирование сценария mysqld_saf e для корректного запуска сервера. Однако тогда, при
будущих модернизациях версий MySQL, модифицированный сценарий mysqld_safe бу-
дет заменен новым. Чтобы избежать этого, потребуется делать копию отредактирован-
ной версии, которую при необходимости можно будет установить повторно.
В среде NetWare mysqld_safe - это загружаемый модуль NLM, который переносится
с оригинального основного сценария Unix; выполняет он следующие действия:
1. Запускает набор проверок системы и опций.
2. Запускает проверку таблиц My ISAM и ISAM.
3. Обеспечивает экранное представление сервера MySQL.
4. Запускает mysqld, осуществляет текущий мониторинг, а также перезапуск в слу-
чае ошибки.
5. Регистрирует сообщение об ошибке в mysqld в журнале имя_хоста.еи, который
находится в каталоге данных.
6. Регистрирует экранный вывод mysqld_safe в журнале имя^хоста. err, который
находится в каталоге данных.
MY_PWD=4pwd4
# Check if we are starting this relative (for the binary release)
# Проверяем,происходит ли запуск относительно каталога (для бинарных версий)
if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \
-x ./bin/mysqld
См. раздел 4.1.З. Тест, запускаемый указанными выше строками, должен пройти
успешно, тем не менее, проблемы не исключены.
• Файл сокета Unix и номер TCP/IP-порта должны быть разными для каждого
mysqld.
• Возможно указание опции —user для mysqld, однако тогда сценарий
mysqldjnulti необходимо запустить от имени привилегированного (root) пользо-
вателя Unix. Наличие опции в файле опций роли не играет; вы просто получите
предупреждение, если не являетесь суперпользователем и если процессы mysqld
запущены от имени вашей учетной записи Unix.
1 Внимание!
р! Убедитесь, что каталог данных полностью доступен для учетной записи Unix, через которую за-
^ пускается определенный процесс mysqld. Если вы не уверены в своих действиях, не исполь-
зуйте учетную запись r o o t в Unix.
Очень важно перед использованием m y s q l d j n u l t i убедиться в том, что вы понимаете значения
опций, передаваемых серверам mysqld, равно как в том, почему могут понадобиться отдельные
процессы mysqld. He забывайте о риске при использовании множественных серверов mysqld с
одним и тем же каталогом данных. Если вы не уверены в своих действиях, отдельные каталоги
данных в таком случае - это лучший вариант. Запуск множественных серверов с одним и тем же ката-
логом данных отнюдь не повышает производительность многопоточной системе. См. раздел 4.9.
222 Глава 4. Администрирование баз данных
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/share/mysql/english
user = John
[mysqld3]
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/share/mysql/swedish
user = monty
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/share/mysql/estonia
user = tonu
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/var6/hostname.pid6
datadir = /usr/local/mysql/var6
language = /usr/local/share/mysql/japanese
user = jani
См. раздел З.З.2.
4.2. Конфигурирование сервера MySQL 223
• —basedi г=луть, -Ь путь. Путь к каталогу установки MySQL. Все пути обычно
определяются относительно данного пути.
• —big-tables. Разрешает работать с большими объемами результатов, сохраняя
все временные данные в файлы. Данная опция позволяет предотвратить большин-
ство ошибок типа "table full" ("таблица переполнена"), но при этом замедляет об-
работку запросов, для которых таблиц в памяти (in-memory) было бы вполне дос-
таточно. В версии MySQL 3.23.2 и выше сервер обрабатывает большие объемы
результатов автоматически, используя память для маленьких временных таблиц и,
при необходимости, переключаясь на таблицы на диске.
• —bind-address=IP. IP-адрес для связывания.
• --console. Регистрировать ошибки в s t d e r r / s t d o u t , даже если задана опция
—log-error. В Windows при использовании данной опции mysqld не будет за-
крывать экран консоли.
• —character-sets-dir=nyTb. Каталог, в котором находятся наборы символов. См.
раздел 4.7.1.
• ~chroot=nyTb. Размещает сервер mysqld в закрытом окружении во время запуска,
используя системный вызов chroot (). Данная опция рекомендуется в качестве
меры безопасности, начиная с версии MySQL 4.O. (Версия MySQL 3.23 не может
обеспечить стопроцентную изоляцию chroot ().) Обратите внимание, что приме-
нение данной опции некоторым образом ограничивает функции LOAD DATA INFILE
И SELECT...INTO OUTFILE.
• — c o r e - f i l e . Записывает файл ядра в случае отказа mysqld. В некоторых системах
для raysqld_safe также понадобится задать опцию — c o r e - f i l e - s i z e . См. раздел
4.1.3. Обратите внимание, что в определенных системах, таких как Solaris, файл
ядра получить не удастся, если используется опция —user-option.
• —datadir=nyrb, -h путь. Путь к каталогу данных.
• —debug [=опции__отладки], -# [опции_отладш]. Если MySQL сконфигурирован с
использованием --with-debug, с помощью данной опции можно получить файл
трассировки выполняемых mysqld операций. Строка опции_отладки чаще всего
выглядит приблизительно так: ' d: t : о, имя_файла'.
• —default-character-set=Ha6op_CHMBCxtfOB. Использовать набор_символов как на-
бор символов по умолчанию. См. раздел 4.7.1.
• —default-collation=coпocтaвлeниe. Использовать сопоставление как сопостав-
ление по умолчанию. Эта опция доступна, начиная с версии MySQL 4.1.1. См.
раздел 4.7.1.
• —default-storage-engine=Tnn. Данная опция является синонимом —default-
table-type. Доступна, начиная с версии MySQL 4.I.2.
• --def ault-table-type=THn. Установить для таблиц тип по умолчанию. См. главу 8.
• — delay-key-write [= OFF | ON | ALL]. Указывает, как будет использоваться оп-
ция DELAYED KEYS. При записи ключей с задержкой буферы ключей не очищаются
между записями для таблиц My ISAM. Значение OFF отключает запись ключей с за-
держкой. Значение ON активизирует запись ключей с задержкой для тех таблиц,
которые были созданы с использованием опции DELAYED KEYS. Значение ALL от-
4.2. Конфигурирование сервера MySQL 225
срочивает запись ключей для всех таблиц My ISAM. Опция доступна, начиная с
MySQL 4.0.3. См. раздел 6.5.2, а также раздел 8.1.1.
\у На заметку!
V"
%, Если установить для данной переменной значение ALL, использовать таблицы My ISAM из дру-
% гой программы (например, с другого сервера MySQL или через myisamchik), когда таблица на-
f ходится в работе, не удастся, поскольку это приведет к повреждению индекса.
• —delay-key-write-for-all-tables. Старая форма —delay-key-write=ALL, ис-
пользуемая в версиях, предшествующих MySQL 4.O.3. Начиная с версии MySQL
4.0.3, вместо нее следует применять —delay-key-write.
• --des-key-file=HM#_$awia. Считывать из данного файла ключи по умолчанию,
ИСПОЛЬЗуемые функциями DES_ENCRYPT () И DES_DESCRYPT ().
• —enable-named-pipe. Активизировать поддержку именованных каналов. Данная
опция доступна только в Windows NT/200/XP и может использоваться только с
серверами mysqld-nt и mysqld-max-nt, которые поддерживают соединения через
именованные каналы.
• —external-locking. Разрешить блокировку доступа к системе. Обратите внима-
ние, что использование данной опции в системах, где lockd не работает полно-
стью (например, в Linux), приводит к зависанию mysqld. Раньше эта опция назы-
валась —enable-locking.
|! На заметку!
\" Если данная опция используется для активизации обновления таблиц My ISAM из множественных
ft процессов MySQL, необходимо убедиться, что выполнены следующие условия:
\, Запросы, которые используют таблицы, обновляемые другим процессом, не кэшируются.
1 Для любых совместно используемых таблиц не применяются опции —delay-key-write=ALL
2 или DELAY_KEY_WRITE=1.
I' Самый простой способ достичь этого - всегда использовать — e x t e r n a l - l o c k i n g вместе с
£ —delay-key-write=OFF —query-cache-size=O.
f (По умолчанию это не выполняется, поскольку в большинстве установок полезно использовать
J;: различные комбинации указанных выше опций.)
back log 50 |
basedir /usr/local/mysql |
bdb cache size 8388572 |
bdb home /usr/local/mysql |
bdb_log_buffer_size 32768 |
bdb logdir
bdb max lock 10000 |
bdb shared data OFF |
bdb tmpdir /tmp/ |
bdb version Sleepycat Software: ... |
I binlog cache size 32768 |
I bulk insert buffer size 8388608 |
I character_set latinl |
I character sets latinl big5 czech euc kr
| concurrent insert ON ~ |
I connect timeout 5 1
I convert character_set
I datadir /usr/local/mysql/data/
I default week format 0
I delay key write ON
I delayed insert limit 100
I delayed insert timeout 300
I delayed queue size I 1000
I flush I OFF
| flush_time 1 0
I ft boolean syntax | + -><()~*:""&|
| ft max word len I 84
| ft min word len 14
| ft query expansion limit I20
I ft stopword file I (built-in)
I have bdb YES
1 have innodb I YES
236 Глава 4. Администрирование баз данных
have_isam I YES
have openssl YES
have query cache YES
have_raid NO
have symlink DISABLED
init file
innodb additional mem pool size 1048576
1 innodb_bufferj?ool_size 8388608
I innodb data file path ibdatal:10M:autoextend
I innodb data home_dir
I innodb fast shutdown ON
I innodb file io threads 4
I innodb flush log at trx commit 1
I innodb flush method
I innodb force recovery 0
I innodb lock wait timeout 50
I innodb_log_arch_dir
I innodb log archive OFF
I innodb log buffer size 1048576
I innodb log file size 5242880
I innodb log files in group 2
I innodb_log_group_home dir ./
I innodb mirrored log groups 1
I innodb thread concurrency 8
I interactive timeout 28800
1 join buffer size 131072
I key buffer size 16773120
I key cache age threshold I 300
I key_cache_block_size 1024
I key cache division limit I 100
I language /usr/local/mysql/share/
I large_files support ON
I local infile I ON
I locked in memory I OFF
1 log I OFF
I log bin | OFF
I log_slave updates I OFF
log_slow_queries I OFF
log_update | OFF
I log warnings I OFF
I long query time 1 io
I low_priority__updates I OFF
I lower case table names 1о
I max allowed packet I 1047552
I max binlog cache size I 4294967295
I max binlog size I 1073741824
I max connect errors 1 io
I max connections I 100
max delayed threads I 20
4.2. Конфигурирование сервера MySQL 237
ций или когда mysqld приходится проверять большое количество строк в таблице,
чтобы вычислить запрос:
bdb: Lock table is out of available locks
Got error 12 from . . .
bdb: Блокировка таблицы вышла за пределы доступных блокировок
Ошибка 12 из . . .
Переменная bdb_max_lock была добавлена в MySQL 3.23.29.
• bdb_shared_data. Имеет значение ON (включено), если используется —bdb-
shared-data. Эта переменная была добавлена в MySQL 3.23.29.
• bdbtmpdir. Значение опции --bdb-tmpdir. Эта переменная была добавлена в
MySQL 3.23.14.
• bdb_version. Версия BDB. Эта переменная была добавлена в MySQL 3.23.31.
• binlog_cache_size. Размер кэша, который будет хранить SQL-операторы для би-
нарного журнала регистрации во время транзакции. Кэш бинарного журнала вы-
деляется для каждого клиента, если сервер поддерживает любой из транзакцион-
ных механизмов хранения и, начиная с версии MySQL 4.1.2, если на сервере акти-
визирован бинарный журнал регистрации (опция —log-bin). Если большие
транзакции с множественными операторами используются часто, значение этой
переменной стоит увеличить, чтобы повысить производительность. Для настрой-
ки размера переменной b i n l o g c a c h e s i z e могут пригодиться переменные со-
стояния Binlog_cache_use и Binlog_cache_disk_use. Эта переменная появилась в
версии MySQL 3.23.29. См. раздел 4.8.4.
• bulk_insert_buffer_size. MylSAM использует специальный древовидный кэш для
ускорения групповых вставок данных для операторов INSERT.. .SELECT, INSERT...
VALUES ( . . . ) , ( . . . ) , . . . и LOAD DATA INFILE. Э т а п е р е м е н н а я о г р а н и ч и в а е т
размеры дерева кэша в байтах на поток. При установленном значении 0 такая оп-
тимизация будет отключена.
'/" Внимание!
Данный кэш используется только тогда, когда данные добавляются в непустую таблицу. Значе-
;
; ние по умолчанию составляет 8 Мбайт. Эта переменная была добавлена в MySQL 4.O.3. Раньше
'; она называлась m y i s a m _ b u l k _ i n s e r t _ t r e e _ s i z e .
Эта переменная также может быть установлена в командной строке или в файле
опций. Чтобы установить переменную, как было только что проиллюстрировано,
используя файл опций, добавляются такие строки:
[mysqld]
init_connect='SET AUTOCOMMIT=0'
Эта переменная была добавлена в MySQL 4.I.2.
• init_f ile. Имя файла, указанного с помощью опции —in i t - f i l e во время запус-
ка сервера. Это файл, содержащий SQL-операторы, которые сервер должен вы-
полнить при запуске. Каждый оператор должен занимать одну строку и не содер-
жать комментарии. Эта переменная была добавлена в MySQL 3.23.2.
• init_slave. Эта переменная подобна init_connect, но представляет собой стро-
ку, выполняемую подчиненным сервером каждый раз при запуске SQL-потока.
Формат строки такой же, как и у переменной init_connect. Эта переменная была
добавлена в MySQL 4.I.2.
• innodb_xxx. Системные переменные InnoDB рассматриваются в разделе 9.5.
• interactive_timeout. Количество секунд, в течение которых сервер ожидает ак-
тивности на интерактивном соединении, прежде чем закрыть его. Интерактивный
клиент определен как клиент, который использует опцию CLIENT_INTERACTIVE для
функции mysql_real_connect (). См. также описание wait_timeout.
• join_buffer_size. Размер буфера, используемого при операциях полного соеди-
нения таблиц (в которых не используются индексы). Буфер устанавливается один
раз во время каждой операции соединения двух таблиц. Увеличение этого пара-
метра с целью ускорить соединения, когда добавляются индексы, результатов не
приносит. (Как правило, лучшим способом ускорения соединения таблиц является
добавление индексов.)
• key__buffer_size. Индексные блоки для таблиц MylSAM и ISAM буферизованы и ис-
пользуются всеми потоками. key_buffer_size - это размер буфера, используемо-
го для индексных блоков. Буфер ключей еще также называют кэшем ключей.
Увеличивайте данное значение для повышения эффективности обработки индек-
сов (как для операций чтения, так и многочисленных операций записи) настолько,
насколько это можно позволить в конкретной ситуации. Использование значения
в 25% от общей памяти на машине, которая в основном работает с MySQL, встре-
чается достаточно часто. Однако если значение окажется слишком большим (на-
пример, больше 50% общей памяти), система может активизировать страничный
обмен и существенно замедлить работу. Что касается кэширования файловой сис-
темы при считывании данных, MySQL полагается на операционную систему, по-
этому необходимо оставлять место и для кэша файловой системы.
Чтобы еще больше повысить скорость во время одновременной записи большого
количества строк, используйте LOCK TABLES.
Проверить эффективность буфера ключей можно с помощью команды SHOW STATUS;
необходимо проанализировать значения переменных состояния Keyj:ead_requests,
Key_reads, Key_write_requests и Key_writes.
Соотношение Keyreads и Key_read__requests обычно должно быть меньше, чем
0.01. Соотношение Key_writes и Key__write_requests близко к 1, если в основном
244 Глава 4. Администрирование баз данных
валось больше, чем указано в ' m a x b i n l o g c a c h e s i z e ' байт для сохранения). Эта
переменная была добавлена в MySQL 3.23.29.
• maxbinlogsize. Если запись в бинарном журнале превышает данное значение,
чередовать бинарные журналы. Для данной переменной нельзя установить значе-
ние больше, чем 1 Гбайт, и меньше, чем 4096 байт. (Минимальное значение до
MySQL 4.0.14 составляет 1024 байт.) Значение по умолчанию - 1 Гбайт. Эта пе-
ременная была добавлена в MySQL 3.23.33.
Обратите внимание, если используются транзакции: транзакция записывается в
бинарный журнал регистрации как одно целое и, следовательно, никогда не рас-
пределяется по нескольким бинарным журналам. Таким образом, если выполня-
ются большие транзакции, не исключено появление бинарных журналов разме-
ром, превышающим значение max_binlog_size.
Если max_relay_log_size имеет значение 0, значение max_binlog_size будет так-
же применяться и для журналов ретрансляции. Опция max_relay_log_size была
добавлена в MySQL 4.0.14.
• max_connect_errors. Если количество прерванных соединений с хоста превышает
указанное в этой переменной число, этот компьютер будет заблокирован от даль-
нейших соединений. Его можно разблокировать с помощью оператора FLUSH
HOSTS.
рых, скорее всего, придется провести большее, чем задано в max_join_size, ко-
личество поисков на диске. Установив данное значение, вы получаете возмож-
ность фиксировать операторы SELECT, в которых ключи используются некоррект-
но, и выполнение которых может занять много времени. Применяйте его, если
пользователи склонны выполнять длительные по времени операции соединения
таблиц с пропущенными операторами WHERE или возвращающие буквально мил-
лионы строк.
Если этой переменной присвоить значение, отличное от DEFAULT, это приведет к
сбросу значения SQL_BIG__SELECTS (то есть установит его в 0). При повторной ус-
тановке SQL_BIG_SELECTS переменная max_join_size игнорируется.
Если результат запроса уже находится в кэше запросов, никакая проверка разме-
ров результата выполняться не будет, поскольку результат уже вычислен и серве-
ру ничего не стоит отправить его клиенту.
Эта переменная раньше называлась sql_max_join_size.
• max_relay_log_size. Если запись, вносимая подчиненным сервером репликации в
свой собственный журнал ретрансляции, превышает заданное здесь значение, жур-
налы ретрансляции будут чередоваться. Эта переменная позволяет ставить различ-
ные ограничения по размерам для бинарных журналов и журналов ретрансляции.
Однако, при значении 0 MySQL будет использовать max_relay_log_size как для
бинарных журналов, так и для журналов ретрансляции. Допустимые значения для
max_relay_log_size лежат в диапазоне от 4096 байт до 1 Гбайт (включительно),
или значение 0. Значением по умолчанию является 0. Эта переменная была добав-
лена в MySQL 4.0.14. См. раздел 5.3.
• max_seeks_f or_key. Ограничивает допустимое максимальное число операций по-
иска, при поиске строк по ключам. Оптимизатор MySQL предполагает, что боль-
шее, нежели указанное число операций поиска подходящих строк в таблице путем
сканирования ключей, независимо от фактического их количества, не понадобит-
ся. Если установить нижнее значение (возможно, 100), это может привести к тому,
что MySQL предпочтет сканирование ключей, а не таблиц. Эта переменная была
добавлена в MySQL 4.0.14.
• max_sort_length. Количество байт, используемых при сортировке значений BLOB
или TEXT. Используются только первые байты max_sort_length, остальные игно-
рируются.
• max_tmp_tables. Максимальное число временных таблиц, которые клиент может
оставлять открытыми одновременно. (Пока эта опция ничего не делает.)
• raax_user_connections. Максимальное число одновременных соединений, разре-
шаемых любой указанной учетной записи MySQL. Значение 0 означает отсутст-
вие ограничений. Эта переменная была добавлена в MySQL 3.23.34.
• max_write_lock_count. Размер (в байтах) указателя по умолчанию, который будет
использоваться CREATE TABLE для таблиц My ISAM, когда ни одна опция MAX_ROWS не
задана. Эта переменная не может иметь значение меньше 2 и больше 8. Значение
по умолчанию - 4. Эта переменная была добавлена в MySQL 4.I.2. См. раздел
А.2.11.
248 Глава 4. Администрирование баз данных
I Aborted clients 0
I Aborted connects 0 1
I Bytes_received 155372598 |
I Bytes_sent 1176560426 |
I Connections 30023 |
I Created tmp disk tables 0 1
I Created tmp files 60 |
I Created tmp tables 8340 |
I Delayed errors 0 1
I Delayed insert threads 0 1
I Delayed writes 0 1
I Flush commands 1 |
I Handler__delete 462604 |
I Handler read first 105881 |
I Handler_read key 27820558
I Handler read next 390681754
I Handler read prev I 6022500
Handler_read rnd- 30546748
Handler read rnd next I 246216530
Handler update I 16945404
Handler write I 60356676
Key blocks used | 14955
I Key_read__requests I 96854827
4.2. Конфигурирование сервера MySQL 261
Key_reads 162040
Key_write_requests 7589728
Key_writes 3813196
Max_used_connections 0
Not_flushed_delayed_rows 0
Not_flushed_key_blocks 0
Open_files 2
Open_streams 0
Open_tables 1
Opened_tables 44600
Qcache_free_blocks 36
Qcache_free_memory 138488
Qcache_hits 79570
Qcache_inserts 27087
Qcache_lowmem_prunes 3114
Qcache_not_cached 22989
Qcache_queries_in_cache 415
Qcache_total_blocks 912
Questions 2026873
Select_full_join 0
Select_full_range_j oin 0
Select_range 99646
Select_range_check 0
Select_scan 30802
Slave_open_temp_tables 0
Slave_running OFF
Slow_launch_threads 0
Slow_queries 0
Sort_merge_passes 30
Sort_range 500
Sort_rows 30296250
Sort_scan 4650
Table_locks_immediate 1920382
Table_locks_waited 0
Threads_cached 0
Threads_connected 1
Threads_created 30022
Threads_running 1
Uptime 80380
Вся остальная информация передается в виде текста, который может прочитать лю-
бой, имеющий возможность наблюдать за соединением. Если это вызывает беспокойст-
во, попробуйте воспользоваться протоколом со сжатием данных (доступным в версиях
MySQL 3.22 и выше), который значительно затрудняет дешифровку. Чтобы еще больше
повысить степень безопасности соединения, следует использовать протокол SSH, кото-
рый обеспечивает шифрованное TCP/IP-соединение между сервером и клиентом
MySQL. Клиент Open Source SSH доступен на сайте http://www.openssh.org/, а ком-
мерческий SSH-клиент - на сайте h t t p : //www. ssh. com/.
В версии MySQL 4.0 и выше также доступна внутренняя OpenSSL-поддержка. См.
раздел 4.5.7.
Чтобы защитить систему MySQL, необходимо самым серьезным образом отнестись к
перечисленным ниже рекомендациям.
• Применяйте пароли для всех пользователей MySQL. Клиентскому приложению
не обязательно известно, кто именно работает с ним. Для клиент-серверных при-
ложений общепринято, что пользователь может указывать для клиентской про-
граммы любое имя пользователя. Например, каждый может воспользоваться про-
граммой mysql и подключиться под именем другого человека, просто вызвав ее
через mysql -u другой^пользователь имя_базы__данных, если для пользователя
другой_пользователь не установлен пароль. Если пароли есть у всех пользовате-
лей, подключиться при помощи учетной записи другого пользователя будет на-
много сложнее.
Чтобы изменить для пользователя пароль, используйте оператор SET PASSWORD.
Также можно обновить таблицу user прямо в базе данных mysql. Например, что-
бы изменить пароль для всех учетных записей MySQL с именем пользователя
root, потребуется предпринять следующие действия:
shell> mysql -u root
mysql> UPDATE mysql.user SET Password=PASSWORD('новый_пароль')
-> WHERE User='root 1 ;
mysql> FLUSH PRIVILEGES;
• He запускайте сервер MySQL от имени привилегированного (root) пользовате-
ля Unix. Это очень опасно, поскольку любой, имеющий привилегию FILE, смо-
жет создавать файлы как привилегированный (root) пользователь (например,
-root/.bashrc). Чтобы предотвратить подобные действия, mysql отказывается за-
пускаться от имени root до тех пор, пока это не будет указано явно, с помощью
опции —user=root.
Вместо этого mysqld можно запускать от имени простого непривилегированного
пользователя. Также есть возможность создать отдельную запись Unix с именем
mysql, чтобы обеспечить дополнительную степень защиты. Используйте эту учет-
ную запись только для администрирования MySQL. Чтобы запустить mysqld от
имени другого пользователя Unix, добавьте опцию user, определяющую имя
пользователя, в группу [mysqld] файла опций /etc/my.cnf или файла опций
my. cnf, который находится в каталоге данных сервера. Например:
[mysqld]
user=mysql
270 Глава 4. Администрирование баз данных
Столбцы привилегий
Table priv Column priv
Column_priv
Другие столбцы
Timestamp Timestamp
Grantor
| На заметку!
Щ Применение операторов GRANT и REVOKE никак не отражается на таблице host. Большинство
%, установок MySQL вообще не нуждается в этой таблице.
Значение в
Значение в столбце Host столбце User Совпавшие с записью подключения
'thomas.loc.gov' 'fred' fred, подключающийся из
thomas.loc.gov.
!
' thomas. loc. gov' ' Любой пользователь, подключающийся
из thomas.loc.gov.
' %' ' fred' fred, подключающийся с любого хоста.
' %' '' Любой пользователь, подключающийся
с любого хоста.
1
%. loc. gov' ' fred' fred, подключающийся с любого хоста
в домене loc.gov.
'х.у.%' 'fred' fred, подключающийся из х.у.net,
х. у. com, х. у. edu и так далее (это, ско-
рее всего, бесполезная комбинация).
'144.155.166.177' 'fred' fred, подключающийся с хоста,
IP-адрес которого выглядит как
144.155.166.177.
'144.155.166.%' 'fred' fred, подключающийся с любого хоста
в подсети 144.155.166 класса С.
'144.155.166.0/255.255.255.0' ' fred' To же, что и в предыдущем примере.
Вполне возможно, чтобы имя хоста клиента и имя пользователя входящего соедине-
ния соответствовали более чем одной записи в таблице user. Вышеуказанный набор
примеров демонстрирует следующее: сразу несколько из представленных записей соот-
ветствуют соединению, устанавливаемому пользователем fred с thomas. loc. gov.
Если соответствующих (совпадающих) записей несколько, сервер должен опреде-
лять, какую из них использовать. Он разрешает эту проблему следующим образом:
• Каждый раз, когда сервер считывает таблицу user, он выполняет сортировку за-
писей.
• Когда клиент пытается подключиться, сервер просматривает записи в отсортиро-
ванном порядке.
• Сервер использует первую запись, которая совпадает с именем хоста клиента и
именем пользователя.
Чтобы посмотреть, как это работает, предположим, что таблица user выглядит сле-
дующим образом:
I Host ! User |
+ + +
I % | root I
I % I Jeffrey I
I localhost | root |
I localhost | I
4.4. Система привилегий доступа MySQL 285
• Значение '%' в столбце Host таблицы db означает "любой хост". Пустое значение в
столбце Host таблицы db означает "для дополнительной информации просматри-
вать таблицу host" (этот процесс описывается чуть ниже в данном разделе).
• Пустое значение или значение '%' в столбце Host таблицы host означает "любой
хост".
• Пустое значение или значение '%' в столбце Db любой из таблиц означает "любая
база данных".
• Пустое значение в столбце User любой из таблиц соответствует анонимному
пользователю.
Сервер считывает и сортирует таблицы host и db, одновременно считывая таблицу
user. Сервер выполняет сортировку таблицы db по столбцам контекста Host, Db и User и
сортировку таблицы host по столбцам Host и Db. Как и в случае с таблицей user, во
время сортировки первыми размещаются наиболее точные значения, а последними -
наименее точные, и при поиске подходящих записей сервер использует первую совпав-
шую из числа найденных.
Таблицы tables_priv и columns_priv предоставляют привилегии на уровне таблиц и
столбцов. Значения в столбцах контекста этих таблиц могут принимать следующие
формы:
• Групповые символы '%' и '_' могут использоваться в столбце Host любой из этих
таблиц. Они имеют то же значение, что и для операций сравнения с образцом, вы-
полняемых оператором LIKE.
• Пустое значение или значение ' %' в любой из таблиц означает "любой хост".
• Столбцы Db, Table_name и Column_name не могут содержать групповых символов
или пустых значений в любой из таблиц.
Сервер выполняет сортировку таблиц tables_priv и columns_priv по столбцам Host,
Db и User. Она подобна сортировке в таблице db, но намного проще, поскольку только в
столбце Host могут содержаться групповые символы.
Далее описывается процесс верификации запросов. (Если вы знакомы с исходным
кодом проверки доступа, заметить, что предлагаемое здесь описание несколько отлича-
ется от используемого в коде алгоритма, будет нетрудно. Описание соответствует тому,
что на самом деле делает код и дается по-другому только с целью упростить объяснение
происходящего процесса.)
Для запросов, требующих наличия административных привилегий, таких как
SHUTDOWN или RELOAD, сервер проверяет только запись в таблице user, поскольку только в
этой таблице задаются привилегии для администрирования. Доступ предоставляется,
если данная запись разрешает запрашиваемую операцию, в противном случае в доступе
будет отказано. Например, если вы хотите выполнить mysqladmin shutdown, но ваша
запись в таблице user не предоставляет привилегии SHUTDOWN, сервер откажет в доступе
даже без проверки таблиц db или host. (Они не содержат столбца Shutdown_priv, поэто-
му проверять их нет необходимости.)
Что касается связанных с базами данных запросов (INSERT, UPDATE и так далее), сер-
вер, прежде всего, проверит глобальные привилегии (то есть привилегии суперпользова-
теля) путем просмотра записей в таблице user. Если соответствующая запись разрешает
запрашиваемую операцию, доступ будет предоставлен. Если же глобальных привилегий
288 Глава 4. Администрирование баз данных
но, ее можно будет использовать и для специальных целей, как, например, для поддерж-
ки списка защищенных серверов. Так, в ТсХ таблица host содержит список всех машин
локальной сети. Им предоставлены все привилегии.
Также таблицу host можно использовать для указания небезопасных хостов. Предпо-
ложим, машина public.your.domain находится в общедоступной области, которую вы
не считаете безопасной. С помощью записей в таблице host, подобным тем, которые
представлены ниже, появляется возможность разрешить доступ абсолютно всем хостам,
кроме именно этой небезопасной машины:
I Host | Db | . . .
+ + +-
I public.your.domain | % I . . . (все привилегии установлены в ' N')
I %. your, domain | % I . . . (все привилегии установлены в ' Y')
1
mysql> SET PASSWORD FOR ' a b e ' @ ' и м я _ х о с т а ' = ' e a g l e ;
Вместо этого пароль нужно устанавливать так:
mysql> SET PASSWORD FOR 'abe'@'имя_хоста' = PASSWORD('eagle');
При задании пароля с помощью оператора GRANT или команды mysqladmin
password указывать функцию PASSWORD не обязательно, поскольку в таком случае
она используется для шифрования пароля автоматически. См. раздел 4.5.5.
• localhost является синонимом имени вашего локального хоста, а также исполь-
зуемым по умолчанию именем хоста, к которому будут пытаться подключиться
клиенты, если хост явно задан не был. Однако соединения с localhost в системах
Unix работать не будут, если используется версия MySQL, предшествующая
3.23.27, и потоки MIT-pthreads: соединения с localhost устанавливаются с помо-
щью файлов сокетов Unix, которые в то время потоки MIT-pthreads не поддержи-
вали.
Во избежание этой проблемы на таких системах с помощью опции --host=
127.0.0.1 явно задавайте имя хоста. В результате будет установлено TCP/IP-
соединение с локальным сервером mysqld. Установить TCP/IP-соединение можно
и с помощью опции —host, в которой необходимо указать реальное имя локаль-
ного хоста. В этом случае имя хоста должно быть задано в записи таблицы user
на хосте сервера, даже если клиентская программа и сервер запускаются на одном
и том же хосте.
• Если ошибка Access denied возникает, когда вы подключаетесь к базе данных с
помощью mysql -u имя_пользователя, скорее всего, проблема заключается в таб-
лице user. Проверить это можно с помощью команды mysql -u root mysql ИЛИ
следующего SQL-оператора:
mysql> SELECT * FROM user;
Результат должен включать запись, значения в столбцах Host и User которой со-
ответствуют имени хоста вашего компьютера и вашему имени пользователя
MySQL.
• Сообщение об ошибке Access denied будет содержать следующую информацию:
под каким именем вы пытаетесь войти в систему, имя хоста клиента, с которого
вы пытаетесь подсоединиться, и вводился ли вами пароль. Обычно в таблице user
должна присутствовать только одна запись, в точности соответствующая имени
хоста и имени пользователя, которые указаны в сообщении об ошибке. Например,
"Using password: NO" в сообщении об ошибке будет означать, что вы пытались
войти в систему без указания пароля.
• Если при попытке подключиться с другого, не того, на котором работает сервер
MySQL, хоста возникает приведенная ниже ошибка, это значит, что в таблице
user отсутствует строка со значением в столбце Host, которое соответствует име-
ни хоста клиента.
Host . . . is not allowed to connect to this MySQL server
Хосту . . . не разрешено подключаться к этому серверу MySQL
Устранить эту проблему можно путем установки для учетной записи комбинации
из числа используемых для подключения имени клиентского хоста и имени поль-
зователя.
4.4. Система привилегий доступа MySQL 293
ненное имя домена (или наоборот). Например, если в таблице user имеется запись
со значением ' tcx 1 в качестве имени хоста, но система DNS передает MySQL имя
хоста ' tcx. subnet. se', эта запись работать не будет. Попробуйте добавить в таб-
лицу user запись, в которой для имени хоста в столбце Host указан IP-адрес. (Или
же в таблицу user можно добавить запись, значение в столбце Host которой будет
содержать групповой символ, например, 'tcx.% 1 . Однако, использовать имена
хостов, заканчивающиеся на '%', небезопасно, и поэтому не рекомендуется.)
• Если команда mysql -u имя_пользователя t e s t работает, а команда mysql -и
имя_пользователя имя_другой_базы_данных - нет, значит, данному пользователю
не был предоставлен доступ к базе данных имя_другой_базы_данных.
• Если команда mysql -u имя_пользователя на хосте сервера работает, а на удален-
ном хосте клиента нет, значит, для данного имени пользователя не был разрешен
доступ к серверу с удаленного хоста.
• Если причину появления ошибки Access denied выяснить никак не получается,
удалите из таблицы user все записи со значениями в столбце Host, содержащими
групповые символы (т.е. '%' или '_'). Наиболее распространенная ошибка состоит
в том, что после вставки новой записи со значением '%' в столбце Host и 'пользо-
ватель' в столбце User пользователь считает, что это позволит ему задавать
localhost для подключения с той же машины. Это не так, потому что привиле-
гии по умолчанию включают запись со значением 'localhost' в столбце Host и
значением ' ' в столбце User. Поскольку значение localhost является более точ-
ным, чем '%', то именно запись с таким значением, а не добавленная новая запись
будет использоваться при подключении к localhost! Правильным будет добавить
еще одну запись со значениями 'localhost' в столбце Host и 'пользователь' в
столбце User, или же вообще удалить запись со значением 'localhost' в столбце
Host и значением ' ' в столбце User. После удаления не забудьте выполнить опе-
ратор FLUSH PRIVILEGES, чтобы перезагрузить таблицы привилегий.
• Если возникает следующая ошибка, возможно имеют место проблемы с таблицей
db или таблицей host:
Access to database denied
В доступе к базе данных отказано
Если выбранная из таблицы db запись содержит пустое значение в столбце Host,
убедитесь, что в таблице host имеется, по крайней мере, одна или несколько со-
ответствующих записей, указывающих, к каким хостам относится запись из таб-
лицы db.
• Если вы подключаетесь к серверу MySQL без проблем, но сообщение Access
denied появляется каждый раз, когда используются операторы SELECT.. .INTO
OUTFILE и LOAD DATA INFILE, значит, ваша запись в таблице user не имеет приви-
легии FILE.
• Если изменения вносятся в таблицы привилегий непосредственно (с помощью
операторов INSERT, UPDATE и DELETE) и при этом вроде как игнорируются, не за-
будьте о том, что необходимо выполнить оператор FLUSH PRIVILEGES или же ко-
манду flush-privileges, чтобы сервер осуществил повторное считывание таблиц
привилегий. В противном случае изменения вступят в силу только после переза-
4.4. Система привилегий доступа MySQL 295
пуска сервера. Также помните, что после изменения пароля для root с помощью
команды UPDATE задавать новый пароль до тех пор, пока не будет очищен список
привилегий, не нужно, поскольку до этого времени сервер не будет знать о том,
что пароль был изменен.
• Если вам кажется, что ваши привилегии изменились непосредственно во время
сеанса, скорее всего, их изменил администратор MySQL. Перезагрузка таблиц
привилегий отразится не только на соединениях клиентов, но и на существующих
соединениях, как описано в разделе 4.4.7.
• Если возникают проблемы с доступом при использовании программ Perl, PHP,
Python или ODBC, попробуйте подсоединиться к серверу через mysql -u
имя_пользователя имя_базы_данных ИЛИ mysql -и имя_пользователя -рпароль
имя_базы_данных. Если установить соединение с помощью клиента mysql удается,
значит, проблема связана с вашей программой, а не с привилегиями доступа.
(Пробел между -р и паролем не ставится; для задания пароля можно также ис-
пользовать синтаксис —passworс1=пароль. Если применяется только опция -р,
MySQL запросит ввод пароля.)
• Для целей тестирования запустите сервер mysqld с опцией --skip-grant-tables.
В этом случае можно будет внести изменения в таблицы привилегий MySQL и
воспользоваться сценарием mysqlaccess, чтобы проверить, приводят ли они к
ожидаемым результатам. Если результаты изменений удовлетворительные, вы-
полните команду mysqladmin flush-privileges, чтобы сервер начал использо-
вать новые таблицы привилегий. (Перезагрузка таблиц привилегий перекрывает
опцию —skip-grant-tables, что позволяет заставить сервер начать снова исполь-
зовать таблицы привилегий без остановки его работы и перезапуска.)
• Если ничего не получается, запустите сервер mysqld с опцией отладки (например,
—debug=d,general,query). Будут выведены данные хоста и пользователя о не-
удачных попытках соединения с сервером, а также информация о каждой коман-
де, которая была использована.
• При наличии любых других проблем с таблицами привилегий MySQL, которые,
по вашему мнению, необходимо передать в список рассылки, всегда предостав-
ляйте дамп таблиц привилегий MySQL. Получить такие данные можно с помо-
щью команды mysqldump mysql, а отправить отчет о проблеме - с помощью сце-
нария mysqlbug. См. раздел 1.7.1.3. В некоторых случаях для выполнения
mysqldump может понадобиться перезапустить сервер.
PASSWORD('mypass') |
+
6f8cll4b58f2ce9e |
I PASSWORD!'mypass1) |
I *43c8aa34cdc98eddd3delfe9a9c2c2a9f92bb2098d75 |
+ +
учетные записи станут недоступными для клиентов старых версий. (Такие клиенты не
смогут случайно сами себя заблокировать, изменив пароль и, тем самым, получив длин-
ные хеш-значения.)
Недостатком применения опции —old-passwords является то, что любые создавае-
мые или изменяемые вами пароли будут использовать только короткие хеш-значения
(это касается даже клиентов версии 4.1). Таким образом, дополнительная степень безо-
пасности, предоставляемая длинными хеш-значениями паролей, теряется. Если требует-
ся создать учетную запись с длинным хеш-значением, (например, для использования
клиентами версии 4.1), это следует делать тогда, когда сервер запускается без опции
—old-passwords.
При работе с сервером версии 4.1 возможны следующие сценарии:
Сценарий 1. Размер столбца Password в таблице user маленький.
• В столбце Password могут храниться только короткие хеш-значения.
• Во время аутентификации клиента сервер использует только короткие хеш-
значения.
• Уже подключившиеся клиенты в операциях по генерированию хеш-значений па-
ролей с применением PASSWORD(), GRANT или SET PASSWORD смогут использовать
исключительно короткие хеш-значения. При любом изменении в пароле учетной
записи ее хеш-значение пароля все равно будет коротким.
• Использовать опцию —old-password можно, но не нужно, поскольку если размер
столбца Password маленький, сервер в любом случае будет автоматически генери-
ровать только короткие хеш-значения паролей.
Сценарий 2. Размер столбца Password большой; сервер запускался без опции
—old-password.
• В столбце Password могут храниться как короткие, так и длинные хеш-значения.
• Клиенты версии 4.1 могут проводить аутентификацию для учетных записей как с
короткими, так и с длинными хеш-значениями.
• Клиенты старых (до 4.1) версий могут проводить аутентификацию только для
учетных записей с короткими хеш-значениями.
• Уже подключившиеся клиенты в операциях по генерированию хеш-значений па-
ролей с применением PASSWORD!), GRANT или SET PASSWORD смогут использовать
исключительно длинные хеш-значения. При любом изменении в пароле учетной
записи ее хеш-значение пароля будет длинным.
Как упоминалось ранее, опасность при таком сценарии состоит в том, что учетные
записи с коротким хеш-значением паролей могут стать недоступными для клиентов вер-
сий, предшествующих 4.1. Изменения, вносимые в пароли таких учетных записей с по-
мощью функции PASSWORD () или операторов GRANT и SET PASSWORD, приводят к тому, что
учетная запись получает длинное хеш-значение пароля. И с этого момента ни один кли-
ент старой (до 4.1) версии не сможет получить к ней доступ до тех пор, пока он не будет
модернизирован до версии 4.1.
Чтобы решить эту проблему, можно изменять пароль особым способом. Например,
обычно для изменения пароля учетной записи оператор SET PASSWORD используется сле-
дующим образом:
1
mysql> SET PASSWORD FOR 'пользователь'@'хост = PASSWORD('mypass');
300 Глава 4. Администрирование баз данных
Чтобы изменить пароль и при этом создать короткое хеш-значение, вместо оператора
SET PASSWORD используйте функцию OLD_PASSWORD ():
mysql> SET PASSWORD FOR 'пользователь1@!хост' = OLD_PASSWORD('mypass');
Функция OLD_PASSWORD() полезна в ситуациях, когда вы явно хотите генерировать
короткое хеш-значение.
Сценарий 3. Размер столбца Password большой; сервер запускался с опцией
—old-passwords.
• В столбце Password могут храниться как короткие, так и длинные хеш-значения.
• Клиенты версии 4.1 могут проводить аутентификацию для учетных записей как с
короткими, так и с длинными хеш-значениями (однако обратите внимание на то,
что создавать длинные хеш-значения можно только тогда, когда сервер запускал-
ся без опции —old-passwords).
• Клиенты старых (до 4.1) версий могут проводить аутентификацию только для
учетных записей с короткими хеш-значениями.
• Уже подключившиеся клиенты в операциях по генерированию хеш-значений па-
ролей с применением PASSWORD(), GRANT или SET PASSWORD смогут использовать
исключительно короткие хеш-значения. При любом изменении в пароле учетной
записи ее хеш-значение пароля все равно будет коротким.
При таком сценарии нельзя создать учетные записи с длинными хеш-значениями па-
ролей, потому что опция —old-passwords запрещает генерирование длинных хеш-
значений. Кроме того, даже если создать учетную запись с длинным хеш-значением до
применения опции —old-passwords, изменения ее пароля во время действия этой опции
приведет к тому, что она получит короткий пароль, потеряв тем самым все преимущест-
ва по безопасности, предоставляемые более длинными хеш-значениями.
Негативные аспекты предложенных сценариев могут быть резюмированы следую-
щим образом:
При сценарии 1 нельзя воспользоваться преимуществами длинных хеш-значений, ко-
торые обеспечивают более безопасную аутентификацию.
При сценарии 2 учетные записи с короткими хеш-значениями становятся недоступ-
ными для клиентов старых (до 4.1) версий, если во время изменения их паролей не была
явно использована функция OLD_PASSWORD ().
При сценарии 3 опция —old-passwords не допускает того, чтобы учетные записи с
короткими хеш-значениями становились недоступными, но операции по изменению па-
ролей приводят к тому, что учетные записи с длинными хеш-значениями снова получа-
ют короткие хеш-значения, и сделать их опять длинными нельзя до тех пор, пока дейст-
вует опция --old-passwords.
именами) Windows или Unix. В Unix большая часть клиентов по умолчанию пы-
таются войти в систему, используя в качестве имени пользователя MySQL теку-
щее имя пользователя Unix, но делают они это только для удобства. Имена по
умолчанию можно легко изменить, потому что клиентские программы позволяют
задавать любое имя пользователя с помощью опции -и ИЛИ —user. Поскольку это
означает, что любой может попытаться подключиться к серверу, используя любое
имя пользователя, обеспечить безопасность для базы данных никак нельзя до тех
пор, пока все учетные записи не будут иметь пароли. Каждый, кто укажет имя
пользователя для учетной записи, не имеющей пароля, сможет успешно подсое-
диниться к серверу.
• В MySQL для имен пользователей разрешается использовать до 16 символов, а
вот в ОС максимальное количество допустимых символов может быть другим.
Например, имена пользователей Unix обычно ограничены 8 символами.
• Пароли MySQL не имеют ничего общего с паролями, используемыми для входа в
ОС. Не обязательно существует связь между паролем, который вводится для вхо-
да в Windows или Unix, и паролем, который необходим, чтобы получить доступ к
серверу MySQL в данной ОС.
• MySQL шифрует пароли с помощью своего собственного алгоритма. Такой тип
шифрования отличается от шифрования, используемого Unix во время входа в
систему. Шифрование паролей в MySQL эквивалентно шифрованию, осуществ-
ляемому с помощью SQL-функции PASSWORD (), а шифрование в Unix равнозначно
шифрованию с помощью SQL-функции ENCRYPT (). Начиная с версии 4.1, MySQL
использует более сложный метод аутентификации, который обеспечивает луч-
шую, чем в более ранних версиях, защиту паролей во время процесса подключе-
ния. Система остается безопасной, даже если перехвачены пакеты TCP/IP или са-
ма база данных mysql. (В более ранних версиях, хотя пароли и хранятся в таблице
user в зашифрованном виде, любой, кому удается узнать зашифрованный пароль,
может использовать его, чтобы подключиться к серверу MySQL.)
Во время установки MySQL в таблицы привилегий заносятся исходные учетные за-
писи. Эти записи получают имена и привилегии доступа, описанные в разделе 2.4.5, где
также обсуждается вопрос о назначении для них паролей. После этого, обычно, для ус-
тановки, изменения или удаления учетной записи MySQL используются операторы
GRANT И REVOKE.
При подключении к серверу через клиент MySQL необходимо указать имя пользова-
теля и пароль для учетной записи, которая будет использоваться:
shell> mysql —user=monty —password=guess имя_базы_данных
Если вы предпочитаете короткие варианты опций, команда будет выглядеть следую-
щим образом:
shell> mysql -u monty -pguess имя_базы_данных
Пробел между опцией -р и следующим за ней значением пароля не ставится. См.
раздел 4.4.4.
Предыдущие команды включают значение пароля в командной строке, что может
представлять определенный риск для безопасности системы (см. раздел 4.5.6). Чтобы
избежать этого, задавайте опцию —password или -р, не указывая после нее само значе-
ние пароля:
4.5. Управление учетными записями пользователей MySQL 303
4.5.7.2. Требования
Для использования соединений между сервером MySQL и программами клиентов,
необходимо, чтобы система поддерживала OpenSSL, а версия MySQL была не ниже.
4.0.0.
Чтобы безопасные соединения начали работать с MySQL, понадобится выполнить
следующие действия:
1. Установите библиотеку OpenSSL. MySQL была протестирована с OpenSSL O.9.6.
Найти OpenSSL можно по адресу http: //www.openessl .org.
2. Во время конфигурирования MySQL запустите сценарий configure с опциями
—with-vio и —with-openessl.
3. Убедитесь, что таблицы привилегий обновлялись и теперь содержат столбцы для
SSL в таблице mysql.user. Это необходимо, если используется версия MySQL,
предшествующая 4.0.0. Процедура обновления описана в разделе 2.5.8.
4. Узнать, поддерживает ли сервер mysqld протокол OpenSSL, можно, проверив зна-
чение системной переменной have_openessl:
4.5. Управление учетными записями пользователей M y S Q L 313
| have_openssl | YES |
# Отдел [ ]:
# Имя (например, ВАШЕ имя) []:администратор MySQL
# Адрес электронной почты []:
#
# Создание запроса к серверу и ключа
#
openssl req -new -keyout $DIR/server-key.pem -out \
$DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf
# Образец выходных данных:
# Используется конфигурация из /home/monty/openssl/openssl.cnf
# Генерация секретного ключа размером 1024 бит с помощью
# шифрования RSA
# ++++++
# ++++++
# Запись нового секретного ключа в
# '/home/monty/openssl/private/cakey.pem'
# Ввод парольной фразы в формате РЕМ:
# Верификация пароля - Введите парольную фразу в формате РЕМ:
#
# После этого последует запрос на ввод информации, которая будет
# включена в сертификат.
# Такая информация называется "отличительным именем", или DN
# (Distinguished Name).
# Строк для ввода всего несколько и некоторые из них
# можно оставить пустыми.
# Некоторым из них будет присвоено значение по умолчанию.
# При вводе '.' строка будет оставлена незаполненной.
#
# Страна (код из двух букв) [AU]:FI
# Штат или область (полностью) [какой-нибудь штат]:.
# Местонахождение (например, город) []:
# Название организации (например, компания) [Internet Widgits Pty Ltd]:MySQL AB
# Отдел []:
# Имя (например, ВАШЕ имя) []:администратор MySQL
# Адрес электронной почты []:
#
# Пожалуйста, введите следующие 'дополнительные' атрибуты,
# отсылаемые вместе с сертификатом
# Пароль вызова[]:
# Название компании (необязательно)[]:
#
# Удаление парольной фразы из ключа (необязательно)
#
openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem
#
# Подписание сертификата сервера
#
openssl ca -policy policy_anything -out $DIR/server-cert.pem \
-config $DIR/openssl.cnf -infiles $DIR/server-req.pem
4.5. Управление учетными записями пользователей MySQL 315
# •
каталога базы данных. Оператор FLUSH TABLES нужен, чтобы гарантировать, что все ак-
тивные страницы индексов будут записаны на диск до начала резервного копирования.
Если требуется выполнить резервное копирование таблицы на уровне SQL, сущест-
вует возможность воспользоваться операторами SELECT INTO.. .OUTFILE или BACKUP
TABLE. Для SELECT INTO.. .OUTFILE выходной файл существовать не может; то же самое
касается и BACKUP TABLE в версиях MySQL 3.23.56 и MySQL 4.0.12, поскольку это бы
представляло угрозу для безопасности системы.
Еще один способ провести резервное копирование базы данных - это использовать
программу mysqldump или сценарий mysqlhotcopy. См. разделы 7.8 и 7.9.
1. Выполните полное резервное копирование базы данных:
shell> mysqldump —tab=/путь/к/'определенному/каталогу
—opt имя_базы_данных
или
shell> mysqlhotcopy имя_базы_данных /путь/к/определенному/каталогу
Можно также просто скопировать все файлы таблиц (*.frm, *.MYD и *.MYI), пока
сервер не осуществляет никаких обновлений. Сценарий mysqlhotcopy использует
именно такой метод. Однако обратите внимание, что если база данных содержит
таблицы innoDB, этот метод работать не будет. InnoDB не хранит файлы таблиц в
каталогах баз данных, и поэтому mysqlhotcopy подходит только для таблиц
My IS AM и ISAM.
2. Остановите mysqld, если он работает, и перезапустите его с опцией - - l o g - b i n [ =
имя_файла]. См. раздел 4.8.4. В файлах бинарного журнала данные, необходимые
для репликации, содержатся в такой же последовательности, в которой вносились
изменения в базу данных, начиная с момента, когда была запущена программа
mysqldump.
Если сервер MySQL является подчиненным сервером репликации, тогда, независимо
от выбранного метода резервного копирования, во время его проведения на таком серве-
ре обязательно следует создавать также резервную копию файлов m a s t e r . i n f o и r e l a y -
log, info. Эти файлы всегда нужны для возобновления репликации после восстановле-
ния данных подчиненного сервера. Если во время репликации на подчиненном сервере
используются команды LOAD DATA INFILE, потребуется сделать копии всех файлов
SQL_LOAD-*, которые могут находиться в каталоге, указанном в опции - - s l a v e - l o a d -
tmpdir. (Если имя этого каталога не задано, по умолчанию ему будет присвоено значе-
ние переменной tmpdir). Подчиненному серверу понадобятся эти файлы, чтобы возоб-
новить репликацию любых прерванных операций LOAD DATA INFILE.
Если приходится восстанавливать таблицы My ISAM, попробуйте сначала сделать это с
помощью REPAIR TABLE или myisamchk -г. В 99,9% случаев это должно сработать. Если
myisamchk не помогает, попытайтесь выполнить следующее. (Обратите внимание, что
это принесет результаты только в том случае, если была активизирована функция реги-
стрирования данных в бинарном журнале путем запуска сервера с опцией — l o g - b i n ; см.
раздел 4.8.4.)
1. Восстановите исходную резервную копию, полученную с помощью mysqldump,
или бинарную копию.
320 Глава 4. Администрирование баз данных
в ней опций), как настроить график обслуживания таблиц и как с помощью myisamchk
выполнять различные функции.
Хотя восстановление таблиц с помощью myisamchk - процесс достаточно безопас-
ный, прежде чем приступать к нему (или любой другой операции по обслуживанию,
подразумевающей внесение многочисленных изменений в таблицу), лучше все-таки
сделать резервную копию.
Выполняемые myisamchk операции, в которых задействуются индексы, могут привес-
ти к построению индексов FULLTEXT с такими полнотекстовыми параметрами, что они
станут несовместимыми со значениями, используемыми сервером MySQL. Чтобы избе-
жать этого, следуйте инструкциям из раздела 4.6.2.2.
В большинстве случаев может оказаться намного проще для обслуживания таблиц
My ISAM использовать SQL-операторы, которые выполняют те же операции, что и
myisamchk:
• Для проверки и восстановления таблиц MylSAM используйте CHECK TABLE или
REPAIR TABLE.
• Для оптимизации таблиц MylSAM используйте OPTIMIZE TABLE.
• Для анализа таблиц MylSAM используйте ANALYZE TABLE.
Эти операторы вводились в различных версиях, но все они доступны, начиная с вер-
сии MySQL 3.23.14. Их можно использовать напрямую или посредством клиентской
программы mysqlcheck, обеспечивающей для них интерфейс командной стоки.
Одно из преимуществ данных операторов по сравнению с myisamchk заключается в
том, что при их использовании всю работу делает сервер. В случае, когда применяется
утилита myisamchk, необходимо проверять, чтобы таблицы в это же время не использо-
вались сервером. В противном случае не исключено нежелательное взаимодействие ме-
жду myisamchk и сервером.
* .MYI. Например, находясь в каталоге базы данных, все таблицы My ISAM в этом каталоге
можно проверить следующим образом:
shell> myisamchk *.MYI
Проверить все таблицы в каталоге базы данных, не находясь в нем, можно, указав
путь к этому каталогу:
shell> myisamchk /путь/к/каталогу_базы_данных/* .MYI
Также, возможно даже проверить все таблицы во всех базах данных, указав группо-
вой символ ('*') и путь к каталогу данных MySQL:
shell> myisamchk /путь/к/каталогу ^данных/*I* .MYI
Для быстрой проверки всех таблиц My ISAM и ISAM рекомендуется следующий способ:
shell> myisamchk —silent —fast /путь/к/каталогу данных/* /* .MYI
shell> isamchk —silent /путь/к/каталогу_данных/*/*.ISM
Если необходимо проверить все таблицы My ISAM и ISAM и восстановить поврежден-
ные, можно воспользоваться следующими командами:
shell> myisamchk —silent —force —fast —update-state \
-0 keyjbuffer=64M -0 sort_buffer=64M \
-0 read_buffer=lM -0 writeJmffer=lM \
/путь/к/каталогу_данных/*/*.MYI
shell> isamchk —silent —force -0 keyJbuffer=64M \
-0 sortjDuffer=64M -0 read_buffer=lM -0 write_buffer=lM \
/путь/к/каталогу__данных/*/*. ISM
Эти команды предполагают наличие более чем 64 Мбайт свободного пространства на
диске. Детальнее вопрос о распределении памяти с помощью myisamchk рассматривается
в разделе 4.6.2.6.
Необходимо убедиться, что во время запуска утилиты myisamchk таблицы больше
никакой другой программой не используются. В противном случае myisamchk при запус-
ке может выдать следующее сообщение об ошибке:
warning: clients are using or haven't closed the table properly
предупреждение: клиенты используют или не закрыли должным образом таблицу
Это указывает на попытку проверить таблицу, которая обновлялась другой програм-
мой (такой как, например, сервер mysqld), пока не закрывшей файл или завершившей
свою работу, не успев корректно закрыть файл.
Если mysqld выполняется, необходимо обязательно, с помощью FLUSH TABLES, заста-
вить его очистить все находящиеся в буфере памяти изменения таблиц. После этого по-
требуется обеспечить, чтобы никто не использовал таблицы до тех пор, пока функцио-
нирует myisamchk. Самый простой способ избежать этой проблемы - для проверки таб-
лиц вместо утилиты myisamchk использовать оператор CHECK TABLE.
и масса ненужных строк. Используйте эту опцию только тогда, когда ситуация
становится полностью безвыходной.
• —force, -f. Вместо аварийного прекращения работы перезаписывать старые вре-
менные файлы (то есть файлы с именами наподобие имя__таблицыЛШ)).
• ~keys-used=#, -k #. Для myisamchk значение опции указывает, какие индексы
обновлять. Каждый двоичный бит значения опции соответствует индексу табли-
цы, где первый индекс - это бит 0. Для isamchk значение опции означает, что об-
новлять следует только первых # индексов. В обоих случаях значение 0 блокирует
обновления для всех индексов, что может использоваться для ускорения вставок.
Отключенные индексы могут быть активизированы снова при помощи myisamchk
-г или isamchk -r.
• —no-symlinks, - I . He учитывать символические ссылки. Обычно myisamchk ис-
правляет таблицу, на которую указывает символическая ссылка. Данная опция не
существует, начиная с версии MySQL 4.O. В версиях 4.0 и выше символические
ссылки не удаляются во время операций по исправлению.
• —parallel-recover, -p. Применяет те же приемы, что и -г или -п, но создает все
ключи параллельно, используя разные потоки. Опция была добавлена в MySQL
4.0.2. Пребывает на стадии альфа-тестирования. Используйте исключительно
на своп страх и риск!
• — quick, -q. Ускоряет операции по восстановлению без изменения файла данных.
Можно задавать двойную опцию -q, что заставит myisamchk изменять исходный
файл данных в случае, если ключи дублируются.
• —recover, -r. Исправляет почти все ошибки, за исключением проблем с уни-
кальными ключами, которые таковыми не являются (в таблицах ISAM и My ISAM это
крайне редкий случай). Если необходимо восстановить таблицу, данная опция яв-
ляется первой, которую следует использовать. Попробуйте применить -о, только
если myisamchk выдает сообщение о том, что таблица не может быть восстановле-
на посредством -г (даже если это произойдет, что маловероятно, файл данных
при этом останется незатронутым).
• —safe-recover, -о. Выполняет операцию по исправлению с помощью старого
метода восстановления, при котором считываются все строки подряд и на основе
найденных строк осуществляется обновление всех индексных деревьев. Такая
операция выполняется на порядок медленнее, чем при использовании -г, но по-
могает решить пару маловероятных проблем, с которыми опция -г справиться не
может. Также при таком методе требуется намного меньше пространства на дис-
ке, нежели когда применяется -г. Обычно сначала всегда используется опция -г,
и только если результат будет неудовлетворительным, используется опция -о.
При наличии большого доступного объема памяти следует увеличить значение
key_buffer__size.
• —set-character-set=niwi. Изменяет таблицу символов, используемую при по-
строении индексов.
• —sort-recover, -n. Заставляет myisamchk использовать метод сортировки для
преобразования ключей, даже если слишком большой размер временных файлов
нежелателен.
4.6. Предотвращение аварий и восстановление системы 327
• myisamchk -m имя_таблицы. Эта опция позволяет найти 99,999% всех ошибок. Она
сначала отдельно проверяет все индексные записи на наличие ошибок, а затем
просматривает все строки подряд. После этого вычисляется контрольная сумма
для всех ключей во всех строках, которая сопоставляется с контрольной суммой
ключей в индексном дереве.
• myisamchk -e имя_таблицы. С помощью этой опции проводится полная и тща-
тельная проверка абсолютно всех данных (-е означает расширенную проверку).
Эта опция осуществляет проверочное считывание каждого ключа для каждой
строки, проверяя, действительно ли ключи указывают на те строки, на которые
нужно. Для больших таблиц с множеством ключей выполнение такой операции
может занять много времени. Обычно myisamchk останавливается, обнаружив
первую же ошибку. Чтобы получать больше данных, можно добавить опцию
—verbose (-v). В таком случае myisamchk сможет не останавливаться до тех пор,
пока количество ошибок не достигнет максимального числа 20.
• myisamchk -e -i имя_таблицы. Схожа с предыдущей командой, но опция -i вы-
нуждает myisamchk отображать также и некоторые статистические данные.
В большинстве случаев просто запустить myisamchk, не указывая никаких других ар-
гументов, кроме имени таблицы, оказывается вполне достаточно для проведения про-
верки.
table description:
Key Start Len Index Type Rec/key Root Blocksize
1 2 8 unique double 1 15845376 1024
2 15 10 multip. text packed stripped 2 25062400 1024
3 219 8 multip. double 73 40907776 1024
4 63 10 multip. text packed stripped 5 48097280 1024
5 167 2 multip. unsigned short 4840 55200768 1024
6 177 4 multip. unsigned long 1346 65145856 1024
7 155 4 multip. text 4995 75090944 1024
8 138 4 multip. unsigned long 87 85036032 1024
9 177 4 multip. unsigned long 178 96481280 1024
193 1 text
Пример выходных данных myisamchk -eis:
Checking MylSAM file: company
Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4
Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4
Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4
Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3
Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4
Total: Keyblocks used: 98% Packed: 17%
Records : 1403698 M.recordlength:: 226
Packed: 0%
Recordspace used: 100% Empty space: 0%
Blocks/Record: 1.00
Record blocks: 1403698 Delete blocks: 0
Recorddata: 317235748 Deleted data: 0
Lost space: 0 Linkdata: 0
User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966
Пример выходных данных myisamchk -eiv:
Checking MylSAM file: company
Data records: 1403698 Deleted blocks: 0
- check file-size
- check delete-chain
block_size 1024:
index 1:
index 2:
index 3:
index 4:
index 5:
index 6:
index 7:
4.6. Предотвращение аварий и восстановление системы 337
index 8:
index 9:
No recordlinks
- check index reference
- check data record references index: 1
Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4
- check data record references index: 2
Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4
- check data record references index: 3
Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4
- check data record references index: 4
Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3
- check data record references index: 5
Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 6
Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 7
Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 8
Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 9
Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4
Total: Keyblocks used: 9% Packed: 17%
- check records and index references
[LOTS OF ROW NUMBERS DELETED]
Records: 1403698 M.recordlength: 226 Packed: 0%
Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00
Record blocks: 1403698 Delete blocks: 0
Recorddata: 317235748 Deleted data: 0
Lost space: 0 Linkdata: 0
User time 1639.63, System time 251.61
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
Blocks in 4 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10604, Involuntary context switches 122798
Н и ж е дается объяснение типов выдаваемой myisamchk информации. "Keyfile" отно-
сится к индексному файлу. "Record" (запись) и "row" (строка) являются синонимами.
• MylSAM file. И м я (индексного) файла MylSAM.
• File-version. Версия формата MylSAM. Н а настоящий момент всегда 2.
• Creation time. Когда в последний раз восстанавливался индексный файл/файл
данных.
• Data records. Количество записей в таблице.
• Deleted blocks. Количество удаленных блоков, которые по-прежнему имеют за-
резервированное для них пространство. М о ж н о оптимизировать таблицу, чтобы
свести такое пространство к минимуму. См. раздел 4.6.2.10.
338 Глава 4. Администрирование баз данных
Это можно сделать с помощью опции — character-sets-dir, указав в ней путь к ка-
талогу, в котором хранятся динамические наборы символов MySQL. Например, добавьте
в файл опций следующую строку:
[client]
character-sets-dir=/usr/local/mysql/share/mysql/charsets
Можно также заставить клиента использовать какой-нибудь определенный набор
символов следующим образом:
[client]
default-character-set=Ha6op
Однако обычно необходимости в этом нет.
* .configure, number_MYSET=MYNUMBER
* .configure. strxfrm_multiply_Mir5ET=N
* .configure. mbmaxlen_MYSET=N
*/
Программа configure использует данный комментарий для автоматического
включения набора символов в библиотеку MySQL.
Строки strxfrmjnultiply и mbmaxlen объясняются ниже. Вводить их нужно толь-
ко при необходимости в наличии функций по упорядочиванию строк или функ-
ций поддержки многобайтных наборов символов соответственно.
5. Затем потребуется создать некоторые из следующих функций:
• my_strncoll_MYS£T()
• my_strcoll_MYS£r()
• my_strxfim_MYSET()
• my_like_range_MYS£T()
См. раздел 4.7.5.
6. Добавьте название набора символов в списки CHARSETS_AVAILABLE и
COMPILED_CHARSETS файла configure.in.
7. Повторно сконфигурируйте, скомпилируйте и протестируйте систему.
8. В файле sql/share/charsets/README содержатся дополнительные инструкции.
При желании, чтобы тот или иной набор символов был включен в дистрибутив
MySQL, можно отправить исправление с ним в список рассылки MySQL internals. См.
раздел 1.7.1.1.
Это может пригодиться, если придется после аварии вернуться к резервной копии
файлов, а затем повторно применить обновления, которые были внесены между датой
создания резервной копии и датой аварии.
Чтобы получить возможность знать, какие файлы каких бинарных журналов приме-
нялись, mysqld также создает и индексный файл, в котором содержатся имена всех ис-
пользуемых файлов бинарного журнала. По умолчанию ему присваивается имя, такое
же, как у файла бинарного журнала, но с расширением ' .index 1 . Изменять имя индекс-
ного файла бинарного журнала можно с помощью опции —log-bin-index= [имя_файла].
Во избежание путаницы редактировать этот файл вручную во время работы mysqld нельзя.
Для удаления всех файлов бинарных журналов используется оператор RESET MASTER,
а для удаления лишь некоторых из них - PURGE MASTER LOGS.
Чтобы контролировать заносимые в бинарный журнал данные, можно применять
следующие опции (также следует ознакомиться с пояснениями, идущими после данного
списка):
• —binlog-do-6Ъ=имя_базы_данных. Указывает главному серверу заносить обнов-
ления в бинарный журнал, если текущей базой данных (то есть базой данных, вы-
бранной с помощью USE) является имя_базы_данных. Все остальные, не упомяну-
тые явно, базы данных игнорируются. При использовании этой опции необходи-
мо проверить, чтобы обновления выполнялись только в текущей базе данных.
Ниже приводится пример того, что не работает так, как ожидается. В случае, ко-
гда сервер был запущен с опцией binlog-do-db=sales и выполняется оператор
USE prices; UPDATE sales.January SET amount=amount+1000;
в бинарный журнал этот оператор занесен не будет.
• —Ып1од-1дпоте-6Ь=имя_базы_данных. Указывает главному серверу не сохранять
обновления в бинарном журнале, если текущей базой данных (то есть базой дан-
ных, выбранной через USE) является имя_базы_данных. При использовании этой
опции необходимо проверить, чтобы обновления выполнялись только в текущей
базе данных.
Ниже приводится пример того, что не работает так, как ожидается. В случае, когда
сервер был запущен с опцией binlog-ignore-db=sales и выполняется оператор
USE prices; UPDATE sales.January SET amount=amount+1000;
этот оператор будет занесен в бинарный журнал.
Чтобы регистрировать или игнорировать обновления сразу нескольких баз данных, за-
дайте соответствующую опцию необходимое число раз, по одному для каждой базы данных.
Правила, по которым обновления будут регистрироваться в бинарном журнале или
игнорироваться, анализируются системой в следующем порядке:
1. Установлены ли правила с помощью —Ь1п1од-йо^Ь=имя_базь/_даняых или
мер, поток открывает временный файл для сохранения транзакции. После закрытия по-
тока временный файл будет удален.
Опцию max__binlog_cache_size (которой по умолчанию присваивается значение
4 Гбайт) можно использовать для ограничения общего объема памяти, выделяемого для
кэширования транзакций с множественными операторами. При превышении указывае-
мого в max_binlog_cache_size значения, выполнение транзакции будет прервано с осу-
ществлением отката.
Если используется журнал обновлений или бинарный журнал, то, когда применяется
оператор CREATE.. .SELECT или INSERT.. .SELECT, параллельные операции вставок будут
преобразовываться в стандартные. Это необходимо для того, чтобы обеспечить возмож-
ность воссоздания точной копии таблиц посредством применения журнала вместе с ре-
зервной копией.
Форматы бинарного журнала в версиях 3.23, 4.0 и 5.0.0 разные. Изменения формата
требовались для улучшения возможностей репликации. В версиях 4.0 и 4.1 формат би-
нарного журнала совпадает. См. раздел 5.5.
• —shared-memory-base-name=HM#
Эта опция в настоящее время используется только в Windows. Она присваивает имя
разделяемой области памяти, которая используется сервером Windows для разре-
шения клиентам подключаться через эту память. Это новая опция в MySQL 4.1.
• —pid-file=nyTb
Эта опция используется только в Unix. С ее помощью указывается имя файла, в
котором сервер записывает свой идентификатор процесса.
Если представленные ниже опции используются, их значения также должны быть
разными для каждого сервера:
• —log=путь
• —1од-Ып=путь
• —log-update=nyTb
• —1од-еггог=путь
• —log-isam=nyTb
• —bdb-logdir=nyTb
Опции, необходимые для работы с журнальными файлами, описаны в разделе 4.8.6.
Чтобы улучшить производительность системы, можно также по-разному для каждого
сервера задать и представленные ниже опции, что позволит распределять нагрузку меж-
ду несколькими физическими дисками:
• —tmpdir=путь
• —bdb-tmpdiт=путь
Помимо этого рекомендуется, чтобы временные каталоги тоже были разными; так
будет намного легче определять, какой из серверов MySQL создал тот или иной времен-
ный файл.
В общем случае, каждый сервер должен использовать отдельный каталог данных,
путь к которому задается с помощью опции —datadir=путь.
! Внимание!
!;< Обычно ни в коем случае нельзя допускать, чтобы сразу два сервера обновляли данные в одной
Р и той же базе данных! Это может привести к очень неприятным последствиям, если ваша опера-
h ционная система не поддерживает функцию безотказной блокировки доступа! Если (даже не-
смотря на данное предупреждение) для сразу нескольких серверов указан один и тот же каталог
; данных и при этом используется функция регистрации в журналах, обязательно следует с помо-
|;-, щью соответствующих опций задать уникальные для каждого сервера имена журнальных фай-
I лов. В противном случае серверы будут пытаться заносить данные в одни и те же файлы.
Не усложняйте сами себе задачу, то есть о доступе сразу двух (или более) серверов к
одной базе данных через сетевую файловую систему лучше забыть. Подходящим реше-
нием может быть использование одного компьютера с несколькими процессорами и
операционной системы, эффективно управляющей потоками.
При наличии нескольких установок MySQL на разных дисках, обычно для каждого
сервера с помощью опции --basedir=nyTb указывается путь к основному каталогу уста-
новки, в результате чего каждый сервер будет использовать отдельные журнальные и
PID-файлы, а также отдельный каталог данных. (Значения по умолчанию будут зависеть
от каталога данных.) В таком случае дополнительно нужно будет задать только опции
—socket и —port. Например, предположим, что устанавливаются разные версии
MySQL с использованием бинарных дистрибутивов в форме файлов tar. Установлены
они будут в разных местах, поэтому сервер (для каждой из установок) можно будет за-
пускать с помощью команды bin/mysqldsafe из соответствующего каталога данных.
mysqld_safe самостоятельно определит подходящую для передачи mysqld опцию
—basedir; понадобится только указать для mysqld_safe опции —socket и —port. (В
версиях MySQL, предшествующих 4.0, вместо mysqld_safe используйте safejnysqld.)
Как уже рассказывалось в предыдущих разделах, существует также возможность за-
пускать дополнительные серверы путем установки переменных окружения или путем
указания соответствующих опций в командной строке. Однако если использовать не-
скольких серверов одновременно планируется на более постоянной основе, тогда лучше
все значения, которые должны быть уникальными для того или иного сервера, указывать
в файле опций.
[mysqld]
datadir = C:/mydatal
port = 3307
Второй файл назовите С: \my-opts2. cnf:
[mysqld]
datadir = C:/mydata2
port = 3308
После этого запустите серверы, указав для каждого собственный файл опций:
С:\> C:\mysql\bin\mysqld ~defaults-file=C:\my-optsl.cnf
С:\> С:\mysql\bin\mysqld-max —defaults-file=C:\my-opts2.cnf
В среде NT оба сервера запустятся в приоритетном режиме (до завершения сервера
никаких других приглашений на ввод команд не появится), поэтому указанные выше
команды понадобится выполнять в разных окнах консоли.
Чтобы завершить работу серверов, необходимо подключиться к соответствующему
порту:
С:\> C:\mysql\bin\mysqladmin — port=3307 shutdown
С:\> C:\mysql\bin\mysqladmin —port=3308 shutdown
Серверы, сконфигурированные только что описанным способом, позволяют клиен-
там подключаться через TCP/IP. Если имеющаяся версия Windows поддерживает имено-
ванные каналы и есть желание разрешить установку соединения с сервером через них,
используйте серверы mysqld-nt и mysqld-max-nt, задавая специальные разрешающие
подобные соединения опции, в которых укажите имя соответствующего именованного
канала. Каждый сервер, поддерживающий соединения через именованные каналы, дол-
жен использовать уникальное имя канала. Например, файл C:\my-optsl.cnf может вы-
глядеть следующим образом:
[mysqld]
datadir = C:/mydatal
port = 3307
enable-named-pipe
socket = mypipel
Тогда сервер должен запускаться так, как показано ниже:
С:\> С:\mysql\bin\mysqld-nt —defaults-file=C:\my-optsl.cnf
Таким же способом измените и файл С:\my-opts2.cnf, который используется вторым
сервером.
Исходя из всего вышесказанного, можно сделать вывод о том, что существует не-
сколько способов установки сразу нескольких служб MySQL на одном компьютере.
Приведенное ниже описание этих способов включает и некоторые примеры. Прежде чем
пытаться проверить любой из них, сначала убедитесь, что все существующие службы
MySQL были закрыты и удалены.
• Способ 1. Задавайте опции для всех служб в одном из стандартных файлов опций.
Для этого необходимо для каждого сервера указать отдельное имя службы. Пред-
положим, вы хотите запустить сервер mysqld-nt версии 4.0.8, используя имя
службы mysqldl, и сервер mysqld-nt версии 4.0.17, используя имя службы
mysqld2. В таком случае для сервера 4.0.8 можно указать группу [mysqldl ], а для сер-
вера 4.0.17 - группу [mysqld2 ]. Например, файл С: \my. cnf может выглядеть так:
# Опции для службы mysqldl
[mysqldl]
basedir = C:/mysql-4.0.8
port = 3307
enable-named-pipe
socket = mypipel
# Опции для службы mysqld2
[mysqld2]
basedir = C:/mysql-4.0.17
port = 3308
enable-named-pipe
socket = mypipe2
4.9. Запуск нескольких серверов MySQL на одном и том же компьютере 357
Установите службы, как показано ниже, указывая пути к серверу полностью; это
гарантирует, что Windows будет регистрировать правильные выполняемые про-
граммы для каждой службы:
С:\> C:\mysql-4.0.8\bin\mysqld-nt —install mysqldl
С:\> C:\mysql-4.0.17\bin\mysqld-nt —install mysqld2
Чтобы запустить службы, используйте диспетчер служб или оператор NET START с
соответствующими именами служб:
С:\> NET START mysqldl
С:\> NET START mysqld2
Чтобы завершить работу служб, используйте диспетчер служб или оператор NET
STOP с соответствующими именами служб:
С:\> NET STOP mysqldl
С:\> NET STOP mysqld2
• Способ 2. Задавайте опции для каждого сервера в отдельном файле и, когда уста-
навливаете службы, применяйте —defaults-file, чтобы указать каждому серве-
ру, какой файл он должен использовать. В таком случае все опции следует пере-
числять в группе [mysqld] каждого отдельного файла.
При таком способе, чтобы указать опции для mysqld-nt версии 4.0.8, создайте
файл С: \myoptsl. cnf, который должен выглядеть так:
[mysqld]
basedir = С:/mysql-4.0.8
port = 3307
enable-named-pipe
socket = mypipel
Для сервера mysqld-nt версии 4.0.17 создайте файл C:\my-opts2.cnf, который
должен выглядеть так:
[mysqld]
basedir = С:/mysql-4.О.17
port = 3308
enable-named-pipe
socket = mypipe2
Установите службы следующим образом (вводите каждую команду в одной строке):
С:\> C:\mysql-4.0.8\bin\mysqld-nt —install mysqldl
—defaults-file=C:\my-optsl.cnf
C:\> C:\mysql-4.0.17\bin\mysqld-nt —install mysqld2
—defaults-file=C:\my-opts2.cnf
При установке MySQL в качестве службы, чтобы использовать опцию
--defaults-file, перед ней необходимо указывать имя службы.
После того, как службы MySQL установлены, запустить или остановить их можно
способами, описанными в предыдущем примере.
Чтобы удалить службы MySQL, для каждой из них используйте опцию mysqld
—remove, указывая после —remove имя службы. Если это имя MySQL (то есть имя,
установленное по умолчанию), его можно и не указывать.
358 Глава 4. Администрирование баз данных
£ На заметку!
; Кэш запросов не работает в среде, где сразу несколько серверов mysqld обновляют одни и те
;1 же таблицы.
I have_query_cache | YES |
I Variable_name I Value I
+ + +
I Qcache_free_blocks I 36 |
I Qcache_free_memory I 138488 |
I Qcachejiits I 79570 |
I Qcache_inserts I 27087 |
I Qcache_lowmem_prunes I 3114 |
I Qcache_not_cached I 22989 |
i Qcache_queries_in_cache | 415 |
I Qcache_total_blocks I 912 |
+ + +
Репликация в MySQL
После того, как подчиненный сервер получит копию данных главного сервера, он
просто подключается к нему и ожидает обновлений, которые нужно обработать. Ес-
ли главный сервер отключится, либо пропадет связь, он будет повторять периодиче-
ские попытки подключиться снова до тех пор, пока ему это не удастся, и он не про-
должит прослушивать изменения. Интервал повторения попыток управляется опцией
—master-connect-retry. По умолчанию он составляет 60 секунд.
Каждый подчиненный сервер запоминает, на каком этапе он утратил связь. Главный
сервер не имеет понятия о том, сколько подчиненных серверов к нему подключено, и
какие из них хранят актуальную информацию в любой момент времени.
4.0.15, когда содержимое столбца State изменилось, чтобы быть более информативным,
чем в ранних версиях.
На главном сервере вывод SHOW PROCESSLIST выглядит так:
mysql> SHOW PROCESSLIST\G
*************************** 2. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to
be updated
Info: NULL
Здесь поток с идентификатором 2 - это поток репликации, созданный для подклю-
ченного подчиненного сервера. Из информации следует, что все необработанные изме-
нения данных отправлены подчиненному серверу, и что главный ожидает поступления
новых изменений.
Н а подчиненном сервере вывод SHOW PROCESSLIST выглядит, как показано ниже:
mysql> SHOW PROCESSLIST\G
*************************** 2. row ***************************
Id: 10
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
Id: 11
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Has read all relay log; waiting for the slave I/O
thread to update it
Info: NULL
Эта информация говорит о том, что поток с идентификатором 10 - это поток ввода-
вывода, который взаимодействует с ведущим сервером, а поток с идентификатором 11 -
поток SQL, обрабатывающий изменения, сохраненные в трансляционном журнале. В
настоящий момент оба потока простаивают, ожидая будущих изменений.
Следует отметить, что значение столбца Time отображает, насколько давно подчи-
ненный сервер сравнивался с главным. См. раздел 5.9.
5.3. Детали реализации процесса репликации 369
Строка Описание
1 Relay_Log_File
2 Relay_Log_Pos
3 Relay_Master_Log_File
4 Exec_Master_Log_Pos
Когда выполняется резервное копирование данных подчиненного сервера, содержи-
мое этих файлов также нужно копировать вместе с файлами журналов ретрансляции.
После восстановления из резервной копии эти файлы понадобятся для продолжения ре-
пликации. Если вы потеряете файлы журналов ретрансляции, но у вас останется файл
relay-log.info, вы можете определить по нему, насколько далеко продвинулся поток
SQL в чтении и выполнении обновлений бинарного журнала главного сервера. Затем
МОЖНО выдать CHANGE MASTER ТО вместе С опциями MASTER_LOG_FILE и MASTER_LOG_POS,
чтобы заставить подчиненный сервер перечитать бинарный журнал главного сервера,
начиная с заданного места. Это требует, чтобы бинарный журнал на главном сервере все
еще существовал.
Если вашему подчиненному серверу приходится реплицировать операторы LOAD
DATA INFILE, вы должны будете также создать резервные копии всех файлов SQL_LOAD-*,
находящиеся в каталоге, который подчиненный сервер использует для этих целей. Эти
файлы понадобятся ему для продолжения репликации прерванных операторов LOAD DATA
INFILE. Местоположение каталога задается опцией —slave-load-tmpdir. Если каталог
не указан, по умолчанию им будет значение переменной tmpdir.
нарной копии, как было описано выше. Для этого выполните команду mysqldump
—master-data на главном сервере, а позже загрузите файл SQL-дампа в базу дан-
ных подчиненного сервера. Однако этот способ медленнее, чем в случае бинар-
ных данных.
Если главный сервер ранее был запущен без включенной опции —log-bin, имя
журнала и позиция смещения, показанная командой SHOW MASTER STATUS или
mysqldump, будут пустыми. В этом случае значениями, которые вам понадобятся
позже при настройке репликации на подчиненном сервере, будут пустая строка
(")и4.
4. Убедитесь, что раздел [mysqld] в файле my.cnf на хосте главного сервера вклю-
чает опцию log-bin. Там же должна быть указана опция зегчег-1с!=идентифика-
тор главного сервера, где идентификатор_главного_сервера — положительное
целое число от 1 до 2 3 2 - 1. Например:
[mysqld]
log-bin
server-id=l
Если эти опции не указаны, добавьте их и перезапустите сервер.
5. Остановите сервер, который предполагается сделать подчиненным, и добавьте в
его файл my. cnf следующие строки:
[mysqld]
server-i 6.=идентифика тор_подчиненного_ серв ера
Значение идентификатор_подчиненного_сервера, как и идентификатор_глав-
ного_сервера, должно быть положительным целым числом из диапазона от 1 до
2 3 2 - 1. Вдобавок очень важно, чтобы идентификатор подчиненного сервера отли-
чался от идентификатора главного сервера, например:
[mysqld]
server-id=2
Если вы настраиваете несколько подчиненных серверов, каждый из них должен
иметь уникальное значение serverid, отличающееся от того, что указано для глав-
ного, и тех, что указаны для остальных подчиненных серверов. Воспринимайте эти
идентификаторы как нечто, подобное IP-адресам. Они уникальным образом иден-
тифицируют каждый сервер в рамках сообщества партнеров репликации.
Если вы не укажете значение server_id, оно будет установлено равным 1, если не
определен master-host, и 2 - в противном случае. Заметьте, что в случае, если
server_id будет пропущено, главный сервер будет отвергать попытки подключе-
ния от всех подчиненных серверов, и подчиненные серверы не смогут соединить-
ся с ним. Поэтому пропускать server-id будет правильно только в случае резерв-
ного копирования с бинарными журналами.
6. Если вы выполняете бинарное резервное копирование данных главного сервера,
переместите эти копии в каталог данных подчиненного сервера до его запуска.
Убедитесь в корректности набора привилегий доступа к файлам и каталогам.
Пользователь подчиненного сервера, от имени которого запускается сервер
MySQL, должен иметь права на чтение и запись файлов, так же, как и пользова-
тель главного.
5.4. Настройка репликации 377
до версии MySQL 5.O.O. Если это еще не сделано, обновите сначала подчиненные серве-
ры. Остановите каждый из них, проведите модернизацию, перезапустите сами серверы и
перезапустите репликацию. Подчиненные серверы 5.0.0 могут читать старые бинарные
журналы, которые были записаны до обновления, и обрабатывать их содержимое. Фай-
лы журналов ретрансляции на подчиненных серверах будут иметь формат 5.0.0.
После модернизации подчиненных серверов остановите главный сервер, обновите
его до версии 5.0.0 и затем перезапустите. MySQL 5.0.0 может читать старые бинарные
журналы, которые были записаны до обновления, и отправлять их подчиненным серве-
рам MySQL 5.O.O. Подчиненные серверы распознают старый формат и корректно его
обработают. Бинарные журналы, записанные главным сервером после обновления, бу-
дут иметь правильный формат 5.0.0, и подчиненные серверы также его правильно обра-
ботают.
Другими словами, не нужно принимать каких-то особых мер при модернизации до вер-
сии 5.0.0, кроме того, что подчиненные серверы должны быть обновлены раньше главно-
го. Имейте в виду, что возврат к версии, предшествующей 5.0.0, не будет столь простым.
Вы должны будете убедиться, что все бинарные и журналы ретрансляции полностью об-
работаны, и вы можете их удалить прежде, чем начнете возврат к старой версии.
осталась, состоит в том, что когда второй сеанс обновляет нетранзакционную таб-
лицу в то время, когда в первом сеансе не окончена транзакция, то порядок опера-
торов все еще может оказаться неверным, потому что обновление второго сеанса
регистрируется в журнале немедленно после выполнения.
В следующем списке перечислены проблемы репликации в версии MySQL 3.23, ко-
торые были успешно решены в MySQL 4.O.
• LOAD DATA INFILE обрабатывается правильно до тех пор, пока файл данных нахо-
дится на главном сервере во время репликации.
• LOAD DATA LOCAL INFILE более не пропускается на подчиненном сервере, как это
было в версии 3.23.
• В версии 3.23 функция RANDO в операторах обновления данных реплицировалась
неправильно. Используйте RAND {некоторое_неслучайное_выражение), если вы ре-
плицируете обновления с вызовом RAND (). Например, в качестве аргумента RAND ()
можно использовать UNIX_TIMESTAMP ().
первой строке указывается общее количество строк в нем. Если вы обновляете старый
сервер до версии 4.1.1, он автоматически обновит файл master.info в соответствии с
новым форматом. Однако если вы возвращаетесь от версии 4.1.1 к более старой, вам
придется вручную убрать первую строку этого файла перед первым запуском сервера.
Помните также, что после возврата к старой версии сервер не сможет больше использо-
вать SSL-соединения для подключения к главному серверу.
Если файл master.info не существует на момент запуска подчиненного сервера, для
этих опций он использует те значения, которые указаны в командной строке или конфи-
гурационном файле. Это случается, когда вы самый первый раз запускаете сервер в ка-
честве подчиненного в процессе репликации, либо после того, как вы даете команду
RESET SLAVE, останавливаете и перезапускаете подчиненный сервер.
Если файл master.info существует на момент старта подчиненного сервера, пере-
данные значения этих опций игнорируются. Вместо них используются значения, прочи-
танные из файла master. info.
Если вы перезапускаете подчиненный сервер с другими значениями опций, которые
соответствуют указанным в master.info, эти новые значения не имеют эффекта, по-
скольку сервер продолжает использовать файл master.info. Чтобы использовать новые
значения, вы должны либо перезапустить сервер снова, удалив файл master.info, или
(что предпочтительнее) с помощью команды CHANGE MASTER TO сбросить значения пря-
мо в процессе работы подчиненного сервера.
Предположим, что вы указали следующую опцию в файле my. cnf:
[mysqld]
master-host=HeKOTopNH_xocT
Первый раз, когда вы запускаете сервер как подчиненный в репликации, он читает и
использует значение этой опции из файла my.cnf. Затем он записывает это значение в
файл master.info. При следующем старте он читает имя хоста главного сервера толь-
ко из файла master. info и игнорирует значение, заданное в конфигурационном файле.
Если вы модифицируете файл my.cnf, чтобы изменить имя хоста главного сервера на
другой_хост, это изменение не возымеет никакого эффекта. Вместо этого следует
воспользоваться оператором CHANGE MASTER TO.
Поскольку сервер отдает предпочтение существующему файлу master.info при чте-
нии описанных опций запуска, возможно, вы предпочтете вообще их не использовать, а
вместо этого указывать их с помощью оператора CHANGE MASTER TO.
В следующем примере продемонстрировано более продуманное применение опций
запуска для конфигурирования подчиненного сервера:
[mysqld]
server-id=2
master-host=db-master.mycompany.com
master-port=3306
master-user=pertinax
master-password=freitag
master-connect-retry=60
report-host=db-slave.mycompany.com
В следующем перечне описаны опции запуска для управления репликацией. Многие
из них могут быть сброшены в процессе работы сервера с помощью команды CHANGE
386 Глава 5. Репликация в MySQL
MASTER TO. Другие, такие как опции —replicate-*, могут быть установлены только при
запуске подчиненного сервера. Мы планируем исправить это.
• —log-slave-updates. Обычно изменения, полученные подчиненным сервером от
главного, не записываются в его бинарный журнал. Эта опция указывает подчи-
ненному серверу, что изменения, которые проводит его поток SQL репликации,
должны регистрироваться в журнале. Чтобы эта опция возымела эффект, подчи-
ненный сервер должен быть запущен с опцией —bin-log, включающей бинарную
регистрацию. —log-slave-updates применяется в случаях, когда нужно постро-
ить цепочку реплицируемых серверов, например, по такой схеме:
А -> В -> С
То есть А служит главным для подчиненного В, а В служит главным для С. Чтобы
эта схема работала, В должен быть одновременно и главным, и подчиненным. Вы
должны запускать и А, и В с опцией --bin-log, чтобы разрешить бинарную реги-
страцию, а В еще и с опцией —log-slave-updates.
• —log-warnings. Заставляет подчиненный сервер печатать больше сообщений о
том, что он делает. Например, он известит вас об успешном восстановлении со-
единения после сбоя сети и сообщит о том, как стартовал каждый из потоков, об-
служивающих репликацию. Эта опция касается не только репликации. Она за-
ставляет генерировать сообщения о многих аспектах активности сервера.
• --master-connect-retry=ceKyjwi. Период времени в секундах, в течение которого
сервер ожидает перед повторными попытками подключиться в случае остановки
главного сервера или отказа сети. Значение, указанное в master.info, имеет при-
оритет, если оно может быть прочитано. Если не установлено явно, принимается
равным 60 секундам.
• —master-host=xocT. Имя хоста или IP-адрес главного сервера репликации. Если
эта опция не указана, потоки репликации подчиненного сервера не запускаются.
Значение, указанное в master. info, имеет приоритет, если может быть прочитано.
• —master-info-f Пе=имя_файла. Имя файла, в который подчиненный сервер запи-
сывает информацию о главном сервере. Значение по умолчанию - mysql.info,
размещенный в каталоге данных.
• —master-password=napcitfb. Пароль пользовательской учетной записи, которую
поток подчиненного сервера использует при подключении к главному серверу.
Значение, указанное в master. info, имеет приоритет, если может быть прочитано.
Если пароль не установлен, он считается пустым.
• —master-port=HOMep_nopTa. Порт TCP/IP, который использует главный сервер
для прослушивания соединений. Значение, указанное в master.info, имеет при-
оритет, если может быть прочитано. Если не установлено, во внимание принима-
ется жестко закодированное в сервере. Если вы не указали другое для configure
при сборке сервера, то оно равно 3306.
• —master-ssl
—master-ssl-capath=имя_кaтaлoгa
—master-ssl-cert=H^3^aj^7a
—master-ssl-cipher=cnHCOK_iuH$poB
5.8. Опции запуска репликации 387
• Да. Цикл.
• Нет. Проверены все таблицы, которые нужно обновлять, и соответствия пра-
вилам не найдены. Есть ли правила --replicate-do-table или —replicate-
wild-do-table?
• Да. Игнорировать запрос и выйти.
• Нет. Выполнить запрос и выйти.
ких подчиненных серверов. Если только вы получили снимок данных главного сервера,
вы можете подождать с настройкой подчиненных до тех пор, пока бинарные журналы
главного сервера находятся в целости. Два практических ограничения, накладываемых
на время от выгрузки снимка до настройки подчиненных - это объем дискового про-
странства для хранения растущих файлов бинарного журнала и время, необходимое
подчиненным серверам, чтобы провести репликацию накопившихся изменений.
Вы также можете использовать LOAD DATA FROM MASTER. Это удобный оператор, пе-
реносящий снимок данных на подчиненный сервер и одновременно настраивающий имя
журнала и смещение. В будущем применение оператора LOAD DATA FROM MASTER будет
рекомендовано для первоначальной настройки подчиненного сервера. Помните, однако,
что он работает только с таблицами My ISAM и может долгое время удерживать блокиров-
ку по чтению. Пока еще он не реализован настолько эффективно, как нам бы хотелось.
Если у вас большие таблицы, предпочтительным способом на сегодняшний день являет-
ся создание бинарного снимка данных главного сервера после выполнения оператора
FLUSH TABLES WITH READ LOCK.
Вопрос. Должен ли подчиненный сервер все время быть подключенным к главному?
Ответ. Нет. Подчиненный сервер может оставаться выключенным в течение часов и
даже дней, затем повторно подключиться и захватить накопившиеся изменения. Напри-
мер, вы можете установить между серверами отношение главный/подчиненный по ком-
мутируемой линии, которая работает только эпизодически и в течение кратких периодов
времени. Следствием этого будет то, что не гарантируется синхронность данных между
главным и подчиненным серверами в любой момент времени, если только вы не пре-
дусмотрите каких-то специальных мер. В будущем мы предусмотрим возможность
блокировать главный сервер до тех пор, пока хотя бы один из подчиненных не син-
хронизирован.
Вопрос. Как узнать, когда данные подчиненного сервера сравнивались с данными
главного? Другими словами, как узнать дату последней репликации?
Ответ. Если подчиненный сервер имеет номер версии 4.1.1 или выше, читайте зна-
чение в столбце Seconds_Behind_Master в выводе команды SHOW SLAVE STATUS. Для бо-
лее старых версий подходит следующий способ. Это возможно, только если SHOW
PROCESSLIST на подчиненном сервере показывает, что работает поток SQL (или, для
MySQL 3.23, что работает поток подчиненного сервера), и что он обработал хотя бы од-
но событие, полученное от главного. См. раздел 5.3.
Когда поток SQL обрабатывает событие, прочитанное с главного, он модифицирует
свое собственное время по временной метке события (вот почему TIMESTAMP правильно
реплицируются). В столбце Time вывода команды SHOW PROCESSLIST количество секунд,
отображаемое для потока SQL, представляет собой разность времени между меткой по-
следнего обработанного события и реальным временем машины подчиненного сервера.
Вы можете использовать его для определения даты последнего реплицированного собы-
тия. Следует заметить, что если ваш подчиненный сервер был отключен от главного в
течение одного часа, а затем подключился заново, вы можете немедленно увидеть зна-
чение наподобие 3600 в столбце Time вывода команды SHOW PROCESSLIST. Это объясня-
ется тем, что подчиненный сервер выполняет оператор, которому исполнился один час.
Вопрос. Как заставить главный сервер блокировать изменения до тех пор, пока под-
чиненный не догонит его?
Ответ. Воспользуйтесь следующей процедурой:
5.9. Часто задаваемые вопросы по репликации 395
Запишите имя журнала и смещение, которые покажет команда SHOW. Это - коор-
динаты репликации.
2. На подчиненном сервере выполните следующие операторы, где аргументами
функции MASTER_POS_WAIT() будут координаты репликации, полученные на
предыдущем шаге:
mysql> SELECT MASTER_POS_WAIT('имя_журнала', смещение);
Оператор SELECT заблокирует базу до тех пор, пока подчиненный сервер не дос-
тигнет указанных координат репликации. К этому моменту данные двух серверов
будут синхронизированы, и оператор SELECT возвратит управление.
3. На главном сервере выдайте следующую команду, чтобы снова разрешить ему
принимать запросы на изменение данных от клиентов:
mysql> UNLOCK TABLES;
и SQL и проверить значение их столбца State. См. раздел 5.3. Если значение
State для потока ввода-вывода равно Connecting to master (Подключение к
главному серверу), проверьте привилегии пользователя репликации на главном
сервере, его имя хоста, ваши настройки DNS, работает ли главный сервер в дан-
ный момент и доступен ли он с подчиненного сервера.
• Если подчиненный сервер работал ранее, а теперь остановлен, причина обычно
состоит в том, что некий оператор, успешно выполненный на главном сервере, не
прошел на подчиненном. Это никогда не должно случаться, если у вас был кор-
ректный первоначальный снимок данных главного сервера, и данные подчинен-
ного не модифицировались вне его потоков репликации. Если это так, то, вероят-
но, это ошибка, либо вы столкнулись с одним из известных ограничений реплика-
ции, описанных в разделе 5.7. Если это ошибка, в разделе 5.11 можно найти
инструкции о том, как сообщать об ошибках.
• Если оператор, выполненный успешно на главном сервере, отвергнут подчинен-
ным, и нет реальной возможности осуществить полную ресинхронизацию (то
есть, удалить базу данных подчиненного и скопировать новый снимок с главно-
го), попробуйте выполнить следующие действия:
1. Определите, чем отличается таблица на подчиненном сервере от той же табли-
цы на главном. Попытайтесь разобраться, как это получилось. Затем приведи-
те таблицу на подчиненном сервере в состояние, эквивалентное ее состоянию
на главном сервере, и выполните START SLAVE.
2. Если предыдущий шаг не работает или невозможен, попробуйте разобраться,
нельзя ли провести обновление вручную (при необходимости), а затем
проигнорировать следующий оператор с главного сервера.
3. Если вы решите, что следующий оператор с главного сервера можно пропус-
тить, выполните следующие операторы:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = л;
raysql> START SLAVE;
Значение л должно быть равно 1, если следующий оператор с главного сервера
не использует AUTO_INCREMENT или LAST_INSERT_ID(). В противном случае
значение должно быть равно 2. Причина указания значения 2 для операторов,
ИСПОЛЬЗУЮЩИХ AUTO_INCREMENT ИЛИ LAST_INSERT_ID ( ) , СОСТОИТ В ТОМ, ЧТО ОНИ
берут два события в бинарном журнале главного сервера.
4. Если вы уверены, что подчиненный сервер стартовал, будучи идеально син-
хронизированным с главным, и никто не вносил изменений в данные подчи-
ненного сервера вне системы репликации, значит, предположительно, расхож-
дения объясняются ошибкой кода сервера. Если вы работаете с самой послед-
ней версией, сообщите нам о проблеме. Если у вас более старая версия
MySQL, попробуйте ее обновить.
Оптимизация MySQL
Примером типа информации, которую может предоставить crash-me, может быть то,
что вы не должны использовать имена столбцов длиннее 18 символов, если собираетесь
взаимодействовать с Informix или DB2.
Программа crash-me и тесты производительности MySQL мало зависят от конкрет-
ной СУБД. Взглянув на то, как они написаны, вы можете получить представление о том,
как ваши собственные программы сделать независимыми от СУБД. Эти программы на-
ходятся в каталоге sql-bench исходного дистрибутива MySQL. Они реализованы на
языке Perl и используют интерфейс баз данных DBI. Применение DBI само по себе ре-
шает проблемы переносимости, поскольку он предлагает независимые от СУБД методы
доступа.
За результатами crash-me обращайтесь по адресу http://dev.mysql.com/tech-
resources/crash-me.php. Результаты тестов производительности можно увидеть по ад-
ресу http://dev.mysql.com/tech-resources/benchmarks/.
Если вы стремитесь к независимости от СУБД, вы должны получить хорошее пред-
ставление об узких местах каждого из серверов SQL. Например, MySQL очень быстро
работает при извлечении и обновлении записей в таблицах My ISAM, но имеет проблемы
при смешанном применении медленного чтения и записи на одной и той же таблице. С
другой стороны, Oracle имеет большие проблемы при попытке получить доступ к стро-
кам, которые только что обновлены (пока они не сброшены на диск). Транзакционные
базы данных вообще не очень хороши для генерации отчетных таблиц из таблиц журна-
лов, поскольку в этом случае блокировка строк практически бесполезна.
Чтобы сделать ваши приложения действительно независимыми от СУБД, вы долж-
ны определить легко расширяемый интерфейс, посредством которого можно манипули-
ровать данными. Так как язык C++ доступен в большинстве систем, имеет смысл ис-
пользовать интерфейс доступа к базам данных, основанный на классах C++.
Если вы применяете средства, специфичные для конкретной СУБД (такие как опера-
тор REPLACE, который есть в MySQL), вы должны реализовать такие же средства для
других серверов SQL, закодировав их альтернативным методом. Несмотря на то что он
может оказаться медленнее, такой подход позволит выполнять те же задачи на других
серверах.
В MySQL вы можете использовать синтаксис /*! */ для добавления к запросам
ключевых слов, специфичных для MySQL. Код внутри /* */ рассматривается как ком-
ментарий (и игнорируется) большинством других SQL-серверов.
Если высокая производительность более важна, чем точность данных, как это бывает
в некоторых Web-приложениях, появляется возможность создать уровень приложения,
который кэширует результаты для повышения производительности. Позволяя старым
результатам запросов исчезать со временем, вы можете поддерживать кэш в достаточно
актуальном состоянии. Это является хорошим способом справиться с пиковыми нагруз-
ками, в случае которых можно динамически увеличивать размер кэша и устанавливать
таймаут "устаревания" данных в нем большим до тех пор, пока нагрузка не вернется в
норму.
В этом случае информация о создании таблицы должна включать информацию о на-
чальном размере кэша и периоде его обновления.
Альтернативой кэшу уровня приложений является использование кэша запросов
MySQL. При включенном кэше запросов сервер сам принимает решения о том, когда
результаты запросов могут быть использованы повторно. Это позволяет упростить при-
ложения. См. 4.10.
6.1. Обзор оптимизации 405
Помните, что все эти тесты однопоточные, поэтому замеряют минимальное время
выполнения операций. В будущем мы планируем добавить многопоточные тесты. Для
использования набора тестов производительности необходимо удовлетворить следую-
щим требованиям:
• Тесты производительности предоставляются исходным дистрибутивом MySQL.
Вы можете либо загрузить такой дистрибутив с http://dev.mysql.com/downloads/,
либо использовать текущее дерево разработки исходных текстов (см. раздел 2.3.3).
• Тестовые сценарии написаны на Perl и используют модуль Perl DBI для доступа к
серверам баз данных, полому DBI должен быть установлен. Вам также понадо-
бятся специфичные для сервера драйверы DBD - по одному для каждого сервера,
который необходимо протестировать. Например, чтобы протестировать MySQL,
PostgreSQL и DB2, вы должны иметь установленные модули DBD: :mysql, DBD: :Pg
и DBD:: DB2. См. раздел 2.7.
После того, как вы получите исходный дистрибутив MySQL, вы найдете набор тес-
тов производительности в его подкаталоге sql-bench. Чтобы запустить их, выполните
сборку MySQL, затем перейдите в подкаталог sql-bench и выполните сценарий
run-all-tests:
shell> cd sql-bench
shell> perl run-all-tests —server-имя^сервера
имя_сервера - это один из поддерживаемых серверов. Для получения списка опций и
поддерживаемых серверов воспользуйтесь командой:
shell> perl run-all-tests —help
Сценарий crash-me также находится в каталоге sql-bench. Этот сценарий пытается
определить, какие средства база данных поддерживает и какие у нее возможности и ог-
раничения для выполнения запросов. В частности, сценарий определяет:
• Какие поддерживаются типы столбцов.
• Сколько поддерживается индексов.
• Какие поддерживаются функции.
• Насколько большим может быть запрос.
• Насколько большими могут быть столбцы типа VARCHAR.
Вы можете найти результаты crash-me для многих различных серверов баз данных
по адресу http: //dev.mysql ..com/tech-resources/crash-me.php.
Более подробная информация о результатах тестов производительности доступна по
адресу http://dev.mysql.com/tech-resources/benchmarks.
| BENCHMARK(1000000,1+1) |
+ +
I 0|
+ +
1 row in s e t (0.32 sec)
408 Глава 6. Оптимизация MySQL
Эти результаты были получены в системе с процессором Pentium II400 Мгц. Они по-
казывают, что MySQL может выполнить в этой системе 1 000 000 простых выражений
суммирования за 0,32 секунды.
Все функции MySQL должны быть очень хорошо оптимизированы, однако сущест-
вуют и некоторые исключения. BENCHMARK () - отличный инструмент для определения,
связана ли проблема с запросами.
или
EXPLAIN SELECT onu,MM_select
Оператор EXPLAIN, как и его синоним DESCRIBE, может использоваться для получения
информации о том, как MySQL будет выполнять оператор SELECT:
• Синтаксис EXPLAIN имя_таблицы - это синоним для DESCRIBE имя_таблицы или
SHOW COLUMNS FROM имя_таблицы.
• Когда вы предваряете оператор SELECT ключевым словом EXPLAIN, MySQL объяс-
няет, как он будет обрабатывать SELECT, предоставляя информацию о том, как
объединяются таблицы и в каком порядке.
Этот раздел посвящен второму применению EXPLAIN.
С помощью EXPLAIN вы можете увидеть, когда к таблицам нужно добавить индексы,
чтобы получить более быстрый SELECT, который будет использовать индексы для поиска
записей.
Вы должны периодически запускать ANALYZE TABLE для обновления статистики таб-
лиц, такой как распределение значений ключей, которое может повлиять на принятие
решений оптимизатором.
Вы также можете увидеть, в правильном ли порядке оптимизатор выполняет соеди-
нение таблиц. Чтобы заставить оптимизатор использовать порядок соединения таблиц в
соответствии с тем, который указан в операторе SELECT, этот оператор должен начинать-
ся С SELECT STRAIGHT_JOIN вместо просто SELECT.
EXPLAIN возвращает строку информации для каждой таблицы, используемой в опера-
торе SELECT. Таблицы перечисляются в том порядке, в котором MySQL читает их при
обработке запроса. MySQL разбирает все соединения, используя однопроходный много-
связный (single-sweep multi-join) метод. Это означает, что MySQL читает строку из пер-
вой таблицы, затем находит соответствующую строку во второй таблице, затем в треть-
ей и так далее. Когда все таблицы обработаны, он выводит выбранные столбцы и вы-
полняет обратный обход в списке таблиц до тех пор, пока не найдет таблицу, в которой
есть еще подходящие строки. Следующая строка читается из этой таблицы, и процесс
продолжается со следующей таблицей.
В MySQL 4.1 формат вывода EXPLAIN был изменен, чтобы лучше работать с такими
конструкциями, как UNION, подзапросами и производными таблицами. Наиболее значи-
тельным нововведением является добавление новых столбцов: i d и s e l e c t _ t y p e . Вы не
увидите этих столбцов, если работаете с серверами более старыми, чем MySQL 4.1.
6.2. Оптимизация операторов SELECT и других запросов 409
шируется операционной системой или SQL-сервером, с ростом таблиц эти вещи будут
замедляться только в малой степени. После того, как объем данных станет слишком
большим, чтобы поддаваться кэшированию, все станет работать значительно медленнее,
до тех пор, пока ваше приложение ограничивается только количеством обращений к
диску (которое растет по закону log N). Чтобы избежать этого, с ростом объема данных
увеличивайте размер кэша ключей. Для таблиц MylSAM размер кэша ключей управляется
системной переменной keyjouf f er_size. См. раздел 6.5.2.
Это стоит за любым возможным значением для данной группы. Вы можете применять
это для достижения более высокой производительности, избегая сортировки и группи-
рования по ненужным элементам. Например, вам не нужно группировать по
customer.name в следующем запросе:
mysql> SELECT o r d e r . c u s t i d , customer.name, MAX(payments)
-> FROM order,customer
-> WHERE o r d e r . c u s t i d = customer.custid
-> GROUP BY order.custid;
В стандартном SQL вам пришлось бы добавлять customer.name в конструкцию GROUP
BY. В MySQL это имя излишне, если только вы не работаете в режиме ANSI.
Не применяйте это средство, если столбцы, которые вы пропускаете в GROUP BY, не
являются уникальными в группе. Вы получите непредсказуемые результаты.
В некоторых случаях вы можете использовать MIN () и МАХ () для получения специфи-
ческого значения столбца, даже если оно не уникально. Следующее выражение возвра-
щает значение column из строки, содержащей самое маленькое значение столбца sort:
SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)
При комбинации LIMIT колмчество_строк с DISTINCT сервер MySQL остановится,
как только найдет количество_строк уникальных строк.
Если вы не извлекаете столбцы из всех таблиц, участвующих в запросе, MySQL ос-
танавливает сканирование неиспользуемых таблиц, как только найдет первое попадание.
В следующем примере, предполагая, что t l используется перед t2 (это можно проверить
с помощью EXPLAIN), MySQL останавливает чтение из t2 (для любой отдельной строки
из t l ) , как только будет найдена первая строка t2:
SELECT DISTINCT t l . a FROM t l , t 2 where t l . a = t 2 . a ;
имя_столбца - это столбец, объявленный как NOT NULL, MySQL останавливает по-
иск строк (для отдельной комбинации ключей) после того, как найдет одну стро-
ку, соответствующую условию LEFT JOIN.
RIGHT JOIN реализован аналогично, со сменой ролей связанных таблиц.
Оптимизатор соединений вычисляет порядок, в котором должны объединяться таб-
лицы. Порядок чтения таблиц обусловлен LEFT JOIN, и STRAIGHT_JOIN помогает оптими-
затору выполнять его работу намного быстрее, поскольку ему не приходится сравнивать
различные перестановки таблиц. Помните, что это означает, что если выполняется за-
прос показанного ниже типа, MySQL выполнит полное сканирование Ь, потому что LEFT
JOIN указывает читать ее перед d:
SELECT *
FROM a,b LEFT JOIN с ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
WHERE b.key=d.key;
Чтобы исправить это, в данном случае нужно переписать запрос следующим обра-
зом:
SELECT *
FROM b , a LEFT JOIN с ON ( с . k e y = a . k e y ) LEFT JOIN d ON ( d . k e y = a . k e y )
WHERE b . k e y = d . k e y ;
• Как только MySQL отправляет заказанное число строк клиенту, он прерывает вы-
полнение запроса, если только вы не используете SQL_CALC_FOUND_ROWS.
• LIMIT 0 всегда быстро возвращает пустой набор. Это полезно для проверки за-
проса или для получения типов результирующих столбцов.
• Когда сервер использует временные таблицы для обработки запроса, LIMIT коли-
чество_строк применяется для вычисления необходимого объема дискового про-
странства.
менной памяти для создания индексов, чем это делает сервер при пересоздании
индексов, когда он выполняет LOAD DATA INFILE.
Начиная с MySQL 4.0, можно использовать также ALTER TABLE имя_таблицы
DISABLE KEYS вместо myisamchk --keys-used=O -rq /путь/к/базе_данных/
имя_таблицы и ALTER TABLE имя_таблицы ENABLE KEYS вместо myisamchk -r -q
/путь/к/базе_данных/имя_таблицы. При этом шаг FLUSH TABLES можно пропустить.
• Вы можете увеличить скорость операции вставки, которая выполняется несколь-
кими операторами, если заблокируете таблицы:
LOCK TABLES a WRITE;
INSERT INTO a VALUES (1,23), (2,34), (4,33);
INSERT INTO a VALUES (8, 26), (6,29) ;
UNLOCK TABLES;
Выигрыш в производительности появляется за счет того, что индексный буфер
сбрасывается на диск только один раз, после того, как завершатся все операторы
INSERT. Явные операторы блокировки не требуются, если вы можете вставить все
строки одним оператором.
Для транзакционных таблиц, чтобы поднять скорость, нужно использовать блоки
BEGIN/COMMIT в м е с т о LOCK TABLES.
Блокировка также снижает общее время выполнения тестов со многими соедине-
ниями, несмотря на то что максимальное время ожидания индивидуальных со-
единений может возрасти, поскольку они ожидают снятия блокировок. Например:
Connection I does 1000 inserts
Connections 2, 3, and 4 do 1 insert
Connection 5 does 1000 inserts
Если вы не применяете блокировки, соединения 2, 3 и 4 завершатся перед соеди-
нениями 1 и 5. Если же они используются, возможно, что соединения 2, 3 и 4 не
завершатся перед соединениями 1 и 5, однако общая скорость будет на 40% выше.
Операции INSERT, UPDATE и DELETE в MySQL выполняются очень быстро, но вы по-
лучите лучшую общую производительность, добавив блокировки вокруг всего, что
делает больше, чем 5 вставок или обновлений строк. Если вы делаете очень много
вставок, то можете выполнять LOCK TABLE с последующим UNLOCK TABLE периоди-
чески (с интервалом в 1000 строк), чтобы позволить другим пользователям иметь
доступ к таблице. Это также даст хороший выигрыш в производительности.
INSERT все еще работает значительно медленнее при загрузке данных, чем LOAD
DATA INFILE, даже если используются описанные выше стратегии.
• Чтобы получить еще некоторое приращение скорости для таблиц My ISAM как при
использовании INSERT, так и при LOAD DATA INFILE, можно увеличить значение
системной переменной key_buffer_size. См. раздел 6.5.2.
I Table_locks_immediate I 1151552 |
I Table_locks_waited | 15324 |
+ + +
Что касается MySQL 3.23.7 (3.23.5 для Windows), при работе с таблицами MylSAM вы
можете свободно смешивать параллельные операторы INSERT и SELECT без блокировок,
если только операторы INSERT не конкурируют между собой. То есть можно вставлять
строки в таблицы MylSAM, в то время как другой клиент осуществляет чтение из них. Ни-
каких конфликтов не возникает, если файл данных не содержит свободных блоков в се-
редине, так как в этом случае записи всегда вставляются в конец файла. (Пустоты могут
образоваться в результате удаления или обновления строк, находящихся в средине таб-
лицы.) Если есть пустоты, параллельные вставки будут включены автоматически, когда
они все будут заполнены новыми данными.
Если вы хотите выполнять множество операторов INSERT и SELECT на таблице в мо-
мент, когда параллельные вставки невозможны, вы можете вставлять строки во времен-
432 Глава 6. Оптимизация MySQL
ный файл и обновлять реальную таблицу записями из этого временного файла периоди-
чески. Это можно сделать с помощью следующего кода:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
InnoDB использует блокировки строк, a BDB - блокировки страниц. Для механизмов
хранения InnoDB и BDB взаимные блокировки возможны. Это объясняется тем, что
InnoDB автоматически вызывает блокировки строк, a BDB - блокировки страниц при вы-
полнении SQL-операторов, а не в начале транзакции.
Преимущества блокировки строк таковы:
• Меньше блокировок конфликтуют между собой, когда разные потоки работают с
разными строками.
• Меньше изменений для отката.
• Есть возможность держать блокировку отдельной строки в течение длительного
времени.
Ниже представлены недостатки блокировки строк:
• Требуется больше памяти, чем при блокировке на уровне таблиц или на уровне
страниц.
• Медленнее работает, чем блокировка уровня страниц или уровня таблиц, особен-
но когда применяется к значительной части таблицы, поскольку нужно выполнить
намного больше индивидуальных блокировок.
• Определенно гораздо хуже, чем другие типы блокировок, если вы часто выпол-
няете операции GROUP BY на значительной части данных, или если вы часто долж-
ны сканировать всю таблицу.
• При высокоуровневом блокировании гораздо проще поддерживать блокировки
других типов для настройки приложения, потому что у них нагрузка, связанная с
блокировками, меньше, чем при блокировках уровня строки.
Блокировки таблиц превосходят блокировки уровня страниц или уровня строк в сле-
дующих случаях:
• Большинство операторов, выполняемых в таблице, связано с чтением.
• Чтения и обновления по строгим ключам, когда вы модифицируете или удаляете
строку, которая может быть извлечена единственным чтением ключа:
UPDATE имя_таблицы SET столбец=значение
WHERE столбец_уникального_ключа=зна чение_ключа ;
DELETE FROM имя_таблицы WHERE столбец_уникального_ключа=значение_ключа;
• Операторы SELECT комбинируются с операторами INSERT и очень малым количе-
ством операторов UPDATE И DELETE.
• Выполняется много полных сканирований таблиц и операций GROUP BY без необ-
ходимости записи.
Ниже указаны альтернативы блокировкам строк и страниц.
Управление версиями (такое, как мы используем в MySQL для параллельных вста-
вок), когда вы можете иметь одну операцию записи одновременно со многими опера-
6.3. Вопросы блокировки 433
циями чтения. Это означает, что база/таблица поддерживают разные взгляды на данные
в зависимости от того, когда вы начинаете доступ к ним. Другие названия для этого: пе-
ремещение во времени, копирование по записи или копирование по требованию.
Копирование по требованию во многих случаях гораздо лучше, чем блокировка
уровня страницы или уровня строки. Однако в худшем случае использует больше памя-
ти, чем когда применяется нормальная блокировка.
Вместо применения блокировок уровня строки можно использовать блокировки
уровня приложения, такие как GETLOCKO и RELEASE_LOCK () в MySQL. Это экспертные
блокировки, поэтому они работают только в хорошо работающих приложениях.
Обычно сервер следует стратегии LRU (Least Recently Used - наиболее давний ис-
пользованный). То есть для замены выбирается блок, который последний раз использо-
вался наиболее давно. Чтобы иметь возможность легко осуществлять этот выбор, мо-
дуль ключевого кэша поддерживает специальную очередь (цепочку LRU) всех исполь-
зуемых блоков, и каждый раз берет оттуда для удаления первый элемент.
Кэш ключей, указываемый в операторе CACHE INDEX, может быть создан путем уста-
новки его размера в параметре SET GLOBAL или с помощью опций запуска сервера. На-
пример:
mysql> SET GLOBAL keycachel.keyjDuffer_size=128*1024;
Чтобы уничтожить кэш ключей, установите его размер в 0:
mysql> SET GLOBAL keycachel.key_buffer_size=O;
Переменные кэшей ключей - это структурные системные переменные, которые име-
ют имя и компоненты. Для keycachel.key_buffer_size, keycachel - имя переменной
кэша, a key_buf fer_size - компонент кэша.
По умолчанию индексы таблиц назначаются главному (по умолчанию) кэшу, кото-
рый создается при запуске сервера. Когда какой-то кэш ключей разрушен, все назначен-
ные ему индексы переназначаются на главный кэш.
Для нагруженного сервера мы рекомендуем стратегию с использованием трех кэшей
ключей:
• "Горячий" (hot) кэш ключей, который занимает до 20% пространства, отведенного
всем кэшам ключей. Он используется для таблиц, которые интенсивно задейст-
вуются для поиска, но редко обновляются.
• "Холодный" (cold) кэш ключей, который занимает до 20% пространства, отведен-
ного всем кэшам ключей. Используется для интенсивно обновляемых таблиц
средних размеров, таких как временные таблицы.
• "Теплый" (warm) кэш ключей, который занимает до 60% пространства, отведен-
ного всем кэшам ключей. Это кэш ключей, используемый по умолчанию всеми
остальными таблицами.
Одной из причин для применения трех кэшей ключей является выгода от того, что
обращение к одной структуре кэша не блокирует доступа к другим. Очереди, работаю-
щие с таблицами, назначенными одному кэшу ключей, не конкурируют с очередями,
работающими с таблицами, назначенными другому кэшу. Выигрыш в производительно-
сти связан и с другими причинами:
• Горячий кэш используется только для запросов чтения, поэтому его содержимое
никогда не модифицируется. Следовательно, всякий раз, когда нужно получить
индексный блок с диска, содержимое блока кэша, выбранного для замены, не
нужно сбрасывать на диск.
• Для индексов, назначенных этому кэшу, если нет запросов, требующих сканиро-
вания индекса, существует высокая вероятность того, что индексные блоки, соот-
ветствующие промежуточным узлам индексного В-дерева, останутся в кэше.
• Операции обновления, в основном проводимые во временных таблицах, выпол-
няются гораздо быстрее, если обновляемый узел уже находится в кэше и не тре-
буется его считывать с диска. Если размер индексов временных таблиц сопоста-
вим с размером холодного кэша ключей, очень высока вероятность того, что об-
новляемый узел уже находится в кэше.
Когда используется эта стратегия, цепочка LRU делится на две части: "горячую"
подцепочку и "теплую" подцепочку. Точка раздела между ними не фиксирована, систе-
ма управления кэшем ключей заботится о том, чтобы "теплая" часть не становилась
слишком короткой, а всегда содержала как минимум key_cache_division_limit процен-
тов блоков. key_cache_division_limit - это компонент структурированной переменной
кэша ключей, поэтому его значение - это параметр, который устанавливается для каждо-
го кэша.
Когда индексный блок читается из таблицы в кэш ключей, он помещается в конец
"теплой" подцепочки. После определенного количества попаданий (доступов к блоку)
он перемещается в "горячую" подцепочку. В настоящее время количество попаданий,
необходимых для этого, одинаково для всех индексных блоков. В будущем мы сделаем
счетчик попаданий зависимым от уровня узла соответствующего блока в В-дереве ин-
декса. Для узлов, находящихся ближе к корню дерева, потребуется меньше попаданий,
чем для узлов-листьев.
Блок, выбранный для переноса в "горячую" подцепочку, помещается в ее конец. Этот
блок затем циркулирует внутри подцепочки. Если блок остается в начале подцепочки в
течение достаточно длительного времени, он вытесняется в "теплую" часть. Время, необ-
ходимое для этого, определяется компонентом key_cache_age_threshold кэша ключей.
Пороговое значение, предписывающее это, вычисляется так: для кэша ключей, со-
держащего N блоков, блок, находящийся в начале "горячей" подцепочки, к которому не
осуществлялся доступ в течение N*key_cache_age_threshold/100 попаданий, должен
быть перемещен в начало "теплой" подцепочки. Затем он становится первым кандида-
том на вытеснение, потому что блоки, подлежащие замене, всегда выбираются в начале
"теплой" подцепочки кэша.
Стратегия центральной точки помогает увеличить производительность при выполне-
нии запроса, который требует сканирования индексов и эффективно вытесняет из кэша
все индексные блоки, содержащие высокоуровневые узлы В-дерева. Чтобы избежать
этого, нужно использовать стратегию вставки центральной точки со значением
key_cache_division_limit, установленным менее 100. Полезные узлы с частыми попа-
даниями будут сохранены в "горячей" подцепочке при сканировании индексов.
• Когда кэш полон и поток пытается открыть таблицу, которая еще не содержится в
кэше.
• Когда кэш содержит больше, чем table_cache позиций, и поток больше не ис-
пользует таблицу.
• Когда выполняется операция сброса таблицы. Это происходит, если кто-то вы-
полняет оператор FLUSH TABLES либо выдает команду mysqladmin flush-tables
или mysqladmin refresh.
Когда табличный кэш наполняется, сервер использует следующую процедуру, чтобы
найти позицию в кэше для использования:
• Таблицы, которые в данный момент не используются, освобождаются в порядке
последнего обращения.
• Если требуется открыть новую таблицу, но кэш полон и никакая из таблиц не мо-
жет быть освобождена, кэш временно расширяется.
Когда кэш временно расширен, и таблица переходит в состояние неиспользуемой,
она закрывается и освобождается из кэша.
Таблица открывается для каждого параллельного доступа. Это означает, что она
должна быть открыта дважды, если потоки обращаются к одной и той же таблице, или
один поток обращается к таблице дважды в одном запросе (например, выполняя соеди-
нение таблицы с нею самой). Каждое конкурирующее открытие требует позиции в таб-
личном кэше. Первое открытие любой таблицы занимает два файловых дескриптора:
один для файла данных и один для индексного файла. Каждое дополнительное исполь-
зование таблицы требует только одного файлового дескриптора - для файла данных.
Дескриптор индексного файла используется потоками совместно.
Если вы открываете таблицу оператором HANDLER имя_таблицы OPEN, то выделенный
табличный объект распределяется для потока. Этот табличный объект не разделяется
другими потоками и не закрывается до тех пор, пока поток не выполнит оператор
HANDLER имя_таблицы CLOSE, или же его выполнение прервется. Когда это случится, таб-
лица перемещается назад в табличном кэше (если он не полон).
Вы можете определить, что ваш табличный кэш маловат, проверив переменную со-
стояния mysqld с именем Opened_tables:
mysql> SHOW STATUS LIKE 'Opened_tables';
| Variable_name | Value |
+
+ +
| Opened_tables | 2741 |
+ + +
Если значение достаточно велико, даже если вы не выполняли FLUSH TABLES, вам
стоит увеличить размер табличного кэша. См. разделы 4.2.3 и 4.2.4.
быть открыта, другая должна быть закрыта. Вы можете снизить эти накладные расходы,
увеличив размер табличного кэша.
поддержку только необходимых вам наборов символов. Это управляется опцией —with-
charset сценария configure.
Ниже приведен список некоторых замеров, которые мы сделали:
• Если применяется компилятор рдсс и все компилируется с опцией -Об, mysqld ра-
ботает на 1% быстрее, чем при использовании дсс 2.95.2.
• Если применяется динамическая компоновка (без -static), результат под Linux
на 13% медленнее. Помните, что вы можете использовать динамические библио-
теки MySQL для клиентских приложений. Вышесказанное касается сервера, для
которого производительность критична.
• Если вы удаляете отладочную информацию из бинарного кода командой s t r i p
mysqld, результирующий код может стать на 4% быстрее.
• Для подключения клиента к серверу, запущенному на том же хосте, если вы под-
ключаетесь по TCP/IP вместо сокетов Unix, производительность получается на
7,5% медленнее. (В Unix, если вы подключаетесь, указывая имя хоста localhost,
MySQL использует файлы сокетов по умолчанию).
• Подключение по TCP/IP к удаленному серверу, находящемуся на другом хосте, на
8-11% медленнее, чем подключение к локальному серверу, на том же хосте, даже
если применяется сетевой интерфейс Ethernet 100 Мбит/с.
• При запуске нашего набора тестов производительности по защищенному соеди-
нению (когда все данные шифруются внутренней поддержкой SSL), производи-
тельность получается на 55% ниже, чем по незащищенному соединению.
• Если вы компилируете с —with-debug=full, большинство запросов будут выпол-
няться на 20% медленнее. Некоторые запросы могут потребовать значительно
большего времени. Например, тесты производительности MySQL выполняются на
35% медленнее. Если вы используете —with-debug (без =full), замедление соста-
вит только 15%. Для версии mysqld, скомпилированной с —with-debug=full, вы
можете выключить проверку памяти во время выполнения, запустив его с опцией
—skip-safemalloc. Конечный результат в этом случае будет близким к тому, что
получается при конфигурировании компиляции с --with-debug.
• На машине Sun UltraSPARC-lie сервер, скомпилированный Forte 5.0, работает на
4% быстрее, чем собранный с помощью gcc 3.2.
• На Sun UltraSPARC-He сервер, скомпилированный Forte 5.0, работает на 4% бы-
стрее в 32-разрядном режиме, чем в 64-разрядном.
• Компиляция с помощью дсс 2.95.2 для UltraSPARC с опциями -mcpu=v8 -Wa,
-xarch=v8plusa дает на 4% более высокую производительность.
• В Solaris 2.5.1 на однопроцессорной машине с пакетом MIT-pthreads MySQL ра-
ботает на 8-12% медленнее, чем со встроенной поддержкой потоков Solaris. При
большей загрузке процессора разница будет еще больше.
• Компиляция в Linux-x86 с использованием компилятора дсс без указателей
фреймов (-fomit-frame-pointer или -fomit-frame-pointer -ffixed-ebp) делает
mysqld на 1-4% быстрее.
Бинарный дистрибутив MySQL для Linux, который поставляется компанией MySQL
АВ, скомпилирован рдсс. Мы собираемся вернуться обратно к дсс из-за ошибки в рдсс,
6.5. Оптимизация сервера MySQL 453
• Для целей надежности может возникнуть желание использовать массив RAID 0+1
(чередование плюс зеркальное отображение), но в этом случае вам понадобится
2*N физических устройств, чтобы иметь N устройств для данных. Это, вероятно,
наилучший выбор, если вы располагаете соответствующими финансовыми сред-
ствами. Однако вы можете также инвестировать их в программное обеспечение
управления дисковыми томами, для повышения эффективности.
• Хорошее решение - варьировать уровень RAID в соответствии с тем, насколько
критичны данные. Например, разместите маловажные данные, которые можно ре-
генерировать, на диск RAID 0, но сохраните действительно важные данные, такие
как информация хоста и протоколы, на диске RAID 0+1 или RAID N. Применение
RAID N может стать проблемой, если у вас много операций записи, из-за времени,
необходимого для обновления битов четности.
• В Linux вы можете получить намного более высокую производительность, ис-
пользуя hdparm для конфигурирования вашего дискового интерфейса (До 100%
под нагрузкой не является чем-то необычным.) Следующие параметры hdparm
должны быть достаточно хороши для MySQL и, предположительно, для многих
других приложений:
hdparm -m 16 -d 1
Помните, что производительность и надежность при использовании этой команды
зависит от существующего оборудования, поэтому мы настоятельно советуем
всесторонне протестировать систему после применения команды hdparm. Оз-
накомьтесь с man-страницами, посвященными hdparm, чтобы получить более под-
робную информацию. Если hdparm применять неосмотрительно, результатом мо-
жет быть повреждение файловой системы, поэтому сделайте резервные копии пе-
ред тем, как будете экспериментировать!
• Вы также можете установить параметры файловой системы, которую использует
база данных:
Если вам не нужно знать, когда осуществлялся доступ к файлам в последний раз
(что на самом деле не очень-то нужно для сервера баз данных), вы можете смон-
тировать файловую систему с опцией -о noatime. Это позволит пропускать об-
новления последнего времени доступа в узлах inode файловой системы, что со-
кратит количество обращений к диску.
На многих операционных системах вы можете настроить асинхронное обновление
файловой системы, монтируя ее с опцией -о async. Если ваш компьютер доста-
точно стабилен, это даст более высокую производительность, без необходимости
приносить в жертву надежность. (Этот флаг в Linux применяется по умолчанию.)
Клиентские программы
и утилиты MySQL
Похожая утилита, pack_isam, сжимает таблицы ISAM. Поскольку формат таблиц ISAM
считается устаревшим, в этом разделе описывается только myisampack, но основные
приемы работы с myisampack подходят также и для packisam, если иное не оговорено
специально.
Следует отметить такие моменты:
• Если сервер mysqld был запущен с опцией —skip-external-locking, не стоит за-
пускать myisampack в отношении таблицы, которую сервер может обновлять од-
новременно с процессом упаковки.
• После упаковки таблицы она становится доступной только для чтения. В общем,
так и было задумано (например, для работы со сжатыми таблицами на компакт-
диске). Обеспечение возможности записи в сжатые таблицы есть в наших планах,
но имеет низкий приоритет.
• myisampack может сжимать столбцы типа TEXT и BLOB. Старая утилита pack_isam
делать это не может.
Запуск myisampack выглядит следующим образом:
shell> myisampack [опции] имя_файла . . .
Каждое имя файла должно быть именем индексного файла (.MYI). Если вы находи-
тесь не в каталоге базы данных, потребуется указать полный путь к файлу. Допускается
не указывать расширение .MYI.
myisampack поддерживает следующие опции:
• —help, -?. Выводит страницу справки и завершает работу.
• --backup, -b. Создает резервную копию данных таблицы под именем
имя_таблицы. OLD.
• —debug [=опции_отладки], -# [опции_отладки]. Записывает журнал отладки.
Обычно строка опции_отладки имеет формат ' d: t :о,имя_файла'.
• —force, -f. Создает упакованную таблицу, даже если она получается больше, чем
исходная, или же найден временный файл, оставшийся от предыдущего запуска
myisampack. (myisampack создает временный файл с именем имя_таблицы.ИШ во
время сжатия таблицы. Если прервать работу myisampack, временный файл может
остаться на диске.) Обычно myisampack завершается с сообщением об ошибке, ес-
ли обнаруживает, что файл имя_таблицы.TMD не удален. С опцией —force упаков-
ка выполняется в любом случае.
• —-}о±п=имя_болыпой_таблицы, -j имя_большой_таблицы. Соединяет все таблицы,
перечисленные в командной строке, в одну таблицу имя_болыпой_таблицы. Все
таблицы, которые нужно соединить таким образом, должны иметь идентичную
структуру (одинаковые имена и типы столбцов, одинаковые индексы и так далее).
• —packlength=#, -р #. Указывает длину адреса записи в байтах. Значением долж-
но быть 1, 2 или 3. myisampack сохраняет все записи с длиной указателей в 1, 2
или 3 байта. В большинстве нормальных случаев myisampack может определить
правильное значение длины до начала упаковки файла, но в процессе может об-
наружить, что допустимо использовать меньшее значение. В этом случае
myisampack выводит сообщение об этом, чтобы следующий раз, когда вы будете
упаковывать этот файл, вы смогли использовать более короткую длину указателя.
7.2. myisampack — генератор сжатых таблиц MySQL, доступных только для чтения 463
14 222 4
15 226 16
16 242 20
17 262 20
18 282 20
19 302 30
20 332 4
21 336 4
22 340 1
23 341 8
24 349 8
25 357 8
26 365 2
27 367 2
28 369 4
29 373 4
30 377 1
31 378 2
32 380 8
33 388 4
34 392 4
35 396 4
36 400 4
37 404 1
38 405 4
39 409 4
40 413 4
41 417 4
42 421 4
43 425 4
44 429 20
45 449 30
46 479 1
47 480 1
48 481 79
49 560 79
50 639 79
51 718 79
52 797 8
53 805 1
54 806 1
55 807 20
56 827 4
57 831 4
shell> myisampack station.MYI
Compressing station.MYI: (1192 records)
- Calculating statistics
normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11
pre-space: 0 end-space: 12 table-lookups: 5 zero: 7
Original trees: 57 After join: 17
- Compressing file
7.2. myisampack - генератор сжатых таблиц MySQL, доступных только для чтения 465
87.14%
Remember to run myisamchk -rq on compressed tables
shell> Is -1 station.*
-rw-rw-r— 1 monty my 127874 Apr 17 19:00 station.MYD
-rw-rw-r— 1 monty my 55296 Apr 17 19:04 station.MYI
-rw-rw-r— 1 monty my 5767 Apr 17 19:00 station.frm
shell> myisamchk - d w station
MylSAM file: station
Isam-version: 2
Creation time 1996-03-13 10:08:58
Recover time: 1997-04-17 19:04:26
Data records: 1192 Deleted blocks: 0
Datafile parts: 1192 Deleted data: 0
Datafile pointer (bytes): 3 Keyfile pointer (bytes): 1
Max datafile length: 16777215 Max keyfile length: 131071
Recordlength: 834
Record format: Compressed
table description:
Key Start Len Index Type Root Blocksize Rec/key
1 2 4 unique unsigned long 10240 1024 1
2 32 30 multip.text 54272 1024 1
Field Start Length Type Huff tree Bits
1 1 1 constant 1 0
2 2 4 zerofill(l) 2 9
3 6 4 no zeros, zerofill(l) 2 9
4 10 1 3 9
5 11 20 table-lookup 4 0
6 31 1 3 9
7 32 30 no endspace, not always 5 9
8 62 35 no endspace, not always, no empty 6 9
9 97 35 no empty 7 9
10 132 35 no endspace, not always, no empty 6 9
11 167 4 zerofill(l) 2 9
12 171 16 no endspace, not_always, no empty 5 9
13 187 35 no endspace, not always, no empty 6 9
14 222 4 zerofill(l) 2 9
15 226 16 no endspace, not_always, no empty 5 9
16 242 20 no endspace, not always 8 9
17 262 20 no endspace, no empty 8 9
18 282 20 no endspace, no empty 5 9
19 302 30 no endspace, no empty 6 9
20 332 4 always zero 2 9
21 336 4 always zero 2 9
22 340 1 3 9
23 341 8 table-lookup 9 0
24 349 8 table-lookup 10 0
25 357 8 always zero 2 9
26 365 2 2 9
27 367 2 no zeros, zerofill(l) 2 9
28 369 4 no zeros, zerofill(l) 2 9
466 Глава 7. Клиентские программы и утилиты MySQL
29 373 4 table-lookup 11 0
30 377 1 3 9
31 378 2 no zeros, zerofill(l) 2 9
32 380 8 no zeros 2 9
33 388 4 always zero 2 9
34 392 4 table-lookup 12 0
35 396 4 no zeros, zerofill(l) 13 9
36 400 4 no zeros, zerofill(l) 2 9
37 404 1 9
Csl
38 405 4 no zeros 2 9
39 409 4 always zero 2 9
40 413 4 no zeros 2 9
41 417 4 always zero 2 9
42 421 4 no zeros 2 9
43 425 4 always zero 2 9
44 429 20 no empty 3 9
45 449 30 no empty 3 9
46 479 1 14 4
47 480 1 14 4
48 481 79 no endspace, no empty 15 9
49 560 79 no empty 2 9
50 639 79 no empty 2 9
51 718 79 no endspace 16 9
52 797 8 no empty 2 9
53 805 1 17 1
54 806 1 3 9
55 807 20 no empty 3 9
56 827 4 no zeros, zerofill(2) 2 9
57 831 4 no zeros, zerofill(l) 9
Csl
весь и буферизировать его перед выводом. Для получения результата необходимо будет
вызывать mysql_use_result () вместо mysql_store_result ().
Использование mysql очень просто. Вызовите его из командной оболочки, как пока-
зано ниже:
s h e l l > mysql имя_базы__данных
или
s h e l l > mysql —\1зег=имя_пользователя —password=napojib имя__базы_данных
Затем вводите операторы SQL, завершая каждый символом ' ; ' , \д или \G и нажимая
клавишу <Enter>.
Вы также можете запускать сценарии следующим образом:
s h e l l > mysql имя_базы__данных < s c r i p t . s q l > output.tab
mysql поддерживает следующие опции:
• — h e l p , - ? . Выводит страницу справки и завершает работу.
• —batch, -В. Печатает результаты, используя символ табуляции в качестве разде-
лителя столбцов; каждая запись таблицы находится в отдельной строке. С этой
опцией mysql не использует файл хронологии.
• — c h a r a c t e r - s e t s - d i r = n y T b . Каталог, в котором установлен символьный набор.
См. раздел 4.7.1.
• —compress, -С. Сжимает всю информацию, пересылаемую между клиентом и
сервером, если оба поддерживают сжатие.
• —databaзе=имя_базы_данных, -D имя_базы_данных. База данных, с которой нужно
работать. Обычно указывается в конфигурационном файле.
• —debug [=опции_отладш], -# [опции_отладки]. Записывает журнал отладки.
Обычно строка опции_отладки имеет формат ' d : t : o , и м я _ ф а й л а \ П о умолчанию
'd:t:o,/tmp/mysql.trace 1 .
• —debug-info, -T. Печатает некоторую отладочную информацию при завершении
работы программы.
• —default-character-set=Ha6op. Использует набор в качестве набора символов
по умолчанию. См. раздел 4.7.1.
• —execute=onepaTop, -e оператор. Выполняет оператор и завершает работу. Фор-
мат по умолчанию такой же, как при использовании — b a t c h .
• — f o r c e , -f. Продолжает работу, даже если возникнет ошибка SQL.
• —host=H/wi_xocTa, -h имя_хоста. Подключается к серверу MySQL на указанном
хосте.
• --html, -H. Генерирует вывод в формате HTML.
• --ignore-space, - i . Игнорирует пробелы после имен функций. Эффект от этой
опции описывается в ходе обсуждения IGNORE_SPACE в разделе 4.2.2.
• — l o c a l - i n f i l e [ = {0 11} ]. Включает и выключает свойство LOCAL для LOAD DATA
INFILE. Если ничего не указано, опция включает LOCAL. Для явного включения и
выключения следует использовать --local-infile=0 или ~ l o c a l - i n f i l e = l .
Включение LOCAL не имеет эффекта, если сервер его не поддерживает.
7.3. Инструмент командной строки mysql 469
указывать никакого значения этой опции, mysql проверяет значение переменной окру-
жения PAGER и использует его в качестве имени программы просмотра. Постраничный
просмотр вывода можно включать интерактивно командой pager и отключать командой
nopager. Эта команда принимает необязательный аргумент. Если он есть, устанавлива-
ется указанная им программа просмотра. Если аргумента нет, выбирается программа,
переданная в опции командной строки, а если не указана и там, то для просмотра ре-
зультатов запросов используется стандартный вывод stdout.
Постраничный просмотр работает только в средах Unix, так как для него применяет-
ся функция рореп (), которая в Windows отсутствует. Для Windows вместо этого можно
использовать команду tee, которая сохранит весь вывод запроса в файле, несмотря на то
что в ряде случаев для просмотра результатов это не так удобно, как применение pager.
Вот несколько советов относительно команды pager:
• Вы можете использовать эту команду для вывода в файл, при этом результаты по-
ступят только в файл:
mysql> pager cat > /tmp/log.txt
Вы можете также передавать любые опции программе, используемой для постра-
ничного просмотра:
mysql> pager less -n -i -S
• В предыдущем примере обратите внимание на опцию -S. Это удобно для про-
смотра очень широких результатов запроса. Иногда такие результирующие набо-
ры очень трудно читать на экране. Опция -S программы less может помочь в по-
добной ситуации, поскольку позволит выполнять горизонтальную прокрутку ши-
рокого текста с помощью клавиш со стрелками вправо и влево. Вы можете
использовать -S интерактивно внутри less, чтобы включать и отключать режим
горизонтальной прокрутки. Более подробную информацию можно получить из
руководства по less:
shell> man less
• Есть возможность задавать очень сложные команды постраничного просмотра
для работы с результатами запросов:
mysql> pager cat | tee /drl/tmp/res.txt \
| tee /dr2/tmp/res2.txt | less -n -i -S
В этом примере команда будет отправлять результат запроса в два файла, которые
хранятся в двух разных каталогах на двух разных файловых системах, смонтиро-
ванных на /drl и /dr2, вдобавок отображая его на экране командой less.
Вы можете комбинировать функции tee и pager. Имея включенным tee и pager, ус-
тановленным в less, вы сможете просматривать результат в less и одновременно со-
хранять вывод в файле. Разница между Unix-командой tee, применяемой с командой
pager, и встроенной в mysql командой tee состоит в том, что встроенная команда tee
работает, даже если соответствующая команда Unix недоступна. Встроенная команда
tee регистрирует в журнале все, что выводится на экран, в то время как Unix-команда
tee, применяемая совместно с pager, записывает не все.
Кроме того, регистрацию в журнале встроенной командой tee можно включать и от-
ключать интерактивно внутри mysql. Это удобно, если вы хотите регистрировать только
некоторые запросы, но не все.
474 Глава 7. Клиентские программы и утилиты MySQL
Символ ' \ ' с последующей любой буквой просто представляет эту букву.
Если вы вводите команду prompt без аргументов, mysql возвращает приглашение к
значению по умолчанию - mysql>.
Приглашение можно установить разными способами:
• Используя переменную окружения. Вы можете в переменной окружения уста-
новить строку приглашения mysql, например:
shell> export MYSQLJ>S1=" (\u@\h) [\d]> "
• Используя конфигурационный файл. Вы можете установить форму приглаше-
ния в группе [mysql] конфигурационного файла MySQL - /etc/my.cnf или
.my. cnf в домашнем каталоге. Например:
[mysql]
prompt=(\\u@\\h) [\\d]>\\_
7.3. Инструмент командной строки mysql 475
Обратите внимание, что в этом примере обратные косые черты дублируются. Ес-
ли вы установите приглашение, используя опцию prompt в конфигурационном
файле, желательно дублировать обратные косые черты, когда используются спе-
циальные параметры приглашения. Набор допустимых параметров приглашения
частично переопределяется со специальными управляющими последовательно-
стями, которые распознаются в конфигурационных файлах. (Эти последователь-
ности перечислены в разделе 3.3.2.) Это переопределение может привести к про-
блемам, если использовать одинарные обратные косые черты. Например, \s будет
интерпретироваться как пробел вместо того, чтобы означать секунды текущего
времени. В следующем примере показано, как определить приглашение в конфи-
гурационном файле, чтобы включить в него текущее время в формате ЧЧ:ММ:СС>:
[mysql]
prompt="\\r:\\m:\\s> "
• Используя опцию командной строки. Можно установить приглашение в опции
—prompt командной строки mysql, например:
shell> mysql --prompt=" (\u@\h) [\d]> "
{пользователь®хост) [база__данных] >
• Интерактивно. Изменить форму приглашения можно также интерактивно, ис-
пользуя команду prompt (или \R), например:
mysql> prompt (\u@\h) [\d]>\_
PROMPT set to '(\u@\h) [\d]>\_'
{пользователь®хост) [база^данных]>
{пользователь®хост) [база_данных]> prompt
Returning to default PROMPT of mysql>
mysql>
• Все большие результаты запросов SELECT ограничиваются 1000 строк, если только
не включают конструкцию LIMIT.
• Многотабличные операторы SELECT, которые предположительно должны прове-
рить более 1 000 000 комбинаций строк, прерываются.
Чтобы указать ограничения, отличные от 1000 и 1000000, вы можете переопределить
умолчания, используя опции —select_limit и —max_join_size:
shell> mysql --safe-updates --select_limit=500 --max_join_size=10000
I a |
+ +
| NULL |
Поскольку mysqlbinlog преобразует операторы LOAD DATA INFILE В LOAD DATA LOCAL
INFILE (то есть, добавляет LOCAL), и клиент, и сервер, которые используются для обра-
ботки этих операторов, должны быть настроены так, чтобы разрешать LOCAL.
| Внимание!
Щ Временные файлы, которые создаются для LOAD DATA INFILE, не удаляются автоматически,
Щ поскольку они нужны д о т е х пор, пока в действительности не будут выполнены эти операторы.
Ш Вы должны удалить их самостоятельно после того, как отпадет необходимость в журнале. Э т и
§и файлы можно найти в каталоге временных файлов под именами вроде оригиналь-
Щ ное_имя__ фа ила - # - #.
inf
-inf
Глава 7. Клиентские программы и утилиты MySQL
что таблицы в файле дампа будут логически согласованы между базами данных.
Таблицы разных баз могут быть выгружены полностью в разном состоянии.
• —master-data. Эта опция подобна —first-slave, но также генерирует оператор
CHANGE MASTER TO, который заставит подчиненный сервер репликации начинать с
правильной позиции в бинарном журнале главного сервера, если вы используете
этот SQL-дамп главного сервера для настройки подчиненного.
• —no-create-db, -п. Эта опция подавляет операторы CREATE DATABASE /* 132312
IF NOT EXISTS*/ имя_базы_данных, которые в противном случае включаются в
дамп, если были указаны опции —databases или —all-databases.
• —no-create-info, -t. He пишет в дамп операторы CREATE TABLE, которые пере-
создают каждую выгружаемую таблицу.
• —no-data, -d. He выводит никакой информации из строк таблицы. Это полезно,
если необходимо получить дамп структур таблиц.
• —opt. Эта опция является сокращением; она имеет тот же смысл, что и сочетание
—quick —add-drop-table —add-locks —create-options —disable-keys
—extended-insert --lock-tables. Опция позволяет выполнить операцию вы-
грузки дампа быстро и сгенерирует файл, который может быть быстро загружен
на сервер MySQL. Начиная с MySQL 4.1, --opt используется по умолчанию, но
может быть отключена с помощью —skip-opt. Чтобы отключить только некото-
рые из опций, включаемых —opt, нужно использовать соответствующую форму
—skip. Например, —skip-add-drop-table или —skip-quick.
• — password [^пароль], -р[пароль]. При подключении к серверу использует ука-
занный пароль. Имейте в виду, что если вы указываете краткую форму этой опции
(-р), то не должны оставлять пробел между названием опции и паролем. Если в
командной строке пароль не указан, он будет запрошен интерактивно.
• —рогt=HOMep_nopта, -Р номер__порта. Номер порта TCP/IP для подключения.
• —protocol={TCP I SOCKET | PIPE | MEMORY}. Сетевой протокол для подключе-
ния к серверу. Эта опция введена в MySQL 4.1.
• —quick, -q. Эта опция применима для выгрузки больших таблиц. Она заставляет
mysqldump извлекать строки для дампа по одной, вместо того чтобы извлечь сразу
весь результирующий набор и поместить его в буфер в памяти перед записью в дамп.
• --quote-names, -Q. Помещает имена баз данных, таблиц и столбцов в кавычки ' N '.
Если SQL-режим сервера включает опцию ANSI_QUOTES, имена помещаются в
двойные кавычки. Начиная с MySQL 4.1.1, опция —quote-names включена по
умолчанию.
• —result-file=$awi, -r файл. Направляет вывод в указанный файл. Эта опция
должна использоваться в Windows, поскольку она предохраняет символ новой
строки с \п' от преобразования в '\г\п' (перевод строки, возврат каретки).
• —single-transaction. Эта опция выдает SQL-оператор BEGIN перед выгрузкой
данных с сервера в дамп. В основном она применима с таблицами innoDB и уров-
нем изоляции транзакций READ COMMITED, так как в этом режиме она выгружает
базу данных в непротиворечивом состоянии, в котором база была на момент
BEGIN, без блокировки других приложений.
7.8. Программа резервного копирования баз данных mysqldump 491
w imptest.txt
32
q
shell> od -c imptest.txt
0000000 1 0 0 \ t M a x S y d o w \ n1 0
0000020 1 \ t C o u n t D r a c u l a \ n
0000040
shell> mysqlimport —local test imptest.txt
test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
shell> mysql -e 'SELECT * FROM imptesf test
I id |n I
+ + +
I 100 | Max Sydow |
I 101 | Count Dracula |
+ + +
Механизмы хранения и
типы таблиц в MySQL
Учтите, что для того чтобы использовать механизм хранения innoDB в MySQL 3.23, по-
требуется сконфигурировать, по крайней мере, опцию запуска innodb_data_file_path.
В версии 4.0, а также в более новых версиях механизм хранения InnoDB использует оп-
ции конфигурации, принятые по умолчанию (если только вы не определите свои опции).
См. раздел 9.4.
Таблицы без транзакций обладают своими преимуществами, что объясняется именно
отсутствием транзакций:
• Более высокая скорость работы.
• Меньшие требования к дисковому пространству.
• Для выполнения обновлений требуется меньше памяти.
В одних и тех же операторах можно комбинировать таблицы с транзакциями и таб-
лицы без транзакций, что дает возможность пользоваться преимуществами таблиц обеих
типов. Однако если для транзакции отключить режим автоматической фиксации, то из-
менения в таблицах без транзакций все равно будут мгновенно фиксироваться, без воз-
можности выполнения отката.
ление новых строк называется параллельной вставкой.) При удалении строки или
обновлении строки с динамически изменяющейся длиной большим количеством
данных может возникнуть свободный блок. Если будут заняты (заполнены) все
свободные блоки, все последующие вставки вновь будут параллельными.
• Файл данных и индексный файл можно сохранять в различных каталогах, что
способствует повышению скорости работы (опции DATA DIRECTORY и INDEX
DIRECTORY ДЛЯ CREATE TABLE).
• В версии MySQL 4.1 каждый столбец символов может содержать символы в раз-
личных кодировках.
• Индексный файл My ISAM имеет флаг, который указывает на то, правильно ли была
закрыта таблица. Если для запуска использовать команду mysqld с опцией
--myisam-recover, тогда при открытии таблиц MylSAM будет выполняться автома-
тическая проверка (и восстановление в случае необходимости), если они не были
закрыты должным образом.
• Утилита myisamchk будет отмечать таблицы как проверенные, если использовать
опцию —update-state. Если указать опцию —fast, проверку пройдут только те
таблицы, которые не имеют такой пометки.
• С помощью опции —analyze утилита myisamchk будет сохранять статистические
данные по частям ключа, а не по всему ключу в целом, как в ISAM.
• Утилита myisamchk способна упаковывать столбцы BLOB и VARCHAR; утилита
pack_isam- нет.
Механизм хранения данных My ISAM обладает также рядом других возможностей, вос-
пользоваться которыми в MySQL можно будет в обозримом будущем:
• Поддержка типа VARCHAR; столбец VARCHAR начинается со значения длины, зани-
мающего два байта.
• Таблицы с VARCHAR могут иметь как фиксированную, так и динамически изме-
няющуюся длину записи.
• Столбцы VARCHAR и CHAR могут быть длиной до 64 Кбайт.
• Для UNIQUE может использоваться вычисленный хешированный индекс. Благодаря
этому вы сможете работать с UNIQUE в любой комбинации столбцов в таблице. (С
другой стороны, вы не сможете производить поиск по вычисленному индексу
UNIQUE.)
Среди трех форматов хранения данных в механизме My ISAM статический формат яв-
ляется самым простым и наиболее безопасным (данные в таблицах этого формата менее
всего подвержены искажению). Также он является наиболее быстрым среди форматов,
работающих с дисками. Повышение скорости работы достигается за счет простоты ал-
горитма поиска строк в файле данных, хранящемся на диске: для поиска строки в индек-
се ее номер умножается на длину строки. Кроме того, при сканировании таблицы очень
просто считывать постоянное число записей при каждой операции чтения с диска.
Безопасность таблицы можно будет оценить, если произойдет сбой в работе компью-
тера во время записи сервером MySQL файла My ISAM фиксированной длины. В этом слу-
чае утилита myisamchk сможет без труда определить начало и окончание каждой строки,
поэтому обычно с ее помощью можно восстановить все записи за исключением частич-
но перезаписанных. Имейте в виду, что индексы таблицы My ISAM всегда можно реконст-
руировать на основе строк данных.
К характеристикам таблиц статического формата можно отнести следующие:
• Все столбцы CHAR, NUMERIC и DECIMAL заполняются пробелами по всей ширине
столбца.
• Высокая скорость работы.
• Простота кэширования.
• Простота восстановления данных после сбоя (благодаря тому, что записи распо-
лагаются в фиксированных позициях).
• Не нуждаются в реорганизации данных кроме тех случаев, когда вы удаляете боль-
шое число записей и хотите передать освобожденное пространство диска операци-
онной системе. Для этого используется OPTIMIZE TABLE или myisamchk -r.
• Обычно требуют больше пространства на диске, чем таблицы динамического
формата.
белов в конце строки, или если столбец с числами будет иметь нулевое значение,
он будет отмечен в битовой карте и не будет сохранен на диск. Строка с содер-
жимым сохраняется в виде байта длины и ее содержимого.
• Для динамических таблиц обычно требуется меньше дискового пространства, чем
для таблиц статического формата.
• Каждая запись занимает столько пространства, сколько это необходимо. Однако
если запись становится большей, она разделяется на требуемое количество частей,
что в результате приводит к фрагментации записи. Так, если вы обновите строку
информацией, которая заполнит всю длину строки, строка окажется фрагменти-
рованной. В этом случае вам придется периодически выполнять команду
OPTIMIZE TABLE или запускать утилиту myisamchk с опцией -г, чтобы добиться
более высокой производительности. Статистику по таблице можно получить с
помощью утилиты myisamchk с опцией -ei.
• Восстанавливать таблицы динамического формата после сбоев труднее, чем ста-
тические таблицы, поскольку запись может оказаться фрагментированной и быть
разделена на множество частей; кроме этого, может отсутствовать ссылка (или
фрагмент).
• Длину строки для динамически изменяющихся записей можно приблизительно
оценить следующим образом:
3
+ {количество столбцов + 7) / 8
+ {количество столбцов с символами)
+ {упакованный размер столбцов с числами)
+ {длина строк)
+ {количество столбцов со значением NULL + 7) / 8
На каждую ссылку добавляется по 6 байт. Динамические записи связываются при
каждом увеличении записи в момент ее обновления. Каждая новая ссылка будет
иметь размер как минимум 20 байт, поэтому следующее увеличение можно будет
произвести по той же ссылке. В противном случае будет использоваться другая
ссылка. Количество ссылок можно узнать с помощью команды myisamchk -ed.
Удалить ссылки можно с помощью команды myisamchk -r.
цесс mysqld не запущен, вы можете также проверить или восстановить таблицу с помо-
щью myisamchk. См. раздел 4.6.2.1.
Если повреждение таблиц происходит слишком часто, попытайтесь установить при-
чину этого. Прежде всего, необходимо выяснить, связано ли повреждение таблиц со
сбоем на сервере. Просмотрите журнал ошибок: он должен содержать новое сообщение
restarted mysqld, свидетельствующее о том, что повреждение таблицы произошло
вследствие сбоя на сервере. Повреждение таблицы может произойти также во время вы-
полнения обычной операции, что свидетельствует о программной ошибке. В этом случае
желательно создать тестовый случай, с помощью которого можно было бы установить
причину неприятностей. См. раздел А.4.2.
Обратите внимание на то, что в таблице MERGE столбец а имеет индекс, хотя и не объ-
явлен как PRIMARY KEY, подобно остальным таблицам My ISAM. Это объясняется тем, что
таблица MERGE не может обеспечить уникальность каждой таблицы, входящей в данную
совокупность.
После того как будет создана таблица MERGE, можно выполнить следующее действие:
mysql> SELECT * FROM total;
+—+ +
I a | message |
+—+ +
1 | Testing |
2 | table |
3 I tl |
1 | Testing |
2 | table |
3 I t2 I
+ + +
Обратите внимание на то, что манипулировать файлом .MRG можно и за пределами
сервера MySQL:
shell> cd /каталог_данных_тузд1/текущая_база_данных
shell> Is -1 tl t2 > total.MRG
shell> mysqladmin flush-tables
Чтобы создать новую совокупность таблиц My ISAM в таблице MERGE, необходимо вы-
полнить следующие действия:
• Выполните команду DROP и повторно создайте таблицу.
• С помощью команды ALTER TABLE имя_таблицы UNION= (...) измените список
таблиц, входящих в совокупность.
• Измените файл . MRG и выполните оператор FLUSH TABLE для таблицы MERGE и всех
ее таблиц, чтобы механизм хранения мог прочитать новый файл описания.
Ниже представлены возможности таблиц MERGE:
• Довольно простое управление совокупностью журнальных таблиц. Так, например,
можно ввести данные по различным месяцам в различные таблицы, сжать некото-
рые из них с помощью утилиты myisampack и затем создать таблицу MERGE, чтобы
использовать их как одну.
• Более высокая скорость работы. Можно разделить по некоторым критериям
большие таблицы формата только для чтения и сохранить получившиеся отдель-
ные таблицы на различных дисках. С такой таблицей MERGE можно будет работать
гораздо быстрее, чем с действительно одной большой таблицей. (Аналогичные
преимущества можно получить, используя дисковый массив RAID.)
• Более эффективный поиск данных. Если вы точно знаете, что ищете, тогда поиск
можно сделать по некоторым запросам в одной таблице, входящей в совокуп-
ность, а таблицу MERGE использовать для других запросов. Можно работать также
с множеством различных таблиц MERGE с перекрывающимися совокупностями
таблиц.
8.2. Механизм хранения MERGE 511
• До выхода версии MySQL 4.1.1 таблица MERGE и все ее таблицы должны были
храниться в одной и той же базе данных.
• Оператор REPLACE не работает.
• Нельзя выполнять операторы DROP TABLE, ALTER TABLE или DELETE FROM без кон-
струкции WHERE, a REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE TABLE ИЛИ ANALYZE
TABLE для любой таблицы, входящей в состав таблицы MERGE, которая, в свою оче-
редь, является "открытой". Если вы попытаетесь выполнить один из упомянутых
операторов, таблица MERGE, вероятно, все еще будет ссылаться на исходную таб-
лицу, и вы получите непредсказуемые результаты. Самый простой способ реше-
ния этой проблемы заключается в выполнении оператора FLUSH TABLES, который
позволит проверить наличие "открытых" таблиц MERGE.
• Таблица MERGE не может поддерживать ограничения UNIQUE для всех своих таб-
лиц. При выполнении команды INSERT данные переносятся в первую или послед-
нюю таблицу My ISAM (в зависимости от значения, присвоенного опцией
INSERTMETHOD). MySQL гарантирует, что уникальные значения ключей остаются
уникальными в пределах данной таблицы My ISAM, но не во всех таблицах, входя-
щих в совокупность.
• До версии MySQL 3.23.49 оператор DELETE FROM таблица^тегде без конструкции
WHERE очищал только отображение для таблицы. Другими словами, вместо удале-
ния записей из отображенных таблиц она некорректно освобождала файл .MRG.
• Применение оператора RENAME TABLE к активной таблице MERGE может привести к
повреждению данных в таблице. Эта проблема будет решена в версии MySQL
4.1.x.
• Когда вы создаете таблицу MERGE, не выполняется проверка существования таб-
лиц, входящих в совокупность, и идентичности их структуры. Когда используется
таблица MERGE, MySQL быстро проверяет, равна ли длина записей во всех отобра-
женных таблицах, что, однако, не очень надежно. Если вы попытаетесь сформи-
ровать таблицу MERGE на основе разнородных таблиц My ISAM, вы наверняка
столкнетесь с проблемами.
• Порядок индексов в таблице MERGE и в ее таблицах должен быть одинаковым. Ес-
ли вы используете ALTER TABLE для добавления индекса UNIQUE в таблицу, входя-
щую в состав таблицы MERGE, и затем будете использовать ALTER TABLE для добав-
ления неуникального индекса в таблицу MERGE, то порядок индексов в таблицах
окажется различным, если в таблице, входящей в состав таблицы MERGE, оставался
старый неуникальный индекс. (Это происходит из-за того, что оператор ALTER
TABLE ставит индексы UNIQUE перед неуникальными индексами, чтобы можно бы-
ло выявлять дублированные ключи на самой ранней стадии их появления.) По-
этому запросы могут вернуть неожиданные результаты.
• Оператор DROP TABLE, выполненный над таблицей, входящей в состав таблицы
MERGE, не работает в среде Windows, поскольку механизм MERGE скрывает отобра-
жение таблиц от верхнего уровня MySQL. Так как в Windows не разрешается уда-
лять открытые файлы, то сначала необходимо будет сбросить на диск все таблицы
MERGE (с помощью FLUSH TABLES) или удалить таблицу MERGE, прежде чем удалить
таблицу. Эту ошибку мы планируем исправить с введением представлений.
8.3. Механизм хранения данных MEMORY (HEAP) 513
главном сервере впервые с момента его запуска, оператор DELETE FROM регистри-
ровался в бинарном журнале главного сервера автоматически, синхронизируя
подчиненный и главный серверы. Обратите внимание на то, что даже с учетом
упомянутой стратегии подчиненный сервер все равно будет хранить устаревшие
данные в таблице в промежутке времени между перезапуском главного сервера и
первым его обращением к таблице. Однако если для заполнения таблицы MEMORY
во время запуска главного сервера указать опцию — i n i t - f i l e , интервал простоя
будет равен нулю.
• Объем памяти, необходимый для одной строки в таблице MEMORY, можно вычис-
лить следующим образом:
SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2)
+ ALIGN(length_of_row+l, sizeof(char*))
ALIGN () соответствует коэффициенту округления, благодаря которому длина
строки будет кратна размеру указателя char. Величина sizeof (char*) равна 4 на
32-разрядных компьютерах и 8 на 64-разрядных.
Чтобы указать явно, что вы хотите работать с таблицей BDB, воспользуйтесь таблич-
ной опцией ENGINE или TYPE:
CREATE TABLE t (i INT) ENGINE = BDB;
CREATE TABLE t (i INT) TYPE = BDB;
В опциях ENGINE и TYPE BerkleyDB является синонимом BDB.
Механизм хранения BDB работает с транзакционными таблицами. Варианты исполь-
зования этих таблиц зависят от режима автоматической фиксации:
• Если вы работаете с включенной автоматической фиксацией (она включена по
умолчанию), изменения в таблицах BDB будут незамедлительно фиксироваться, и
не могут быть возвращены.
• Если вы работаете с отключенной автоматической фиксацией, изменения не будут
фиксироваться до тех пор, пока вы не выполните команду COMMIT. Вместо фикса-
ции можно выполнить команду ROLLBACK, чтобы отменить внесенные изменения.
Можно запустить транзакцию с помощью оператора BEGIN WORK, чтобы приоста-
новить автоматическую фиксацию, или SET AUTOCOMMIT=0, чтобы запретить ее яв-
ным образом.
Ниже представлены характеристики механизма хранения BDB.
• Таблицы BDB могут иметь 31 индекс в таблице, 16 столбцов в индексе, а макси-
мальный размер ключа может составлять 1024 байт (до выхода версии MySQL 4.0
этот размер составлял 500 байт).
• Чтобы можно было уникальным образом идентифицировать каждую строку, в
каждой таблице BDB должен присутствовать первичный ключ (PRIMARY KEY). Если
вы сами не создадите его явным образом, MySQL создаст и будет поддерживать
для вас скрытый первичный ключ. Скрытый ключ имеет длину 5 байт, и будет
увеличиваться с каждой попыткой вставки данных.
• Первичный ключ (PRIMARY KEY) будет работать гораздо быстрее, чем любой дру-
гой индекс, поскольку он хранится вместе с данными строки. Остальные индексы
хранятся как данные ключа плюс первичный ключ, поэтому лучше всего работать
с наименее коротким первичным ключом, что позволит увеличить скорость рабо-
ты и сэкономить пространство на диске.
Это же касается и таблиц InnoDB, в которых короткие первичные ключи позволя-
ют экономить пространство диска не только в первичном, но и во вторичных ин-
дексах.
• Если все столбцы, к которым вы производите обращение в таблице BDB, являются
частью одного индекса или одного первичного ключа, MySQL может выполнить
запрос, не обращаясь к самой строке. В таблице MylSAM это можно сделать только
в том случае, если ее столбцы являются частью одного индекса.
• Последовательное сканирование выполняется медленнее, чем в таблицах My ISAM,
поскольку данные в таблицах BDB хранятся в В-деревьях, а не в отдельном файле
данных.
• Значения ключей не сжимаются в префиксах или суффиксах, как в таблицах
My ISAM. Другими словами, информация о ключе в таблицах BDB занимает чуть
больше места, чем в таблицах My ISAM.
8.4. Механизм хранения данных BDB (BerkleyDB) 519
• Приложения всегда должны быть готовы к обработке ситуаций, при которых вся-
кое изменение в таблице BDB может вызвать автоматический откат, а всякое чте-
ние может привести к взаимной блокировке.
• Если таблица BDB заполняет все пространство на диске, выводится сообщение об
ошибке (возможно, ошибка 28) и выполняется откат транзакции. В этом заключа-
ется отличие этих таблиц от таблиц My ISAM и ISAM, для которых mysqld будет
ожидать появления достаточного объема дискового пространства, прежде чем
продолжить работу.
520 Глава 8. Механизмы хранения и типы таблиц в MySQL
[mysqld]
innodb_data_home_dir=innodb_data_file_path=
ibdata/ibdatal:50M/ibdata/ibdata2:50M:autoextend
Простой пример файла my.cnf
Предположим, что у вас есть компьютер с ОЗУ объемом 128 Мбайт и одним жестким
диском. В предложенном ниже примере показаны возможные конфигурационные пара-
метры в файле my.cnf или my.ini для InnoDB. Предполагается, что у вас установлена
версия MySQL-Max 3.23.50 и выше или MySQL 4.0.2 и выше, поскольку в этом примере
используется параметр autoextend.
Этот пример будет интересен тем пользователям Unix и Windows, которые не хо-
тят размещать свои файлы данных и файлы журналов на различных дисках. Здесь
создается автоматически расширяющийся файл ibdatal и два файла журналов
ib_logfileO и ib_logfilel в каталоге данных MySQL. Кроме этого, в этом каталоге
находится небольшой автоматически создаваемый InnoDB архивный файл журнала
ib_arch_log_0000000000:
[mysqld]
# Сюда можно добавить другие параметры сервера MySQL
# ...
# Файлы данных должны иметь достаточный размер для
# для хранения ваших данных и индексов.
# Убедитесь что у вас достаточно
# свободного места на диске.
innodb_data_file_path = ibdatal:10M:autoextend
#
# Размер буферного пула должен составлять
# от 50 до 80% памяти вашего компьютера,
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
#
# Размер журнального файла должен составлять
# около 25% от размера буферного пула,
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=8M
#
innodb_flush_log_at_trx_commit=l
Убедитесь в том, что сервер MySQL имеет права на создание файлов в каталоге дан-
ных. Как правило, сервер должен иметь права доступа к любому каталогу, в котором ему
необходимо создать файлы данных и файлы журналов.
Не забывайте, что в некоторых файловых системах размер файла не должен превы-
шать 2 Гбайт. Общий размер файлов журналов должен быть менее 4 Гбайт, а общий
размер файлов данных - как минимум 10 Мбайт.
Когда вы впервые создаете табличное пространство InnoDB, лучше всего запустить
сервер MySQL из командной строки. Тогда на экран будет выводиться информация о
создании базы данных, и вы сможете следить за происходящими событиями. Например,
если в системе Windows mysqld-max расположен в каталоге C:\mysql\bin, его можно
запустить следующим образом:
С:\> С:\mysql\bin\mysqld-max —console
528 Глава 9. Механизм хранения InnoDB
/dr2/ibdata/ibdata2:2000M:autoextend
#
# Размер буферного пула должен составлять
# от 50 до 80% памяти вашего компьютера;
# пользователям Linux x86 следует убедиться, что
# общая занимаемая память не превышает 2 Гб.
set-variable = innodb_buffer_pool_size=lG
set-variable = innodb_additional_mem_pool_size=20M
innodb_logjgroup_home_dir = /dr3/iblogs
#
# innodb_log_arch_dir должен быть таким же,
# как и innodb_log_group_home_dir
# (начиная с версии 4.0.6, этот параметр можно опустить).
innodb_log_arch_dir = /dr3/iblogs
set-variable = innodb_log_files_in_group=2
#
# Размер файла журнала должен составлять
# около 15% от размера буферного пула,
set-variable = innodb_log_file_size=250M
set-variable = innodb_log_buffer_size=8M
#
innodb_flush_log_at_trx_commit=l
set-variable = innodb_lock_wait_timeout=50
#
# Уберите комментарий со следующих строк, если
# они должны использоваться.
#innodb_flush_method=fdatasync
#set-variable = innodb_thread_concurrency=5
Обратите внимание на то, что два файла данных размещены на разных дисках.
InnoDB будет заполнять табличное пространство, начиная с первого файла данных. В
некоторых случаях это позволяет повысить производительность базы данных, если не
все данные размещены на одном физическом диске. Размещение файлов журналов на
другом диске зачастую способствует повышению производительности. Для файлов дан-
ных InnoDB можно также использовать низкоуровневые разделы диска (низкоуровневые
устройства), что может позволить ускорить процессы ввода-вывода. См. раздел 9.15.2.
% Внимание!
Ъ В GNU/Linux x86 нельзя устанавливать слишком большой процент используемой памяти.
i; g l i b c позволит разрастись куче процесса и превысить стеки потоков, что приведет к сбою
5 сервера. Степень риска будет гораздо выше, если эта величина приблизится или превысит
ъ, значение 2 Гбайт:
Н/ innodb_buffer_pool_size
i + key_buffer \
|; + max__connections * (sort_buffer_size+read_buffer_size+binlog__cache__size)
y: + max_connections * 2 Мб
Каждый поток будет использовать стек (обычно 2 Мбайт, а в бинарных дистрибути-
вах от компании MySQL AB только 256 Кбайт) и, в худшем случае, также дополнитель-
ную память, равную sort_buf fer_size + read_buf fer_size.
530 Глава 9. Механизм хранения InnoDB
который сбрасывается на диск примерно один раз в секунду. Если присвоить зна-
чение 2, тогда запись в журнальный файл будет производиться во время выполне-
ния каждой транзакции. По умолчанию используется значение 1 (до выхода вер-
сии MySQL 4.0.13 по умолчанию использовалось нулевое значение).
• innodb_f lushjnethod. Эта опция работает только в системах Unix. Если устано-
вить для нее значение fdatasync, то InnoDB будет использовать функцию fsyncO
для сброса файлов данных и файлов журналов. Если присвоить значение O_DSYNC,
тогда InnoDB будет применять 0_SYNC для открытия и сброса файлов журналов, а
f sync () - для сброса файлов данных. Если указать 0_DIRECT (это значение дос-
тупно в некоторых версиях GNU/Linux, начиная с версии MySQL 4.0.14), тогда
InnoDB будет использовать его для открытия файлов данных, a fsyncO - для
сброса файлов данных и файлов журналов. Следует отметить, что InnoDB не ис-
пользует f datasynk или O_DSYNK по умолчанию, поскольку во многих операцион-
ных системах семейства Unix они не работают. Этот параметр доступен, начиная
с версии MySQL 3.23.40.
• innodb_force_recovery
|! Внимание!
|| Эта опция используется только в крайних случаях для сброса таблиц из поврежденной базы дан-
|| ных! Допустимыми значениями являются 1-6 (каждое из них описано в разделе 9.9.1). В целях
|| безопасности InnoDB запрещает пользователю изменять данные, когда значение этого napa-
lm метра больше 0. Параметр доступен, начиная с версии MySQL 3.23.44.
С помощью команды SHOW TABLE STATUS для любой таблицы InnoDB можно запро-
сить количество свободного пространства в табличном пространстве InnoDB. Количество
свободного пространства будет выводиться в разделе Comment выходной информации
команды SHOW TABLE STATUS, например:
SHOW TABLE STATUS FROM t e s t LIKE ' c u s t o m e r s '
Обратите внимание, что статистические данные, которые команда SHOW выдает по
таблицам InnoDB, являются приблизительными. Они используются в целях оптимизации
SQL. А вот точными являются зарезервированные размеры таблиц и индексов, значения
которых указываются в байтах.
В таких API-интерфейсах, как PHP, Perl DBI/DBD, JDBC, ODBC или С, вы можете
посылать команды управления транзакциями (подобные COMMIT) серверу MySQL в виде
строк, подобно тому, как это делают и любые другие SQL-команды, например SELECT
или INSERT. В некоторых API-интерфейсах также предлагается разделять специальные
функции или методы фиксации и отката транзакций.
Обе таблицы должны быть таблицами формата InnoDB. Таблица, производящая ссыл-
ку, должна иметь индекс, в котором столбцы внешнего ключа должны быть указаны в
первых столбцах в одинаковом порядке. Таблица, на которую производится ссылка,
должна иметь индекс, в котором столбцы, на которые производится ссылка, должны
быть указаны в первых столбцах в одинаковом порядке. Внешние ключи не поддержи-
вают столбцы с индексами в префиксах.
InnoDB не создает автоматически индексы на внешних или на ссылочных ключах -
вы должны их создать самостоятельно. Благодаря индексам проверки внешнего ключа
могут осуществляться быстро и без сканирования таблицы.
Соответствующие столбцы внешнего и ссылочного ключей в таблице InnoDB должны
содержать данные одинакового типа, что позволит сравнивать их, не преобразовывая
типы. Размер и знак целочисленных типов должны быть одинаковыми. Длина стро-
ковых типов может быть различной. Если вы определяете действие SET NULL, убедитесь
в том, что столбцы в дочерней таблице не объявлены как NOT NULL.
Если MySQL выдает ошибку с номером 1005 после оператора CREATE TABLE, а в
строке сообщения об ошибке присутствует ссылка на ошибку с номером 150, это свиде-
тельствует о сбое при создании таблицы, который был вызван тем, что ограничения
внешнего ключа не были сформированы надлежащим образом. Аналогично и для опера-
тора ALTER TABLE: если возникает ошибка при выполнении оператора и в сообщении
присутствует ссылка на ошибку с номером 150, это означает, что описание внешнего
ключа для преобразовываемой таблицы было сформировано неправильно. Начиная с
версии MySQL 4.0.13, можно использовать команду SHOW INNIDB STATUS для вывода де-
тальных сведений по последней ошибке внешнего ключа InnoDB на сервере.
Начиная с версии MySQL 3.23.50, InnoDB не проверяет ограничения внешнего ключа
по значениям, содержащимся в столбце NULL.
Отклонение от стандартов SQL. Если в родительской таблице присутствует не-
сколько строк с одинаковым значением ссылочного ключа, InnoDB проверяет внешний
ключ так, как если бы не существовали другие родительские строки с тем же значением
ключа. Например, если вы определили ограничение RESTRICT, и если существует дочер-
няя строка с несколькими родительскими строками, то InnoDB не разрешит удалить ка-
кую-либо родительскую строку.
Начиная с версии MySQL 3.23.50, с ограничением внешнего ключа можно также свя-
зывать конструкции ON DELETE CASCADE или ON DELETE SET NULL. Соответствующие па-
раметры ON UPDATE доступны в версии 4.0.8 и выше. Если определить конструкцию ON
DELETE CASCADE, и если будет удалена строка в родительской таблице, то InnoDB удалит
автоматически все те строки в дочерней таблице, значения внешнего ключа которых
будут равны значениям ссылочного ключа в родительской строке. Если определить
предложение ON DELETE SET NULL, строки дочерней таблицы будут обновлены автома-
540 Глава 9. Механизм хранения InnoDB
тически, поэтому столбцам во внешнем ключе будет присвоено значение NULL. SET
DEFAULT хотя и анализируется, но игнорируется.
Операции каскадирования InnoDB выполняет в соответствии с алгоритмом поиска в
глубину (depth-first algorithm), который основан на записях в индексах в соответствии с
ограничениями внешнего ключа.
Отклонение от стандартов SQL. Если операция ON UPDATE CASCADE или ON UPDATE
NULL возвращается к обновлению одной и топ лее таблицы, которая уже была обновлена
во время выполнения каскадирования, то эта операция будет работать как RESTRICT. Это
означает, что вы не сможете использовать самоотносимые операции ON UPDATE CASCADE
или ON UPDATE SET NULL. Это необходимо для того, чтобы предотвратить бесконечные
циклы, возникающие в результате каскадных обновлений. С другой стороны, начиная с
версии MySQL 4.0.13, доступно самоотносимая операция ON DELETE SET NULL. Самоот-
носимая операция ON DELETE CASCADE была доступно с момента реализации ON DELETE.
Далее показан простой пример установления отношения между таблицами parent и
child посредством внешнего ключа с одним столбцом:
CREATE TABLE p a r e n t ( i d INT NOT NULL,
PRIMARY KEY (id)
) TYPE=INNODB;
CREATE TABLE c h i l d ( i d INT, p a r e n t _ i d INT,
INDEX p a r _ i n d ( p a r e n t _ i d ) ,
FOREIGN KEY (parent_id) REFERENCES p a r e n t ( i d )
ON DELETE CASCADE
) TYPE=INNODB;
Ниже представлен более сложный пример, в котором таблица product_order имеет
внешние ключи для двух других таблиц. Один внешний ключ ссылается на индекс с
двумя столбцами в таблице product. Другой ключ ссылается на индекс с одним столб-
цом в таблице customer:
CREATE TABLE p r o d u c t ( c a t e g o r y INT NOT NULL, i d INT NOT NULL,
p r i c e DECIMAL,
PRIMARY K E Y ( c a t e g o r y , i d ) ) TYPE=INNODB;
CREATE TABLE c u s t o m e r ( i d INT NOT NULL,
PRIMARY KEY ( i d ) ) TYPE=INNODB;
CREATE TABLE p r o d u c t _ o r d e r (no INT NOT NULL AUTO_INCREMENT,
p r o d u c t _ c a t e g o r y INT NOT NULL,
p r o d u c t _ _ i d INT NOT NULL,
c u s t o m e r _ i d INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id),
FOREIGN KEY (customer_id)
REFERENCES customer(id)) TYPE=INNODB;
Начиная с версии MySQL 3.23.50, InnoDB позволяет добавлять новое ограничение
внешнего ключа в таблицу, используя команду ALTER TABLE:
9.7. Создание таблиц InnoDB 541
He забывайте о том, что сначала нужно создать все необходимые индексы. По-
мимо этого, с помощью команды ALTER TABLE можно добавлять в таблицу ограничение
на самоотносимый внешний ключ.
Начиная с версии MySQL 4.0.13, InnoDB поддерживает выполнение команды ALTER
TABLE для удаления внешних ключей:
ALTER TABLE имя_таблицы DROP FOREIGN KEY символ_внешнего_ключа;
TABLE и CREATE TABLE. При выполнении команды ALTER TABLE MySQL может использовать
команду RENAME TABLE, что может привести к нарушению ограничений внешнего ключа,
ссылающегося на таблицу. Оператор CREATE INDEX в MySQL обрабатывается так же, как и
ALTER TABLE, поэтому приведенные выше ограничения действительны и для него.
Начиная с версии MySQL 3.23.50, InnoDB возвращает определения внешнего ключа
таблицы в виде части выходных данных оператора SHOW CREATE TABLE:
SHOW CREATE TABLE имя_таблицы;
В этой версии mysql dump также генерирует корректные определения таблиц для фай-
ла дампа и не забывает о внешних ключах.
Вывести ограничения внешнего ключа для таблицы можно следующим образом:
SHOW TABLE STATUS FROM имя_базы_данных LIKE 'имя_таблицы*
Ограничения внешнего ключа выводятся в виде списка в столбце Comment (коммента-
рий) вывода.
При проверке внешних ключей InnoDB устанавливает совместно используемые бло-
кировки на уровне строки на родительских или дочерних записях, подлежащих провер-
ке. Проверка ограничений внешнего ключа для таблиц InnoDB осуществляется немед-
ленно и не откладывается до фиксации транзакции.
Чтобы облегчить повторную загрузку файлов дампа для таблиц, имеющих отноше-
ние к внешнему ключу, mysql dump автоматически включает в вывод дампа оператор для
присвоения параметру FOREIGN_KEY_CHECKS значения 0 (как в версии MySQL 4.1.1). Это
позволяет избежать возникновения проблем с таблицами, которые должны индивиду-
ально повторно перезагружаться во время повторной загрузки дампа. В более ранних
версиях переменную можно было отключить вручную непосредственно в mysql в про-
цессе загрузки файла данных, как показано далее:
mysql> SET FOREIGN_KEY_CHECKS = 0;
mysql> SOURCE имя_файла_дампа;
mysql> SET FOREIGN_KEY_CHECKS = 1;
Подобным образом вы сможете импортировать таблицы в любом порядке, если в
файле дампа будут содержаться таблицы, неупорядоченные для внешних ключей. Это
позволит повысить скорость выполнения импорта. Параметр FORE IGN_KEY_CHECKS досту-
пен, начиная с версии MySQL 3.23.52. и MySQL 4.O.3.
Присвоение параметру FOREIGN_KEY_CHECKS нулевого значения будет полезно для то-
го, чтобы игнорировать ограничения внешнего ключа во время выполнения операции
LOAD DATA.
InnoDB позволяет удалять любую таблицу, даже если это приведет к нарушению ог-
раничений внешнего ключа, ссылающегося на таблицу. При удалении таблицы удаляют-
ся и ограничения, описанные в операторе, с помощью которого она была создана.
Если удаленная таблица создается повторно, ее описание должно согласоваться с ог-
раничениями внешнего ключа, который на нее ссылается. В этой таблице необходимо
правильно задать имена и типы столбцов; она должна также иметь индексы ключей, на
которые производится ссылка, о чем было сказано выше. Если эти условия не будут
удовлетворены, MySQL выдаст ошибку с номером 1005 и ссылку на ошибку с номером
150 в строке сообщения об ошибке.
9.7. Создание таблиц InnoDB 543
Если вам нужно будет перейти к версии 4.0, то в этом случае вам придется извлечь
дампы таблиц и повторно создать все табличное пространство InnoDB. Если у вас нет
созданных новых таблиц InnoDB для MySQL 4.1.1 и выше, и требуется быстро перейти к
ранним версиям, можно просто вернуться к версии MySQL 4.0.18 или более поздней в
линейке 4.0. Прежде чем перейти к версии в линейке 4.О., необходимо закрыть все кли-
ентские соединения с сервером mysqld, который должен быть понижен в версии, и по-
зволить ему осуществить очистку и операции слияния буферных вставок. После этого
команда SHOW INNODB STATUS покажет, что основной поток находится в состоянии
waiting for server activity. Затем можно будет завершить работу mysqld и запустить
версию 4.0.18 или более позднюю в линейке 4.0. Тем не менее, мы не рекомендуем пе-
реходить напрямую к более ранней версии, поскольку такой переход еще не изучен в
достаточной мере.
Активизировать множество табличных пространств можно, если в раздел [mysqld]
файла my. cnf добавить следующую строку:
[mysqld]
innodb_file_per_table
После перезапуска сервера InnoDB будет сохранять каждую вновь созданную таблицу
в ее собственном файле имя_таблицы.ibd, который будет расположен в каталоге баз
данных, куда принадлежит таблица. Подобное происходит и в механизме хранения
MylSAM, однако MylSAM делит таблицу на файл данных имя_таблицы.ЖЪ и файл индекса
имя_таблицы.MYI. В InnoDB данные и индексы сохраняются в файле .ibd. Файл
имя_таблицы. f rm создается так же, как и обычно.
Если удалить строку innodb_file_per_table из файла my.cnf и перезапустить сер-
вер, то InnoDB снова создаст таблицы внутри файлов совместно используемого таблич-
ного пространства.
innodb_f ile_per__table оказывает влияние только на создание таблиц. Если запустить
сервер без этой опции, новые таблицы хотя и будут созданы в файлах . idb, однако вы все
равно сможете обращаться к таблицам, существующим в табличном пространстве общего
использования. Если удалить этот параметр, то новые таблицы будут созданы в табличном
пространстве общего использования, однако вы все равно сможете обращаться к любой
таблице, созданной с применением множественного табличного пространства.
Для InnoDB всегда необходимо табличное пространство общего использования. Для
работы InnoDB недостаточно одних лишь файлов .idb. В табличном пространстве обще-
го использования содержатся файлы ibdata, в которые InnoDB заносит свой внутренний
словарь данных и журналы отмены выполненных действий.
9.7. Создание таблиц InnoDB 545
Нельзя свободно перемещать файлы .ibd между каталогами баз данных, как это
можно сделать с файлами таблиц MylSAM. На то есть два объяснения: 1) описание табли-
цы хранится в табличном пространстве общего использования InnoDB; 2) механизм
InnoDB должен сохранять последовательность идентификаторов транзакций и порядок
номеров в журналах.
В пределах установленной копии MySQL можно перемещать файл . ibd и связанную
с ним таблицу из одной базы данных в другую с помощью знакомого вам оператора
RENAME TABLE:
RENAME TABLE старое_имя_базы_данных.имя_таблицы
TO новое_имя_базы_данных. имя_та блицы;
Если у вас имеется чистая резервная копия файла . ibd, этот файл можно восстано-
вить в MySQL:
1. Выполните оператор ALTER TABLE:
ALTER TABLE имя_таблицы DISCARD TABLESPACE;
Внимание! Текущий файл . ibd будет удален.
2. Переместите резервную копию файла .ibd обратно в соответствующий каталог
базы данных.
3. Выполните оператор ALTER TABLE:
ALTER TABLE имя_таблицы IMPORT TABLESPACE;
В данном контексте чистая резервная копия файла . idb означает, что:
• В этом файле не существует незафиксированных модификаций, выполненных
транзакциями.
• В этом файле не существуют несоединенные записи буфера вставок.
• Во время чистки из него были удалены все индексные записи, обозначенные для
удаления.
• mysqld сбросил все модифицированные станицы файла . ibd из буферного пула в
файл.
Чистую резервную копию файла . ibd можно подготовить следующим образом:
1. Остановите работу сервера mysqld и зафиксируйте все транзакции.
2. Подождите, пока после выполнения команды SHOW INNODB STATUS не будет пока-
зано, что в базе данных отсутствуют активные транзакции, и что основной поток
InnoDB пребывает в состоянии Waiting for server a c t i v i t y . После этого вы
сможете сделать копию . ibd файла.
Другой способ создания чистой резервной копии файла . ibd заключается в исполь-
зовании коммерческого инструмента InnoDB HOT Backup:
1. Воспользуйтесь InnoDB HOT Backup для резервного копирования InnoDB.
2. Запустите второй сервер mysqld для резервной копии, чтобы осуществить чистку
файлов . ibd в резервной копии.
В нашем списке TODO запланировано позволить перемещать чистые файлы . ibd в
другую установленную копию MySQL. Для этого потребуется перенастроить идентифи-
каторы транзакций и проверить последовательность номеров журналов в файле . ibd.
546 Глава 9. Механизм хранения lnnoDB
если они вам понадобятся для восстановления табличного пространства. Затем следует
удалить старые файлы журналов из их каталога, внести изменения в файл my. cnf и снова
запустить MySQL. Теперь во время запуска raysqld увидит, что ни один файл журнала не
существует, и выдаст сообщение о создании новых файлов журналов.
Допустим, что по столбцу id создан индекс. При запросе будет произведено скани-
рование этого индекса, начиная с первой записи, в которой id больше 100. Далее, если
установленные на записях индекса блокировки не заблокируют вставки в интервалы, то
за это время в таблицу может быть вставлена новая строка. Если сейчас выполнить эту
же команду SELECT в этой же транзакции, то после выполнения запроса вы сможете уви-
деть новую строку. Это противоречит принципу изоляции транзакции: транзакция
должна выполняться таким образом, чтобы считываемые ею данные не изменялись во
время выполнения транзакции. Если набор строк считать элементом данных, то новый
дочерняя "фантомная запись" нарушит этот принцип изоляции.
Когда InnoDB сканирует индекс, она может также заблокировать интервалы после по-
следней записи в индексе. Именно это и было продемонстрировано в предыдущем при-
мере: блокировка, установленная InnoDB, запрещает вставку в таблицу, если id будет
больше 100.
556 Глава 9. Механизм хранения InnoDB
Блокировку следующего ключа можно использовать для того, чтобы проверить уни-
кальность значений в своем приложении. Если данные считываются в режиме совмест-
ного доступа, и отсутствует дубликат строки, которую необходимо вставить, то можно
безопасно вставлять свою строку и быть уверенным, что благодаря блокировке следую-
щего ключа, установленной на предшествующей строке во время чтения, будет запре-
щена вставка дублированной строки. Таким образом, блокировка следующего ключа
позволяет "заблокировать" отсутствие чего-либо в таблице.
1 row in set
В этом примере пользователь А увидит строку, вставленную пользователем В, только
после того, как пользователь В зафиксирует вставку, а пользователь А зафиксирует свою
собственную транзакцию, чтобы момент времени сдвинулся на позицию после фикса-
ции, которую выполнил пользователь В.
Чтобы увидеть "наиболее актуальное" состояние базы данных, необходимо восполь-
зоваться чтением с блокировкой:
SELECT * FROM t LOCK IN SHARE MODE;
9.11. Транзакционная модель InnoDB и блокирование 557
• ALTER TABLE, BEGIN, CREATE INDEX, DROP DATABASE, DROP INDEX, DROP TABLE,
LOAD MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START
TRANSACTION, TRUNCATE, UNLOCK TABLES.
• CREATE TABLES (фиксация производится только в том случае, если в версиях
MySQL, предшествующих 4.0.13, используется бинарная регистрация).
• Оператор CREATE TABLE в InnoDB обрабатывается как одна транзакция. Это озна-
чает, что команда ROLLBACK, инициированная пользователем, не приведет к отмене
выполнения операторов CREATE TABLE, выданных пользователем во время данной
транзакции.
Если указать опцию —opt для mysqldump, вы получите файлы, которые будут дос-
таточно быстро импортироваться в таблицу InnoDB, даже если и не использовать
вышеуказанные операторы SET AUTOCOMMIT и COMMIT.
• Осторожно относитесь к большому количеству откатов массовых вставок: InnoDB
использует буфер вставок для того, чтобы сократить количество дисковых опера-
ций ввода-вывода, однако для соответствующего отката транзакции подобный
механизм не предусмотрен. Ограниченный физическими параметрами диска откат
может занять в 30 раз больше времени, чем вставка. Удаление процесса базы дан-
ных не поможет, поскольку после запуска базы данных снова начнется откат. Во
избежание подобного отката можно увеличить размер буферного пула настолько,
чтобы скорость выполнения отката зависела только от производительности цен-
трального процессора, либо предусмотреть для этого специальную процедуру.
См. раздел 9.9.1.
• Следует также осторожно относиться к операциям со значительными объемами
данных, которые зависят от производительности диска. Чтобы очистить таблицу,
применяйте операторы DROP TABLE или TRUNCATE (начиная с версии MySQL 4.0 и
выше), но не DELETE FROM имя_таблицы.
• Если вам нужно вставить большое количество строк, используйте синтаксис опе-
ратора INSERT с несколькими строками, что позволит сократить нагрузку на связь
между клиентом и сервером:
INSERT INTO имя_таблицы VALUES (1,2), (5,5), ...;
Этот совет подходит для вставок в таблицы любого типа, а не только для InnoDB.
• Если у вас имеются ограничения UNIQUE для вторичных ключей, то, начиная с
версий MySQL 3.23.52 и MySQL 4.0.3, можно ускорить импортирование таблиц,
если отключить на время проверки на уникальность:
SET UNIQUE_CHECKS=O;
При работе с крупными таблицами можно будет существенно сократить количе-
ство дисковых операций ввода-вывода, поскольку InnoDB сможет использовать
свой буфер вставки для групповой регистрации записей вторичных индексов.
• Если в ваших таблицах имеются ограничения внешнего ключа FOREIGN KEY, то,
начиная с версии MySQL 3.23.52 и MySQL 4.0.3, вы можете увеличить скорость
выполнения вставок в таблицу, отключив на время проверку внешних ключей:
SET FOREIGN_KEY_CHECKS=0;
Для больших таблиц это позволит сократить количество дисковых операций вво-
да-вывода.
• Если вы часто обращаетесь к редко обновляемым таблицам, используйте кэш
запросов, доступный в MySQL 4.0:
[mysqld]
query_cache_type = ON
query_cache__size = 10M
В MySQL 4.0 кэш запросов доступен только для режима автоматической фикса-
ции. В версии MySQL 4.1.1 это ограничение было снято.
9.12. Советы по настройке производительности InnoDB 563
SEMAPHORES
030709 12:59:58
*** (1) TRANSACTION:
TRANSACTION 0 290252780, ACTIVE 1 sec, process no 3185, OS thread id 30733
inserting
LOCK WAIT 3 lock struct(s), heap size 320, undo log entries 146
9.12. Советы по настройке производительности InnoDB 565
TRANSACTIONS
FILE I/O
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (write thread)
Pending normal aio reads: 0, aio writes: 0,
ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
151671 OS file reads, 94747 OS file writes, 8750 OS fsyncs
25.44 reads/s, 18494 avg bytes/read, 17.55 writes/s, 2.33 fsyncs/s
Ibuf for space 0: size 1, free list len 19, seg size 21,
85004 inserts, 85004 merged recs, 26669 merges
Hash table size 207619, used cells 14461, node heap has 16 buffer (s)
1877.67 hash searches/s, 5121.10 non-hash searches/s
LOG
ROW OPERATIONS
мещать таблицы innoDB между базами данных путем простого перемещения файлов
. f rm. По той же причине команда DROP DATABASE не работала для таблиц InnoDB в верси-
ях, предшествующих MySQL 3.23.43.
Для всех таблиц InnoDB имеется специальный индекс, в котором хранятся данные
строк - он называется кластеризованным индексом (clustered index). Если в таблице оп-
ределить первичный ключ (PRIMARY KEY), то индекс первичного ключа будет кластери-
зованным индексом.
Если первичный ключ для таблицы не был определен, MySQL будет использовать
первый индекс UNIQUE, который имеют только столбцы NOT NULL, в качестве первичного
ключа, и InnoDB рассматривает его как кластеризованный индекс. Если такого индекса в
таблице нет, то InnoDB самостоятельно создаст кластеризованный индекс, в котором
строки будут упорядочены по идентификаторам, присвоенным механизмом InnoDB стро-
кам этой таблицы. Идентификатор строки представляет собой 6-байтовое поле, значение
которого постоянно увеличивается при вставке новых строк. Таким образом, сортировка
по идентификатору строки фактически представляет собой сортировку по последова-
тельности вставки.
Доступ к строке через кластеризованный индекс осуществляется достаточно быстро,
поскольку данные строки находятся в той же странице, в которой производится поиск по
индексу. При больших размерах таблицы архитектура кластеризованных индексов за-
частую позволяет сократить количество дисковых операций ввода-вывода, если сравни-
вать ее с традиционными решениями.
Записи в некластеризованных индексах (которые называются вторичными индекса-
ми) в InnoDB содержат значение первичного ключа для строки. InnoDB использует это
значение первичного ключа для поиска строки в кластеризованном индексе. Следует
иметь в виду, что если первичный ключ будет достаточно велик, вторичные индексы
займут больше места.
InnoDB сравнивает потоки CHAR и VARCHAR разной длины таким образом, что остав-
шаяся длина в более короткой строке будет рассматриваться как строка, содержащая
пробелы.
• Каждая запись вторичного индекса содержит все поля, определенные для ключа
кластеризованного индекса.
• Запись содержит указатель на каждое поле записи. Если общая длина полей в за-
писи будет меньше 128 байт, то указатель будет иметь размер в 1 байт, в против-
ном случае - 2 байта.
• InnoDB сохраняет столбцы фиксированной длины, такие как CHAR (10), в формате
фиксированной длины. InnoDB усекает завершающие пробелы в столбцах VARCHAR.
Учтите, что InnoDB может преобразовывать столбцы CHAR в VARCHAR.
• SQL-значение NULL занимает 0 байт при сохранении в столбце переменной длины.
В столбце фиксированной длины резервируется фиксированная длина. Необхо-
димость резервирования фиксированного пространства для значения NULL объяс-
няется тем, что замена значения NULL на другое отличное от него значение осуще-
ствляется на месте и не приводит к фрагментации индексной страницы.
вместного использования.
• 38 (ERROR_HANDLE_EOF). Достигнут конец файла.
• 39 (ERRORJiANDLE_DlSK_FULL). Отсутствует место на диске.
• 112 (ERROR_DISK_FULL). Отсутствует место на диске.
• 123 (ERROR_INVALID_NAME). Неверный синтаксис имени файла, каталога или мет-
ки тома.
• 1450 (ERROR_NO__SYSTEM_RESOURCES). Недостаточно системных ресурсов для за-
вершения затребованной службы.
• Если вы подозреваете, что таблицы повреждена, запустите для нее команду CHECK
TABLE.
InnoDB: have deleted and recreated InnoDB data f i l e s but have forgotten
InnoDB: to delete the corresponding .frm files of InnoDB tables?
InnoDB: Невозможно найти таблицу test/child2 во внутреннем словаре данных
InnoDB: InnoDB, хотя файл .frm для этой таблицы существует.
InnoDB: Возможно, вы удалили и повторно создали файлы данных InnoDB,
InnoDB: но забыли удалить соответствующие файлы .frm для таблиц InnoDB.
Это сообщение свидетельствует о существовании "висячего" файла . frm, не имею-
щего соответствующей таблицы в InnoDB. Этот файл можно удалить вручную.
Если происходит сбой MySQL во время выполнения операции ALTER TABLE, все мо-
жет закончиться появлением "висячей" временной таблицы в табличном пространстве
InnoDB. Запустив монитор innodb_table_monitor, можно увидеть таблицу с именем
# s q l . . . , однако поскольку MySQL не предоставляет доступ к таблице с таким именем,
вы не сможете удалить ее или выполнить дамп. Выход заключается в использовании
специального механизма, который доступен в версии MySQL 3.23.48.
Если вы обнаружили "висячую" таблицу #sql_id в табличном пространстве, ей мож-
но присвоить новое имя rsql_id_recover__innodb_tmp_table с помощью следующего
оператора:
CREATE TABLE ч rsql_id_recover_innodb__tmp_table 4 (...) TYPE=InnoDB;
Обратные кавычки, в которые заключено имя, необходимы потому, что в имени про-
межуточной таблицы присутствует символ '-'.
Описание таблицы должно быть похожим на описание временной таблицы. Если вам
не известно описание временной таблицы, можно использовать произвольное описание
в предыдущем операторе CREATE TABLE и заменить файл rsql_id.frm на файл
#sql_id.frm временной таблицы. Обратите внимание на то, что для копирования или
переименования файла в среде оболочки необходимо заключить имя файла в двойные
кавычки, если в имени файла присутствует символ '#'. Затем вы сможете выполнить
дамп и удалить переименованную таблицу.
10
Введение в MaxDB
м axDB - это база данных уровня предприятия. MaxDB представляет собой новое
имя системы управления базами данных, ранее известной как SAP DB.
Первая переименованная версия под названием MaxDB 7.5.00 вышла в ноябре 2003
года.
Продолжение табл. ЮЛ
Зарезервирова- Контекст применения
но в MaxDB в MaxDB Соответствие MySQL
BOOLEAN Тип столбца, принимает BOOLEAN был добавлен в MySQL 4.1.0, синоним
только значения для BOOL, отображаемого на TINYINT (1). При-
TRUE, FALSE или NULL нимает значения в том же диапазоне, что
TINYINT, также, как и NULL. TRUE и FALSE мо-
гут использоваться как синонимы 1 и О
CHECK Проверка таблицы CHECK TABLE - похожее, но не идентичное
применение
COLUMN Типы столбцов COLUMN, излишнее слово
CHAR() Функция SQL CHAR () - идентичный синтаксис, похожее, но
не идентичное применение.
COMMIT Явная фиксация транзакций Явно фиксирует транзакцию, выполняется по-
выполняемая после операто сле оператора определения данных, а также
ра определения данных после многих других операторов
COSHO Функция SQL Нет соответствия
сото Функция SQL СОТ () - идентичный синтаксис и реализация
CREATE SQL, язык определения CREATE
данных
DATABASE Функция SQL DATABASE ( ) ; DATABASE применяется в другом
контексте, например, CREATE DATABASE
DATE() Функция SQL CURRENT_DATE
DATEDIFFO Функция SQL DATEDIFF ( ) , новая в MySQL 4.1.1
DAY() Функция SQL Нет соответствия
DAYOFWEEK() Функция SQL DAYOFWEEK ( ) , по умолчанию 1, означает поне-
дельник в MaxDB и воскресенье в MySQL
DISTINCT Функции SQL DISTINCT, но применяется в другом контексте:
AVG, MAX, MIN, SUM SELECT DISTINCT
DROP DROP INDEX, DROP INDEX, похожее, но не идентичное
например применение
EBCDIC () Функция SQL Нет соответствия
EXPAND () Функция SQL Нет соответствия
EXPLAIN Оптимизация EXPLAIN, похожее, но не идентичное применение
FIXED () Функция SQL Нет соответствия
FLOAT () Функция SQL Нет соответствия
HEX() Функция SQL HEX ( ) , похожее, но не идентичное применение
INDEX () Функция SQL INSTR () или LOCATE ( ) , похожие, но не
идентичные синтаксис и значение
586 Глава 10. Введение в MaxDB
Когда клиент MySQL или сервер mysqld получает пакет размером больше, чем
max_allowedj?acket байт, он выдает ошибку Packet too large (Слишком большой па-
кет) и закрывает соединение. В некоторых клиентах в этом случае вы также можете по-
лучить сообщение об ошибке Lost connection to MySQL server during query (Потеря
соединения с сервером MySQL во время выполнения запроса).
И клиент, и сервер имеют свою собственную переменную max_allowed_packet, по-
этому если вы хотите работать с большими пакетами, то должны увеличить ее значение
как на клиенте, так и на сервере.
Если вы применяете клиентскую программу mysql, в ней по умолчанию
max_allowed_packet равно 16 Мбайт. Это также максимальное значение этой перемен-
ной, которое допускалось в версиях MySQL до 4.0. Чтобы установить большее значение
в версии 4.0 и выше, запускайте mysql следующим образом:
mysql> mysql —max_allowed_packet=32M
Это установит максимальный размер пакета в 32 Мбайт.
Значение по умолчанию max_allowed_packet для сервера равно 1 Мбайт. Вы можете
увеличить его, если серверу необходимо работать с большими запросами (например,
если вы работаете со столбцами BLOB). Например, чтобы установить значение перемен-
ной для сервера в 16 Мбайт, запускайте сервер так:
mysql> mysqld —max_allowedjpacket=16M
До версии MySQL 4.0 синтаксис был иной:
mysql> mysqld —set-variable=max_allowedjpacket=16M
Для установки значения max_allowed_packet можно также использовать файл опций.
Например, чтобы установить это значение в 16 Мбайт, добавьте в файл опций следую-
щие строки:
[mysqld]
max_allowed_packet=16M
До MySQL версии 4.0 синтаксис выглядел по-другому:
[mysqld]
set-variable = max_allowed_packet=16M
Увеличивать значение этой переменной вполне безопасно, потому что дополнитель-
ная память выделяется только по необходимости. Например, mysqld выделяет дополни-
тельную память, только когда получает длинный запрос, или когда должен вернуть
большую строку результата. Небольшое значение по умолчанию для этой переменной -
простая предосторожность, предусмотренная, чтобы перехватывать некорректные паке-
ты между клиентом и сервером, а также гарантировать, что не будет превышен размер
доступной памяти, если неожиданно будет переслан большой пакет.
Вы можете также столкнуться со странными проблемами больших пакетов, если ис-
пользуете большие значения BLOB, но не предоставляете mysqld памяти достаточного
объема для обработки этих запросов. Если вы предполагаете, что причина в этом, по-
пробуйте добавить ulimit -d 256000 в начало сценария mysqld_safe и перезапустите
сервер.
А.2. Наиболее общие ошибки при работе с программами MySQL 597
[mysqld]
tmpdir=C:/temp
Каталог С: /temp должен уже существовать. См. раздел 3.3.2.
Проверяйте также код получаемой ошибки с помощью perror. Одной из причин, по
которой сервер не может записывать в таблицу, может быть переполнение файловой
системы:
shell> perror 28
Error code 28: No space left on device
shell> perror 24
Too many open f i l e s
Слишком много открытых файлов
shell> perror 11
Resource temporarily unavailable
Ресурс временно не доступен
Проблема заключается в том, что mysqld пытается открыть слишком много файлов
одновременно. Вы можете либо указать mysqld, чтобы он не открывал такого количества
файлов сразу, либо увеличить количество доступных ему файловых дескрипторов.
Чтобы указать mysqld, чтобы он не открывал одновременно так много файлов, можно
уменьшить размер табличного кэша, для этого уменьшив значение системной переменной
table_cache (ее значение по умолчанию равно 64). Уменьшение значения переменной
max_connections также уменьшит количество открытых файлов (по умолчанию - 100).
Для изменения количества доступных серверу файловых дескрипторов можно вос-
пользоваться опцией —open-files-limit mysqld_safe, или же (начиная с MySQL
3.23.30) установить системную переменную open_files_limit. См. раздел 4.2.3. Самый
простой способ установить эти значения - добавить их в файл опций. См. раздел 3.3.2.
Если у вас старая версия mysqld, которая не поддерживают установку предельного числа
открытых файлов, вы можете отредактировать сценарий mysqld_safe. В нем есть заком-
ментированная строка ulimit -n 256. Вы можете удалить символ '#', сняв тем самым
комментарий, и изменить число 256, указав необходимое число файловых дескрипторов,
доступных mysqld.
—open-files-limit и ulimit могут увеличить количество файловых дескрипторов,
но только в пределах, установленных операционной системой. Существует также "жест-
кий" лимит, который можно превысить, только если вы запустите mysqld_safe или
mysqld от имени пользователя root (только помните, что вам также нужно будет при
запуске сервера указывать опцию —user, чтобы он не продолжал работать от имени
root после своего запуска). Если вам понадобится увеличить лимит доступных каждому
процессу файловых дескрипторов, установленный операционной системой, проконсуль-
тируйтесь с документацией по системе.
^ На заметку!
r
rl Если вы работаете с оболочкой t c s h , u l i m i t работать не будет! Эта оболочка также даст не-
|| корректный результат, если вы запросите текущие значения лимитов. В этом случае вам следует
Ц запускать mysqld_saf e из sh.
• У вас есть запорченный файл данных или индексный файл, который содержит по-
врежденные данные, которые сбивают с толку mysqld.
• Вы нашли ошибку в коде сохранения данных. Такое маловероятно, но это по-
следнее, что можно предположить. В этом случае вы можете попробовать изме-
нить тип таблиц для использования другого механизма хранения, выполнив опе-
ратор ALTER TABLE на восстановленной копии таблицы.
Поскольку иногда очень трудно понять причину краха, прежде всего проверьте, есть
ли вещи, которые работают у других, но приводят к краху вашу систему. Пожалуйста,
попробуйте следующее:
• Остановите mysqld командой mysqladmin shutdown, запустите myisamchk —silent
— force */* .MY I из каталога данных, чтобы проверить все таблицы My ISAM, и пе-
резапустите mysqld. Это гарантирует, что вы начинаете из чистого состояния. См.
главу 4.
• Запустите mysqld с опцией --log и попробуйте среди информации, записанной в
журнале, найти конкретный запрос, который приводит к аварии сервера. Около
95% всех ошибок связаны с конкретным запросом. Обычно это будет один из по-
следних запросов в файле протокола - непосредственно перед перезапуском сер-
вера. См. раздел 4.8.2. Если один и тот же запрос повторно прерывает работу сер-
вера, даже если вы проверили все занятые в нем таблицы непосредственно перед
его выполнением, вы сможете найти ошибку и составить отчет о ней. См. раздел
1.7.1.3.
• Попытайтесь составить тестовый случай, которым мы сможем воспользоваться
для воспроизведения проблемы.
• Попробуйте запустить тесты из каталога mysql-test. Они достаточно хорошо тес-
тируют функционирование MySQL. Вы можете добавить код в тесты производи-
тельности, который будет эмулировать ваше приложение. Тесты производитель-
ности можно найти в каталоге sql-bench исходного дистрибутива, или, для би-
нарного дистрибутива - в каталоге sql-bench вашей установки MySQL.
• Попробуйте запустить сценарий fork_big.pl (он находится в каталоге t e s t s ис-
ходного дистрибутива).
• Если вы настроили MySQL для отладки, будет гораздо легче собрать информа-
цию о возможных ошибках, если что-то идет не так. Настройка MySQL для от-
ладки включает безопасный распределитель памяти, который может найти не-
которые ошибки. Это также приводит к генерации большого объема выходной
информации о том, что происходит. Переконфигурируйте MySQL с помощью
опций —with-debug или —with-debug=full сценария configure и затем пере-
компилируйте MySQL.
• Проверьте, установлены ли все последние исправления для операционной системы.
• Используйте опцию —skip-external-locking с mysqld. В некоторых системах
диспетчер блокировок lockd работает некорректно. Опция —skip-external-
locking указывает mysqld не использовать внешнюю блокировку. (Это означает,
что вы не можете запустить два и более экземпляра mysqld на одном и том же ка-
талоге данных, и что нужно быть осторожным при использовании myisamchk. Не-
смотря на это, может быть поучительно попробовать эту опцию в качестве теста.)
608 Приложение А. Поиск и устранение неполадок в программах MySQL
S На заметку!
Ji Чтобы разделить эффективно нагрузку, эти пути должны указывать на каталоги, расположенные
Q на разных физических дисках, а не в разделах одного и того же диска.
менных файлах для обслуживания перезапуска таким образом, чтобы иметь возмож-
ность реплицировать временные таблицы или операции LOAD DATA INFILE. Если содер-
жимое каталога временных файлов будет потеряно при перезапуске сервера, репликация
перестанет работать.
Все временные файлы MySQL создает как скрытые. Это гарантирует, что они будут
удалены, если работу mysqld будет прервана. Неудобство в применении скрытых файлов
заключается в том, что вы не увидите большого временного файла, который переполнит
файловую систему в каталоге, в котором он расположен.
При выполнении сортировок (ORDER BY или GROUP BY) MySQL обычно использует
один или два временных файла. Максимально необходимый объем дискового простран-
ства в этом случае вычисляется по следующему выражению:
(длина сортируемых строк + sizeof{указатель на строку))
* количество совпадающих строк
*2
Размер указателя на строку обычно составляет 4 байта, но в будущем может вырасти
для работы с очень большими таблицами.
Для некоторых операторов SELECT MySQL также создает временные таблицы. Они не
скрыты и получают имена SQL_*.
ALTER TABLE создает временную таблицу в том же каталоге, где находится исходная
таблица.
Окончание табл. Б. 1
Переменная Описание
MYSQL_ PWD Пароль по умрлчанию для подключения к серверу raysqld. Имейте в
виду, что его использование небезопасно! См. раздел 4.5.6.
MYSQL_ TCP_PORT Значение по умолчанию номера порта TCP/IP.
MYSQL_UNIX_PORT Значение по умолчанию имени файла сокета Unix; используется для
подключения локальных клиентов.
PATH Используется оболочкой для поиска программ MySQL.
TMPDIR Каталог временных файлов.
TZ Наименование локальной временной зоны. См. А.4.6.
UMASK_ DIR Маска прав доступа к пользовательским каталогам; используется при
их создании.
UMASK Маска прав доступа к пользовательским файлам.
USER Имя пользователя по умолчанию в Windows и NetWare? применяемое
для подключения к серверу raysqld.
Предметный указатель
API-интерфейс, 19; 20; 31; 68; 158; 163; 165; Атомарная операция, 62
268; 536; 537
Б
G Библиотека
GnuPG, 90-92 readline,32; 104; 107; 132; 190; 191; 467
GPL, См. Лицензия GNU General Public regexp, 32; 45; 493
License, 18; 29; 32-34; 36; 39; 56; 141; 506;
524;582
В
Взаимная блокировка, 47; 70; 388; 432; 532;
557-560
innodb_additional_mem_pool_size, 236; 527;
529; 530 Д
innodb_buffer_pool_awe memmb, 530 Двойная лицензия, 15
innodb_buffer_pool_size, 236; 527; 529; 530
innodb_data_file_path, 215; 236; 500; 525-528;
ж
Журнал
531; 535; 546; 572 бинарный, 345; 348
innodb_data_home_dir, 236; 525-528; 531; запросов, 345
535;546;572 медленных запросов, 345; 351
innodbfastshutdown, 236; 531 обновлений, 226; 345; 347
innodb_file_per_table, 531; 544 ошибок, 100; 101; 103; 148; 345; 346; 597
innodbfiletothreads, 531 таблиц ISAM, 345
innodb_flush_log_at_trx_cornrnit, 236; 527;
529; 531; 561 К
innodb_flush_method, 236; 529; 532; 561 Ключ
innodb_force_recovery, 236; 532; 549 внешний, 29; 37; 38; 43; 65; 66; 68; 100; 539;
innodb_lock_wait_timeout, 236; 529; 532; 559 541; 542; 562
innodb_log_arch_dir, 236; 529; 532; 533 Код ошибки
innodblogarchive, 236; 532 1005 (ER_CANT_CREATE_TABLE), 574
innodb_log_buffer_size, 236; 527; 529; 532 1016 (ER_CANT_OPEN_FILE), 574
innodbjog_file_size, 236; 527; 529; 533 1114 (ER_RECORD_FILE_FULL), 574
1205 (ER_LOCK_WAIT_TIMEOUT), 574
innodblogfilesingroup, 236; 529; 533
1213 (ER_LOCK_DEADLOCK), 574
innodb_log_group_home_dir, 236; 529; 532;
1216 (ER_NO_REFERENCED_ROW), 574
533 1217 (ER_ROW_IS_REFERENCED), 574
innodb_max_dirty_pages_pct, 533 Компания MySQL AB
innodbmirroredloggroups, 236; 533 http://www.mysql.com, 15
innodbopenfiles, 533 коммерческая лицензия, 29; 30
innodbthreadconcurrency, 236; 529; 533; 567 поддержка, 21; 24; 28; 31; 40
s сертификация, 28
Компилятор
SMP, См. Симметричная аСС,87;88; 188
многопроцессорная система, 78; 170; 172; СС,88
175; 177 сс/схх, 89
сс-5.0, 86
ссс, 85; 177
-temp-pool, 161; 230 есс, 85
egcs,89; 118; 122; 178; 179; 183; 189; 190
Предметный указатель 615
gcc, 85-90; 118; 122; 123; 127-131; 173; MERGE, 25; 42; 72; 75; 105; 361; 381; 498;
176-190; 192-196; 199; 200;451 509; 510-512; 521; 549
pgcc,82; 122; 451; 452 MylSAM, 20; 22-25; 37; 38; 40; 42; 45; 46;
xlC_r,87; 188 59; 62; 64; 65; 68; 72; 153; 159; 160; 161;
Конструкция 163-165; 168; 213; 215; 218; 223-227;
CHANGE имястолбца, 59 229; 230; 239-241; 243; 247; 248; 250;
DELAYED, 46; 59; 63; 71; 164; 172; 224; 252; 318-322; 324; 326; 329; 330; 333-
241; 246; 262; 425; 429; 434; 489; 578 338; 345; 366; 374; 375; 381; 383; 394;
DROP INDEX, 59; 165; 559; 585 396; 403; 404; 411; 416; 417; 425^31;
DROP имястолбца, 59 434; 436; 437; 440; 441; 446; 447; 453-
IF EXISTS, 17; 25; 59 455; 457; 458; 460; 461; 463; 465; 485;
IGNORE, 44; 58; 59; 68; 72; 162; 232; 233; 489; 491; 492; 498-505; 507-512; 517-
411; 444; 445; 468; 549; 574; 586 519; 521; 523; 530; 537; 543-545; 550;
LIMIT, 39; 46; 47; 59; 158; 380; 418; 420; 577-579; 598; 607
423; 424; 434; 440; 476; 477; 586 Монитор InnoDB, 563; 579
LOW_PRIORITY, 59; 161; 227; 429; 434
ORDER BY, 21; 46; 59; 72-74; 162; 165; H
166; 250; 251; 263; 327; 340; 412; 417- Недействительный результат чтения, 63
419; 421-423; 427; 439; 440; 451; 610
SQL_SMALL_RESULT, 59; 417 о
WHERE, 20; 21; 58; 61; 64; 66; 70; 74; 75; Оболочка
151; 152; 157; 247; 267; 269; 307; 309; bash, 112; 185; 186; 203; 210; 389
347; 348; 362; 409-413; 416-422; 424; Bourne, 17; 210
427; 428; 432; 437-440; 476; 491; 512; sh, 16; 126; 145; 146; 185; 186; 191; 203; 210;
537; 554; 555; 557; 558; 586; 592; 593; 601
599; 606 tcsh, 17; 112; 203; 210; 601
Контрольная сумма MD5, 61; 90; 91; 93; 266; zsh,210
301; 427 Оператор
Курсор, 42 ALTER TABLE, 24; 45; 46; 59; 71; 75; 105;
156; 159; 163-165; 246; 248; 279; 324;
л 331; 361; 414; 426; 427; 457; 458; 489;
Лицензия GNU General Public License, 15; 499; 501; 504; 510-512; 521; 537; 539-
18; 32; 582 541; 543; 545; 549; 559; 573; 578; 581;
598;607-610
M ANALYZE TABLE, 59; 71; 72; 321; 324;
Механизм хранения 381; 408; 411; 415; 416; 424; 485; 512;
BDB, 23; 62; 71; 98; 126; 147-149; 155; 214; 519; 522;587
215; 223; 228; 238; 239; 242; 252; 350; CHECK TABLE, 55; 59; 113; 164; 165; 229;
396; 411; 430; 432-434; 498; 499; 515- 321; 322; 330; 333; 485; 507; 508; 522;
521 548; 580; 585; 595
HEAP, 40; 70; 73; 246; 382; 417; 422; 429; CREATE DATABASE, 59; 389; 390; 490; 585
430; 437; 438; 453; 491; 498; 513 CREATE TABLE, 24; 25; 40; 45; 53; 59; 61;
InnoDB, 23; 24; 29; 37; 38; 43; 62; 64; 65; 68; 65; 71; 105; 155; 156; 230; 233; 240; 246;
72; 97; 98; 100; 103; 120; 126; 147; 156; 247; 279; 280; 331; 381; 425; 437; 458;
161; 214; 215; 223; 229; 238; 242; 243; 487; 488; 490; 491; 495; 498-500; 502;
252; 318; 319; 350; 361; 375; 380; 381; 509; 513; 514; 518; 535; 536; 539-542;
396; 430; 432; 433; 434; 437; 451; 490; 558; 559; 563; 578; 580; 581
498;500; 518; 523-564; 567-574; 577- AVG_ROW_LENGTH, 24; 96; 331; 598
581;598 MAX_ROWS, 24; 96; 246; 247; 331; 514;
MEMORY, 42; 246; 358; 382; 430; 437; 438; 598
440; 469; 479; 481; 486; 490; 494; 496; DROP DATABASE, 59; 105; 162; 164; 267;
498; 499; 513-515; 567; 576 361; 389; 390; 559; 569; 580
EXPLAIN, 21; 52; 53; 59; 408; 409; 411; 413-
416; 418-420; 422-424; 427; 560; 585
616 Предметный указатель
EXPLAIN SELECT, 52; 53; 59; 408; 413; Mac OS, 77; 81; 88; 109-111; 114; 117; 138;
423; 560 144; 179; 214; 218; 245;516
FLUSH, 53; 59; 71; 75; 105; 151; 152; 229; NetBSD,77;185
246; 252; 262; 269; 271; 277; 289; 294; Novell NetWare, 77; 112
304; 306-309; 318; 320; 322; 345-348; OpenBSD, 77; 185
352; 364; 371; 374; 375; 379; 381; 393- OS/2 Warp, 77; 196
395; 425; 426; 447; 454; 455; 492; 493; SCO OpenServer, 77; 194; 516
508; 510; 512; 519; 592; 593; 606 SCO UnixWare, 78; 196; 516
GRANT, 139; 140; 152; 160; 165; 221; 228; SGI Irix, 78; 89; 193
266; 270; 271; 273; 277-280; 282; 283; Solaris, 24; 77; 78; 86; 127; 130-132; 179-
286; 288; 289; 292; 296; 298-300; 302- 183; 214; 218; 224; 227; 252; 448; 452;
310; 317; 374; 381; 407 454; 457; 516; 594
LOAD DATA INFILE, 44; 47; 59; 72; 105; SunOS, 78; 89; 131; 190
106; 224; 231; 239; 244; 248; 253; 273; Tru64Unix,78
279; 294; 319; 320; 373; 384; 391; 425; UNIX, 16; 21; 22; 38; 77; 141; 144; 194; 358;
426; 429; 461; 468; 481-483; 489; 493; 359; 361; 384; 461; 611; 613
494; 514; 609; 610 Windows, 15; 16; 21; 22; 38; 49; 51; 52; 55;
LOCK TABLES, 63; 64; 243; 278; 280; 318; 56; 78; 91; 93;95-99; 101-107; 133-138;
426; 432-434; 448; 491; 492; 508; 519; 144; 148-154; 156; 159; 167; 168; 197;
532;558-560; 579 198; 203; 206; 208-210; 213; 214;224;
OPTIMIZE TABLE, 59; 71; 72; 164; 321; 225; 229; 230; 241; 245; 248; 251; 253;
324; 333; 334; 381; 427; 429; 485; 505; 272; 281; 282; 290; 293; 302; 311; 318;
506; 512; 519; 522; 609 327; 346; 347; 352-355; 357; 359; 374;
RENAME DATABASE, 43 423; 431; 457; 459; 473; 483; 490; 512;
RENAME TABLE', 42; 59; 512; 542; 545; 559 524; 525; 527; 528; 530; 531; 534; 550;
REPAIR TABLE, 55; 59; 71; 72; 113; 157; 561; 563; 572; 576; 577; 579; 583; 590;
162; 163; 229; 241; 242; 248; 319; 321; 591; 598; 600; 603-605; 609; 613
324; 330; 333; 381; 457; 485; 507; 508; Опция
512; 522; 609 -analyze, 327; 333; 411; 416; 485; 502
REPLACE, 21; 44; 59; 70; 72; 227; 320; 404; ~ansi,57;223;238
512; 558; 565;566; 587 AVG_ROW_LENGTH, 24; 96; 331; 598
RESET, 17; 59; 349; 364; 385; 398; 399 -backup, 325; 462
SHOW INDEX, 162; 411; 416 -basedir, 216; 224; 354
SHOW MASTER STATUS, 161; 280; 375; -big-tables, 224; 453; 598
376; 379; 393; 395; 399; 401 —bind-address, 224
SHOW OPEN TABLES, 162 bulk_insert_buffer_size, 161; 235; 239; 257;
SHOW SLAVE STATUS, 162; 280; 369; 372; 425; 503
391; 394; 399; 401 -character-sets-dir, 224; 325; 341; 345; 468;
UNLOCK TABLES, 63; 320; 375; 393; 395; 479; 485; 496
426; 432; 448; 559; 560 -character-sets-dir, 224; 325; 468; 479; 485; 496
Операционная система -check, 93; 325; 485; 486; 493
AIX, 77; 86;87;90;188-190; 214; 516 —check-only-changed, 325; 486
Amiga, 77 -chroot, 224
BSDI,77;90; 185; 186 -config-file, 220
FreeBSD, 77; 88; 89; 130; 131; 145; 183; 184; -console, 100; 101; 224; 346; 527; 534; 563;
248; 516 579
HP-UX, 77; 87; 187; 188; 214 -core-file, 176; 216; 224
Linux, 24; 77; 78; 81; 85; 86; 89; 91; 92; 94; —core-file-size, 216
107; 109; 122; 127; 131; 133; 135; 138; —correct-checksum, 325
145; 161; 170-174; 176-178; 184; 197; -datadir,216;224;353;358
199; 213; 214; 216; 218; 225; 228; 230; -data-file-length, 325
268; 290; 293; 351; 360; 405; 448; 451; -debug, 101; 136; 149; 224; 295; 323; 462;
452; 456; 457; 483; 516; 528; 529; 532; 468; 479; 486; 489; 493; 494; 496
561; 575; 591; 594; 597
Предметный указатель 617
-replicate-do-db, 388; 392 -sql-mode, 57; 58; 158; 162; 223; 230; 232; 238
--replicate-do-table, 388; 392; 393 -symbolic-links, 229
-replicate-ignore-db, 388; 389; 392 ~tcp-ip, 220
--replicate-ignore-table, 389; 392 -temp-pool, 161; 230
--replicate-rewrite-db, 390 —timezone, 217
-replicate-wild-do-table, 388; 389; 392; 393 "tmpdir, 230; 327; 328; 353; 493; 598; 609
-replicate-wild-ignore-table, 389; 390; 392 -transaction-isolation, 58; 158; 230; 552
-report-host, 390 -unpack, 327; 467
-report-port, 390 -update-state, 322; 325; 331; 502; 508
-safe-mode, 228 -user, 106; 115-117; 119-121; 139-141; 144;
-safe-recover, 323; 326; 328; 332 146; 171; 182; 185; 203; 217; 220; 221;
-safe-show-database, 160; 228; 271 224; 231; 269; 281; 302-305; 468; 470;
-safe-user-create, 228; 271 480; 481; 484; 487; 491; 493; 495; 496;
-secure-auth, 228; 250; 271 601; 603
-set-auto-increment, 327 -verbose, 147; 205; 223; 323; 327; 330; 416;
-set-character-set, 124; 153; 326; 340 449; 451; 463; 470; 478; 480; 487; 491;
-silent, 136; 322; 323; 329; 333; 334; 463; 495; 496
470; 480; 486; 495; 607 -version, 205; 220; 231; 323; 463; 470; 480;
-skip-bdb, 215; 228; 238; 242; 395; 516; 517 481; 484; 487; 491; 495; 497
—skip-concurrent-insert, 229 -wait, 323; 463; 470; 480
—skip-delay-key-write, 229 -with-berkleydb, 82
-skip-external-locking, 113; 161; 227; 229; -with-debug, 82; 90; 124; 131; 189; 224; 230;
323; 325; 328; 329; 448; 462; 463; 503; 452; 479; 607
606;607 -with-innodb, 82; 85-89; 194; 214
-skip-grant-tables, 140; 229; 271; 291; 295; -with-libwrap, 82; 194
604; 605 -with-names-z-libs, 82
-skip-host-cache, 229; 293; 455 —without-innodb, 161
-skip-innodb, 161; 215; 229; 242; 395 -with-raid, 82
—skip-isam, 229; 242
-skip-locking, 161; 229 П
-skip-name-resolve, 104; 184; 229; 271; 293; Пакет RPM, 90; 107; 108; 109; 145; 203; 213;
455 218; 219
—skip-networking, 229; 271; 455 Переменная
-skip-new, 229; 240 серверная
-skip-safemalloc, 230; 452 autocommit, 257
-skip-show-database, 230; 271; 280 backjog, 182; 235; 238; 449
-skip-slave-start, 377; 390 basedir, 98; 134; 146; 147; 235; 238; 354;
-skip-stack-trace, 230 356;357
-skip-symbolic-links, 229; 458 bdb_cache_size, 235; 238; 449
-skip-thread-priority, 186; 230 bdbjiome, 235; 238
—slave_compressed_protocol, 390 bdb_log_buffer_size, 235; 238
-slave-load-tmpdir, 319; 373; 391 bdbjogdir, 235; 238
bdb_max_lock, 235; 238; 239; 517
—slave-net-timeout, 391
bdb_shared_data, 235; 239
-slave-skip-errors, 383; 391
bdbjmpdir, 235; 239
-socket, 104; 209; 217; 230; 352; 354; 358; bdb_version, 235; 239
359; 470; 480; 481; 484; 487; 491; 493; bigjables, 257; 259
495; 496; 590; 591; 610; 611 binlog_cache_size, 235; 239; 245; 257; 262;
sort_buffer_size, 161; 234; 237; 251; 254; 350; 351; 449; 517; 529
259; 264; 323; 324; 332; 334; 422; 423; bulk_insert_buffer_size, 161; 235; 239; 257;
450; 451; 529 425; 503
-sort-index, 327; 333; 334; 416; 467 character_set, 235; 239; 240; 257
-sort-records, 327; 333; 416 character_sets, 235; 240
-sort-recover, 324; 326; 328 concurrent_insert, 235; 240; 257
Предметный указатель 619
connecttimeout, 209; 235; 240; 257; 449; key_buffer_size, 72; 166; 208; 231; 234;
470;480; 484; 597 236; 243; 244; 255-258; 263; 323-326;
convert_character_set, 235; 257 332; 416; 426; 441; 443; 445; 449-451;
datadir, 97; 98; 134; 140; 146; 147; 207; 218; 453; 530
222; 235; 238; 240; 355; 358; 517 key__cache__age_threshold, 236; 244; 255;
default_week_format, 235; 240; 257 444
delay_key_write, 235; 240; 257 key_cache_block_size, 236; 244; 255; 256;
delayed_insert_limit, 235; 241; 257; 449 445
delayed_insert_timeout, 235; 241; 257; 449 key_cache_division_limit, 236; 244; 255;
delayed_queue_size, 235; 241; 257; 449 444
flush, 71; 140; 229; 235; 241; 257; 271; 277; language, 222; 236; 244
279; 289; 293-295; 304; 328; 329; 345; large_files_support, 236
347; 348; 350; 352; 425; 447; 449; 454; locaUnfiie, 236; 244; 258
455; 467; 478; 479; 510; 567; 593; 605 locked_in_memory, 236; 244
flushjime, 235; 241; 257; 449 log, 47; 71; 74; 100; 120; 129; 141; 148; 155;
ft_boolean_syntax, 235; 241; 258 161; 182; 226; 227; 236; 238; 244-247;
ft_max_word_len, 235; 241; 323; 324 258; 259; 293; 319; 346; 347; 351; 352;
ft_min_word_len, 235; 242; 323; 324 368; 370-373; 375-377; 386-388; 398;
ft_query_expansion_limit, 235; 242 415; 425; 473; 493; 513; 520; 521; 527;
ft_stopword_fiie, 235; 242; 324 534-536; 548; 564-567; 589
have_bdb,215;235;242 log_bin, 236; 244; 259
have_innodb,215;235;242 log_slave_updates, 236; 244
have_isam,215;236;242 log_slow_queries, 236; 245
have_openssl, 215; 236; 242; 313 log_update, 236; 245; 259
have_query_cache, 215; 236; 362; 364 log_warnings, 236; 258
have_raid,215;236;242 long_query_time, 45; 226; 236; 245; 258;
have_symlink, 215; 236; 457 264; 345;351;449; 479
init_file, 236; 243 low_priority_updates, 236; 245; 258; 259
innodb_additional_mem_pool_size, 236; lower_case_table_names, 55; 236; 245; 449;
527; 529; 530 541;550
innodb_buffer_pool_size, 236; 527; 529; 530 max_allowed_packet, 208; 210; 211; 236;
innodb_data_file_path, 215; 236; 500; 525- 245; 248; 258; 449; 453; 470; 484; 491;
528;531;535;546; 572 492;595;596;597
innodb_data_home_dir, 236; 525-528; 531; max_binlog_cache_size, 236; 245; 258; 351;
535; 546;572 449; 517
innodb_fast_shutdown, 236; 531 max_binlog_size, 236; 246; 258; 348; 372
mnodb_file_io_threads, 236 max_connect_errors, 236; 246; 258; 449;
innodb_flush_log_at_trx_commit, 236; 527; 593;594
529;531; 561 max_connections, 174; 228; 236; 246; 258;
innodb_flush_method, 236; 529; 532; 561 274; 307; 446; 449; 529; 530; 594; 601
innodb_force_recovery, 236; 532; 549 max_delayed_threads, 236; 246; 258; 449
innodbjock_wait_timeout, 236; 529; 532; maxerrorcount, 237; 246; 258
559 max_heap_table_size, 237; 246; 258; 449
innodb_log_arch_dir, 236; 529; 532; 533 maxjoin_size, 237; 246; 247; 258; 259; 413;
innodb_log_archive, 236; 532 449; 470; 477; 484
innodb_log_buffer_size, 236; 527; 529; 532 max_relay_log_size, 237; 246; 247; 258;
innodb_log_file_size, 236; 527; 529; 533 372;387
innodb_log_files_in_group, 236; 529; 533 max_sort_length, 73; 237; 247; 258; 449
innodb_log_group_home_dir, 236; 529; 532; maxjmpjables, 237; 247; 258; 446; 449
533 max_user_connections, 237; 247; 258; 270;
innodb_mirrored_log_groups, 236; 533 307
innodb_thread_concurrency, 236; 529; 533; max_write_lock_count, 237; 247; 258; 434;
567 449
interactive_timeout, 236; 243; 253; 258; 449; myisam_max_extra_sort_file_size, 161; 237;
597 248; 258; 503
join_buffer_size, 236; 243; 449 myisam_max_sort_file_size, 237; 248; 258;
503
620 Предметный указатель
NO_AUTO_VALUE_ON_ZERO, 232
NO_DIR_IN_CREATE, 233; 381
Семафор, 46; 47; 78; 104; 172; 370; 371; 455;
NO_FIELD_OPTIONS, 233
516; 533; 567
NO_KEY_OPTIONS, 233
Сервер баз данных, 18
NO_TABLE_OPTIONS, 233
NO_UNSIGNED_SUBTRACTION, 233 встроенный, 39; 223
ONLY_FULL_GROUP_BY, 58; 233 Симметричная многопроцессорная
ORACLE, 233 система, 78; 170
PIPES_AS_CONCAT, 58; 233 Система управления базами данных, 18
POSTGRESQL, 233 Список рассылки MySQL, 48
REAL_AS_FLOAT, 58; 233 anounce, 48
Репликация, 23; 40; 71; 365; 366; 380; 395; benchmarks, 49; 175; 404; 406
396; 543;584 benchmarks-digest, 49
--log-slave-updates, 382; 386; 398; 401 bugs, 48; 50; 51; 53; 54; 84; 126; 213; 401
--log-warnings, 227; 377; 386; 597 bugs-digest, 48
—master-connect-retry, 367; 370; 383; 384; gui-tools, 49
386;391 gui-tools-digest, 49
-master-host, 384; 386 internals, 48; 90; 127; 172; 343
—master-info-file, 386 internals-digest, 48
-master-password, 384; 386 Java, 49
-master-port, 384; 386 java-digest, 49
-master-ssl, 384; 386; 387 msql-mysql-modules, 50
—master-ssl-ca, 384; 386 msql-mysql-modules-digest, 50
-master-ssl-capath, 384; 386 myodbc, 49
—master-ssl-cert, 384; 386 myodbc-digest, 49
-master-ssl-cipher, 384; 386 mysql, 48
-master-ssl-key, 384; 387 mysql-digest, 48
-master-user, 384; 387 mysqldoc, 49; 127
—max-relay-log-size, 387; 388 mysqldoc-digest, 49
-read-only, 325; 387 packagers, 49
-relay-log, 371; 387; 391 packagers-digest, 49
-relay-log-index, 387 plusplus, 49; 50
—relay-log-info-file, 387 plusplus-digest, 50
-relay-log-purge, 387 Win32, 49; 133
-relay-log-space-limit, 387 win32-digest, 49
-replicate-do-db, 388; 392 Стандарт
~replicate-do-table, 388; 392; 393 SQL
-replicate-ignore-db, 388; 389; 392 1999, 18;56
-replicate-ignore-table, 389; 392 2003, 18; 42; 56
—replicate-rewrite-db, 390 SQL-92, 18; 56
-replicate-wild-do-table, 388; 389; 392; 393 СУБД, См. Система управления базами
-replicate-wild-ignore-table, 389; 390; 392 данных, 18; 19; 28; 29; 31; 33; 35; 36; 39;
-report-host, 390 47; 49; 56; 60; 62; 63; 67; 68; 79; 81; 150;
-report-port, 390 231; 403; 404; 407
-skip-slave-start, 377; 390 Сценарий
—slave_compressed_protocol, 390 bin/mysqlbug, 85
-slave-load-tmpdir, 319; 373; 391 Build-tools/Do-compile, 85
—slave-net-timeout, 391 configure, 46; 54; 85-90; 118; 119; 121-124;
-slave-skip-errors, 383; 391 126-131; 161; 164; 173; 176-196; 312;
Репозиторий BitKeeper, 39; 41; 42; 79; 80; 82; 340; 342; 343; 358; 360; 386; 452; 516;
83; 124; 125; 127; 133; 135; 136 528; 600; 607; 611; 612
Предметный указатель 623
Компания MySQL AB