Программное обеспечение MySQL (TM)
представляет собой очень быстрый
многопоточный, многопользовательский надежный SQL
-сервер баз данных (SQL -
язык структурированных запросов). Сервер MySQL предназначен как для
критических по задачам производственных систем с большой нагрузкой, так и
для встраивания в программное обеспечение массового распространения.
MySQL - это торговая марка MySQL АВ.
Программное обеспечение MySQL имеет двойное лицензирование
. Это означает,
что пользователи могут выбирать, использовать ли ПО MySQL бесплатно по общедоступной лицензии GNU
General Public License
(GPL
) или приобрести одну из стандартных коммерческих лицензий MySQL AB.
(http://www.gnu.org/licenses/).
Для получения самой свежей информации о программном обеспечении MySQL обращайтесь на веб-сайт MySQL (http://www.mysql.com/).
Ниже перечислены наиболее интересные разделы данного руководства.
Что важно:
Отчеты об ошибках (bugs), а также вопросы и комментарии следует посылать
по адресу mysql@lists.mysql.com. See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах. Для
составления отчетов об ошибках следует использовать сценарий mysqlbug
. В
поставках исходного текста сценарий mysqlbug
находится в директории
scripts
. Если у вас бинарная поставка, то сценарий mysqlbug
следует
искать в директории `bin'.
Если вы обнаружите существенную ошибку, относящуюся к безопасности в сервере MySQL, следует сообщить об этом по адресу: security@mysql.com.
Это - справочное руководство по MySQL; оно представляет собой документацию по MySQL версии 4.0.11-gamma. Функциональные изменения отмечены номером версии, в которой они произведены, поэтому это руководство будет полезно при освоении также и более старых версий MySQL.
Поскольку данный материал носит чисто справочный характер, в нем не содержится основных положений SQL или сведений по реляционным базам данных.
Руководство часто обновляется, поскольку ПО СУБД MySQL находится в состоянии постоянного развития. Самая последняя версия данного руководства доступна по адресу http://www.mysql.com/documentation/ в различных форматах, включая HTML, PDF и Windows HLP.
Исходным документом для всех версий документации является файл Texinfo.
HTML-версия генерируется автоматически модифицированной версией texi2html
.
Текстовая и Info-версии генерируются при помощи makeinfo
,
PostScript-версия создается texi2dvi
и dvips
. PDF-версия генерируется с
помощью pdftex
.
Если найти нужную информацию в руководстве не удается, можно прибегнуть к помощи версии руководства с функцией поиска, находящейся по адресу http://www.mysql.com/doc/.
Группа, работающая над документацией, рассмотрит любые предложения по дополнению или исправлению данного руководства. Их следует отправлять по адресу docs@mysql.com.
Данное руководство было изначально написано Дэвидом Аксмарком (David Axmark) и Майклом (Монти) Видениусом (Michael (Monty) Widenius). Сейчас это руководство поддерживается Майклом (Монти) Видениусом, Полом Дюбуа (Paul DuBois), Арйен Ленц (Arjen Lentz). Остальные разработчики упомянуты в разделе section C Благодарности.
Авторское право (2003) на данное руководство принадлежит шведской компании MySQL AB. See section 1.6.2 Авторские права и лицензии на MySQL.
В данном руководстве используются следующие обозначения:
Моноширинный
mysqladmin
, запустите его с
опцией --help
.''
Если нужно показать, что приведенная команда должна выполняться
определенной программой, она предваряется подсказкой с именем этой
программы. Например, shell>
указывает, что команда будет выполняться
вашей оболочкой, а mysql>
означает, что команда будет выполняться
клиентской программой mysql:
shell> набирайте команды оболочки здесь mysql> набирайте SQL-операторы здесь
Для представления команд оболочки в данном руководстве применяется
синтаксис оболочки Bourne. Если у вас используется csh
-оболочка, синтаксис
для нее будет несколько отличаться. Например, последовательность команд
для установки переменной окружения и запуска команды в синтаксисе оболочки
Bourne выглядит следующим образом:
shell> ПЕРЕМЕННАЯ=значение некая_команда
В случае csh
-оболочки для выполнения тех же действий вам потребуются
следующие команды:
shell> setenv ПЕРЕМЕННАЯ значение shell> некая_команда
Часто в командах имена баз данных, таблиц, столбцов следует заменять
конкретными значениями. Чтобы показать необходимость такой замены, в
данном руководстве используются выражения типа db_name
(имя базы данных),
table_name
(имя таблицы) и col_name
(имя столбца). Например, в тексте
руководства может встретиться оператор, подобный следующему:
mysql> SELECT col_name FROM db_name.table_name;
Это означает, что при вводе такого оператора вам необходимо будет указать собственную базу данных, имя таблицы и имя столбца, например:
mysql> SELECT author_name FROM biblio_db.author_list;
Ключевые слова SQL являются нечувствительными к регистру, поэтому их можно записывать, используя как прописные, так и строчные буквы. В данном руководстве используется регистр прописных букв.
Для представления необязательных слов и выражений в синтаксических
описаниях используются квадратные скобки (`[' и `]'). Например, в
приведенном ниже операторе выражение IF EXISTS
является необязательным:
DROP TABLE [IF EXISTS] имя_таблицы
Если элемент синтаксиса состоит из ряда альтернативных элементов, последние отделяются друг от друга вертикальными чертами (`|' ). В случае, когда может быть выбран один элемент из такого ряда, альтернативные элементы заключаются в квадратные скобки (`[' и `]'):
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
В случае, когда должен быть выбран один элемент из такого ряда, альтернативные элементы заключаются в фигурные скобки (`{' и `}'):
{DESCRIBE | DESC } имя_таблицы {имя_столбца | wild}
Русский перевод документации на ПО СУБД MySQL выполнен в 2002-2003гг. компанией Ensita.NET (http://www.ensita.net/).
Переводчики: Василюк Елена, Добродеев Сергей, Закиянов Денис, Коротун
Юрий, Пономарев Алексей, Ченцов Алексей; а также Жданов Сергей (раздел
"Интерфейс DBI
").
Научная редакция: Егор Егоров, Людмила Мезенко, Виктория Резниченко.
Литературный редактор: Людимила Мезенко (the best!)
Главный редактор перевода: Егор Егоров
* * * * *
Компания Ensita.NET (http://www.ensita.net/) являясь официальным
партнером MySQL AB с января 2002г. консультирует пользователей ПО СУБД MySQL по
всему миру, поддерживая список рассылки mysql@lists.mysql.com
(see section 1.8.1.1 Списки рассылки MySQL).
Ensita.NET с 1999г. занимается разработкой программного обеспечения для веб-сайтов, обслуживанием СУБД и консалтингом.
Редакционная коллегия при подготовке этого перевода старалась как можно адекватнее перевести специфические термины с английского языка на русский. Нами была поставлена цель создать справочное руководство на живом и понятном языке, но в то же время не переходить на чистый сленг. Поэтому терминология, принятая в этом переводе, возможно, не полностью соответствует четким терминам, принятым в русскоязычной литературе на "около-реляционную" тему.
Для ясности понимания мы включаем в документацию список принятых в этом переводе терминов.
Термин | Значение |
account | аккаунт, учетная запись |
ACL | списки контроля доступа |
banner | баннер |
benchmark page | страничка тестов производительности |
Berkeley-style copyright | лицензия наподобие Berkeley |
binary release, binary distribution | бинарная поставка, двоичная поставка |
cache | кэш |
case sensitive | чувствительный к регистру, регистро-зависимый |
change history | история изменений |
charset | набор символов, кодировка |
client/server | клиент-серверный |
command-line tool | утилита командной строки |
commit | принять; commit transaction - принять транзакцию |
communication protocol | коммуникационный протокол |
contact form | форма. fill in the contact form - заполните форму |
data dir | каталог с данными |
datadir, data dir | каталог datadir, каталог данных |
date type | тип даты |
DBA | администратор (физическое лицо) |
dbms | см. rdbms |
ddos | distributed dos - распределенная атака создания отказа в обслуживании |
denial of service | отказ в обслуживании |
deployment | распространение |
distribution | поставка, дистрибутив |
distributor | производитель |
dos | см. denial of service |
embedded | встраиваемый. Не "встроенный" |
environment variables | переменные окружения |
escape chars | символы экранирования |
escaped chars | экранированные символы |
extended regular expression | расширенное регулярное выражение |
fail-safe | отказобезопасный |
feature | возможность, особенность |
firewall | брандмауэр |
flush | сброс, очистка, перегрузка |
foreign key constraint | ограничения внешних ключей |
full precision | полная точность |
full-text | полнотекстовый |
grant tables | таблицы привилегий |
grants | привилегии |
group | группа, группировка |
group functions | групповые функции, операции группировки данных, операции над групповыми данными |
host | удаленный компьютер |
inserting data | добавление, вставка данных |
join | связь |
join optimizer | оптимизатор связей |
key cache | кэш ключей |
large-scale | широкомасштабный |
license | лицензция |
link | линкование (в контексте линкования компиляции программ) |
localhost, local host | локальный хост, локальный компьютер |
locking | блокировка |
log | журнал |
log position | точка положения в журнале репликации |
login | см. account |
login shell | первая оболочка входа (login shell) |
master | (репликация) головной сервер |
miscellaneous | разнообразный |
multi-byte | мультибайтный |
multi-layered | многоуровневый |
multithread | многопоточный |
mysql server | MySQL или сервер |
mysql user | пользователь MySQL |
non-updating queries | запросы, не изменяющие информацию |
null | null |
open source | система с открытым кодом (open source) |
optional | опциональный |
parser | синтаксический анализатор |
patch | патч |
port listening | слушание порта, слушать порт, ожидать соединение на порту |
privacy | конфиденциальность |
privilege | привилегии |
qualifier | определитель |
qualify | определять |
rdbms | система управления реляционными базами данных |
reference manual | справочник, руководство |
regular client | обычный клиент |
regular expression | регулярное выражение; extended - расширенное р.в. |
released under gpl | выпущено под лицензией GPL |
replica (server) | сервер с копиями |
robustness | надежность, отказоустойчивость |
rollback | откат |
rotation | ротация |
row-level locking | строчная блокировка |
scope | контекст |
script | сценарий, скрипт |
security | безопасность |
security issues | вопросы безопасности |
SET | множество |
silent | молчаливо |
slave | (репликация) подчиненный сервер |
snapshop | образ, снимок |
socket | сокет |
ssh port-forwarding | пересылка по SSH (SSH port-forwarding) |
SSL connections | SSL-соединения |
sticky | прилипчив |
superuser | суперпользователь |
symbol table | см. charset |
symbol value | строкое значение |
symlink | символическая ссылка |
table handler | обработчик таблиц |
thread | поток |
time stamp | временная метка |
timestamp | тип данных временной метки |
TODO-list | список задач к выполнению |
track | последовательность, протокол |
transactional | транзакционный |
trick | трюк, хитрость |
unix socket, unix domain socket | unix-сокет |
up-to-date | своевременный |
utilities | инструментальные программы |
vendor | поставщик |
verbose | расширенный режим вывода сообщений |
voting algorithm | алгоритм голосования |
warning | предупреждение |
wildcard | шаблон, шаблонные символы |
wrapper | оболочка |
Разработку и сопровождение MySQL, самой популярной SQL-базы данных с открытым кодом, осуществляет компания MySQL AB. MySQL AB - коммерческая компания, основанная разработчиками MySQL, строящая свой бизнес, предоставляя различные сервисы для СУБД MySQL. See section 1.5 Что представляет собой компания MySQL AB?.
На веб-сайте MySQL (http://www.mysql.com/) представлена самая свежая информация о программном обеспечении MySQL и о компании MySQL AB.
SQL
как часть системы MySQL можно охарактеризовать как
язык структурированных запросов
плюс наиболее распространенный
стандартный язык, используемый для доступа к базам данных.
GPL
(GNU General
Public License
), http://www.gnu.org/licenses/, в которой указано, что
можно и чего нельзя делать с этим программным обеспечением в различных
ситуациях. Если работа в рамках GPL
вас не устраивает или планируется
встраивание MySQL-кода в коммерческое приложение, есть возможность купить
коммерческую лицензированную версию у компании MySQL AB. See section 1.6.3 Лицензии на ПО MySQL.
MySQL
обладает также рядом удобных возможностей, разработанных в
тесном контакте с пользователями. Сравнительные характеристики MySQL и
других средств управления базами данных приведены на нашей странице тестов
производительности (see section 5.1.4 Набор тестов MySQL (The MySQL Benchmark Suite)).
Первоначально сервер MySQL разрабатывался для управления большими базами данных с целью
обеспечить более высокую скорость работы по сравнению с существующими на
тот момент аналогами. И вот уже в течение нескольких лет данный сервер
успешно используется в условиях промышленной эксплуатации с высокими
требованиями. Несмотря на то что MySQL постоянно совершенствуется, он уже
сегодня обеспечивает широкий спектр полезных функций. Благодаря своей
доступности, скорости и безопасности MySQL очень хорошо подходит для
доступа к базам данных по Internet.
ПО MySQL
является системой
клиент-сервер, которая содержит многопоточный SQL
-сервер, обеспечивающий
поддержку различных вычислительных машин баз данных, а также несколько
различных клиентских программ и библиотек, средства администрирования и
широкий спектр программных интерфейсов (API
).
Мы также поставляем сервер MySQL в виде многопоточной библиотеки, которую можно подключить к
пользовательскому приложению и получить компактный, более быстрый и легкий
в управлении продукт.
MySQL
уже поддерживается вашим
любимым приложением или языком.
MySQL правильно произносится как ''Май Эс Кью Эль'' (а не ''майсиквел''), хотя никто не запрещает вам произносить эту аббревиатуру как ``майсиквел'' или еще каким-либо образом.
В один прекрасный день мы решили применить mSQL для доступа к нашим
таблицам, для которых использовались собственные быстрые (ISAM
)
подпрограммы низкого уровня. Однако после тестирования мы пришли к
заключению, что для наших целей скорость и гибкость mSQL недостаточны.
В результате для базы данных был разработан новый SQL-интерфейс, но почти
с тем же API-интерфейсом, что и mSQL. Этот API мы выбрали, чтобы
упростить перенос на код сторонних разработчиков.
Происхождение имени MySQL не совсем ясно. Уже около 10 лет наша основная директория и большое количество библиотек и инструментария имеют префикс `my'. Более того, дочь Монти (она несколькими годами моложе) тоже получила имя My! Что из этих двух факторов повлияло на имя - до сих пор остается загадкой, даже для разработчиков.
Ниже приведено описание важных характеристик программного обеспечения MySQL. See section 1.7 Кратко о MySQL 4.x.
FLOAT
, DOUBLE
, CHAR
, VARCHAR
,
TEXT
, BLOB
, DATE
, TIME
, DATETIME
,
TIMESTAMP
, YEAR
, SET
и ENUM
. See section 6.2 Типы данных столбцов.
INSERT
можно
вставить подмножество столбцов таблицы; столбцы, для которых явно не
заданы значения, устанавливаются в значения по умолчанию.
SELECT
- и WHERE
- частях
запросов. Например:
mysql> SELECT CONCAT(first_name, " ", last_name) -> FROM tbl_name -> WHERE income/dependents > 10000 AND age > 30;
GROUP BY
и ORDER BY
с выражениями SQL. Поддержка
групповых функций (COUNT()
, COUNT(DISTINCT ...)
, AVG()
, STD()
, SUM()
,
MAX()
и MIN()
).
LEFT OUTER JOIN
и RIGHT OUTER JOIN
с синтаксисом ANSI SQL и
ODBC.
DELETE
, INSERT
, REPLACE
, and UPDATE
возвращают число строк, которые
были изменены. Вместо этого можно задать возвращение совпавших строк.
Для этого следует установить флаг при соединении с сервером.
SHOW
, которая является специфической для MySQL, можно
использовать для получения информации о базах данных, таблицах и
индексах. Чтобы выяснить, как оптимизатор выполняет запрос, можно
применять команду EXPLAIN
.
ABS
является корректным именем столбца. Для вызова функции существует
только одно ограничение: между именем функции и следующей за ним
открывающей скобкой `(' не должно быть пробелов. See section 6.1.6 ``Придирчив'' ли MySQL к зарезервированным словам?.
MySQL
для работы с несколькими базами данных, которые содержат
50 миллионов записей, кроме того, нам известны пользователи,
использующие MySQL для работы с 60000 таблицами, включающими
около 5000000000 строк.
CHAR
или VARCHAR
.
MySQL
, используя сокеты TCP/IP,
сокеты Unix или именованные каналы (named pipes, под NT).
ODBC
(Open-DataBase-Connectivity) для Win32 (с исходным
кодом). Все функции ODBC 2.5 и многие другие. Например, для соединения
с MySQL можно использовать MS Access. See section 8.3 Поддержка ODBC в MySQL.
myisamchk
, очень быструю утилиту для проверки, оптимизации и
восстановления таблиц. Все функциональные возможности myisamchk
также
доступны через SQL-интерфейс. See section 4 Администрирование баз данных.
--help
или -?
для
получения помощи.
Этот раздел дает ответ на следующие вопросы ''Насколько стабильным является MySQL?'' и ''Могу ли я положиться на MySQL в своем проекте?'' Мы попытаемся внести ясность в эти проблемы, а также ответить на некоторые важные вопросы, которые имеют значение для многих потенциальных пользователей. Информация данного раздела базируется на данных из списка рассылки, - наши пользователи очень активно сообщают нам о выявленных проблемах и о своем опыте использования нашего ПО.
Самые первые версии кода были созданы в начале 80-х. Это был устойчивый
код с форматом таблиц ISAM
, обеспечивающим обратную совместимость с
предыдущими версиями. Во времена компании TcX, предшественника MySQL AB, с
середины 1986 года код MySQL работал в проектах без каких-либо проблем. Но
когда сервер MySQL был выпущен для широкого использования, оказалось, что
существует несколько фрагментов ``непротестированного кода''. Эти
фрагменты были быстро обнаружены новыми пользователями, которые составляли
запросы в несколько ином виде, чем мы.
С каждым новым релизом количество проблем, связанных с переносимостью, уменьшалось (несмотря на то, что в каждом выпуске появлялось множество новых возможностей).
Каждый релиз MySQL был рабочим, проблемы возникали только при использовании кода из ``серых зон''. Естественно, что новые пользователи не знают о том, где находятся такие ``серые зоны''; в данном разделе сделана попытка описать те из них, которые известны на данный момент. Большая часть описания относится к версии 3.23 MySQL-сервера. В самой последней версии все известные ошибки устранены, за исключением тех, которые перечислены в разделе ошибок, а также конструктивных дефектов. See section 1.9.5 Известные ошибки и недостатки проектирования в MySQL.
Структура ПО MySQL является многоуровневой с независимыми модулями. Некоторые из новейших модулей перечислены ниже, причем по каждому дается информация о том, насколько хорошо он протестирован.
InnoDB
-таблицы - стабильно (в 3.23 с 3.23.49)
InnoDB
-таблиц объявлен в настоящее время
стабильными в дереве MySQL 3.23, начиная с версии 3.23.49. InnoDB
используется в больших промышленных системах с большой нагрузкой.
BDB
-таблицы - Gamma
Berkeley DB
очень устойчив, но на настоящий момент продолжается
усовершенствование интерфейса обработчика транзакционных BDB
-таблиц с
MySQL, поэтому должно пройти некоторое время, пока он будет так же хорошо
протестирован, как и таблицы других типов.
Полнотекстовый поиск
- Beta
MyODBC 2.50
(использующий ODBC SDK 2.5) - Gamma
MyISAM
-таблиц - Gamma
MyISAM
-таблицах в MySQL 4.0 для быстрой вставки
большого количества строк.
fcntl()
). В таких случаях следует запустить демон mysqld
с флагом
--skip-external-locking
. Известно, что проблемы имеют место в некоторых системах
Linux и в SunOS, когда используются NFS-монтированные файловые системы.
Несмотря на то, что высококвалифицированную поддержку MySQL AB обеспечивает за плату, в списке рассылки MySQL обычно можно получить ответы на часто возникающие вопросы. Ошибки обычно ликвидируются сразу же при помощи патчей, а серьезные дефекты почти всегда устраняются в новом выпуске.
MySQL версии 3.22 имеет предел по размеру таблиц 4 Гб. В MySQL версии 3.23, где используется новый тип таблиц, максимальный размер таблицы доведен до 8 миллионов терабайтов (2 ^ 63 bytes).
Однако следует заметить, что операционные системы имеют свои собственные ограничения по размерам файлов. Ниже приведено несколько примеров:
Операционная система | Ограничения на размеры файла |
32-разрядная Linux-Intel | 2Гб, 4Гб и более, в зависимости от версии Linux |
Linux-Alpha | 8T (?) |
Solaris 2.5.1 | 2 Гб (с патчем возможно 4Гб) |
Solaris 2.6 | 4Гб (может быть изменено при помощи указания флага) |
Solaris 2.7 Intel | 4 Гб |
Solaris 2.7 UltraSPARC | 512 Гб |
В Linux 2.2 существует возможность создавать таблицы с размерами более 2 Гб, используя патч LFS для файловой системы ext2. Существуют также патчи, обеспечивающие поддержку больших файлов для ReiserFS в Linux 2.4.
Как можно видеть, размер таблицы в базе данных MySQL обычно лимитируется операционной системой.
По умолчанию MySQL-таблицы имеют максимальный размер около 4 Гб. Для любой
таблицы можно проверить/определить ее максимальный размер с помощью команд
SHOW TABLE STATUS
или myisamchk -dv table_name
. See section 4.5.6 Синтаксис команды SHOW
.
Если необходимы таблицы большего размера, чем 4 Гб (и используемая
операционная система ``не возражает''), следует при создании такой таблицы
задать параметры AVG_ROW_LENGTH
и MAX_ROWS
(see section 6.5.3 Синтаксис оператора CREATE TABLE
). Эти параметры можно задать и позже - с помощью ALTER TABLE
(see section 6.5.4 Синтаксис оператора ALTER TABLE
).
Если большая таблица предназначена только для чтения, можно
воспользоваться myisampack
, чтобы слить несколько таблиц в одну и сжать
ее. Обычно myisampack
ужимает таблицу по крайней мере на 50%, поэтому в
результате можно получить очень большие таблицы (see section 4.7.4 myisampack
, MySQL-генератор сжатых таблиц (только для чтения)).
Есть еще одна возможность обойти ограничения операционной системы на
размеры файлов данных MyISAM, - это делается при помощи опции RAID
(see section 6.5.3 Синтаксис оператора CREATE TABLE
).
Еще одним решением может быть использование функции MERGE
, которая
обеспечивает возможность обрабатывать набор идентичных таблиц как одну
таблицу (see section 7.2 Таблицы MERGE).
Сам MySQL не имеет проблем, связанных с Проблемой-2000 (Y2K):
2069
, исключены. Принимается, что все двузначные
значения годов находятся в диапазоне с 1970
по 2069
, поэтому число 01
в
столбце с типом year
MySQL обрабатывает как 2001
.
YEAR
,
который обеспечивает хранение нулевого 0
года и значений лет от 1901
до 2155
в одном байте, а также отображение дат при помощи 2 или 4
знаков.
Проблемы, связанные с 2000-м годом, могут возникнуть в приложениях,
которые используют MySQL так, что это может оказаться небезопасным
с точки зрения Y2K. Например, во многих старых приложениях для хранения и
обработки значений годов используются 2-значные величины (которые можно
трактовать неоднозначно), а не 4-значные. Эта проблема может быть
урегулирована при помощи приложений, которые используют 00
или 99
как
``отсутствующие'' индикаторы значений.
К сожалению, такие проблемы бывает сложно устранить, так как разные приложения могут быть написаны разными программистами, каждый из которых мог применять отличный от других набор соглашений и обрабатывающих значения даты функций.
Приведенный ниже код является наглядной демонстрацией того, что в MySQL Server проблемы с датами вплоть до 2030 года отсутствуют.
mysql> DROP TABLE IF EXISTS y2k; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE y2k (date DATE, -> date_time DATETIME, -> time_stamp TIMESTAMP); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO y2k VALUES -> ("1998-12-31","1998-12-31 23:59:59",19981231235959), -> ("1999-01-01","1999-01-01 00:00:00",19990101000000), -> ("1999-09-09","1999-09-09 23:59:59",19990909235959), -> ("2000-01-01","2000-01-01 00:00:00",20000101000000), -> ("2000-02-28","2000-02-28 00:00:00",20000228000000), -> ("2000-02-29","2000-02-29 00:00:00",20000229000000), -> ("2000-03-01","2000-03-01 00:00:00",20000301000000), -> ("2000-12-31","2000-12-31 23:59:59",20001231235959), -> ("2001-01-01","2001-01-01 00:00:00",20010101000000), -> ("2004-12-31","2004-12-31 23:59:59",20041231235959), -> ("2005-01-01","2005-01-01 00:00:00",20050101000000), -> ("2030-01-01","2030-01-01 00:00:00",20300101000000), -> ("2050-01-01","2050-01-01 00:00:00",20500101000000); Query OK, 13 rows affected (0.01 sec) Records: 13 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM y2k; +------------+---------------------+----------------+ | date | date_time | time_stamp | +------------+---------------------+----------------+ | 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 | | 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 | | 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 | | 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 | | 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 | | 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 | | 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 | | 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 | | 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 | | 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 | | 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 | | 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 | | 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 | +------------+---------------------+----------------+ 13 rows in set (0.00 sec)
Можно видеть, что при использовании типов DATE
и DATETIME
проблем с датами
будущего не возникнет (эти типы ``справляются'' с датами вплоть до 9999
года).
Тип TIMESTAMP
, который используется для сохранения текущего времени, имеет
диапазон только до 2030-01-01
. В 32-разрядных машинах TIMESTAMP
тип имеет
диапазон от 1970
до 2030
(значение со знаком). В 64-разрядных машинах этот
тип ``справляется'' со значениями времени до 2106
года (значение без
знака).
Таким образом, даже несмотря на то, что MySQL является Y2K-совместимым, ответственность за однозначную интерпретацию значений даты ложится на плечи пользователя. See section 6.2.2.1 Проблема 2000 года и типы данных, где приведены правила по работе MySQL с входными данными, которые имеют неоднозначные значения даты (данные, содержащие 2-значные значения года).
MySQL AB - компания, в состав которой входят основатели MySQL и основные
разработчики. MySQL AB создана в Швеции Дэвидом Аксмарком (David Axmark),
Аланом Ларссом (Allan Larsson) и Майклом Монти
Видениусом (Michael
Monty Widenius).
Все разработчики сервера MySQL - штатные сотрудники компании. MySQL AB - виртуальная компания, состоящая из сотрудников, живущих в десятках стран по всему миру. Мы каждый день общаемся по Сети друг с другом, а также с нашими партнерами и пользователями.
Наша компания занимается разработкой и распространением СУБД MySQL и сопутствующего ПО. MySQL AB владеет всеми правами на исходный код MySQL, на логотип и торговую марку MySQL, а также на данное руководство (see section 1.4 Что представляет собой MySQL?).
Наши основные ценности - это то, что наша деятельность посвящена MySQL и
идеям Open Source
, открытого программного обеспечения.
Мы хотим, чтобы сервер MySQL соответствовал следующим критериям:
MySQL AB и люди, работающие в MySQL AB:
Свежая информация о MySQL и MySQL AB находится на сайте MySQL (http://www.mysql.com/).
Очень часто нам задают такой вопрос: ''Как вам удается зарабатывать на жизнь, ведь вы все раздаете бесплатно?''
Компания MySQL AB получает плату за поддержку, услуги, коммерческие лицензии и лицензионные платежи. Эти доходы вкладываются в разработку продукта и расширение бизнеса нашей компании.
Компания является прибыльной с момента своего основания. В октябре 2001 ряд ведущих скандинавских инвесторов и небольшая группа меценатов предоставили нам венчурный кредит. Эти капиталовложения идут на укрепление нашей бизнес-модели и создают основу устойчивого роста бизнеса компании.
Владельцами и руководителями компании MySQL AB являются ее основатели и ведущие разработчики ПО баз данных MySQL. В задачи разработчиков входит предоставление поддержки клиентам и другим пользователям, что обеспечивает нам возможность всегда быть в курсе их потребностей и проблем. Вся наша поддержка осуществляется квалифицированными разработчиками. Ответы на самые каверзные вопросы дает
Майкл Монти Вайдиниус (Michael Monty Widenius), главный автор MySQL Server. See section 1.6.1 Поддержка, предлагаемая компанией MySQL AB.
Для более подробной информации и заказа различных уровней поддержки обратитесь на веб-сайт https://order.mysql.com/ или свяжитесь с нашим отделом сбыта по адресу sales@mysql.com.
Компания MySQL AB проводит обучение по MySQL и другим смежным продуктам по всему миру. Мы предлагаем как общедоступные, так и внутрифирменные курсы, подготовленные в соответствии с конкретными потребностями вашей компании. Обучение по MySQL проводят также наши партнеры - авторизованные центры обучения по MySQL.
В наших учебных материалах в качестве примеров используются те же базы данных, что и в нашей документации и типовых приложениях. Эти материалы постоянно дополняются, чтобы соответствовать последней версии MySQL. Наши инструкторы опираются на поддержку коллектива разработчиков, что гарантирует качество обучения и постоянное совершенствование учебного материала. Благодаря тесной связи с разработчиками вы можете быть уверены также и в том, что какой бы вопрос ни возник у вас в процессе обучения, на него всегда будет найден ответ.
Обучение на наших курсах позволит вам достичь целей, которые вы ставите перед собой при создании своих MySQL-приложений. Помимо этого вы:
сертификации по MySQL
.
Если предлагаемое нами обучение интересует вас как потенциального участника нашего проекта или партнера в реализации учебных курсов, посетите учебный раздел на нашем веб-сайте http://www.mysql.com/training/ или свяжитесь с нами по адресу: training@mysql.com.
Для более подробной информации о программе сертификации MySQL, см. http://www.mysql.com/certification/.
Компания MySQL AB и ее авторизованные партнеры предлагают по всему миру консультационные услуги для пользователей MySQL а также для разработчиков, встраивающих MySQL в свое программное обеспечение.
Наши консультанты окажут вам помощь в таких вопросах, как проектирование и настройка баз данных, создание эффективных запросов, настройка используемой вами платформы для достижения оптимальной эффективности работы, решение проблем миграции, реализация тиражирования, создание устойчивых приложений диалоговой обработки запросов, а также во многих других. Кроме того, мы помогаем нашим клиентам встраивать MySQL в их продукты и приложения, предназначенные для широкомасштабного распространения.
Наши консультанты работают в тесном сотрудничестве с коллективом разработчиков компании, что обеспечивает высокий технический уровень предоставляемых ими профессиональных услуг. Мы предлагаем широкий диапазон форм консультационной поддержки - от двухдневных интенсивных курсов до проектов продолжительностью в недели и месяцы. Наши консультации охватывают не только MySQL, но и языки программирования и сценариев, например PHP, Perl и многое другое.
Заинтересованных в наших консультационных услугах, а также тех, кто хотели бы стать нашими партнерами в оказании таких услуг, приглашаем посетить консультационный раздел на нашем веб-сайте http://www.mysql.com/consulting/ или связаться с нашим консультационным отделом по адресу consulting@mysql.com.
ПО баз данных MySQL выпускается по общедоступной лицензии GNU General
Public License
(GPL
). Это означает, что при соблюдении условий GPL
ПО
MySQL
можно пользоваться бесплатно. Если вы не хотите связывать себя
лицензионными ограничениями GPL
(например, вас не устраивает условие, что
ваше собственное приложение также подпадает под действие GPL
), есть
возможность приобрести у компании MySQL AB на этот же продукт коммерческую
лицензию.
См. https://order.mysql.com/).
Компания MySQL AB владеет авторскими правами на
исходный код MySQL, поэтому мы вправе использовать двойное лицензирование,
в соответствии с которым один и тот же продукт доступен как по лицензии
GPL
, так и по коммерческой лицензии, и это никоим образом не нарушает
обязательств компании MySQL AB по предоставлению исходного кода. Более
подробную информацию о том, в каких случаях необходимо приобретение
коммерческой лицензии, вы найдете в разделе section 1.6.3 Лицензии на ПО MySQL.
Компания MySQL AB занимается также продажей коммерческих лицензий на ПО
сторонних разработчиков, предоставляемое с открытым исходным кодом на
условиях GPL
. Это ПО расширяет возможности MySQL
. Хороший пример -
транзакционный обработчик таблиц InnoDB, обеспечивающий поддержку
технологии ACID
, строковую блокировку, восстановление системы после аварии,
управление версиями, поддержку внешних ключей и многое другое (see section 7.5 Таблицы InnoDB).
Компания MySQL AB реализует глобальную программу партнерства, которая охватывает учебные курсы, консультативные услуги и поддержку продукта, издательскую деятельность, а также продажу и распространение MySQL и смежных продуктов. Партнеры компании MySQL AB получают право быть представленными на веб-сайте http://www.mysql.com/ и использовать в маркировке своих продуктов специальные варианты торговой марки MySQL - с целью идентификации и продвижения этих продуктов на рынке.
Тех, кто заинтересован в получении статуса партнера MySQL, просим обращаться по адресу partner@mysql.com.
Название MySQL и логотип MySQL в виде дельфина являются торговыми марками компании MySQL AB (see section 1.6.4 Логотипы и торговые марки MySQL AB), принадлежащими компании MySQL AB. Узнаваемость этих торговых марок свидетельствует о том, что за годы своей работы основатели компании MySQL AB сумели добиться для своей компании заметного положения и признания в мире.
Веб-сайт компании MySQL (http://www.mysql.com/) пользуется популярностью среди разработчиков и пользователей. Например, в октябре 2001 г. мы обслужили 10 миллионов запросов на просмотр размещенных на нем страниц. Наши посетители относятся к категории лиц, принимающих решения и дающих рекомендации о покупке как программного, так и аппаратного обеспечения. 12% наших посетителей утверждают решения о приобретении, и только 9% наших посетителей совсем не имеют отношения к принятию подобных решений. Более 65% наших посетителей сделали в деловых целях как минимум одну покупку в Сети за последние полгода, а 70% - планируют совершить ее в ближайшие месяцы.
Самая свежая информация о MySQL и нашей компании представлена на веб-сайте MySQL (http://www.mysql.com/).
По вопросам связи с прессой и темам, не затронутым в наших сообщениях для печати (http://www.mysql.com/news/), обращайтесь по адресу press@mysql.com.
Для получения своевременных и точных ответов на технические вопросы, касающиеся ПО MySQL, необходимо иметь действующий контракт с компанией MySQL AB по поддержке (за дополнительной информацией обращайтесь к разделу section 1.6.1 Поддержка, предлагаемая компанией MySQL AB). Чтобы заказать контракт по поддержке, следует обратиться на сайт https://order.mysql.com/ или направить сообщение по адресу sales@mysql.com.
Для получения информации об учебных курсах, которые проводит компания MySQL AB, посетите раздел по обучению на веб-сайте http://www.mysql.com/training/. Тех, кто имеет ограниченный доступ в Internet, просим связаться с учебным отделом компании MySQL AB по адресу training@mysql.com (see section 1.5.1.2 Обучение и сертификация).
Информацию о программе сертификации компании MySQL AB вы найдете на странице http://www.mysql.com/certification/index.html нашего веб-сайта. Если вы желаете быть в курсе текущего состояния программы сертификации по MySQL, просим сообщить об этом по адресу certification@mysql.com. See section 1.5.1.2 Обучение и сертификация.
Заинтересованных в получении консультаций приглашаем посетить раздел консультаций на веб-сайте http://www.mysql.com/consulting/. Тех, у кого имеется ограниченный доступ в Internet, просим связаться с консультационным отделом компании MySQL AB по адресу consulting@mysql.com. Обращайтесь к разделу section 1.5.1.3 Консультации.
Коммерческие лицензии можно приобрести по Сети, на веб-сайте https://order.mysql.com/. Здесь вы найдете также информацию о том, как передать в компанию MySQL AB свой заказ на покупку по факсу. Более подробная информация о лицензировании доступна на http://www.mysql.com/products/pricing.html.
Если у вас имеются вопросы, касающиеся лицензирования, или вы хотите знать расценки на лицензии в случае массового выпуска продукта, заполните форму на нашем веб-сайте (http://www.mysql.com/) или пошлите сообщение по электронной почте: вопросы, касающиеся лицензирования, направляйте по адресу licensing@mysql.com, а запросы на покупку - по адресу sales@mysql.com. Обращайтесь также к разделу section 1.6.3 Лицензии на ПО MySQL.
Если вы представляете деловые круги, заинтересованные в партнерских отношениях с компанией MySQL AB, напишите нам по адресу partner@mysql.com. Обращайтесь к разделу section 1.5.1.5 О нашей программе партнерства.
Для получения дополнительной информации о политике компании MySQL в отношении торговых марок обращайтесь на наш веб-сайт http://www.mysql.com/company/trademark.html или напишите письмо по адресу trademark@mysql.com. Обратитесь к разделу section 1.6.4 Логотипы и торговые марки MySQL AB.
Если вас заинтересовало какое-либо из предложений, перечисленных в нашем разделе предложений работы (http://www.mysql.com/company/jobs/), направляйте свои письма по адресу jobs@mysql.com. Просьба не оформлять свои личные данные в виде вложения в письмо: лучше добавьте эту информацию в виде обычного текста в конце своего сообщения.
Если вы желаете принять участие в общей дискуссии с нашими многочисленными пользователями, обращайтесь на соответствующий список рассылки (see section 1.8.1 Списки рассылки MySQL).
Сообщения об ошибках (или bugs), а также вопросы и комментарии следует
направлять в список рассылки по адресу mysql@lists.mysql.com. При
обнаружении в MySQL ошибок
, влияющих на безопасность баз данных,
просим сообщать об этом по адресу security@mysql.com. Обратитесь также к
разделу section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах.
Если у вас имеются сравнительные результаты тестирования, которые мы можем опубликовать, свяжитесь с нами по адресу benchmarks@mysql.com.
Предложения по внесению дополнений или исправлений в данное руководство пользователя следует направлять коллективу разработчиков руководства по адресу docs@mysql.com.
Вопросы и замечания по работе или содержанию веб-сайта MySQL (http://www.mysql.com/) направляйте по адресу webmaster@mysql.com.
Компания MySQL AB придерживается определенной политики относительно конфиденциальности информации. Об этом вы можете прочитать на странице http://www.mysql.com/company/privacy.html нашего веб-сайта. По вопросам этой политики просим обращаться по адресу privacy@mysql.com.
По всем другим вопросам обращайтесь по адресу info@mysql.com.
В этом разделе описаны условия предоставления компанией MySQL AB лицензий и поддержки.
Что подразумевается под технической поддержкой компании MySQL AB? Это означает, что на каждый свой вопрос вы получите адресованный лично вам ответ непосредственно от программистов, пишущих программы баз данных MySQL.
Мы стараемся, чтобы наша техническая поддержка носила широкий и
содержательный характер. Если вопрос, который вы задаете по MySQL, важен
для вас, то, следовательно, он должен быть важен и для нас. Как правило,
клиенты просят помочь разобраться в том, как работают те или иные команды
или утилиты, как устранить ``узкие места'', мешающие эффективной работе
системы, как восстановить систему в случае аварии, как влияет на работу
MySQL та или иная операционная система или локальная сеть, какие
технологии резервного копирования и восстановления данных лучше применять,
как использовать API
-интерфейсы и т.д. Наша поддержка охватывает вопросы,
относящиеся только к серверу MySQL и нашим собственным утилитам, но не к
продуктам сторонних разработчиков, которые обеспечивают доступ к серверу
MySQL, хотя мы стараемся и в этих случаях оказывать посильную помощь.
Подробная информация о различных видах поддержки, которую предлагает компания, приведена на веб-сайте http://www.mysql.com/support/. Там же вы можете заказать по Сети контракты по поддержке. Те, кто имеет ограниченный доступ в Internet, могут связаться с нашим отделом сбыта по адресу sales@mysql.com.
Техническая поддержка - это своего рода страхование жизни. Без такой страховки можно успешно обходиться долгие годы, но наступит критический момент - и придется сожалеть о своей беспечности! Если вы используете сервер MySQL для важных приложений и внезапно сталкиваетесь с неполадками в их работе, может оказаться, что на самостоятельное выяснение ответов на все вопросы потребуется слишком много времени. В таких случаях не обойтись без срочной помощи самых опытных специалистов по устранению аварийных ситуаций в MySQL, а они работают именно в компании MySQL AB.
Компания MySQL AB является владельцем авторских прав на исходный код ПО MySQL, логотипы и торговые марки MySQL, а также на данное руководство пользователя. Обратитесь к разделу section 1.5 Что представляет собой компания MySQL AB? Распространение MySQL подпадает под действие нескольких различных лицензий:
mysqlclient
и клиентское ПО, а также библиотека GNU
readline
подпадают под
действие общедоступной лицензиии GNU
General Public License
(see section H GNU General Public License). Текст этой лицензии имеется также в
составе дистрибутива ПО, в файле `COPYING'.
GNU
getopt подпадает под действие GNU Lesser General
Public License
(see section I GNU Lesser General Public License).
GPL
. Его использование допускается на следующих
условиях:
Дополнительная информация о том, как практически осуществляется лицензирование MySQL, находится в разделе section 1.6.3 Лицензии на ПО MySQL. Обращайтесь также к разделу section 1.6.4 Логотипы и торговые марки MySQL AB.
ПО MySQL распространяется в соответствии с условиями общедоступной
лицензии GNU General Public License
(GPL
), которая является одной из
наиболее широко распространенных лицензий на ПО с открытым исходным кодом.
Официальные условия лицензии GPL
вы найдете на веб-сайте
http://www.gnu.org/licenses/. Обратитесь также к
http://www.gnu.org/licenses/gpl-faq.html и
http://www.gnu.org/philosophy/enforcing-gpl.html.
Так как ПО MySQL выпускается по лицензии GPL
, зачастую им можно
пользоваться бесплатно, но в некоторых случаях желательно или необходимо
приобрести коммерческую лицензию у компании MySQL AB (это можно сделать на
веб-сайте https://order.mysql.com/).
См. http://www.mysql.com/products/licensing.html для получения более подробной информации.
Старые версии MySQL (3.22 и более ранние) подпадают под действие более строгой лицензии (http://www.mysql.com/products/mypl.html). Информацию об условиях лицензии вы найдете в документации на конкретную версию.
Обращаем ваше внимание на то, что использование ПО MySQL, подпадающего под
коммерческую лицензию, лицензию GPL
или старую лицензию MySQL, не
означает, что вы автоматически получаете право на использование торговых марок,
принадлежащих компании MySQL AB. Об этом читайте в разделе section 1.6.4 Логотипы и торговые марки MySQL AB.
Лицензия GPL
- в хорошем смысле - носит ``заразный'' характер. Это
означает, что в случае линкования какой-либо программы с программой, выпущенной
по данной лицензии, все части исходного кода получившегося продукта должны
также выпускаться по лицензии GPL
. В противном случае будут нарушены
условия лицензии и вы вообще лишитесь права использовать программу, подпадающую
под ее действие.
Коммерческая лицензия является необходимой в следующих случаях:
GPL
кодом из ПО MySQL, в тех случаях, когда вы не
хотите, чтобы готовый продукт подпадал под действие GPL
(например,
продукт разрабатывается как коммерческий или существуют какие-либо
другие причины не открывать добавленный программный код, который не
подпадает под действие GPL
). При покупке коммерческой лицензии
вы не используете ПО MySQL под лицензией GPL
, даже несмотря на то,
что это один и тот же код.
GPL
,
которое предназначено для работы исключительно с ПО MySQL и
поставляется вместе с ним. Такой вариант решения в действительности
считается связыванием, даже если оно осуществляется по сети.
GPL
.
Для каждой инсталляции ПО MySQL вам понадобится отдельная лицензия. Ее действие распространяется на любое число процессоров в машине и при этом не накладывается никаких юридических ограничений на число клиентских машин, подключенных к серверу.
По поводу коммерческих лицензий, см. http://www.mysql.com/products/licensing.html. Для контрактов на поддержку, см. http://www.mysql.com/support/. Тех, для кого требуются особые условия лицензирования, а также тех, у кого имеется ограниченный доступ в Internet, просим связаться с нашим отделом сбыта по адресу sales@mysql.com.
По лицензии GPL
допускается бесплатное использование ПО MySQL если вы
согласны с условиями GPL
. Подробнее по поводу лицензии GPL
и
освещение наиболее популярных вопросов вы найдете по адресу
http://www.gnu.org/licenses/gpl-faq.html.
Некоторые общие примеры GPL-использования MySQL:
MySQL
или не зависящими от него по
своему функциональному назначению, даже в том случае, если они
распространяются на коммерческой основе.
Это называется mere aggregation в лицензии GPL
.
В общем случае мы рекомендуем приобретать контракт на поддержку компании MySQL AB и тем, кому для использования ПО баз данных MySQL не требуется коммерческой лицензии: этим вы будете способствовать развитию технологии MySQL и заодно немедленно получите для себя дополнительные преимущества (see section 1.6.1 Поддержка, предлагаемая компанией MySQL AB).
В случае использования ПО баз данных MySQL в коммерческих целях, предполагающего получение прибыли, мы предлагаем приобретение поддержки того или иного уровня, что будет способствовать дальнейшему развитию ПО MySQL. Мы считаем, что, если база данных MySQL способствует вашему бизнесу, то резонно предложить и вам оказать содействие компании MySQL AB (иначе получается так, что, обращаясь в нашу службу поддержки с вопросом, вы не только бесплатно пользуетесь тем, во что мы вложили большое количество усилий, но к тому же и требуете от нас еще и бесплатной поддержки)
Многие пользователи СУБД MySQL выражают желание расположить логотип MySQL AB с изображением дельфина на своих веб-сайтах, книгах или коробках со своими программными продуктами. Мы приветствуем это желание, хотя и обязаны напомнить, что MySQL и логотип MySQL с изображением дельфина являются торговыми марками компании MySQL AB и могут применяться только в соответствии с нашими правилами использования торговых знаков, с которыми вы можете ознакомиться по адресу http://www.mysql.com/company/trademark.html.
Логотип MySQL с изображением дельфина был создан финским рекламным агентством Priority в 2001 году. Мы решили сделать эмблемой СУБД MySQL дельфина - умное, проворное и изящное животное, с удивительной легкостью плавающее в океане, так же как и наша СУБД - в океане данных. К тому же дельфины нам просто нравятся.
Оригинальный логотип MySQL может использоваться только представителями MySQL AB, а также лицами, получившими на то письменное разрешение.
Мы разработали несколько специальных логотипов для договорного использования, которые можно загрузить с нашего сайта, расположенного по адресу http://www.mysql.com/press/logos.html и применять на сайтах третьих сторон без письменного разрешения MySQL AB. Возможности использования этих логотипов, как и следует из их названия, определенным образом ограничены: они регламентируются правилами применения наших торговых знаков (которые также приведены у нас на сайте). Если вы планируете использовать данные логотипы, необходимо ознакомиться с указанными правилами. Они в основном сводятся к следующим:
Связаться с нами с целью заключения соответствующих вашим потребностям соглашений можно по адресу trademark@mysql.com.
Письменное разрешение MySQL AB для использования логотипов MySQL необходимо в следующих случаях:
Исходя из юридических и коммерческих соображений, мы следим за использованием торговых знаков MySQL на различных продуктах, книгах и т.п. Обычно мы взимаем плату за помещение логотипов MySQL AB на коммерческих продуктах, так как считаем, что вполне справедливо, если часть полученных производителем прибылей идет таким образом на финансирование дальнейшего усовершенствования СУБД MySQL.
Партнерские логотипы MySQL могут использоваться только теми компаниями и частными лицами, которые подписали письменное соглашение о партнерстве с MySQL AB. В условия подписания такового соглашения входит сертификация в качестве преподавателя или консультанта MySQL. See section 1.5.1.5 О нашей программе партнерства.
MySQL
в текстовых документах и презентациях
MySQL AB приветствует упоминания о СУБД MySQL, но не следует забывать о
том, что слово MySQL
- торговая марка MySQL AB. Поэтому первое
встречающееся в тексте слово MySQL
следует снабдить символом,
обозначающим торговую марку (TM
), а также (по возможности) упомянуть о
том, что MySQL является зарегистрированной торговой маркой компании MySQL
AB. Дополнительную информацию вы сможете получить, ознакомившись с нашими
правилами использования торговых знаков, расположенными по адресу
http://www.mysql.com/company/trademark.html.
MySQL
в названиях компаний и продуктовИспользовать слово MySQL в названиях компаний, продуктов или в именах доменов без письменного разрешения MySQL AB запрещено.
Наконец-то появилась давно обещанная компанией MySQL AB бета-версия MySQL Server 4.0, которую так долго ждали пользователи. Ее можно загрузить с веб-сайта http://www.mysql.com/ или с наших зеркал.
Большинство новых функций MySQL 4.0 ориентированы на уже существующих пользователей MySQL уже существующих пользователей в общественной и деловой сфере. Эти функции позволяют усовершенствовать программное обеспечение базы данных MySQL, предоставляя решения для критически важных систем управления базами данных, работающих с большими объемами информации. Остальные новые функции предназначены для пользователей встроенных баз данных.
Начиная с 4.0.6, MySQL имеет статус gamma, что означает что версии 4.0.x в течении более чем 2 месяцев (сначала в alpha-, затем и в beta-статусе) используются без каких-либо известных серьезных и сложных для исправления ошибок и готовы для промышленного использования.
Мы снимем префикс gamma, когда MySQL 4.0 будет в эксплуатации более чем один месяц без обнаруженных серьезных ошибок.
Все новые функции будут добавляться в версию MySQL 4.1, доступную сейчас из нашего репозитория bk, выпуск alpha-версии которой запланирован на первый квартал 2003. See section 2.3.4 Установка из экспериментального набора исходных кодов.
Все бинарные поставки проходят наши сложные тесты без каких-либо ошибок на всех платформах, на которых мы тестируем MySQL. MySQL 4.0 протестирован в реальных условиях огромным количеством пользователей и находится в промышленной эксплуатациями на нескольких крупных сайтах.
Библиотека libmysqld
обеспечивает для MySQL
возможность не
отставать от прогресса в стремительно развивающемся мире приложений.
Вариант MySQL в виде встроенной библиотеки позволяет встраивать
MySQL в различные приложения и электронные устройства так, что
конечный пользователь даже не будет знать о ``заложенной в их фундаменте''
базе данных. Встроенный MySQL идеально подходит для использования в
интернет-приложениях, публичных киосках, в устройствах с сочетанием
аппаратного и программного обеспечения, высокопроизводительных
интернет-серверах, автономных базах данных, распространяемых на
компакт-дисках, и так далее.
Большинство пользователей libmysqld
оценят преимущество Двойной лицензии
MySQL. Для тех, кто не хочет связывать себя условиями GPL
лицензии, программное обеспечение доступно также на условиях коммерческой
лицензии. Для встроенной библиотеки MySQL используется такой же интерфейс,
как и для обычной клиентской библиотеки, поэтому ею удобно и легко
пользоваться. See section 8.4.9 libmysqld, встраиваемая библиотека сервера MySQL.
bulk INSERT
) для большого
количества данных, поиск в сжатых индексах, создание полнотекстовых
индексов (FULLTEXT
), а также COUNT(DISTINCT)
.
TRUNCATE TABLE
(как в Oracle) и IDENTITY
, как
синоним автоматически инкрементируемых ключей (как в Sybase). Многим
пользователям также будет приятно узнать, что MySQL теперь
поддерживает оператор UNION
, долгожданную стандартную функцию SQL.
DELETE
и
UPDATE
Добавив поддержку символических ссылок к MyISAM
на уровне
таблицы (а не только на уровне базы данных, как это было раньше), а также
включив обработку таких ссылок как функцию, используемую в Windows по
умолчанию, мы надеемся продемонстрировать, что серьезно относимся к
предложениям по усовершенствованиям. Такие функции как
SQL_CALC_FOUND_ROWS
и FOUND_ROWS()
позволяют узнать, сколько
строк возвратит запрос без оператора LIMIT
.
В последующих версиях MySQL
4.x будут добавлены следующие функции,
которые на данный момент находятся в стадии разработки:
LOAD DATA FROM MASTER
в скором времени будет
добавлена автоматизация настройки подчиненных серверов. Удаленное
резервное копирование обеспечит возможность легко добавлять новые
подчиненные серверы, не отключая головной сервер, - это позволит
практически избежать потерь в производительности при обновлении
объемных систем.
mysqld
(настройки запуска) можно будет
изменять без выключения серверов.
FULLTEXT
в MySQL 4.0 позволяют
использовать FULLTEXT
-индексацию больших объемов текста при помощи как
бинарной логики поиска, так и логики поиска естественного языка.
Пользователи могут производить настройку минимальной длины слова и
задавать свои списки недопустимых слов на любом естественном языке,
благодаря чему появляется возможность создания новой группы программ
на основе MySQL.
MySQL 4.0 готовит базу для реализации новых возможностей в сервере MySQL
4.1 и более новых версиях. Имеются в виду такие возможности, как вложенные
подзапросы (nested subqueries
) (4.1), хранимые процедуры (5.0) и правила
целостности ссылок (foreign key integrity rules
) для MyISAM-таблиц (5.0).
Эти возможности возглавляют список наиболее востребованных нашими потребителями функций.
После реализации этих изменений критикам СУБД MySQL придется проявить больше изобретательности и придумать более убедительные аргументы, чем просто указание на недостающие функциональные возможности. Будучи давно известной как быстродействующая, надежная и легкая в использовании, СУБД MySQL теперь станет соответствовать ожиданиям самых требовательных потребителей.
В этом разделе представлены списки рассылки MySQL, а также даются некоторые указания по их использованию. Подписавшись на список рассылки, вы будете получать по электронной почте информацию из данного списка и сможете отправлять туда свои собственные вопросы и ответы.
Чтобы подписаться на главный список рассылки MySQL, следует отправить сообщение на адрес электронной почты mysql-subscribe@lists.mysql.com.
Чтобы отказаться от подписки на главный список рассылки MySQL, следует отправить сообщение на адрес электронной почты mysql-unsubscribe@lists.mysql.com.
В посылаемом сообщении роль играет только адрес, на который это сообщение отправляется. Тема и текст сообщения игнорируются.
Если адрес, с которого было отправлено ваше сообщение, не действителен,
можно точно указать адрес для подписки или адрес, подписку для которого
следует аннулировать. Для этого в указанных выше адресах электронной почты
следует добавить дефис в конце командного слова, обозначающего подписку
(subscribe
) или отказ от нее (unsubscribe
), а за ним - нужный адрес
электронной почты, заменив в нем символ `@' на символ `='. Например, чтобы
подписать адрес your_name@host.domain, необходимо отправить сообщение на
mysql-subscribe-your_name=host.domain@lists.mysql.com.
Сообщения, посланные по адресам mysql-subscribe@lists.mysql.com или
mysql-unsubscribe@lists.mysql.com, обрабатываются автоматически программой
обслуживания списка рассылки ezmlm
. Информация по программе ezmlm доступна
на веб-узле ezmlm
(http://www.ezmlm.org/).
Чтобы отправить сообщение в список рассылки, следует послать сообщение по адресу mysql@lists.mysql.com. Пожалуйста, не отправляйте сообщения о подписке или отказе от подписки на адрес mysql@lists.mysql.com, поскольку все сообщения, направленные на этот адрес, автоматически распространяются среди тысяч других подписчиков.
Если на вашем локальном веб-узле уже есть подписчики на
mysql@lists.mysql.com, то на нем может существовать локальный список
рассылки, поэтому сообщения, отправленные из lists.mysql.com
на ваш
веб-узел, будут также дублироваться в местный список. В таких случаях
необходимо связаться со своим системным администратором, чтобы он добавил
вас в местный список рассылки MySQL или исключил из него.
Если необходимо, чтобы сообщения, поступающие со списка рассылки,
направлялись в отдельный почтовый ящик вашего почтового клиента,
установите фильтр по заголовкам сообщений. Чтобы выделить сообщения из
списка рассылки, можно использовать заголовки List-ID:
или Delivered-To:
.
Существуют следующие списки рассылки MySQL:
announce-subscribe@lists.mysql.com announce
mysql-subscribe@lists.mysql.com mysql
mysql-digest-subscribe@lists.mysql.com mysql-digest
mysql
в виде сборника. Это означает, что вы получите все сообщения,
отправленные за день, в виде одного большого почтового сообщения, которое
отправляется раз в день.
bugs-subscribe@lists.mysql.com bugs
mysqlbug
(если вы работаете в Windows,
необходимо включить описание операционной системы и указать версию MySQL).
Прежде чем отправлять отчет об ошибке, желательно проверить, при
использовании какой версии MySQL данная ошибка возникает -
последней окончательной или находящейся на стадии разработки! Чтобы любой
желающий мог воспроизвести эту ошибку, желательно также включить в отчет
контрольный тестовый пример, который можно было бы запустить при помощи
mysql test < script
. Все ошибки, сообщения о которых будут направлены в
список рассылки, будут либо исправлены, либо включены в список ошибок в
следующей версии MySQL! Если необходимо только небольшое изменение кода,
мы также отправим исправляющую эту ошибку заплатку для программы.
bugs-digest-subscribe@lists.mysql.com bugs-digest
bugs
в виде сборника.
internals-subscribe@lists.mysql.com internals
internals-digest-subscribe@lists.mysql.com internals-digest
internals
.
java-subscribe@lists.mysql.com java
java-digest-subscribe@lists.mysql.com java-digest
java
.
win32-subscribe@lists.mysql.com win32
win32-digest-subscribe@lists.mysql.com win32-digest
win32
.
myodbc-subscribe@lists.mysql.com myodbc
myodbc-digest-subscribe@lists.mysql.com myodbc-digest
myodbc
.
mysqlcc-subscribe@lists.mysql.com mysqlcc
mysqlcc-digest-subscribe@lists.mysql.com mysqlcc-digest
mysqlcc
.
plusplus-subscribe@lists.mysql.com plusplus
plusplus-digest-subscribe@lists.mysql.com plusplus-digest
plusplus
.
msql-mysql-modules-subscribe@lists.mysql.com msql-mysql-modules
msql-mysql-modules-digest-subscribe@lists.mysql.com msql-mysql-modules-digest
msql-mysql-modules
.
Подписаться или отказаться от подписки на все списки рассылки можно
способом, указанным выше. В своем сообщении о подписке или отказе от
подписки вместо mysql
просто укажите соответствующее название списка
рассылки. Например, чтобы подписаться на список рассылки myodbc
или
отказаться от подписки на него, следует отправить сообщение по адресу
myodbc-subscribe@lists.mysql.com или myodbc-unsubscribe@lists.mysql.com.
Если получить ответы на свои вопросы в списке рассылки не удалось, можно оплатить поддержку от MySQL AB - это позволит вам напрямую общаться с разработчиками MySQL. See section 1.6.1 Поддержка, предлагаемая компанией MySQL AB.
В приведенной ниже таблице указаны некоторые списки рассылки MySQL на языках, отличных от английского. Обратите внимание на то, что компания MySQL AB эти списки не контролирует, поэтому мы не можем гарантировать их качество.
mysql-france-subscribe@yahoogroups.com Французский список рассылки
list@tinc.net Корейский список рассылки
subscribe
mysql your@e-mail.address
.
mysql-de-request@lists.4t2.com Немецкий список рассылки
subscribe
mysql-de your@e-mail.address
. Информацию по этому списку рассылки можно
найти на http://www.4t2.com/mysql/.
mysql-br-request@listas.linkway.com.br Португальский список рассылки
subscribe
mysql-br your@e-mail.address
.
mysql-alta@elistas.net Испанский список рассылки
subscribe
mysql your@e-mail.address
.
Прежде чем отправлять отчет об ошибке, необходимо выполнить следующие действия:
Если в руководстве или архивах не удалось найти ответ, обратитесь к локальному эксперту по MySQL. Если же и таким образом не удалось получить ответы на вопросы, переходите к следующему разделу, в котором описано, как отправлять почту на mysql@lists.mysql.com.
Чтобы написать хороший отчет об ошибке, потребуется немало терпения. Однако лучше сделать все правильно с первой попытки - это сбережет и ваше, и наше время. Грамотно составленный отчет об ошибке, содержащий ее подробное описание, позволит нам исправить эту ошибку уже в следующей версии программы. Включенные в данный раздел рекомендации помогут вам правильно написать свой отчет, не тратя времени на описание того, что мало чем сможет нам помочь или не потребуется вовсе.
Мы рекомендуем для создания отчетов об ошибках (или отчетов о любых
проблемах), всегда, если это возможно, использовать сценарий mysqlbug
.
mysqlbug
можно найти в каталоге `scripts' раздела распространения исходных
текстов, или в разделе распространения исполняемых программ, в каталоге
`bin' инсталляционного каталога MySQL. Если же не удается воспользоваться
mysqlbug
, то все равно необходимо указать в своем отчете все данные,
перечисленные ниже в этом разделе.
Сценарий mysqlbug
помогает сгенерировать отчет путем автоматического
определения большей части приведенной ниже информации, но если окажется,
что в сгенерированном отчете отсутствует что-либо важное, обязательно
включите это в свое сообщение! Внимательно прочитайте данный раздел и
убедитесь, что в отчет вошли все описанные здесь сведения.
Обычно отчеты об ошибках и проблемах направляются в mysql@lists.mysql.com.
Если же вы можете создать подробное описание, четко определяющее ошибку,
его можно направить в список рассылки bugs@lists.mysql.com. Обратите
внимание: в этот список рассылки можно посылать только полный отчет о
повторяющейся ошибке, составленный при помощи сценария mysqlbug
. Если вы
работаете в Windows, необходимо включить описание операционной системы и
версии MySQL. Прежде чем направлять отчет, желательно проверить,
проявляется ли данная проблема при использовании последней окончательной
или находящейся в стадии разработки версии MySQL! Чтобы любой
желающий мог воспроизвести эту ошибку, желательно также включить в отчет
контрольный тестовый пример, который можно было бы запустить при помощи
``mysql test < script
'', либо Perl-сценарий или сценарий оболочки, которые
можно запустить непосредственно. Все ошибки, сообщения о которых будут
направлены в список рассылки, будут либо исправлены, либо включены в
список ошибок в следующей версии MySQL! Если необходимо только небольшое
изменение кода, мы также отправим исправляющий эту ошибку патч для
программы.
Если вы нашли ошибку в системе безопасности MySQL, необходимо отправить сообщение по адресу security@mysql.com.
Не забывайте о том, что можно ответить на сообщение, в котором содержится слишком много информации, но нельзя ответить на сообщение, в котором информации недостаточно. Часто те, кто нам пишет, опускают некоторые факты: они считают, что им известна причина возникшей проблемы и поэтому, по их мнению, некоторые детали не имеют значения. Необходимо придерживаться следующего принципа: если возникают сомнения в отношении того, следует или нет приводить в отчете те или иные сведения, - включите их в отчет обязательно! Намного быстрее и проще написать несколько дополнительных строк в отчете, чем получать уточняющие вопросы и снова ждать ответа только потому, что в первый раз были указаны не все данные.
Чаще всего наши корреспонденты не указывают используемую версию MySQL или платформу, на которой установлен сервер MySQL (включая версию платформы). Это довольно существенная информация, и в 99 случаях из 100 отчет об ошибке без нее будет совершенно бесполезным! Очень часто бывает и так: мы получаем вопрос типа: ''Почему это у меня не работает?'', а потом оказывается, что указанная функция в данной версии MySQL отсутствует или что ошибка, описанная в отчете, уже была исправлена в более новой версии MySQL. Иногда ошибка зависит от используемой платформы. В таких случаях практически невозможно ничего исправить, не имея информации об операционной системе и о версии платформы.
Не забывайте указывать информацию о своем компиляторе - в тех случаях, когда это имеет отношение к возникшей проблеме. Ведь бывает и так: пользователь полагает, что проблема связана с MySQL, а на самом деле он нашел ошибку в компиляторе. Большинство компиляторов постоянно находятся в состоянии разработки и становятся лучше от версии к версии. Чтобы определить, зависит ли ваша проблема от компилятора, мы должны знать, какой именно используется компилятор. Обратите внимание на то, что все проблемы с компиляторами должны рассматриваться как ошибки и по ним должен составляться соответствующий отчет.
Вы окажете нам значительную помощь, включив в отчет об ошибке подробное описание проблемы. В качестве хорошего примера подобной информации можно привести описание всех действий, которые привели к возникновению проблемы и описание самой проблемы. Лучшие отчеты содержат подробные примеры, в которых показано, как можно воспроизвести ошибку или проблему. section E.1.6 Создание контрольного примера при повреждении таблиц.
Если программа выдает сообщение об ошибке, очень важно точно воспроизвести это сообщение в своем отчете! Возможно, нам придется производить поиск в архивах - лучше, чтобы указанное в отчете сообщение об ошибке точно совпадало с тем, которое выдает программа. Не следует пытаться запомнить сообщение об ошибке, имеет смысл просто скопировать его полностью и вставить в отчет!
Если возникли проблемы с MyODBC
, необходимо попытаться создать файл
трассировки MyODBC
. See section 8.3.7 Составление отчетов о проблемах с MyODBC.
Не забывайте, что у большинства людей, которые будут читать ваш отчет,
экраны дисплеев имеют ширину в 80 символов. При создании отчетов или
примеров при помощи средств командной строки mysql
необходимо использовать
параметр --vertical
(или терминатор оператора \G
) для выходных данных,
которые будут превышать ширину для таких дисплеев (пример для оператора
EXPLAIN SELECT
приведен ниже в данном разделе).
В свой отчет вам необходимо включить следующую информацию:
mysqladmin version
. Программу mysqladmin
можно найти в
каталоге `bin' инсталляционного каталога MySQL.
uname -a
.
mysqld
, необходимо сообщить
о запросе, который привел к такому завершению. Это можно выяснить,
запустив mysqld
с включенной функцией ведения журнала.
See section E.1.5 Использование журналов для определения причин ошибок в mysqld.
mysqldump --no-data db_name
tbl_name1 tbl_name2 ...
. Выполняется это очень легко. Таким способом
можно получить подробную информацию о таблице в базе данных, что
поможет нам создать ситуацию, соответствующую той, в которой оказались
вы.
SELECT
, всегда необходимо включать в отчет выходную информацию команды
EXPLAIN SELECT ...
и, по крайней мере, количество строк, которые выдает
оператор SELECT
. Вы также должны включить вывода SHOW CREATE TABLE
...
для каждой таблицы, задействованной в запросе. Чем больше информации
будет предоставлено о сложившейся ситуации, тем больше шансов, что будет
оказана надлежащая помощь! Например, ниже приведен образец очень хорошего
отчета об ошибке (он, конечно, должен быть отправлен при помощи сценария
mysqlbug
):
Пример запускается при помощи командной строки mysql
(обратите внимание
на применение терминатора операторов \G
, который используется для
операторов, если ширина выводимой ими информации превышает ширину строки
80-символьного дисплея):
mysql> SHOW VARIABLES; mysql> SHOW COLUMNS FROM ...\G <вывод SHOW COLUMNS> mysql> EXPLAIN SELECT ...\G <вывод EXPLAIN> mysql> FLUSH STATUS; mysql> SELECT ...; <Корокая версия вывода SELECT, включая время, затраченное на обработку запроса> mysql> SHOW STATUS; <вывод SHOW STATUS>
mysqld
, постарайтесь
предоставить сценарий, который воспроизведет аномальное поведение
программы. Сценарий должен включать все необходимые файлы данных. Чем
точнее сценарий может воспроизвести сложившуюся ситуацию, тем лучше.
Если вы можете создать воспроизводимый контрольный пример, его
необходимо отправить на bugs@lists.mysql.com для немедленного
рассмотрения! Если сценарий обеспечить нельзя, необходимо, по крайней
мере, включить в свое сообщение выходную информацию команды mysqladmin
variables extended-status processlist
, чтобы предоставить данные о
работе системы!
mysqldump
и создать файл `README' с описанием вашей проблемы.
Запакуйте файлы при помощи tar
и gzip
или zip
, и по ftp
загрузите
архив на ftp://support.mysql.com/pub/mysql/secret/. Затем отправьте
краткое описание проблемы на bugs@lists.mysql.com.
ftp
на
ftp://support.mysql.com/pub/mysql/secret/. Если данные действительно
представляют собой секретную информацию, которую нельзя показывать
даже нам, тогда можно привести пример, используя другие имена, но этот
вариант следует оставить на крайний случай.
mysqld
, так и для запуска клиентских программ
MySQL. Параметры таких программ как mysqld
и mysql
, а также сценарий
configure
часто содержат ответы на многие вопросы и очень важны!
Включить их в отчет не помешает в любом случае! Если используются
какие-либо модули, такие как Perl или PHP, также укажите их версии.
mysqlaccess
, выходные данные команды mysqladmin reloa
d
и все сообщения об ошибках, которые выдаются при попытке соединения!
Во время проверки своих привилегий сначала необходимо выполнить
команду mysqlaccess
. После этого запустите mysqladmin reload version
и
попытайтесь соединиться с программой, которая вызывала проблемы.
Программу mysqlaccess
можно найти в каталоге `bin' установочного
каталога MySQL.
myisamchk
или CHECK TABLE
и REPAIR TABLE
.
See section 4 Администрирование баз данных.
mysqld
никогда
не должна повреждать данные в таблицах, если не произошло никакого
сбоя во время обновления! Если вам удалось найти причину ошибки в
mysqld
, нам будет гораздо проще оказать вам помощь в решении этой
проблемы. See section A.1 Как определить, чем вызваны проблемы.
Если вы пользователь, пользующийся официальной поддержкой, направьте отчет об ошибке на mysql-support@mysql.com, чтобы его рассмотрели в первую очередь, а также в соответствующий список рассылки, чтобы узнать, сталкивался ли кто-нибудь еще с этой проблемой (и, возможно, нашел решение).
Чтобы получить информацию по отчетам об ошибках в MyODBC
, See section 8.3.4 Как сообщать о проблемах с MyODBC.
Решения для наиболее часто встречающихся проблем можно найти в разделе section A Проблемы и распространенные ошибки.
Если ответы направляются к вам индивидуально, не попадая в список рассылки, хорошим тоном считается составить отчет по полученным ответам и отправить его в список рассылки, чтобы другие пользователи смогли получить информацию, которая помогла решить вашу проблему!
Если вы считаете, что ваш ответ представляет интерес для большинства пользователей, то можете направить его прямо в список рассылки, вместо того, чтобы отвечать напрямую человеку, задавшему вопрос. Постарайтесь обобщить свой ответ таким образом, чтобы его смысл был понятен всем, а не только человеку, задавшему вопрос. При отправке сообщения в список рассылки убедитесь, что ваш ответ не является повторением предыдущего ответа.
Постарайтесь оставить главную часть вопроса в своем ответе, не стесняйтесь оставить все исходное сообщение в своем письме.
Не отправляйте сообщения из своего браузера с включенным режимом HTML! Многие пользователи не используют браузер для чтения почты!
В дополнение к спискам рассылки MySQL, вы можете найти поддержку у опытных пользователей MySQL в IRC.
Вот сети/каналы, известные нам на данный момент:
#mysql
В основном обсуждение MySQL, но вопросы по другим СУБД приветствуются.
#mysqlphp
Вопросы про популярную связку MySQL+PHP
#mysql
Вопросы по MySQL.
Мы можем рекомендовать вам X-Chat для подключения к IRC-сети. X-Chat доступен как для Unix, так и для Windows по адресу: http://www.xchat.org/.
В этом разделе рассматривается соотношение между MySQL и стандартами ANSI SQL. Сервер MySQL имеет много расширений стандарта ANSI SQL; здесь вы найдете информацию о том, что представляют собой эти расширения и как их использовать. Помимо этого, в данном разделе содержится информация о том, какие функциональные возможности отсутствуют в сервере MySQL, а также дается описание способов обхода некоторых трудностей.
Мы не ставили перед собой цель ограничивать какую бы то ни было область применения сервера MySQL, если на то нет веских причин. И несмотря на то что у нас не хватает ресурсов выполнять разработку для каждого возможного применения сервера, мы всегда охотно окажем помощь и предложим советы тем, кто пытается расширять сферу использования MySQL.
Одним из главных направлений разработки данного продукта является
продолжение работы в области соответствия его стандартам ANSI 99, но не за
счет ущерба для скорости или надежности. Мы без опаски добавляем к серверу
MySQL расширения к SQL или поддержку не предусмотренных в SQL
возможностей, если это заметно увеличивает удобство его использования для
значительной части наших пользователей (одним из примеров такой стратегии
является новый интерфейс HANDLER
в версии сервера MySQL 4.0;
see section 6.4.2 Синтаксис оператора HANDLER
).
В наших планах - продолжение поддержки баз данных с транзакциями и без транзакций, чтобы обеспечить как интенсивное применение для веб-регистрации, так и зависящее от целевого назначения использование в круглосуточном режиме 24/7.
С самого начала сервер MySQL был спроектирован для работы с базами данных среднего размера (10-100 миллионов строк или около 100 MB на таблицу) на малых вычислительных системах. Мы будем продолжать расширять сервер MySQL для работы с базами данных с размерами даже больше терабайта, и наряду с этим - предоставлять возможность компиляции упрощенной версии MySQL, которая больше подходит для портативных устройств и встраивания. Благодаря компоновочной схеме сервера MySQL оба эти направления возможны без каких-либо конфликтов в дереве исходных кодов.
В настоящее время мы не ставим перед собой задач поддержки работы в режиме реального времени или кластеризованных баз данных (хотя наши сервисы репликации уже обеспечивают многие из таких возможностей).
Мы не считаем, что для базы данных необходима поддержка чистого XML, но при этом будем добавлять на клиентской стороне поддержку XML-запросов наших пользователей. По нашему мнению, основной код сервера должен оставаться настолько ``скудным и чистым'', насколько возможно, а взамен следует разрабатывать библиотеки, которые ``взвалят на свои плечи'' все сложности на клиентской стороне. Эта концепция полностью соответствует упомянутой выше стратегии - не жертвовать скоростью или надежностью сервера.
Начальный уровень SQL92. Для ODBC уровни 0-3.51.
Мы стремимся к полной поддержке стандарта ANSI SQL99, но без ущерба для скорости и качества кода.
При запуске mysqld
с опцией --ansi
поведение сервера MySQL изменяется
следующим образом:
||
представляет собой конкатенацию строк вместо ИЛИ (OR).
REAL
будет синонимом для FLOAT
, а не для DOUBLE
.
SERIALIZABLE
(see section 6.7.3 Синтаксис команды SET TRANSACTIO
N).
GROUP BY
, которое не перечислено в списке столбцов.
Использование данной опции равносильно применению
--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,
IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY
.
Сервер MySQL включает в себя ряд расширений, которые могут отсутствовать в
других базах данных SQL. Если вы их используете, то следует иметь в виду,
что такой код не будет переносимым на другие SQL-серверы. В некоторых
случаях можно написать код, включающий расширения MySQL, но, тем не менее,
являющийся переносимым, воспользовавшись комментариями вида /*! ... */
. В
этом случае сервер MySQL будет анализировать и выполнять данный код внутри
этого комментария как обычную команду MySQL, в то время как другие
SQL-серверы будут игнорировать данное расширение. Например:
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
При добавлении номера версии после '!'
это выражение будет исполняться
только в случае, если номер данной версии MySQL равен указанному номеру
или больше:
CREATE /*!32302 TEMPORARY */ TABLE t (a int);
Это означает, что при наличии версии 3.23.02 или выше сервер MySQL будет
использовать ключевое слово TEMPORARY
.
Ниже приводится перечень расширений MySQL:
MEDIUMINT
, SET
, ENUM
и различные типы BLOB
и TEXT
.
AUTO_INCREMENT
, BINARY
, NULL
, UNSIGNED
и ZEROFILL
.
BINARY
или использовать явное приведение
типов BINARY
, в результате чего сравнение будет выполняться в
соответствии с порядком ASCII, используемом на хосте сервера MySQL.
db_name.tbl_name
. В некоторых SQL-серверах
обеспечивается точно такая же функциональная возможность, но она
называется User space
. Сервер MySQL не поддерживает табличные
пространства (как в выражении: CREATE TABLE ralph.my_table...IN
my_tablespace
).
LIKE
разрешается на числовых столбцах.
INTO OUTFILE
и STRAIGHT_JOIN
в команде SELECT
(see section 6.4.1 Синтаксис оператора SELECT
).
SQL_SMALL_RESULT
в команде SELECT
.
EXPLAIN SELECT
для получения описаний объединения
таблиц.
INDEX
или KEY
в команде CREATE
TABLE (see section 6.5.3 Синтаксис оператора CREATE TABLE
).
TEMPORARY
или IF NOT EXISTS
с CREATE TABLE
.
COUNT(DISTINCT list)
, где list
представляет собой более
чем один элемент.
CHANGE col_name
, DROP col_name
или DROP INDEX,
IGNORE
или RENAME
в команде ALTER TABLE
(see section 6.5.4 Синтаксис оператора ALTER TABLE
).
RENAME TABLE
. See section 6.5.5 Синтаксис оператора RENAME TABL
E.
ADD
, ALTER
, DROP
или CHANGE
в
команде ALTER TABLE
.
DROP TABLE
с ключевыми словами IF EXISTS
.
DROP TABLE
.
LIMIT
в команде DELETE
.
DELAYED
в командах INSERT
и REPLACE
.
LOW_PRIORITY
в командах INSERT
, REPLACE
, DELETE
и UPDATE
.
LOAD DATA INFILE
. Во многих случаях этот синтаксис
совместим с применяющимся в Oracle LOAD DATA INFILE
(see section 6.4.9 Синтаксис оператора LOAD DATA INFILE
).
ANALYZE TABLE
, CHECK TABLE
, OPTIMIZE TABLE
и REPAIR TABLE
.
SHOW
(see section 4.5.6 Синтаксис команды SHOW
).
SET
(see section 5.5.6 Синтаксис команды SET
).
GROUP
BY
. Это дает лучшую производительность для некоторых очень
специфических, но вполне нормальных запросов (see section 6.3.7 Функции, используемые в операторах GROUP BY
).
ASC
и DESC
с GROUP BY
.
||
и &&
для обозначения логических ИЛИ
(OR
) и И (AND
), как это принято в языке программирования C. В сервере
MySQL ||
и ИЛИ (OR
) являются синонимами, так же, как &&
и И (AND
).
Благодаря этому удобному синтаксису, в сервере MySQL не поддерживается
оператор ANSI SQL ||
для конкатенации строк: вместо него используется
функция CONCAT()
. Поскольку функция CONCAT()
принимает любое
количество аргументов, то в сервере MySQL можно легко модифицировать
использование оператора ||
.
CREATE DATABASE
или DROP DATABASE
(see section 6.5.1 Синтаксис оператора CREATE DATABASE
).
%
является синонимом для MOD()
. Т.е. N % M
эквивалентно
MOD(N,M)
. Оператор %
поддерживается для программистов на C и для
совместимости с PostgreSQL.
=
, <>
, <=
,<
, >=
,>
, <<
, >>
, <=>
, AND
, OR
или LIKE
могут
использоваться при сравнении столбцов слева от FROM
в командах SELECT
.
Например:
mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
LAST_INSERT_ID()
(see section 8.4.3.126 mysql_insert_id()
).
REGEXP
и NOT REGEXP
расширенных регулярных выражений.
CONCAT()
или CHAR()
с одним аргументом или более чем с двумя
аргументами (в сервере MySQL эти функции могут принимать любое
количество аргументов).
BIT_COUNT()
, CASE
, ELT()
, FROM_DAYS()
, FORMAT()
, IF()
,
PASSWORD()
, ENCRYPT()
, MD5()
, ENCODE()
, DECODE()
, PERIOD_ADD()
,
PERIOD_DIFF()
, TO_DAYS()
или WEEKDAY()
.
TRIM()
для усечения подстрок. В ANSI SQL
поддерживается только удаление единичных символов.
GROUP BY
для функций STD()
, BIT_OR()
и BIT_AND()
.
REPLACE
вместо DELETE
+ INSERT
(see section 6.4.8 Синтаксис оператора REPLACE
).
FLUSH
, RESET
и DO
.
:=
:
SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
Наши усилия направлены на то, чтобы сервер MySQL соответствовал стандартам ANSI SQL и ODBC SQL, но в некоторых случаях сервер MySQL функционирует по-другому. Ниже приведен перечень таких отличий:
VARCHAR
при хранении величины концевые пробелы удаляются
(see section 1.9.5 Известные ошибки и недостатки проектирования в MySQL).
CHAR
без уведомления изменяются на столбцы
VARCHAR
(see section 6.5.3.1 Молчаливые изменения определений столбцов).
REVOKE
(see section 4.3.1 Синтаксис команд GRANT
и REVOKE
).
NULL AND FALSE
будет трактоваться как NULL
, а не как FALSE
. Причина
здесь в том, что мы не считаем необходимым оценивать множество
дополнительных условий для этого случая.
Если вас интересует, когда к серверу MySQL будут добавляться новые расширения, необходимо обратиться к онлайновому списку перспективных задач к выполнению, в котором дан их перечень в порядке приоритетности. Он находится по адресу http://www.mysql.com/doc/en/TODO.html. Это самая последняя версия списка задач к выполнению (TODO list) в данном руководстве (see section 1.10 MySQL и будущее (что предстоит сделать)).
SELECT
ы
В сервер MySQL поддерживает вложенные запросы вида INSERT ... SELECT ...
и REPLACE ... SELECT ...
. В других контекстах можно использовать
и функцию IN()
.
Вложенные операции выборки реализованы в версии 4.1.
Между тем, во многих случаях можно переписать запрос, чтобы не использовать вложенную выборку. Например, запрос:
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
можно переписать следующим образом:
SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
Запросы:
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2); SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 WHERE table1.id=table2.id);
эквивалентны следующему:
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
Для более сложных подзапросов часто можно создать временные таблицы,
содержащие данный подзапрос. Иногда, однако, этот способ не годится, чаще
всего для команд DELETE
, для которых в стандарте SQL не поддерживаются
объединения (за исключением вложенных выборок). В этой ситуации возможны
два временных (пока вложенные запросы не поддерживаются сервером MySQL)
варианта решения проблемы.
Первый вариант следующий: при помощи какого-либо
процедурно-ориентированного языка программирования (такого как Perl или
PHP) делается запрос SELECT
для получения первичных ключей тех записей,
которые должны быть удалены, а затем полученные величины используются для
составления команды DELETE (DELETE FROM ... WHERE ... IN (key1, key2,
...))
.
Второй вариант предполагает применение диалогового SQL для автоматического
создания набора команд DELETE
с использованием расширения MySQL CONCAT()
(вместо стандартного оператора ||
). Например:
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", tab1.pkid, "'", ';') FROM tab1, tab2 WHERE tab1.col1 = tab2.col2;
Можно поместить этот запрос в файл скрипта, перенаправить стандартный вход клиента командной строки с этого файла, а стандартный выход - на еще один экземпляр клиента командной строки:
shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb
Сервер версии MySQL 4.0 поддерживает многотабличные удаления - эту функцию можно использовать для эффективного удаления строк как из одной таблицы, так и из нескольких одновременно
SELECT INTO TABLE
Для сервера MySQL пока не реализована поддержка расширения Oracle SQL:
SELECT ... INTO TABLE ...
. Вместо этого сервер MySQL поддерживает
синтаксис ANSI SQL INSERT INTO ... SELECT ...
, который, по существу,
представляет собой то же самое (see section 6.4.3.1 Синтаксис оператора INSERT ... SELECT
).
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;
Можно также использовать выражения SELECT INTO OUTFILE...
или CREATE
TABLE ... SELECT
.
Поддержка транзакций в сервере MySQL реализуется при помощи обработчиков
транзакционных таблиц типов InnoDB
и BDB
(see section 7 Типы таблиц MySQL).
Таблицы InnoDB
обеспечивают соответствие требованиям ACID
.
Однако для таблиц нетранзакционных типов, таких как MyISAM
, в MySQL
используется иная парадигма обеспечения целостности данных, получившая
название ``атомарные операции
''. Атомарные операции в сравнении с
транзакциями часто обеспечивают такую же или даже лучшую целостность при
более высокой производительности. Поскольку сервер MySQL поддерживает обе
парадигмы, пользователь может выбирать между скоростью, которую
обеспечивают атомарные операции, и транзакционными возможностями для своих
приложений. Такой выбор может быть сделан для каждой таблицы отдельно.
Рассмотрим, как используются возможности сервера MySQL для обеспечения строгой целостности и каковы эти возможности в сравнении с транзакционной парадигмой.
ROLLBACK
вместо COMMIT
, то транзакции предпочтительней
атомарных операций. Транзакции также обеспечивают гарантию того, что
незаконченные обновления или искаженные действия не будут
фиксироваться в базе данных; серверу предоставляется возможность
выполнить автоматический откат, и база данных будет сохранена. Почти
во всех случаях при работе с сервером MySQL решить возможные проблемы
можно путем включения простых проверок перед обновлениями и запуска
простых скриптов, которые выполняют проверку баз данных на нарушение
целостности с автоматическим исправлением повреждений или выдачей
предупреждения, если такое нарушение возникает. Отметим, что
полноценное выявление и устранение ошибок в таблицах без потери
целостности данных можно обеспечить, просто используя системный журнал
MySQL или добавив еще один дополнительный журнал.
LOCK TABLES
или атомарных UPDATE
,
при гарантии того, что в базе данных никогда не произойдет
автоматического прерывания (что является часто встречающейся проблемой
для транзакционных баз данных).
Транзакционная парадигма имеет свои достоинства и свои недостатки. Для многих пользователей и разработчиков приложений решающее значение имеет простота кодирования в проблемных ситуациях, в которых может произойти или неизбежно аварийное прерывание. Однако даже если парадигма атомарных операций для вас нова или вы привыкли к транзакциям, все же следует принимать во внимание выигрыш в скорости, который могут обеспечить нетранзакционные таблицы (порядка от трех до пяти раз по сравнению со скоростью наиболее быстрых и оптимально настроенных транзакционных таблиц).
В ситуациях, где целостность данных чрезвычайно важна, сервер MySQL
обеспечивает даже для нетранзакционных таблиц надежность и целостность
данных уровня транзакций или лучше. При блокировании таблиц с помощью LOCK
TABLES
все обновления останавливаются до тех пор, пока не будут выполнены
все проверки на целостность. При наличии только блокировки чтения (в
противоположность блокировке записи) операции чтения и вставки, тем не
менее, производятся. Новые внесенные записи не будут видны никому из
имеющих блокировку чтения клиентов до освобождения этих блокировок. С
iомощью INSERT DELAYED
вставки становятся в очередь и находятся там до тех
пор, пока не будут сняты все блокировки. При этом клиент не вынужден
ждать, пока отработает INSERT
(see section 6.4.4 Синтаксис оператора INSERT DELAYED
).
То, что мы подразумеваем под термином ``атомарные'', не означает ничего сверхъестественного. Имеется в виду лишь следующее: гарантируется, что при выполнении каждого конкретного обновления никакой другой пользователь не может повлиять на него и никогда не произойдет автоматического отката (который возможен на транзакционных таблицах, если не приняты должные меры предосторожности). Сервер MySQL также гарантирует, что не случится грязного чтения (dirty read)".
Ниже описаны некоторые технические приемы работы с нетранзакционными таблицами:
LOCK TABLES
, причем нет необходимости в указателях при
динамическом обновлении записей.
ROLLBACK
, можно использовать следующую
стратегию:
LOCK TABLES ...
для блокирования всех таблиц, к которым
необходим доступ.
UNLOCK TABLES
для освобождения произведенных
блокировок.
WHERE
в команде
UPDATE
. Если данную запись обновить не удалось, то клиент получает
сообщение: "Некоторые данные, которые вы изменяли, были модифицированы
другим пользователем". После этого в окне выводится старая версия, чтобы
пользователь мог решить, какую версию записи заказчика он должен
использовать. Такой алгоритм обеспечивает нечто похожее на блокирование
столбцов, но реально он даже лучше, поскольку мы обновляем только часть
столбцов, используя величины, соответствующие их текущим значениям. Это
означает, что типичные команды UPDATE
выглядят примерно как приведенные
ниже:
UPDATE tablename SET pay_back=pay_back+'relative change'; UPDATE customer SET customer_date='current_date', address='new address', phone='new phone', money_he_owes_us=money_he_owes_us+'new_money' WHERE customer_id=id AND address='old address' AND phone='old phone';Как можно видеть, этот способ очень эффективно и работает, даже если другой клиент изменит величины в столбцах
pay_back
или money_he_owes_us
.
ROLLBACK
и/или LOCK
TABLES
для управления уникальными идентификаторами для разных таблиц.
Того же результата можно добиться намного более эффективно, используя
столбец AUTO_INCREMENT
и либо SQL-функцию LAST_INSERT_ID()
, либо
функцию C API mysql_insert_id()
(see section 8.4.3.126 mysql_insert_id()
).
В общем случае можно написать код и для блокирования на уровне строк. Для
некоторых ситуаций это действительно необходимо, но таких случаев очень мало.
Блокировка на уровне строк поддерживается в таблицах InnoDB
. Для типа
MyISAM
можно использовать флаговые столбцы в таблице и выполнять
запросы, подобные следующему:
UPDATE tbl_name SET row_flag=1 WHERE id=ID;MySQL возвращает 1 в качестве количества подвергнутых воздействию строк, если данная строка была найдена, а
row_flag
в исходной строке не был уже
равен 1. Это можно себе представить так, как будто сервер MySQL изменяет
предшествующий запрос на:
UPDATE tbl_name SET row_flag=1 WHERE id=ID AND row_flag <> 1;
Хранимые процедуры представляют собой набор команд SQL, которые могут компилироваться и храниться на сервере. Таким образом, вместо того, чтобы хранить часто используемый запрос, клиенты могут ссылаться на соответствующую хранимую процедуру. Это обеспечивает лучшую производительность, поскольку данный запрос должен анализироваться только однажды и уменьшается трафик между сервером и клиентом. Концептуальный уровень можно также повысить за счет создания на сервере библиотеки функций.
Триггер представляет собой хранимую процедуру, которая активизируется при наступлении определенного события. Например, можно задать хранимую процедуру, которая срабатывает каждый раз при удалении записи из транзакционной таблицы - таким образом обеспечивается автоматическое удаление соответствующего заказчика из таблицы заказчиков, когда все его транзакции удаляются.
Возможность работы с хранимыми процедурами будет обеспечивать планируемый язык обновлений. Наша цель - ввести хранимые процедуры приблизительно в версию сервера MySQL 5.0. Мы работаем также и над триггерами.
Следует учитывать, что в SQL внешние ключи используются не для объединения
таблиц, а главным образом для проверки целостности ссылочных данных
(ограничения внешних ключей). Если необходимо получить результаты из
большого количества таблиц от команды SELECT
, следует делать это через
объединение таблиц:
SELECT * FROM table1,table2 WHERE table1.id = table2.id;
См. разделы section 6.4.1.1 Синтаксис оператора JOIN
и See section 3.5.6 Использование внешних ключей.
В версии сервера MySQL 3.23.44 и выше таблицы InnoDB поддерживают проверку
ограничений внешних ключей (see section 7.5 Таблицы InnoDB). Для таблиц других
типов сервер MySQL производит анализ синтаксиса FOREIGN KEY
в командах
CREATE TABLE
, но без выполнения дальнейших действий.
Синтаксис FOREIGN KEY
без ON DELETE ...
главным образом применяется для
целей документирования. В некоторых ODBC-приложениях его можно
использовать для автоматического создания выражений WHERE
, но обычно это
легко сделать вручную. FOREIGN KEY
иногда используется в качестве
проверки ограничений, но на практике такая проверка не является
необходимой, если строки вносятся в таблицу в правильном порядке.
В сервере MySQL можно обойти проблему отсутствия реализации ON DELETE ...
добавлением соответствующей команды DELETE
в приложение, когда удаляются
записи из таблицы, имеющей внешний ключ. На практике при этом достигается
почти такая же скорость (в некоторых случаях еще быстрее), как и при
использование внешних ключей, и намного большая переносимость.
В версии сервера MySQL 4.0 можно использовать многотабличное удаление,
чтобы удалить строки из многих таблиц одной командой (see section 6.4.6 Синтаксис оператора DELETE
).
В ближайшем будущем мы расширим реализацию FOREIGN KEY
таким образом, что
информация будет сохраняться в специальном файле таблицы и ее можно будет
извлечь с помощью mysqldump
и ODBC. На следующем этапе мы внедрим
ограничения внешних ключей для приложений, в которых не так просто
обойтись без них.
Следует иметь в виду, что внешние ключи часто применяются неправильно, что может вызывать большие проблемы. Даже если они использованы соответствующим образом, то не являются магическим решением для проблемы целостности ссылочных данных, хотя в некоторых случаях действительно упрощают ситуацию.
Некоторые преимущества внедрения внешних ключей:
Недостатки:
Представления планируется реализовать примерно в версии сервера MySQL 5.0.
Представления полезны в основном для случая, когда требуется предоставлять пользователям доступ к набору связей как к одной таблице (только в режиме чтения). Во многих базах данных SQL не обеспечивается возможность обновлять какие-либо строки в представлении - такие обновления необходимо выполнять в отдельных таблицах.
Поскольку сервер MySQL применяется в основном в приложениях и веб-системах, где разработчик приложения имеет полный контроль над использованием базы данных, большинство из наших пользователей не считают представления достаточно важной функциональной возможностью (по крайней мере, никто не заинтересовался ими настолько, чтобы выразить готовность финансировать реализацию представлений).
Для сервера MySQL нет необходимости в применении представлений для ограничения доступа к столбцам, так как в нем реализована хорошо продуманная система привилегий (see section 4.2 Общие проблемы безопасности и система привилегий доступа MySQL).
В некоторых отличных от MySQL базах данных SQL символы `--' используются
как начальные символы комментариев. В сервере MySQL символом начала
комментариев является `#'. Для сервера MySQL можно также использовать
стиль комментирования из C: /* this is a comment */
(see section 6.1.5 Синтаксис комментариев).
В версии сервера MySQL 3.23.3 и выше поддерживается комментирование с
помощью символов `--' - при условии, что за комментарием следует пробел.
Это объясняется тем, что данный стиль комментирования вызвал много проблем
при автоматической генерации SQL-запросов, в которых присутствовал код,
подобный приведенному ниже (величина платежа вставляется в выражение
!payment!
автоматически):
UPDATE tbl_name SET credit=credit-!payment!
Давайте представим себе, что произойдет в случае, если величина payment
окажется отрицательной. Поскольку выражение 1--1
в SQL является
допустимым, то просто страшно себе вообразить последствия в случае, если
будут разрешены комментарии, начинающиеся с `--',
Использование нашей реализации этого метода комментирования в версии
сервера MySQL 3.23.3 и выше - в форме 1-- This is a comment
- является
действительно безопасным.
Существует еще один безопасный способ решения этой проблемы. Он
заключается в том, что клиент командной строки mysql
удаляет все строки,
начинающиеся с `--'.
Приведенная ниже информация относится только к работе более ранних, чем 3.23.3, версий MySQL.
Если ваша SQL-программа представлена в виде текстового файла, содержащего комментарии `--', необходимо использовать:
shell> replace " --" " #" < text-file-with-funny-comments.sql \ | mysql database
вместо обычного:
shell> mysql database < text-file-with-funny-comments.sql
Можно также отредактировать сам командный файл, заменив комментарии `--' комментариями `#':
shell> replace " --" " #" -- text-file-with-funny-comments.sql
Привести эти комментарии к первоначальному виду можно с помощью следующей команды:
shell> replace " #" " --" -- text-file-with-funny-comments.sql
Устранение следующих из выявленных проблем относится к числу первоочередных задач:
ANALYZE TABLE
на таблицах BDB
в некоторых случаях может сделать
таблицу недоступной для использования, пока не произойдет перезапуск
mysqld
. При этом в файле ошибок MySQL можно будет увидеть ошибки,
подобные следующим:
001207 22:07:56 bdb: log_flush: LSN past current end-of-log
ALTER TABLE
на таблицах BDB
, на которых
осуществляются многокомандные транзакции, пока все эти транзакции не
завершатся (возможно, данные транзакции будут проигнорированы).
ANALYZE TABLE
, OPTIMIZE TABLE
и REPAIR TABLE
могут вызвать проблемы на
таблицах, для которых используется INSERT DELAYED
.
LOCK TABLE ...
и FLUSH TABLES ...
не гарантирует, что на
данной таблице нет исполняемых в текущий момент незаконченных
транзакций.
BDB
происходит несколько медленно. Если база данных
содержит много таблиц BDB
, то потребуется значительное время для
использования клиента mysql
на этой базе данных, если не применять
опцию -A
или если использовать rehash
. Это особенно заметно при
наличии большого табличного кэша.
Следующие проблемы также известны и будут устранены в свое время:
RPAD
, или любой другой строковой функции,
добавляющией пробелы в правую часть строки, в запросе, для которого MySQL
будет создавать временные таблицы для его выполнения, все результирующие
строки будут в результате обработаны RTRIM'ом (RTRIM'ed). Вот пример запроса:
SELECT RPAD(t1.field1, 50, ' ') AS f2, RPAD(t2.field2, 50, '
') AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON
t1.record=t2.joinID ORDER BY t2.record;
В результате невозможно получить пробелы в правой части результирующего столбца.
Такое поведение присутствует во всех версиях MySQL.
Причина заключается в том, что HEAP-таблицы, которые в первую очередь используются для временных
таблиц, неспособны работать с VARCHAR-столбцами.
Такое поведение будет исправлено в одной из версий 4.1.
SET CHARACTER SET
нельзя использовать
преобразованные символы в именах базы данных, таблицы и столбца.
_
или %
с ESCAPE
в LIKE
... ESCAPE
.
DECIMAL
число хранится в различных форматах (+01.00,
1.00, 01.00), то GROUP BY
может рассматривать каждую величину как
самостоятельную.
DELETE FROM merge_table
при использовании без WHERE
будет очищать
только отображение для этой таблицы, а не удалять все данные в
отображенных таблицах.
BLOB
в GROUP BY
или
ORDER BY
или DISTINCT
. В этих случаях при сравнении величин BLOB
используются только первые max_sort_length
байтов (по умолчанию 1024).
Это можно изменить с помощью опции -O max_sort_length
для mysqld
.
Обходной путь для большинства случаев заключается в использовании
подстроки: SELECT DISTINCT LEFT(blob,2048) FROM tbl_name
.
BIGINT
или
DOUBLE
(оба типа обычно имеют длину 64 бита). Это зависит от того,
какую точность обеспечивает применяемая функция. Общее правило состоит
в том, что битовые функции работают с точностью BIGINT
, функции IF
и
ELT()
- с точностью BIGINT
или DOUBLE
, а остальные - с точностью
DOUBLE
. Следует избегать применения беззнаковых величин двойной
точности, если они могут превысить 63 бита (9223372036854775807), для
каких-либо величин, кроме битовых полей! В версии сервера MySQL 4.0
реализована лучшая обработка BIGINT
, чем в 3.23.
BLOB
и TEXT
при извлечении
данных автоматически удаляются все концевые пробелы. Для типов CHAR
это хорошо и может рассматриваться как свойство, соответствующее ANSI
SQL92. Ошибка заключается в том, что в сервере MySQL столбцы VARCHAR
трактуются тем же самым образом.
ENUM
и SET
.
MIN()
, MAX()
и других групповых функциях, MySQL сейчас
сравнивает ENUM
и SET
-столбцы по их строковому значению, а не по
относительной позиции строки в множестве.
safe_mysqld
все сообщения из mysqld
направляются в журнал данного потока mysqld
. Одна из проблем
заключается в том, что если вы исполняете mysqladmin refresh
для того,
чтобы закрыть и заново открыть журнал, то stdout
и stderr
будут все
еще по-прежнему направлены в старый журнал. При активном использовании
--log
следует отредактировать safe_mysqld
, чтобы записи велись в
``hostname`.err', а не в ``hostname`.log', с тем, чтобы вы могли очищать
пространство, удаляя старые журналы и вызывая mysqladmin refresh
.
UPDATE
столбцы обновляются слева направо. При
ссылке на обновленный столбец вместо исходной величины будет получена
обновленная величина. Например:
mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;Эта команда обновит
KEY
со значением 2 вместо значения 1.
mysql> SELECT * FROM temporary_table, temporary_table AS t2;
RENAME
не работает с временными таблицами или при использовании
таблицы MERGE
.
DISTINCT
по-разному, в зависимости от
того, используются или нет в объединении ``скрытые'' столбцы. В
объединении скрытые столбцы считаются частью результата (даже если они
не показываются), в то время как в обычных запросах скрытые столбцы не
участвуют в сравнении DISTINCT
. Возможно, в будущем мы изменим это
правило таким образом, чтобы при выполнении DISTINCT
скрытые столбцы
никогда не сравнивались. Например:
SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC;и
SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC;Во втором случае в версии сервера MySQL 3.23.x можно получить две идентичных строки в результирующем наборе данных (поскольку скрытый столбец
id
может варьироваться). Заметьте, что это случается только с
запросами, где в результате отсутствуют столбцы ORDER BY
, что не
разрешается делать в ANSI SQL.
NULL
в числовом столбце, который не
принимает значения величины NULL
, сервер MySQL вместо NULL
будет
сохранять 0 или ''
(пустая строка) (однако это поведение можно
изменить с помощью опции компиляции -DDONT_USE_DEFAULT_FIELDS
).
DATE
и DATETIME
(такие как 2000-02-31 или 2000-02-00).
Идея заключается в том, что задача проверки валидности даты не входит в круг
обязанностей сервера баз данных. Если MySQL может сохранить и корректно
воспроизвести какие-либо значение даты, пусть и неправильное - MySQL будет
сохранять такое значение. Если дата полностью неправильна, сервер MySQL будет
сохранять в этом столбце специальную величину даты 0000-00-00.
ENUM
в неподдерживаемую величину, то
он будет устанавливаться в значение ошибки empty string
с
числовым значением 0.
SET
в неподдерживаемую величину, то
эта величина будет игнорироваться.
PROCEDURE
на запросе, возвращающем пустой набор, в
некоторых случаях PROCEDURE
не будет преобразовывать столбцы.
MERGE
не происходит проверки, если лежащие в
ее основе таблицы имеют совместимые типы.
NaN
, -Inf
и Inf
с
двойной точностью. Их использование вызовет проблемы при попытке
экспорта или импорта данных. В качестве промежуточного решения мы
должны изменить NaN
на NULL
(если возможно) и -Inf
и Inf
на
минимальную или, соответственно, максимально возможную величину
двойной точности.
LIMIT
на отрицательных числах трактуются как большие положительные
числа.
ALTER TABLE
используется для того, чтобы сначала добавить индекс
UNIQUE
к таблице, которая входит в таблицу MERGE
, а затем - чтобы
добавить обычный индекс к таблице MERGE
, то в случае, если существовал
старый ключ, который не был уникальным в данной таблице, порядок
ключей для таблиц будет различным. Это обусловлено тем, что ALTER
TABLE
помещает уникальные ключи перед обычными ключами, чтобы
обеспечить возможность определять дублирующиеся ключи как можно
раньше.
В более ранних версиях MySQL известны следующие ошибки:
DROP TABLE
на таблице,
которая является одной из числа многих таблиц, заблокированных с
помощью LOCK TABLES
.
LOCK table
с помощью WRITE
.
FLUSH TABLES
.
UPDATE
, которая обновляла
ключ с помощью WHERE
на тот же самый ключ, может оказаться неудачной,
поскольку данный ключ использовался для поиска записей и одна и та же
строка может быть найдена много раз:
UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;Обходным решением является использование:
mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;Эта команда будет работать, поскольку сервер MySQL не будет использовать индекс на выражениях в утверждении
WHERE
.
В отношении ошибок, связанных со спецификой различных платформ, см. разделы о компилировании и переносе.
В этом разделе приведен список возможностей, которые планируется реализовать в MySQL.
Разработка приведенных в списке пунктов будет проходить примерно в порядке их перечисления. Если вы считаете, что это порядок следует изменить, то, пожалуйста, зарегистрируйте лицензию или окажите поддержку MySQL АВ и сообщите нам, что желательно было бы разработать побыстрее. See section 1.6 Лицензии и поддержка MySQL.
Планируется, что в будущем стандарт ANSI SQL99 будет поддерживаться полностью, но с большим числом полезных расширений. Проблема заключается в том, чтобы сделать все намеченное, не жертвуя скоростью и без компромиссов при кодировании.
Уже все сделано. Сейчас мы только исправляем обнаруженные ошибки в MySQL 4.0. See section D.1 Изменения в версии 4.0.x (В разработке; Альфа) Сейчас ведется разработка версий 4.1 и 5.0.
Следующие возможности планируются для реализации в MySQL 4.1. Список того, что уже сделано, можно найти в @xref{News-4.1.x}.
Перечисленные ниже функции планируется реализовать в MySQL 5.0.
Отметим также, что поскольку у нас над новыми проектами работает большое количество разработчиков, появятся и дополнительные возможности. Существует - хотя и очень небольшая - вероятность, что эти возможности будут введены уже в MySQL 4.1. Список того, что уже сделано в 4.1, можно найти в @xref{News-4.1.x}.
SHOW COLUMNS FROM table_name
(используемый клиентом mysql
для
получения информации о столбцах) не должен открывать таблицы, а только
файл определения структуры. Это занимает меньше памяти и будет работать быстрее.
ROLLUP
и CUBE
OLAP (Online Analytical Processing) опции группировки для
приложения хранения данных (Data warehousing).
DELETE
, работающей с MyISAM
-таблицами,
использовать кэш записей. Чтобы осуществить это, нам необходимо
обновлять кэш записей потока при обновлении `.MYD'-файла.
SET CHARACTER SET
мы должны преобразовать весь запрос целиком, а не
только строки. Это позволит пользователям использовать сконвертированные символы в
именах баз данных, таблиц и столбцов.
RENAME TABLE
,
использующийся для активной MERGE
-таблицы, может повредить таблицу.
RENAME DATABASE
. Чтобы сделать эту команду безопасной для
всех обработчиков таблиц, она будет работать следующим образом:
RENAME
.
VARCHAR
(такая поддержка уже имеется для
MyISAM
).
BIT
, чтобы он занимал 1 бит (сейчас 1 символ).
RAID
(текущая реализация - это просто хак).
HEAP
):
MyISAM
-таблиц.
INSERT ... SELECT
с целью оптимального использования
одновременных вставок.
SELECT MIN(столбец)
GROUP BY
.
long_query_time
с градацией в микросекундах.
myisampack
прямо в сервер.
INSERT
/DELETE
/UPDATE
, чтобы обеспечить изящное восстановление в
случае, если индексный файл окажется полностью заполненным.
ALTER TABLE
над таблицей, которая имеет
символическую ссылку на другой диск, создавать временные таблицы на
этом диске.
DATE
/DATETIME
с корректной обработкой информации о
временных зонах, чтобы упростить работу с форматом даты для различных
временных зон.
configure
так, чтобы можно было компилировать все библиотеки
(подобно MyISAM
) без потоков.
INSERT SQL_CONCURRENT
и mysqld --concurrent-insert
для выполнения
одновременной вставки в конец файла, если файл закрыт для чтения.
lockd
с современными ядрами Linux; если нет, то
внести исправления в lockd
! Чтобы это протестировать, необходимо
запустить mysqld
с --enable-locking
и выполнить различные наборы
тестов на fork*
. Они не должны выявить никаких ошибок, если lockd
работает.
LIMIT
, как, например, в
LIMIT @a,@b
.
UPDATE
. Например:
UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c
.
GROUP BY
, как в следующем
примере: SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM table_name
GROUP BY id
.
DEFAULT
-значений (значений по
умолчанию) в столбцы. Выдавать ошибку в случае использования INSERT
,
не содержащего столбца, для которого не определено значение по
умолчанию.
libmysql.c
так, чтобы две команды mysql_query()
, идущие
подряд, могли работать без чтения результатов или с выдачей хорошего
сообщения об ошибке, если это все-таки происходит.
ctime()
потоков MIT-pthreads не работает на
некоторых FreeBSD системах.
IMAGE
опции к LOAD DATA INFILE
, чтобы не обновлять
поля TIMESTAMP
и AUTO_INCREMENT
.
LOAD DATE INFILE ... UPDATE
.
LOAD DATA INFILE ...
REPLACE INTO
.
LOAD DATA INFILE
, подобно следующему:
LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name TEXT_FIELDS (text_field1, text_field2, text_field3) SET table_field1=CONCAT(text_field1, text_field2), table_field3=23 IGNORE text_field3Такой синтаксис может быть использован для пропуска лишних столбцов в текстовом файле или для обновления столбцов на основе выражений, построенных по прочитанным данным.
LOAD DATA INFILE 'file_name' INTO TABLE 'table_name' ERRORS TO
err_table_name
. Этот оператор задает запись всех ошибок и
предупреждений в таблицу err_table_name
, которая будет иметь
структуру, подобную следующей:
line_number - номер строки в файле данных error_message - сообщение об ошибке/предупреждение и, возможно data_line - строка из файла данных
mysql
в Netscape.
LOCK DATABASES
(с различными опциями.)
ADD_TO_SET(value,set)
и REMOVE_FROM_SET(value,set)
.
t1 JOIN t2 ON ... и t1 JOIN t2 USING ...
В
данное время можно использовать этот синтаксис только с LEFT JOIN
.
SHOW STATUS
. Фиксирование
операций чтения и обновления. Выборки по 1 таблице и выборки по
связям. Среднее число таблиц в выборке. Большое число запросов ORDER
BY
и GROUP BY
.
SHOW INFO FROM
tbl_name
для основных данных о таблицах.
SELECT a FROM crash_me LEFT JOIN crash_me2 USING
(a)
; в данном случае подразумевается, что a
будет браться из
таблицы crash_me
.
CONNECT BY PRIOR ...
для изучения иерархических
структур.
mysqladmin copy database new-database
; требуется добавить команду COPY
в mysqld
.
SHOW HOSTS
для распечатки информации о кэше имен хостов.
DELETE
и REPLACE
для оператора UPDATE
(оператор с этими опциями
будет удалять строки при получении ошибки дублирующихся ключей во
время обновления).
DATETIME
, чтобы сохранять порции в секундах.
NULL
для вычисляемых столбцов.
Item_copy_string
для числовых значений во избежание
преобразований число->строка->число в случае: SELECT COUNT(*)*(id+0)
FROM table_name GROUP BY id
GNU regexp
вместо
текущей (библиотека GNU
должна быть намного быстрее, чем предыдущая).
ALTER TABLE
не срывал работу INSERT DELAYED
.
UPDATE
, они будут содержать значения, хранившиеся там до запуска
процесса обновления.
pread()
/pwrite()
под Windows, чтобы сделать
возможными одновременные вставки.
SUM(DISTINCT)
.
ANY()
, EVERY()
и SOME()
. В ANSI SQL эти
функции работают только с булевыми столбцами, но мы можем расширить
эти функции, чтобы они работали с любыми столбцами/выражениями,
применив: value == 0 -> FALSE
и value <> 0 -> TRUE
.
MAX(column)
был таким же как и тип столбцов:
mysql> CREATE TABLE t1 (a DATE); mysql> INSERT INTO t1 VALUES (NOW()); mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1; mysql> SHOW COLUMNS FROM t2;
UPDATE
над строкой при наличии таковой, и INSERT
новой строки, если строка
отсутствует (подобно тому, как REPLACE
работает с INSERT
/ DELETE
).
get_changed_tables(timeout,table1,table2,...)
.
SET
TIMESTAMP=#;
.
MyISAM
-таблицах
(возможно, после реализации хранимых процедур с триггерами).
sql_yacc.yy
внутритекстовым синтаксическим анализатором,
чтобы уменьшить ее размер и получать лучшие сообщения об ошибке (5
дней).
MINUS
, INTERSECT
и FULL OUTER JOIN
(в настоящее время поддерживаются
UNION
[в 4.0] и LEFT OUTER JOIN
).
SQL_OPTION MAX_SELECT_TIME=#
, чтобы устанавливать ограничения по
времени для запроса.
LIMIT
, чтобы можно было делать восстановление
данных с конца результирующего набора.
safe_mysqld
; согласно
FSSTND (которому пытается следовать Debian) PID-файлы должны
помещаться в `/var/run/<progname>.pid', a файлы журналов - в `/var/log'.
Было бы хорошо, если бы было можно поместить "`DATADIR'" в первое
объявление "`pidfile'" и "`log'", чтобы местоположение этих файлов можно было
изменить одним оператором.
zlib()
для gzip
-файлов в LOAD DATA INFILE
.
BLOB
-столбцов (сейчас проблема
частично решена).
NULL
.
JOIN
.
GET_LOCK
. Когда это будет реализовано, потребуется еще сделать
обработку возможных тупиковых ситуаций, которые привнесет данное
изменение.
Время отводится согласно объемам работ, а не реальному времени.
Наши пользователи провели исследование скорости работы нескольких обычных серверов баз данных и серверов баз данных с открытым кодом. Нам известно о проводившихся сравнениях MySQL с сервером Oracle, сервером DB/2, Microsoft SQL Server и другими коммерческими программными продуктами. Однако по причинам юридического характера опубликовать результаты некоторых из этих сравнений в документации не представляется возможным.
В данном разделе приведены результаты сравнения с mSQL (проводившегося по историческим причинам) и с PostgreSQL (так как эта СУБД также распространяется как ПО с открытым кодом). Если у вас имеются результаты подобного тестирования, которые мы могли бы опубликовать, просьба связаться с нами по адресу benchmarks@mysql.com.
Сравнения всех имеющихся функций и типов а также данные о пределах
возможностей различных СУБД вы найдете на веб-странице crash-me
,
расположенной по адресу http://www.mysql.com/information/crash-me.php.
INSERT
над простыми таблицами, содержащими небольшое
количество столбцов и ключей
CREATE TABLE
и DROP TABLE
SELECT
чего-нибудь, кроме индексов (очень просто выполняется
просмотр таблицы)
SELECT
.
VARCHAR
.
SELECT
с несколькими выражениями.
SELECT
над объемными таблицами.
SELECT
,
скорость работы mSQL может упасть ниже всяких допустимых пределов. При
выполнении комплекта тестов производительности выполнение такой
операции заняло в 15000 раз больше времени, чем у MySQL.
Причиной столь плачевно низкой производительности является отсутствие
в mSQL оптимизатора связей, который обеспечивал бы оптимальность
используемого порядка соединения таблиц. Однако если в mSQL2
расположить таблицы в правильном порядке, не перегружать оператор
WHERE
и использовать индексные столбцы, связывание будет выполнено
относительно быстро! (see section 5.1.4 Набор тестов MySQL (The MySQL Benchmark Suite)).
ORDER BY
и GROUP BY
.
DISTINCT
.
TEXT
или BLOB
.
GROUP BY
и HAVING
.
В mSQL функция GROUP BY
отсутствует вовсе. В MySQL
Server же GROUP BY
имеется и работает как с HAVING
, так и со следующими
функциями: COUNT()
, AVG()
, MIN()
, MAX()
, SUM()
и STD()
.
Работа оператора
COUNT(*)
оптимизирована в расчете на быстрый возврат результатов, если
оператор SELECT
берет данные из одной таблицы, не используя никаких других
столбцов и выражения WHERE
. Функции MIN()
и MAX()
могут принимать
строковые аргументы.
INSERT
и UPDATE
с вычислениями. MySQL может выполнять
вычисления непосредственно в теле вызова INSERT
или UPDATE
. Вот
пример:
mysql> UPDATE SET x=x*10+y WHERE x<20;
SELECT
с функциями. Функций в MySQL много (даже слишком много,
чтобы их можно было перечислить здесь; see section 6.3 Функции, используемые в операторах SELECT
и WHERE
).
MEDIUMINT
, длина значений которого составляет 3
байта. При наличии 100 миллионов записей значение экономии даже одного
байта на каждой из них трудно переоценить. Выбор типов столбцов в mSQL2
значительно беднее, и поэтому снизить размеры таблиц заметно трудней.
JDBC
-драйверов:
GROUP BY
и т.п. в mSQL все еще не реализованы, этой системе еще
долго придется догонять нас. Более точное представление о положении вещей
вы сможете получить, прочитав файл `HISTORY' от mSQL за последний год, и
сравнив его с разделом новостей (News) MySQL Reference Manual (see section D История изменений и обновлений MySQL).
После этого сомнений относительно того, какая
система развивалась быстрее, остаться не должно.
msql2mysql
, исправляющая различия в написании наиболее
популярных функций C API между mSQL и MySQL. Вызовы функции
msqlConnect()
, например, она заменяет на mysql_connect()
. Обычно для
перевода клиентской программы из mSQL в MySQL оказывается
достаточно минимальных усилий.
Согласно нашему опыту, переделать такие инструментальные программы, как
msql-tcl
и msqljava
, созданные на основе C API mSQL для работы с C API
MySQL, несложно.
Сделать это можно так:
msql2mysql
. Для этого
необходима программа replace
, распространяющаяся вместе с MySQL
Server.
Различия между реализациями C API в mSQL и MySQL заключаются в следующем:
MYSQL
(в mSQL в этом
качестве применяется int
).
mysql_connect()
принимает в качестве параметра указатель на
структуру MYSQL
. Такую структуру можно легко объявить как глобальную
или создать ее с помощью malloc()
. Кроме того, mysql_connect()
принимает еще два параметра, в которых указываются имя пользователя и
его пароль. Для использования данной структуры по умолчанию этим
параметрам нужно присвоить значения NULL
, NULL
.
mysql_error()
принимает в качестве параметра структуру MYSQL
. При
переносе старого кода достаточно добавить параметр в вызов
msql_error()
.
Различий здесь имеется более чем достаточно для того, чтобы поддержку обоих протоколов одновременно обеспечить было невозможно (или, по меньшей мере, очень сложно).
Ниже приведены наиболее заметные различия между коммуникационными протоколами MySQL и mSQL:
Типы столбцов
MySQL
CREATE TABLE
):
ENUM
- тип для одного набора строк.
SET
- тип для нескольких наборов строк.
BIGINT
- тип для 64-битовых целых чисел.
UNSIGNED
- опция для целочисленных столбцов и столбцов чисел с
плавающей запятой.
ZEROFILL
- опция для целочисленных столбцов.
AUTO_INCREMENT
- опция для целочисленных столбцов, являющихся
первичными ключами. See section 8.4.3.126 mysql_insert_id()
.
DEFAULT
- значение для всех столбцов.
mSQL2
Тип в mSQL | Соответствующий тип в MySQL |
CHAR(len) | CHAR(len)
|
TEXT(len) | TEXT(len) . len - максимальная длина. Работает LIKE .
|
INT | INT . Со множеством опций!
|
REAL | REAL . Или FLOAT . Имеются как 4-битовые, так и 8-битовые варианты.
|
UINT | INT UNSIGNED
|
DATE | DATE . Использует формат ANSI SQL, а не собственный формат mSQL.
|
TIME | TIME
|
MONEY | DECIMAL(12,2) . Значение с фиксированной точкой и двумя знаками после нее.
|
Создание индексов
MySQL
CREATE TABLE
.
mSQL
CREATE
INDEX
.
Вставка уникального идентификатора в таблицу
MySQL
AUTO_INCREMENT
. See section 8.4.3.126 mysql_insert_id()
.
mSQL
SEQUENCE
и выбрать столбец _seq
.
Получение уникального идентификатора для строки
MySQL
PRIMARY
или UNIQUE
состоит только
из одного целочисленного столбца, к нему можно обращаться и как к _rowid
.
mSQL
_rowid
. Нельзя забывать о том, что _rowid
может, в зависимости от множества факторов, со временем измениться.
Получение времени последнего изменения столбца
MySQL
TIMESTAMP
. Этому столбцу автоматически
присваиваются текущая дата и время при вызове операторов INSERT
или
UPDATE
, если ему не присвоить определенного значения или присвоить
значение NULL
.
mSQL
_timestamp
.
Сравнение значений NULL
MySQL
NULL
всегда возвращает результат NULL
.
mSQL
NULL = NULL
имеет значение TRUE. Поэтому при переводе
старого кода из mSQL в MySQL =NULL
необходимо заменить на IS NULL
,
а <>NULL
- на IS NOT NULL
.
Сравнение строк
MySQL
BINARY
, тогда сравнение будет проводиться в
соответствии с ASCII-порядком, установленным на сервере MySQL.
mSQL
Поиск без учета регистра символов
MySQL
LIKE
может быть как чувствительным, так и нечувствительным к регистру
оператором, в зависимости от столбцов, к которым он применяется. По
возможности MySQL использует индексы, если аргумент LIKE
не начинается с
шаблонного символа.
mSQL
CLIKE
.
Обработка концевых пробелов
MySQL
CHAR
и VARCHAR
удаляются. Если такое
поведение нежелательно, используйте столбцы TEXT
.
mSQL
Операторы WHERE
MySQL
AND
имеет приоритет перед
OR
). Заставить MySQL вести себя так, как mSQL, можно при помощи
скобок (как можно видеть в соответствующем примере).
mSQL
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;Чтобы MySQL вычислил результат этого запроса так же, как это сделал бы mSQL, нужно расставить скобки:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
Ограничения доступа
MySQL
mSQL
Читая этот раздел, помните о том, что оба программных продукта находятся в постоянном развитии. Мы (разработчики MySQL) и разработчики PostgreSQL постоянно заняты улучшением наших СУБД, поэтому обе системы являются серьезными альтернативами любым коммерческим СУБД.
Приведенное ниже сравнение проводилось в MySQL AB. Мы старались быть как можно более точными и объективными, однако, зная MySQL наизусть, мы не можем похвастаться таким же знанием возможностей PostgreSQL, поэтому в чем-то могли и ошибиться. Однако мы будем тут же исправлять все замеченные неточности.
Прежде всего хотелось бы отметить, что PostgreSQL и MySQL являются широко
используемыми программными продуктами, которые разрабатывались с разными
целями (хотя создатели обоих и стремятся довести их до полной
совместимости со стандартом ANSI SQL). Это значит, что для решения одних
задач больше подходит MySQL, для других же - PostgreSQL. Выбирая
СУБД, проверьте, соответствуют ли ее возможности требованиям,
предъявляемым решаемой задачей. Если требуется максимальная скорость
работы, лучше всего, вероятно, будет остановить свой выбор на MySQL
Server. Если же вам необходимы дополнительные возможности, имеющиеся
только у PostgreSQL
, этой СУБД и стоит пользоваться.
Расширяя возможности MySQL мы всегда стараемся принять оптимальное решение. Код должен быть настолько хорош, чтобы в обозримом будущем в нем не понадобилось ничего менять. Кроме того, мы не считаем целесообразным ради расширения возможностей приносить в жертву скорость, а вместо этого стараемся в каждом случае обеспечить максимально возможную производительность. В итоге несколько увеличивается время разработки, но результаты того стоят. Разработка в таком ключе возможна потому, что все новые фрагменты серверного кода перед включением в состав MySQL проверяются несколькими разработчиками.
Мы считаем, что лучшим средством предоставления нашим пользователям новых возможностей является частый выпуск новых версий. Поэтому примерно раз в три недели у нас выходит несколько обновленная версия системы, а раз в год - полностью новая. Все версии проходят полное тестирование с помощью наших инструментальных средств на множестве платформ.
Система PostgreSQL основана на ядре, созданном множеством разработчиков. В подобных случаях разумно сосредоточиться на оснащении системы новыми возможностями, но не заниматься оптимальным их воплощением, так как в случае возникновения необходимости всегда можно будет вернуться к оптимизации соответствующих участков кода.
Еще одно значительное отличие MySQL от PostgreSQL заключается в
том, что практически весь содержащийся в MySQL код создан разработчиками,
работающими в MySQL AB и постоянно занятыми совершенствованием кода
сервера. Исключением из этого правила являются системы транзакций и
библиотека регулярных выражений regexp
.
Большая же часть кода PostgreSQL написана множеством разработчиков, никак друг с другом не связанных. Не так давно разработчики PostgreSQL объявили о том, что у их команды наконец-то хватило времени на просмотр всего кода, вошедшего в состав очередной версии PostgreSQL.
У обоих вышеупомянутых методов разработки есть достоинства и недостатки. Мы, сотрудники MySQL AB, разумеется, считаем, что наша модель лучше, так как обеспечивает большую логичность кода, оптимальность и возможность его повторного использования, а также - меньшее количество ошибок. Будучи авторами кода сервера MySQL, мы с большим успехом можем координировать включение в систему новых возможностей и выход ее новых версий.
На странице crash-me
(http://www.mysql.com/information/crash-me.php)
приведен список ограничений и особенностей СУБД, которые могут быть
обнаружены автоматически с помощью специальных программ. Однако не стоит
забывать о том, что многие ограничения могут быть изменены настройкой
соответствующих баз данных. Впрочем, эта web-страница оказывается очень
кстати, если необходимо, чтобы создаваемое приложение нормально работало с
несколькими СУБД или для перевода приложения с одной СУБД в другую.
MySQL обладает следующими преимуществами перед PostgreSQL:
MySQL
обычно намного превосходит PostgreSQL по скорости работы. Кроме
того, в MySQL 4.0 реализован кэш запросов. Он позволяет во много раз
увеличить скорость обработки запросов для сайтов, на которых
преобладают неоднократно повторяющиеся запросы на чтение.
Cygwin
. Нам доводилось слышать о недостаточной стабильности
работы PostgreSQL в среде Windows, но самостоятельно эти сведения до
сих пор мы проверить не могли.
VACUUM
для освобождения занятого последствиями работы команд
UPDATE
и DELETE
пространства и проводить статистический анализ,
необходимый для достижения максимальной производительности PostgreSQL.
Запускать VACUUM
необходимо и после каждого добавления к таблице
нескольких столбцов. На напряженно работающих системах VACUUM
нужно
запускать более часто, в худших случаях - по несколько раз в день. А
ведь во время работы VACUUM
(а ее работа может продолжаться часы, если
база данных достаточно велика) база практически ``мертва''. Впрочем, в
PostgreSQL версии 7.2 выполнение основных функций этой программы
больше не приводит к блокировке базы, и пользователи могут продолжать
нормально работать с ней. Новая команда VACUUM FULL
берется за дело
более серьезно: она, как и в старых версиях, блокирует таблицу и
сжимает копию таблицы на диске.
mysql-test-run
и
crash-me
(http://www.mysql.com/information/crash-me.php), а также
пакет для замеров производительности. Тестовая система постоянно
обновляется, в нее добавляется код для тестирования всех новых
возможностей и почти всех воспроизводимых ошибок, которые попали в
поле нашего зрения. Перед выпуском каждой новой версии мы используем
эти пакеты для тестирования MySQL на нескольких платформах.
Наши тесты значительно превосходят по своим возможностям все
существующие в PostgreSQL аналоги, и обеспечивают высокое качество
кода MySQL.
PostgreSQL
.
ALTER
TABLE
.
HEAP
-таблиц или дисковых MyISAM
. See section 7 Типы таблиц MySQL.
InnoDB
и BerkeleyDB
. Так как все
системы поддержки транзакций в разных условиях работают по-разному,
это дает разработчику возможность найти наилучшее решение для условий,
в которых будет работать его система. See section 7 Типы таблиц MySQL.
myisampack
, MySQL-генератор сжатых таблиц (только для чтения).
INSERT
, SELECT
и UPDATE
/DELETE
над базой
или таблицей, MySQL предоставляет возможность определения
полного набора разнообразных привилегий на уровне базы, таблицы и
столбца. Кроме того, MySQL позволяет задавать привилегии для
комбинаций хост/пользователь. See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
InnoDB
) реализованы в виде файлов (по
одной таблице в файле), что значительно облегчает создание резервных
копий, перенос, удаление и даже создание символьных ссылок между
базами данных и таблицами, даже если сервер находится в нерабочем
состоянии.
MyISAM
(наиболее распространенного типа таблиц в MySQL). Ее использование
требуется только в случае физического повреждения файла данных
(например, в результате аппаратного сбоя). Позволяет восстановить
большую часть данных.
Недостатки MySQL по сравнению с PostgreSQL:
MyISAM
,
во многих случаях работает быстрее, нежели блокировки на уровне
страниц, строк или контроль версий. Недостаток этого подхода в том,
что если не учитывать механизм работы блокирования таблиц, один
длительный запрос может надолго заблокировать таблицу. Обычно этого
эффекта можно избежать, приняв соответствующие меры при разработке
приложения. Если это не удастся, всегда можно изменить тип таблицы и
сделать ее транзакционной. See section 5.3.2 Вопросы блокирования таблиц.
UDF
(user-defined functions
, определяемые пользователем
функции) возможности MySQL можно расширить и дополнить обычными
SQL-функциями или их объединениями. Но это сделать не так просто, да и
система не настолько гибка в этом отношении, как PostgreSQL. See section 9.2 Добавление новых функций в MySQL.
UPDATE
и в MySQL 4.1 - с помощью
подзапросов. В MySQL 4.0 можно одновременно удалять данные из
нескольких таблиц. See section 6.4.6 Синтаксис оператора DELETE
.
Ниже перечислены преимущества PostgreSQL по сравнению с MySQL на сегодняшний день.
Так как нам известен план разработки новых версий MySQL, мы включили в приведенную ниже таблицу версии MySQL, в которых будет реализована поддержка соответствующих возможностей. К сожалению, в сопоставлении мы сделать этого не могли, так как план разработки PostgreSQL нам неизвестен.
Возможность | Версия MySQL |
Подзапросы | 4.1 |
Внешние ключи | 5.0 (3.23 с InnoDB) |
Представления | 5.0 |
Хранимые процедуры | 5.0 |
Триггеры | 5.0 |
Объединения | 4.0 |
Полные связи | 4.1 |
Ограничения | 4.1 или 5.0 |
Курсоры | 4.1 или 5.0 |
R-деревья | 4.1 (для таблиц MyISAM) |
Наследование таблиц | Не планируется |
Расширяемая система типов | Не планируется |
Другие причины, по которым можно предпочесть PostgreSQL:
MyISAM
реализована поддержка R-деревьев).
OR
. Набор результатов тестов скорости MySQL,
расположенный по адресу
http://www.mysql.com/information/benchmarks.html покажет, каких
конструкций следует избегать при работе с различными базами данных.
Недостатки PostgreSQL по сравнению с MySQL:
VACUUM
затрудняет использование PostgreSQL в постоянно работающих
системах.
INSERT
, DELETE
и UPDATE
.
Полный список недостатков приведен в первой таблице настоящего раздела.
Единственная тестовая система с открытым кодом, способная тестировать скорость работы как MySQL Server, так и PostgreSQL (а также других СУБД), о существовании которой нам известно, - наша собственная разработка. Ее можно найти по адресу http://www.mysql.com/information/benchmarks.html.
Мы много раз просили разработчиков PostgreSQL и некоторых пользователей PostgreSQL помочь нам расширить эту систему и превратить ее в совершенный инструмент тестирования скорости работы СУБД, но, к сожалению, безрезультатно.
По этой причине разработчики MySQL потратили много времени, пытаясь выжать (для тестирования) из PostgreSQL все возможное, но из-за недостаточно совершенного знания PostgreSQL мы наверняка что-то упустили. На страничке тестов производительности проведенное нами исследование полностью задокументировано, так что любой может легко повторить его и проверить результаты.
Обычно тесты запускаются без ключа --fast
. При запуске с этим ключом
используются все трюки, позволяющие заставить сервер работать как можно
быстрее. Идея состоит в том, чтобы в обычном режиме тест показал, как
сервер будет работать при настройках по умолчанию, в режиме --fast
, - как
производительность изменится, если разработчик приложения воспользуется
расширениями сервера для ускорения его работы.
При тестировании PostgreSQL в режиме --fast
мы запускаем VACUUM
после
каждой операции UPDATE
и DROP TABLE
, чтобы обеспечить отличное состояние
базы для последующих операторов SELECT
. Время, уходящее на работу VACUUM
,
измеряется отдельно.
Однако при тестировании PostgreSQL 7.1.1 мы не смогли запустить программу
в режиме --fast
, так как во время теста INSERT
, postmaster
(демон
PostgreSQL) дал сбой и база данных была повреждена настолько, что
перезапустить демон не удалось. Когда это случилось дважды, мы решили
отложить тестирование в режиме --fast
до выхода следующей версии
PostgreSQL. Подробную информацию о компьютере, на котором выполнялись
тесты, вы найдете на странице тестов.
Перед тем как переходить к описанию других известных нам тестов, мы дадим побольше информации о таких тестах вообще.
Нет ничего проще, чем написать тест, доказывающий, что любая СУБД является лучшей в мире, для этого достаточно ограничиться измерением результатов операций, с которыми эта СУБД справляется хорошо, и деликатно забыть об остальных. А если еще после этого выдать обобщенный график, то все становится еще проще.
Это то же самое, если бы мы решили сравнить скорость работы MySQL Server и PostgreSQL просто сравнив общие результаты тестов MySQL, приведенных на нашей странице. По таким результатам MySQL Server оказался бы более чем в 40 раз быстрее PostgreSQL, а это, конечно, неверно. Можно было бы подлить масла в огонь, избрав для тестирования PostgreSQL тесты, на которые эта система тратит больше всего времени, - и утверждать что MySQL Server более чем в 2000 раз быстрее PostgreSQL.
Дело тут в том, что MySQL оптимизирует многое из того, чего не оптимизирует PostgreSQL. И наоборот. SQL-оптимизатор вообще очень сложная штука, и можно потратить годы исключительно на его улучшение.
Исследуя результаты тестов, нужно искать задачи, которые должно выполнять ваше приложение, и результаты их выполнения использовать для принятия решения о выборе СУБД. Результаты тестов позволяют определить и задачи, с решением которых выбранная СУБД справляется не слишком хорошо, - таким образом можно определить, чего следует избегать и обходить в своих программах.
Нам известно о двух тестах, утверждающих, что PostgreSQL по производительности превосходит MySQL Server. Оба они - многопользовательские, а у сотрудников MySQL AB пока что не нашлось времени написать такой тест. Основная причина - довольно сложно сделать это так, чтобы не поставить ни одну из СУБД в заведомо проигрышное положение.
Один из этих тестов был заказан компанией Great Bridge, которая в течение 16 месяцев пыталась построить бизнес на основе PostgreSQL, но в конце концов прекратила свою деятельность. Вероятно, это худший из когда-либо проводившихся кем-либо тестов. Он не только принимает во внимание лишь те области, в которых PostgreSQL оказывается ``на коне'', но и ставит абсолютно все остальные СУБД в заведомо проигрышное положение.
Примечание: Нам стало известно о том, что даже некоторым ключевым разработчикам PostgreSQL отнюдь не понравилось то, как фирма Great Bridge проводила свое тестирование, так что команду разработчиков PostgreSQL мы в связи с этим тестом ни в чем не обвиняем.
Упомянутый тест осуждался во многих сообщениях и телеконференциях, так что мы просто коротко перечислим его недостатки.
Open Source
-компании,
каковой мы являемся; мы даже не можем выяснить, как же на самом деле
проводились эти тесты. Причем сама программа, даже не является
специализированной утилитой для тестирования производительности - она
представляет из себя универсальный инструмент для настройки и
тестирования приложений. Называть ее ``стандартным'' тестом - это уж
слишком большая натяжка.
VACUUM
) и специально настроена для проведения тестов, чего не делалось
ни для одной другой СУБД, участвовавшей в тестировании. Они заявили
буквально следующее: ``Этот процесс оптимизирует индексы и
высвобождает немного дискового пространства. Оптимизированные индексы
в некоторой степени повышают производительность.'' Проведенные нами
тесты недвусмысленно свидетельствуют о том, что разница в скорости
выполнения большого количества выборок (SELECT'ов) из базы данных,
прошедшей чистку VACUUM
, и не прошедшей ее, может быть десятикратной.
AS3AP
упоминается о том, что при тестировании выполняются ``выборки,
простые связи, проекции, аггрегация, обновления с одним набором
значений для атрибута и массовые обновления''.
PostgreSQL отлично выполняет операции SELECT
и JOIN
(особенно после
VACUUM
), но отнюдь не здорово справляется с INSERT
или UPDATE
. А
результаты показывают, что выполнялись только операции SELECT
(или
операций обновления выполнялось очень мало). Это правдоподобно объясняет
отличные результаты, показанные PostgreSQL в данном тесте. А причина, по
которой MySQL показал неважные результаты, станет понятной несколько ниже.
glibc
или нашу стандартную бинарную поставку (ее используют 80%
наших пользователей), которая была статически слинкована с конкретной
glibc. Насколько нам известно, компания Great Bridge не сделала абсолютно
ничего для правильной настройки других СУБД при тестировании. Впрочем, мы
уверены, что в Oracle или Microsoft они за советом не обращались. ;)
Тим Пердью (Tim Perdue), преданный обожатель PostgreSQL и не слишком большой любитель MySQL, опубликовал свое сравнение на сайте PHPbuilder (http://www.phpbuilder.com/columns/tim20001112.php3).
Узнав об этом, мы связались с Тимом по телефону с тем, чтобы обсудить некоторые странности в полученных им результатах. Он, например, утверждал, что MySQL Server в его тестах с трудом справлялся с обслуживанием пяти пользователей, хотя нам были известны пользователи с примерно такими же, как у Тима, компьютерами, работающие с MySQL Server при 2000 активных соединениях, выдающих до 400 запросов в секунду (причем в данном случае производительность ограничивалась каналом связи с web, а не базой данных).
Похоже было, что Тим работал с ядром Linux, не умеющим нормально обрабатывать большое количество потоков, как, например, ядра до версии 2.4, у которых возникали серьезные проблемы с обработкой большого количества потоков на мультипроцессорных компьютерах. В настоящем руководстве мы описали решение этой проблемы, и Тим должен был об этом знать.
Существует еще одна возможная причина возникновения проблем: Тим мог
воспользоваться старой библиотекой glibc
или не загрузить
откомпилированный исполняемый файл MySQL (слинкованный с исправленной
библиотекой glibc
) с нашего сайта, но скомпилировал его сам. В любом из
этих случаев симптомы были бы именно такими, как описал Тим.
Мы спросили Тима, может ли он предоставить нам его данные с тем, чтобы мы могли повторить тест, а также попросили его проверить свою версию MySQL и сообщить нам. Пока что он этого не сделал.
Из за этого его тесту мы тоже не можем доверять. :(
Все течет, все изменяется, и старые тесты теряют актуальность. Теперь MySQL обзавелся парой новых обработчиков таблиц, которые обеспечивают совершенно разные характеристики в разрезе скорости/параллелизма. See section 7 Типы таблиц MySQL. Было бы интересно узнать, какие результаты показали бы вышеупомянутые тесты с разными типами транзакционных таблиц в MySQL. Конечно, в PostgreSQL с тех пор тоже появились новые возможности. Так как эти тесты недоступны общественности, выяснить, как СУБД показала бы себя в них сегодня, мы не можем.
Заключение:
Единственные существующие на сегодня тесты, позволяющие сравнить MySQL Server и PostgreSQL, которые любой может загрузить и запустить, - это тесты из комплекта MySQL. Мы, сотрудники MySQL AB, считаем, что Open Source-СУБД должны тестироваться при помощи Open Source-инструментов! Только так можно получить гарантии того, что никто не сможет провести невоспроизводимые тесты и на основе их результатов утверждать, что одна СУБД лучше другой. Не зная всех фактов, подтвердить или опровергнуть подобные утверждения просто невозможно.
Нам кажется странным, что невоспроизводимые тесты с участием PostgreSQL показывают преимущество этой системы, в то время как наши тесты, которые может повторить любой, четко доказывают обратное. Этим мы вовсе не хотим сказать, что PostgreSQL не годится для решения многих задач (еще как годится!) или что при определенных условиях эта система не обгонит MySQL Server. Но нам просто хотелось бы для разнообразия увидеть честный тест, в котором PostgreSQL покажет отличные результаты, - исключительно с целью поддержания товарищеской конкуренции!
Дополнительную информацию о нашей тестовой системе вы можете получить из раздела section 5.1.4 Набор тестов MySQL (The MySQL Benchmark Suite).
Мы занимаемся разработкой еще лучшего комплекса тестов, в состав которого будут включены многопользовательские тесты, а также более подробное описание того, что собственно делает каждый отдельный тест и как расширить комплекс.
В этом разделе описаны получение и установка MySQL:
Для установки MySQL на Linux рекомендуется применять пакеты RPM. В
настоящее время RPM для MySQL создаются на операционной системе SuSE Linux 7.3,
но они должны работать также и для других версий Linux,
которые поддерживают rpm
и используют glibc
.
В случае возникновения проблем с файлом RPM (например, если вы получили
ошибку ``Sorry, the host 'xxxx' could not be looked up
''), обращайтесь к
разделу See section 2.6.1.1 Примечания к бинарным дистрибутивам Linux.
Доступны для использования следующие RPM-файлы:
MySQL-server-VERSION.i386.rpm
.
Сервер MySQL. Если вам нужно только подключаться к серверу MySQL, запущенному
на другом компьютере, этот файл не требуется. Обратите внимание, что выхода
4.0.10 этот пакет назывался MySQL-VERSION.i386.RPM
.
MySQL-client-VERSION.i386.rpm
.
Стандартные клиентские программы MySQL.
Установка этого пакета требуется всегда.
MySQL-bench-VERSION.i386.rpm
.
Тесты и контрольные задачи. Для файла
требуется наличие модулей Perl и msql-mysql-modules.
MySQL-devel-VERSION.i386.rpm
.
Библиотеки и включаемые файлы,
необходимые для компилирования других клиентов MySQL, таких как модули
Perl.
MySQL-shared-VERSION.i386.rpm
Этот пакет содержит динамические библиотеки (libmysqlclient.so*
),
нужные для некоторых языков программирования или приложений для того, чтобы
работать с MySQL.
MySQL-embedded-VERSION.i386.rpm
Встраиваемая библиотека сервера MySQL (MySQL 4.x и более новые).
MySQL-VERSION.src.rpm
.
Этот файл содержит исходный код для всех
предыдущих пакетов. Файл также можно использовать для создания файлов
RPM для других архитектур (например Alpha или SPARC).
Для просмотра всех файлов в пакете RPM выполните команду:
shell> rpm -qpl MySQL-VERSION.i386.rpm
Для выполнения стандартной минимальной установки запустите команду:
shell> rpm -i MySQL-server-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm
Для установки только клиентского пакета выполните команду:
shell> rpm -i MySQL-client-VERSION.i386.rpm
RPM помещает данные в `/var/lib/mysql' и создает соответствующие вхождения в `/etc/init.d/' для автоматического запуска сервера во время начальной загрузки (в случае, если у вас имеется предыдущая инсталляция, можно создать копию ранее установленного файла запуска MySQL, чтобы изменения в нем не были утеряны.)
Если вы хотите установить MySQL RPM на старших версиях Linux, которые не поддерживают init-скрипты в `/etc/init.d' (непосредственно или посредством символической ссылки), вам следует создать символическую ссылку на старое расположение перед тем, как устанавливать RPM:
shell> cd /etc ; ln -s rc.d/init.d .
Однако, все современные поставки Linux должны поддерживать эту схему каталогов, т.к. это требование стандарта LSB (Linux Standard Base).
После установки RPM, mysqld
должен заработать и вы можете сразу приступать к
использованию MySQL.
See section 2.4 Послеустановочные настройка и тестирование.
Если при установке возникнут проблемы, то за более подробной информацией следует обращаться к главе, в которой описывается установка из бинарного дистрибутива. See section 2.2.10 Установка бинарного дистрибутива MySQL.
Имеются два следующих типа дистрибутивов сервера MySQL для Windows:
В общем случае следует отдавать предпочтение бинарному дистрибутиву.
Вам потребуется:
MAX_ROWS
и AVG_ROW_LENGTH
. See section 6.5.3 Синтаксис оператора CREATE TABLE
.
ZIP
для распаковки файла дистрибутива.
ODBC
, то
понадобится драйвер MyODBC
. See section 8.3 Поддержка ODBC в MySQL.
C:\> NET STOP MySQLВ остальных случаях используйте:
C:\mysql\bin> mysqladmin -u root shutdown
C:\mysql\bin> mysqld-max-nt --remove
Browse
для указания выбранного вами
каталога.
Начиная с версии MySQL 3.23.38, дистрибутив для Windows включает в себя
как обычный бинарный код, так и бинарный код сервера MySQL-Max
. Ниже
приводится список различных серверов MySQL, которые можно использовать:
Бинарный код | Описание |
mysqld | Скомпилирован с полным набором возможностей отладки и автоматической проверки выделения памяти, символических ссылок, таблиц InnoDB и BDB. |
mysqld-opt | Оптимизированный бинарный код без поддержки транзакционных таблиц. |
mysqld-nt | Оптимизированный бинарный код для NT/2000/XP с поддержкой именованных каналов. Можно запустить эту версию на Windows 9x/Me, но в этом случае не создаются именованные каналы и необходимо иметь установленный протокол TCP/IP. |
mysqld-max | Оптимизированный бинарный код с поддержкой символических ссылок и таблиц InnoDB и BDB. |
mysqld-max-nt | Подобен mysqld-max , но скомпилирован с поддержкой именованных каналов.
|
Начиная с версии 3.23.50, именованные каналы доступны только при запуске
mysqld с --enable-named-pipe
.
Все бинарные коды оптимизированы под процессор Pentium Pro, но должны работать на любом процессоре Intel >= i386.
При следующих обстоятельствах для того чтобы задать вашу конфигурацию MySQL будет необходимо использовать файл опций:
Обычно для редактирования файла опций `my.ini' можно использовать инструмент
WinMySQLAdmin
. В этом случае остальную часть данного раздела вы можете
пропустить.
Существует два файла опций с одинаковыми функциями: `my.cnf' и `my.ini'.
Однако во избежание недоразумений лучше всего использовать только один из
них. Оба файла представляют собой простой текст. Если вы собираетесь
использовать файл `my.cnf', то его следует создать в корневом каталоге
диска C, если `my.ini' - то в системном каталоге Windows (это обычно
что-либо вроде `C:\WINDOWS' или `C:\WINNT'; его точное местоположение
можно определить по значению переменной окружения windir
). MySQL сначала
ищет файл `my.ini', а затем `my.cnf'.
Если на вашем компьютере используется начальный загрузчик, в котором диск
C не является загрузочным диском, то следует работать только с файлом
`my.ini'. Инструментальная программа WinMySQLAdmin
, если она у вас
применяется, также использует только файл `my.ini' (файл помощи с
инструкциями по использованию этого инструмента находится в каталоге
`\mysql\bin').
Используя notepad.exe
, создайте файл опций и отредактируйте раздел
[mysqld]
, указав значения параметров basedir
и datadir
:
[mysqld] # set basedir to installation path, e.g., c:/mysql basedir=the_install_path # set datadir to location of data directory, # e.g., c:/mysql/data or d:/mydata/data datadir=the_data_path
Следует учитывать, что в Windows имена путей должны указываться в файле опций с использованием предпочтительно прямых слешей, а не обратных. Если вы применяете обратные слеши, то их необходимо дублировать.
Чтобы использовать каталог данных, отличный от заданного по умолчанию `c:\mysql\data', необходимо скопировать все содержимое каталога `c:\mysql\data' в новое местоположение.
Если вы хотите работать с транзакционными таблицами InnoDB
, то необходимо
вручную создать два новых каталога для хранения данных таблиц InnoDB
и
журнальных файлов - т.е. `c:\ibdata' и `c:\iblogs'. Помимо этого
потребуется добавить несколько дополнительных строк в файле опций. См.
раздел See section 7.5.2 Параметры запуска InnoDB.
Если же работу с таблицами InnoDB
вы не планируете, следует в файле опций
добавьте опцию skip-innodb
.
Теперь вы готовы тестировать запуск сервера.
Тестирование лучше всего производить из окна оболочки DOS, поскольку сообщения о состоянии, которые выводит сервер, появляются в окне DOS. Если с вашей конфигурацией что-нибудь не так, то при помощи этих сообщений будет легче идентифицировать и устранить любые проблемы.
Убедитесь, что находитесь в каталоге, где расположен сервер, затем введите следующую команду:
C:\mysql\bin> mysqld-max --standalone
При запуске сервера вы должны увидеть следующие сообщения:
InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist: InnoDB: a new database to be created! InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200 InnoDB: Database physically writes the file full: wait... InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280 InnoDB: Doublewrite buffer not found: creating new InnoDB: Doublewrite buffer created InnoDB: creating foreign key constraint system tables InnoDB: foreign key constraint system tables created 011024 10:58:25 InnoDB: Started
Чтобы получить дальнейшую информацию о работе MySQL под Windows, обращайтесь к разделу See section 2.6.2 Примечания к Windows.
Информацию о текущей версии и инструкции по ее загрузке можно получить на домашней странице MySQL (http://www.mysql.com/).
Наш главный зеркальный сайт - http://mirrors.sunsite.dk/mysql/
Если вы заинтересованы в организации зеркального сайта MySQL, то можете
анонимно зеркалировать нас программой rsync с адреса
rsync://sunsite.dk/ftp/mirrors/mysql/
. Просьба отправить нам письмо по
адресу webmaster@mysql.com
, чтобы уведомить нас о том, что ваш зеркальный
сайт следует добавить в представленный ниже список.
Если возникнут проблемы с загрузкой с нашего главного сайта, пробуйте использовать один из следующих зеркальных сайтов.
О недействительных или устаревших зеркальных сайтах просьба сообщать по
адресу webmaster@mysql.com
.
For a complete upto-date list of MySQL web/download mirrors, see http://www.mysql.com/downloads/mirrors.html. There you will also find information about becoming a MySQL mirror site and how to report a bad or out-of-date mirror.
MD5 Checksums
или GnuPG
После того, как вы загрузили нужный вам пакет MySQL, и перед тем как вы будете его устанавливать, вам следует убедиться в том, что он в сохранности и не был кем-либо изменен.
MySQL AB предоставляет два способа проверить пакет: контрольная сумма MD5
и криптографическая подпись с использованиемп GnuPG
, GNU Privacy Guard
.
MD5
После того как вы загрузили пакет, вы должны проверить, соответствует ли контрольная сумма MD5 загруженного пакета той, что указана на страничке загрузки пакетов. У каждого пакета своя контрольная сумма, которую вы можете проверить такой командой:
shell> md5sum <пакет>
Однако не все операционные системы поддерживают команду md5sum
- на некоторых
она просто называется md5
, а в других она вовсе не поставляется. На Linux
эта команда является частью GNU Text Utilities
, которые доступны для множества
разных платформ.
Пример:
shell> md5sum mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz 155836a7ed8c93aee6728a827a6aa153 mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz
Вы должны удостовериться, что результирующая контрольная сумма соответствует той, что указана на страничке загрузки возле соответствующего пакета.
Множество зеркальных сайтов также предоставляют файл с именем `MD5SUMS',
который также содержит MD5
контрольные суммы всех файлов из каталога
`Downloads'. Однако заметьте, что этот файл достаточно легко изменить и
это не самый надежный метод проверки целостности пакета. Если вы в сомнениях,
вы должны посмотреть на другие зеркала и сравнить увиденное.
GnuPG
Гораздо более надежный метод проверки целостности пакета это использование
криптографически сигнатур. MySQL AB использует ПО GNU Privacy Guard
(GnuPG
), открытая альтернатива весьма известному пакету Pretty Good
Privacy
(PGP
) Фила Циммермана (Phil Zimmermann).
См. http://www.gnupg.org/ и http://www.openpgp.org/
для более подробной информации про OpenPGP/GnuPG и как его получить и поставить на
вашей системе. Большинство поставок Linux уже идут с GnuPG прямо в поставке.
Начиная с MySQL 4.0.10 (Февраль 2003), MySQL AB начала подписывать
загружаемые пакеты с помощью GnuPG
. Криптографические сигнатуры являются
гораздо более надежным методом проверки целостности и аутентичности файла.
Для проверки подписи конкретного пакета, вам в первую очередь следует получить копию публичного ключа GPG build@mysql.com. Вы можете либо взять этот ключ прямо отсюда, либо взять его на http://www.keyserver.net/.
Key ID: pub 1024D/5072E1F5 2003-02-03 MySQL Package signing key (www.mysql.com) <build@mysql.com> Fingerprint: A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5 Public Key (ASCII-armored): -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3 RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3 BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q7TXlTUUwgUGFj a2FnZSBzaWduaW5nIGtleSAod3d3Lm15c3FsLmNvbSkgPGJ1aWxkQG15c3FsLmNv bT6IXQQTEQIAHQUCPj6jDAUJCWYBgAULBwoDBAMVAwIDFgIBAheAAAoJEIxxjTtQ cuH1cY4AnilUwTXn8MatQOiG0a/bPxrvK/gCAJ4oinSNZRYTnblChwFaazt7PF3q zIhMBBMRAgAMBQI+PqPRBYMJZgC7AAoJEElQ4SqycpHyJOEAn1mxHijft00bKXvu cSo/pECUmppiAJ41M9MRVj5VcdH/KN/KjRtW6tHFPYhMBBMRAgAMBQI+QoIDBYMJ YiKJAAoJELb1zU3GuiQ/lpEAoIhpp6BozKI8p6eaabzF5MlJH58pAKCu/ROofK8J Eg2aLos+5zEYrB/LsrkCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWsEN/l xaZoJYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLmRDRi Rjd1DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hkAWzE 7zaD5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkbf4fm Le11EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHbuE5p /1oIDznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+Lwqq a8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSaf anFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOW I39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42Lmu QT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt92 6s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZ Whe70YGNPw1yjWJT1IhMBBgRAgAMBQI+PqMdBQkJZgGAAAoJEIxxjTtQcuH17p4A n3r1QpVC9yhnW2cSAjq+kr72GX0eAJ4295kl6NxYEuFApmr1+0uUq/SlsQ== =YJkx -----END PGP PUBLIC KEY BLOCK-----
Вы можете импортировать этот ключ в ваш публичный репозитарий ключей (public keyring)
используя gpg --import
. См. документацию на GPG
для более подробной информации
о том, как работать с публичными ключами.
После того, как вы загрузили и импортирлвали публичный ключ сборки, вы можете загрузить выбранный вами пакет MySQL и соответствующую подпись, доступную на той же страничке загрузки.
Файл сигнатуры имеет расширение `.asc'. Например, сигнатура для `mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz' будет `mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc'. Удостоверьтесь, чтобы оба файла находятся в том же самом каталоге и затем запустите такую команду для проверки сигнатуры файла:
shell> gpg --verify <package>.asc Example: shell> gpg --verify mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc gpg: Warning: using insecure memory! gpg: Signature made Mon 03 Feb 2003 08:50:39 PM MET using DSA key ID 5072E1F5 gpg: Good signature from "MySQL Package signing key (www.mysql.com) <build@mysql.com>"
Сообщение "Good signature" сообщает вам о том, что все в порядке.
Для пакетов RPM
, отдельного файла подписи не предоставляется - пакеты RPM
уже
сами по себе имеют встроенную поддержку подписей GPG
и контрольных сумм MD5
. Вы можете
проверить их такой командой:
shell> rpm --checksig <package>.rpm Example: shell> rpm --checksig MySQL-server-4.0.10-0.i386.rpm MySQL-server-4.0.10-0.i386.rpm: md5 gpg OK
Если вдруг вы заметите что контрольные суммы MD5 или подпись GPG не совпадают, попробуйте в первую очередь загрузить соответствующий пакет еще один раз, может быть, даже с другого сервера. Если вы не сможете успешно удостовериться в целостности пакета, пожалуйста, сообщите нам о подобных инцидентах, включая полное имя пакета и адрес сайта, с которого вы пытались загрузить пакет, на адрес webmaster@mysql.com.
Мы применяем GNU Autoconf, что дает возможность переносить MySQL на все современные системы с работающими потоками Posix и компилятором C++ (чтобы скомпилировать только код клиента, требуется только компилятор C++ без использования потоков). Для себя мы используем и разрабатываем программное обеспечение в основном на Sun Solaris (версий 2.5 - 2.7) и SuSE Linux версии 7.x.
Следует учитывать, что для многих операционных систем поддержка собственных потоков работает только в самых последних версиях. Согласно полученным нами сообщениям, MySQL успешно компилируется на следующих комбинациях операционных систем и потоковых пакетов:
Следует отметить, что не на всех платформах MySQL функционирует одинаково хорошо. Насколько подходит определенная платформа для высоконагружаемого многоцелевого сервера MySQL, определяется следующими факторами:
SMP
) на многопроцессорных
системах. Другими словами, при создании процессом потока для этого
потока должна быть возможность работать на ином центральном процессоре
(CPU), чем исходный процесс.
pthread_mutex_lock()
является очень
``уступающей'' время центрального процессора, это значительно
вредит MySQL. Если не принять во внимание данное обстоятельство, то
использование добавочных центральных процессоров сделает MySQL
существенно медленнее.
В соответствии с предыдущими критериями наилучшими платформами с этой точки зрения для функционирования MySQL являются: x86 под управлением SuSE Linux 7.1, с ядром 2.4 и ReiserFS (или любой подобный дистрибутив Linux) и SPARC под управлением Solaris 2.7 или 2.8. FreeBSD оказывается третьей, но мы в самом деле надеемся, что эта платформа войдет в число лучших, как только станет совершеннее потоковая библиотека. Мы также надеемся, что, с некоторого момента, мы сможем включить в высшую категорию все остальные платформы, на которых MySQL компилируется и функционирует нормально, но не с тем же уровнем стабильности и производительности. Это потребует некоторых усилий с нашей стороны в сотрудничестве с разработчиками компонентов операционных систем и библиотек, от которых зависит MySQL. Если вы заинтересованы в улучшении тех или иных компонентов, у вас есть возможность оказать влияние на их разработку и вы нуждаетесь в подробных инструкциях по поводу того, что нужно MySQL, чтобы работать лучше, пошлите письмо по адресу internals@lists.mysql.com.
Просьба к вам: на основании приведенных выше сравнительных характеристик не делать выводов о том, что какая-либо операционная система лучше или хуже другой в общем. Мы говорим о выборе определенной операционной системы для конкретной цели - для работы MySQL, и сравниваем платформы только в таком смысле. С этой точки зрения результат такого сравнения был бы другим, если бы мы включили в него больше пунктов. И в некоторых случаях причина того, что одна операционная система лучше, чем другая, может заключаться всего лишь в том, что в тестирование и оптимизацию этой конкретной платформы было вложено гораздо больше усилий. Мы просто констатируем наши наблюдения, чтобы помочь вам принять решение - на какой платформе использовать MySQL в вашей системе.
Во-первых, нужно принять решение о том, что именно вам требуется - самый свежий экспериментальный выпуск или последняя устойчивая версия:
Во-вторых, нужно принять решение, хотите ли вы использовать дистрибутив исходного кода или бинарный дистрибутив. В большинстве случаев лучше остановить свой выбор на бинарном дистрибутиве, если такой существует для вашей платформы, так как обычно его проще установить, чем дистрибутив исходного кода.
Установка из исходного кода может оказаться более предпочтительной в следующих случаях:
MySQL
могут
подключаться к обеим версиям.
Бинарный дистрибутив расширенной версии
MySQL маркируется суффиксом -max
и конфигурируется с теми же опциями,
что и mysqld-max
. See section 4.7.5 mysqld-max
, расширенный сервер mysqld
.
Если вы хотите использовать пакет RPM MySQL-Max
, то сначала
следует установить стандартный пакет MySQL
RPM.
mysqld
с некоторыми дополнительными
свойствами, которые отсутствуют в стандартных бинарных дистрибутивах.
Ниже приводится список наиболее распространенных дополнительных опций,
которые, возможно, вы захотите использовать:
--with-innodb
--with-berkeley-db
--with-raid
--with-libwrap
--with-named-z-lib (Это делается для некоторых бинарных дистрибутивов)
--with-debug[=full]
pgcc
) или воспользоваться опциями компилятора, которые лучше
оптимизированы для вашего процессора.
В системе наименований в MySQL используются номера выпусков, состоящие из
трех чисел и суффикса. Например, выпуск mysql-3.21.17-beta
интерпретируется следующим образом:
3
) служит для описания формата файлов. Все выпуски
версии 3
имеют один и тот же формат файлов.
21
) представляет собой уровень выпуска. Обычно
существует выбор из двух возможностей. Одна представляет выпуск
стабильной ветви (в настоящее время 23
) и вторая - экспериментальную
ветвь (в настоящее время 4.0
). Обычно обе ветви стабильны, но
экспериментальная версия может обладать некоторыми причудами, возможно
отсутствие документации на новые свойства, либо она может не
компилироваться на некоторых системах.
17
) является номером версии в пределах уровня выпуска.
Это число увеличивается для каждого нового дистрибутива. Обычно имеет
смысл предпочесть самую последнюю версию для выбранного уровня
выпуска.
beta
) указывает на уровень стабильности данного выпуска.
Возможны следующие суффиксы:
alpha
указывает, что выпуск содержит большие разделы нового кода,
не протестированного на 100%. Обнаруженные ошибки (обычно их нет)
должны быть задокументированы в разделе ``Новости'' (News). См.
раздел See section D История изменений и обновлений MySQL. В большинстве выпусков alpha
присутствуют также новые команды и расширения. При работе над
alpha
-выпуском может происходить активная разработка, включающая
значительные изменения кода, но перед выпуском все тестируется. В
любом выпуске MySQL не должно быть известных ошибок.
beta
означает, что весь новый код протестирован. Не добавляются
никакие новые свойства, которые могли бы вызвать повреждения
старого кода. Не должно быть никаких известных ошибок. Версия
изменяется с alpha
на beta
тогда, когда никаких сообщений о
критических ошибках в alpha
-версии не поступает по меньшей мере в
течение месяца и мы не планируем добавлять какие- либо новые
свойства, которые могли бы понизить надежность прежних команд.
gamma
представляет собой версию beta
, которая почти закончена и,
похоже, работает хорошо. Добавляются только незначительные
исправления. Это именно то, что во многих других компаниях
называется релизом.
Все версии MySQL пропускаются через наши стандартные тесты и контрольные задачи, чтобы получить уверенность в том, что они надежны в применении. Так как стандартные тесты периодически дополняются, чтобы включить проверку обнаруженных новых ошибок и ситуаций, которые могут их вызвать, то набор тестов со временем становится лучше и лучше.
Отметим, что все выпуски протестированы по меньшей мере со следующими тестами:
crash-me
Существует еще один тест. Он заключается в том, что мы используем самую новую версию MySQL в нашей внутренней производственной среде по крайней мере на одной машине. Для работы с этой версией у нас есть более чем 100 гигабайт данных.
В этом разделе описывается расположение каталогов, создаваемых по умолчанию при установке бинарного дистрибутива и дистрибутива исходного кода.
Бинарный дистрибутив устанавливается путем его распаковки в выбранном вами месте установки (обычно `/usr/local/mysql') и создает следующие каталоги:
Каталог | Содержание каталога |
`bin' | Клиентские программы и сервер mysqld
|
`data' | Файлы журналов, базы данных |
`include' | Включаемые (заголовочные) файлы |
`lib' | Библиотеки |
`scripts' | mysql_install_db
|
`share/mysql' | Файлы с текстами сообщений об ошибках |
`sql-bench' | Тесты производительности |
Дистрибутив исходного кода устанавливается после того, как вы сконфигурируете и скомпилируете его. По умолчанию на этапе установки файлы инсталлируются в каталог `/usr/local' в следующие подкаталоги:
Каталог | Содержание каталога |
`bin' | Клиентские программы и скрипты |
`include/mysql' | Включаемые (заголовочные) файлы |
`info' | Документация в формате Info |
`lib/mysql' | Библиотеки |
`libexec' | Сервер mysqld
|
`share/mysql' | Файлы с текстами сообщений об ошибках |
`sql-bench' | Тесты производительности и тест crash-me
|
`var' | Базы данных и файлы журналов |
Внутри каталога установки схема расположения инсталляции исходного кода отличается от схемы установки бинарного дистрибутива в следующих отношениях:
mysqld
устанавливается в каталог `libexec', а не в `bin'.
mysql_install_db
устанавливается в каталоге `/usr/local/bin', а не в
`/usr/local/mysql/scripts'.
Можно создать собственную бинарную установку из скомпилированного дистрибутива исходного кода. Для этого следует выполнить скрипт `scripts/make_binary_distribution'.
Развитие MySQL в MySQL AB происходит очень быстрыми темпами и мы стремимся к тому, чтобы результаты нашей работы стали доступны и другим пользователям MySQL. Мы стараемся сделать новый выпуск сразу же, как только в продукте появляются очень полезные свойства, которые, по нашему мнению, необходимы другим пользователям.
Помимо этого мы откликаемся на просьбы наших пользователей, если для этого требуется добавить в продукт легко реализуемые свойства. Мы принимаем во внимание пожелания наших пользователей, имеющих лицензии, а особенно - пожелания обширного круга пользователей, охваченных поддержкой при помощи электронной почты, и стараемся помочь им решить их проблемы.
Загружать новый выпуск не обязательно. Информацию о том, действительно ли новый выпуск представляет собой именно то, что вам требуется, вы почерпнете из раздела ``Новости'' (News). See section D История изменений и обновлений MySQL.
Наша политика в вопросах обновления MySQL заключается в следующем:
Текущим стабильным выпуском сейчас является версия 3.23; уже начата активную разработка версии 4.0. Ошибки в стабильной версии по-прежнему будут исправляться. Мы не верим в полное ``замораживание'', поскольку при этом упускаются исправления ошибок и вещи, которые ``должны быть сделаны''. ``Отчасти заморожено'' подразумевает, что мы можем добавить некоторые вещи, которые ``почти несомненно не окажут влияния ни на что из того, что уже работает''.
В MySQL применяется несколько отличающаяся от большинства других продуктов система именования. В общем случае достаточно надежно использовать любую версию, просуществовавшую в течение пары недель без замены ее новой версией. See section 2.2.6 Какую версию MySQL использовать.
Компания MySQL AB в качестве услуги предоставляет набор бинарных (скомпилированных) дистрибутивов MySQL - они скомпилированы на нашем оборудовании или на вычислительных системах, к которым нам любезно предоставили доступ заказчики.
Эти дистрибутивы сгенерированы скриптом
Build-tools/Do-compile
, который компилирует дерево исходных
кодов, и создает архив .tar.gz
используя scripts/make_binary_distribution
Эти бинарники сконфигурированы и собраны с помощью следующих компиляторов и опций.
gcc
2.95.3
CFLAGS="-O2 -mcpu=pentiumpro" CXX=gcc CXXFLAGS="-O2 -mcpu=pentiumpro -felide-constructors" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --disable-shared --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
ecc
(Intel C++ Itanium Compiler 7.0)
CC=ecc CFLAGS=-tpp1 CXX=ecc CXXFLAGS=-tpp1 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile
ccc
(Compaq C V6.2-505 / Compaq C++ V6.3-006)
CC=ccc CFLAGS="-fast -arch generic" CXX=cxx CXXFLAGS="-fast -arch generic -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared --disable-shared
egcs
1.1.2
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --disable-shared
gcc
2.95.3
CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
gcc
3.2
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=no --with-named-curses-libs=-lcurses --disable-shared
gcc
2.95.3
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-curses-libs=-lcurses --disable-shared
cc-5.0
(Sun Forte 5.0)
CC=cc-5.0 CXX=CC ASFLAGS="-xarch=v9" CFLAGS="-Xa -xstrconst -mt -D_FORTEC_ -xarch=v9" CXXFLAGS="-noex -mt -D_FORTEC_ -xarch=v9" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=no --enable-thread-safe-client --disable-shared
gcc
3.2.1
CFLAGS="-O2 -mcpu=powerpc -Wa,-many " CXX=gcc CXXFLAGS="-O2 -mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --disable-shared
gcc
3.2.1
CFLAGS="-O2 -mcpu=powerpc -Wa,-many" CXX=gcc CXXFLAGS="-O2 -mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --with-server-suffix="-pro" --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --disable-shared --with-innodb
gcc
3.1
CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc CXXFLAGS="-DHPUX -I/opt/dce /include -felide-constructors -fno-exceptions -fno-rtti -O3 -fPIC" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-pthread --with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC --disable-shared
aCC
(HP ANSI 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
gcc
3.1
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared
gcc
2.95.4
CFLAGS=-DHAVE_BROKEN_REALPATH ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --with-named-z-libs=not-used --disable-shared
Следующие бинарные поставки собраны на системах, предоставленных MySQL AB пользователями. Заметьте, что эти бинарные поставки предоставляются исключительно для удобства. Поскольку у MySQL AB нет полного контроля над этими системами, мы только можем дать ограниченную поддержку этих бинарных поставок.
gcc
2.95.3
CFLAGS="-O3 -mpentium" LDFLAGS=-static CXX=gcc CXXFLAGS="-O3 -mpentium -felide-constructors" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --enable-thread-safe-client --disable-shared
CC
3.2
CC=cc CFLAGS="-O" CXX=CC ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --enable-thread-safe-client --disable-shared
cc/cxx
(Compaq C V6.3-029i / DIGITAL C++ V6.1-027)
CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -fast -inline speed -speculate all -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 -lc" --disable-shared --with-mysqld-ldflags=-all-static
gcc
3.0.1
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --disable-shared
Такие опции компиляции использовались для бинарных поставок MySQL AB в прошлом. Такие бинарные поставки более не обновляются, но опции компиляции мы сохранили здесь как реферативную информацию.
gcc
2.95.2
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex
gcc
2.7.2.1
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-assembler
egcs
1.0.3a or 2.90.27 or gcc 2.95.2 and newer
CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex --enable-assembler
gcc
2.8.1
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
gcc
2.7.2.1
CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc
2.7.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc
2.7.2.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
Каждый, кто обладает более оптимальными опциями для любой из вышеперечисленных конфигураций, в любое время может выслать их в список рассылки разработчиков по адресу internals@lists.mysql.com.
Дистрибутивы RPM для версии MySQL до 3.22 создавались силами пользователей. Однако начиная с версии 3.22, пакеты RPM собираются у нас в MySQL AB.
Если вы хотите скомпилировать отладочную версию MySQL, то следует добавить
--with-debug
или --with-debug=full
к предыдущим строкам конфигурации и
удалить любые опции -fomit-frame-pointer
.
По вопросам, относящимся к дистрибутиву для Windows, просьба обращаться к разделу See section 2.1.2 Установка MySQL на Windows.
См. также раздел See section 2.1.2.1 Установка бинарного кода, раздел section 2.1.1 Установка MySQL на Linux и раздел See section 8.4.7 Сборка клиентских программ.
Для установки бинарного дистрибутива MySQL необходимы следующие инструментальные средства:
gunzip
для разархивирования дистрибутива.
tar
для распаковки дистрибутива. GNU tar
известен как
работающий, а tar
разработки Sun - как имеющий проблемы.
Для Linux существует альтернативный метод установки с использованием дистрибутива RPM (RedHat Package Manager, менеджер пакетов RedHat). См. раздел See section 2.1.1 Установка MySQL на Linux.
Если вам придется столкнуться с проблемами, то, пожалуйста, при отправке
вопросов на mysql@lists.mysql.com всегда пользуйтесь mysqlbug
. Даже если
ваша проблема не относится к числу ошибок, mysqlbug
соберет системную
информацию, которая поможет решать такие проблемы и другим. Без mysqlbug
вы уменьшаете вероятность получить решение своей проблемы! mysqlbug
можно
найти в каталоге `scripts' после распаковки дистрибутива. See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах.
Для установки бинарного дистрибутива MySQL необходимо выполнить следующие основные команды:
shell> groupadd mysql shell> useradd -g mysql mysql shell> cd /usr/local shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql shell> scripts/mysql_install_db shell> chown -R root . shell> chown -R mysql data shell> chgrp -R mysql . shell> bin/safe_mysqld --user=mysql &
или
shell> bin/mysqld_safe --user=mysql &
если вы работаете с MySQL 4.x
Новых пользователей можно добавить, используя скрипт
bin/mysql_setpermission
, если установить модули Perl DBI
и
Msql-Mysql-modules
.
Далее следует более детальное описание.
Для установки бинарного дистрибутива выполните приведенные ниже действия, а затем перейдите к разделу section 2.4 Послеустановочные настройка и тестирование для послеустановочной настройки и проверки:
root
.)
VERSION
представляет собой число (например 4.0.11-gamma), а OS
указывает тип
операционной системы, для которой предназначен данный дистрибутив
(например pc-linux-gnu-i586
).
-max
, то это означает,
что данный бинарный код поддерживает транзакционные таблицы и другие
свойства. See section 4.7.5 mysqld-max
, расширенный сервер mysqld
. Отметим,
что все бинарные дистрибутивы созданы из одного и того же дистрибутива
исходного кода MySQL.
mysqld
как:
shell> groupadd mysql shell> useradd -g mysql mysqlПриведенные команды добавляют группу
mysql
и пользователя mysql
. Данный
синтаксис для useradd
и groupadd
для различных версиях Unix может иметь
некоторые различия. Эти команды могут также называться adduser
и addgroup
.
При желании можно дать пользователю и группе вместо mysql
другие имена.
shell> cd /usr/local
shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - shell> ln -s full-path-to-mysql-VERSION-OS mysqlПервая команда создает каталог с именем
mysql-VERSION-OS
, а вторая -
устанавливает символическую ссылку на данный каталог. Это позволяет более
просто ссылаться на каталог установки - как на `/usr/local/mysql'.
shell> cd mysqlВ каталоге
mysql
вы найдете несколько файлов и подкаталогов. Наиболее
важными для целей установки являются подкаталоги `bin' и `scripts'.
PATH
, чтобы оболочка
операционной системы правильно находила программы MySQL.
See section F Переменные окружения.
mysql_install_db
, используемый для
инициализации базы данных mysql
, содержащей таблицы привилегий, в которых
хранятся права доступа к серверу.
mysqlaccess
и установить
дистрибутив MySQL в каком-либо нестандартном месте, то необходимо
изменить место, где mysqlaccess
ожидает найти клиента mysql
.
Отредактируйте скрипт `bin/mysqlaccess' примерно на 18-й строке.
Найдите строку, выглядящую примерно так:
$MYSQL = '/usr/local/bin/mysql'; # путь к исполняемому клиенту mysqlИзмените путь для указания того места в системе, где действительно находится
mysql
. Если этого не сделать, то возникнет ошибка Broken pipe
при запуске mysqlaccess
.
shell> scripts/mysql_install_dbОтметим, что в версиях MySQL старше, чем 3.22.10, сервер MySQL запускался при запуске
mysql_install_db
. Сейчас это не так!
root
и
принадлежность каталога данных пользователю, под которым будет
запускаться mysqld
, следующим образом:
shell> chown -R root /usr/local/mysql/. shell> chown -R mysql /usr/local/mysql/data shell> chgrp -R mysql /usr/local/mysql/.Первая команда изменяет владельца данного файла на пользователя
root
,
вторая - владельца каталога данных на пользователя mysql
, а третья -
группу на группу mysql
.
DBI
/DBD
,
See section 2.7 Замечания по установке Perl.
После того, как все это будет установлено, необходимо инициализировать и протестировать данный дистрибутив.
Запустить сервер MySQL можно с помощью следующей команды:
shell> bin/safe_mysqld --user=mysql &
А сейчас следует перейти к разделу section 4.7.2 safe_mysqld
, оболочка mysqld
и просмотреть раздел See section 2.4 Послеустановочные настройка и тестирование.
Перед тем как приступить к установке исходного кода, вначале убедитесь, что наш бинарный дистрибутив подходит для вашей платформы и что он будет работать на вашей системе. Мы прилагаем много усилий для того, чтобы снабдить наши бинарные дистрибутивы наилучшими свойствами из возможных.
Для сборки и установки MySQL из исходного кода необходимы следующие инструменты:
gunzip
для разархивирования дистрибутива.
tar
для распаковки дистрибутива. Известно, что GNU tar
является работоспособным, а tar
разработки Sun имеет проблемы.
gcc
>= 2.95.2, egcs
>=
1.0.2 или egcs 2.91.66, SGI C++ и SunPro C++. При использовании gcc
нет необходимости в libg++
. Версия gcc 2.7.x имеет ошибку, из-за
которой невозможна компиляция некоторых полностью допустимых файлов
C++, таких как `sql/sql_base.cc'. Если у вас есть только gcc
2.7.x, то
для того, чтобы можно было провести компиляцию MySQL, необходимо
модернизировать gcc
. Компилятор gcc
2.8.1, как известно, также имеет
проблемы на некоторых платформах, так что его лучше не использовать,
если для данной платформы существует новый компилятор. При компиляции
версии MySQL 3.23.x рекомендуется gcc
>= 2.95.2.
make
. Всегда рекомендуется (а иногда и необходимо)
использовать GNU make. В случае возникновения проблем мы рекомендуем
попробовать работать с версией GNU make 3.75 или более новой.
Очень важно, чтобы вы использовали последнюю версию gcc
, достаточно новую,
чтобы ``понимать'' опцию -fno-exceptions
. В противном случае не исключена
компиляция бинарного кода, который может неожиданно привести к отказу. Мы
также рекомендуем использовать -felide-constructors
и -fno-rtti
вместе с
-fno-exceptions
. Если вы сомневаетесь, то выполните следующие действия:
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions \ -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-static
На большинстве операционных систем это даст быстрый и стабильный бинарный код.
Если вам придется столкнуться с проблемами, то при отправке вопросов на
mysql@lists.mysql.com, пожалуйста, всегда используйте mysqlbug
. Даже если
ваша проблема не вызвана какой-либо ошибкой, mysqlbug
соберет системную
информацию, которая в поможет решении этой проблемы другим пользователям.
Без mysqlbug
уменьшается вероятность того, что вы получите решение своей
проблемы! mysqlbug
можно найти в каталоге `scripts' после распаковки
дистрибутива. See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах.
Для установки MySQL из исходного кода необходимо выполнить следующие основные команды:
shell> groupadd mysql shell> useradd -g mysql mysql shell> gunzip < mysql-VERSION.tar.gz | tar -xvf - shell> cd mysql-VERSION shell> ./configure --prefix=/usr/local/mysql shell> make shell> make install shell> scripts/mysql_install_db shell> chown -R root /usr/local/mysql shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysql shell> cp support-files/my-medium.cnf /etc/my.cnf shell> /usr/local/mysql/bin/safe_mysqld --user=mysql & или shell> /usr/local/mysql/bin/mysqld_safe --user=mysql &
если запускается версия MySQL 4.x.
Чтобы обеспечить поддержку таблиц InnoDB, следует отредактировать файл
`/etc/my.cnf', удалив символ #
перед теми параметрами, которые начинаются с
innodb_....
See section 4.1.2 Файлы параметров `my.cnf'. See section 7.5.2 Параметры запуска InnoDB.
Если вы используете исходный код RPM, выполните следующую команду:
shell> rpm --rebuild --clean MySQL-VERSION.src.rpm
Эта команда создаст бинарный код RPM, который вы можете установить.
Новых пользователей можно добавить, используя скрипт
bin/mysql_setpermission
, если установить модули Perl DBI
и
Msql-Mysql-modules
.
Ниже следует более подробное описание установки.
Для установки исходного кода нужно выполнить приведенные ниже действия, а затем перейти к разделу section 2.4 Послеустановочные настройка и тестирование для инициализации и послеустановочной проверки:
VERSION
представляет собой число.
mysqld
следующим образом:
shell> groupadd mysql shell> useradd -g mysql mysqlЭти команды добавляют группу
mysql
и пользователя mysql
. Данный синтаксис
для useradd
и groupadd
в различных версиях Unix может иметь некоторые
отличия. Приведенные выше команды могут также иметь другие названия -
adduser
и addgroup
соответственно. Пользователю и группе можно назначить
какие-нибудь иные, отличные от mysql
имена.
shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -Эта команда создает каталог с именем `mysql-VERSION'.
shell> cd mysql-VERSIONУчтите, что теперь необходимо конфигурировать и компоновать MySQL из этого каталога высшего уровня. Построить MySQL в другом каталоге нельзя.
shell> ./configure --prefix=/usr/local/mysql shell> makeПри запуске configure вам, возможно, понадобится указать некоторые опции. Чтобы получить список опций, запустите
./configure --help
. Некоторые
наиболее полезные опции рассмотрены в разделе See section 2.3.3 Типичные опции configure
.
Если configure
не работает и вы собираетесь посылать письмо с просьбой о
помощи на mysql@lists.mysql.com, то просьба включить в него те строки из
`config.log', которые, по вашему мнению, могут помочь решить данную
проблему. Кроме того, если выполнение configure
преждевременно
прекращается, в письмо следует включить несколько последних строк вывода
из configure
. Для отсылки отчета об ошибке используйте скрипт mysqlbug
(see section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах). Если компиляция не
выполняется, то обращайтесь к разделу See section 2.3.5 Проблемы с компиляцией?, в котором
содержатся рекомендации по решению ряда часто встречающихся проблем.
shell> make installВозможно, необходимо запустить эту команду как
root
.
shell> scripts/mysql_install_dbУчтите, что в версиях MySQL до 3.22.10 работа сервера MySQL начиналась при запуске
mysql_install_db
. Сейчас это не так!
root
и принадлежность каталога
данных, назначив их пользователю, под именем которого будет
запускаться mysqld
. Это делается следующим образом:
shell> chown -R root /usr/local/mysql shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysqlПервая команда изменяет атрибут owner данного файла на пользователя
root
,
вторая - атрибут owner каталога данных на пользователя mysql
, а третья -
атрибут group на группу mysql
.
DBI
/DBD
,
обращайтесь к разделу See section 2.7 Замечания по установке Perl.
После завершения установки данный дистрибутив необходимо проинициализировать и протестировать:
shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &
Если эта команда прекращает работу немедленно после останова демона
mysqld
, то некоторую информацию можно найти в файле
`mysql-data-directory/'hostname'.err'. Причина, возможно, заключается в том,
что уже запущен другой сервер mysqld
(see section 4.1.4 Запуск нескольких серверов MySQL на одном компьютере).
Теперь приступайте к разделу See section 2.4 Послеустановочные настройка и тестирование.
Патчи иногда присутствуют в списке рассылки или помещаются в папке патчей на веб-сайте MySQL (http://www.mysql.com/downloads/patches.html).
Для применения патча из списка рассылки сохраните сообщение, содержащее патч, в файле, поместите его в каталог высшего уровня, в котором находится дерево исходных кодов MySQL, и запустите следующие команды:
shell> patch -p1 < patch-file-name shell> rm config.cache shell> make clean
Патчи с FTP-сайта распространяются как файлы с простым текстом или как
файлы, сжатые с помощью gzip
. Патч в виде простого текста следует
применять, как показано выше для патчей из списка рассылки. Чтобы
применить сжатый патч, поместите его в каталог высшего уровня, в котором
находится дерево исходных кодов MySQL, и запустите следующие команды:
shell> gunzip < patch-file-name.gz | patch -p1 shell> rm config.cache shell> make clean
После применения патча следуйте инструкциям для обычной установки
исходного кода, начиная с этапа ./configure
. После запуска этапа make
install
перезапустите свой сервер MySQL.
Возможно, перед запуском make install
потребуется остановить любые
запущенные в это время серверы (используйте для этого mysqladmin
shutdown
). В некоторых системы не разрешается устанавливать новую версию
какой-либо программы, если она замещает запущенную в данное время версию.
configure
Скрипт configure
обеспечивает широкие возможности управления конфигурацией
дистрибутива MySQL. Обычно такое управление осуществляется путем
использования опций в командной строке configure
. На работу configure
можно также воздействовать при помощи соответствующих переменных окружения
(see section F Переменные окружения). Чтобы получить список поддерживаемых
configure опций, запустите следующую команду:
shell> ./configure --help
Ниже описаны некоторые из наиболее часто используемых опций configure
:
--without-server
:
shell> ./configure --without-serverПри отсутствии компилятора C++ не будет компилироваться
mysql
(именно для
данной клиентской программы требуется C++). В этом случае можно удалить из
configure код, который проверяет наличие компилятора C++, а затем
запустить ./configure
с опцией --without-server
. На этапе компиляции и
после этого будет предпринята попытка скомпилировать mysql
, но любые
предупреждения насчет `mysql.cc' можно игнорировать (если make
остановится,
попробуйте запустить make -k
- чтобы компиляция остального кода
продолжалась даже в случае возникновения ошибок).
--with-embedded-server
.
configure
наподобие одной из приведенных ниже:
shell> ./configure --prefix=/usr/local/mysql shell> ./configure --prefix=/usr/local \ --localstatedir=/usr/local/mysql/dataПервая команда изменяет установочный префикс, в результате чего весь код будет установлен в каталоге `/usr/local/mysql' вместо принятого по умолчанию `/usr/local'. Вторая команда сохраняет принятый по умолчанию установочный префикс, но переопределяет принятое по умолчанию местоположение каталогов базы данных (обычно `/usr/local/var') и изменяет его на `/usr/local/mysql/data'. После завершения компиляции MySQL эти опции можно изменить с помощью файлов опций (see section 4.1.2 Файлы параметров `my.cnf')
shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sockСледует учитывать, что данный файл должен представлять собой полный путь к каталогу! Позже местоположение mysql.sock можно также изменить, используя файлы опций MySQL (see section A.4.5 Как защитить или изменить сокет-файл MySQL `/tmp/mysql.sock').
configure
так, как показано ниже:
shell> ./configure --with-client-ldflags=-all-static \ --with-mysqld-ldflags=-all-static
gcc
без установленной библиотеки libg++
или
libstdc++
можно предписать configure
в качестве компилятора C++
использовать gcc
:
shell> CC=gcc CXX=gcc ./configureЕсли
gcc
используется как компилятор C++, то он не будет пробовать
линковаться с libg++
или libstdc++
. Это может оказаться полезным даже если
такие библиотеки установлены, поскольку при использовании некоторых версий
вышеназванных библиотек в прошлом у пользователей MySQL возникали
непонятные проблемы.
Ниже приводятся установки некоторых общих
переменных окружения в зависимости от используемого компилятора:
Компилятор | Рекомендуемые опции |
gcc 2.7.2.1 | CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" |
egcs 1.0.3a | CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" |
gcc 2.95.2 | CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro \ -felide-constructors -fno-exceptions -fno-rtti" |
pgcc 2.90.29 or newer | CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc \ CXXFLAGS="-O3 -mpentiumpro -mstack-align-double -felide-constructors \ -fno-exceptions -fno-rtti" |
--prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-staticДругими словами, полная строка конфигурации для всех последних версий gcc должна быть подобна приведенной ниже:
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro \ -felide-constructors -fno-exceptions -fno-rtti" ./configure \ --prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-staticВсе бинарные коды, которые мы поставляем с веб-сайта MySQL на http://www.mysql.com/, компилируются с максимальной оптимизацией и должны быть идеальными для большинства пользователей (see section 2.2.9 Бинарные коды MySQL, скомпилированные в MySQL AB). Существуют некоторые настройки, позволяющие сделать бинарный код даже еще быстрее, но их могут выполнять только опытные пользователи (see section 5.5.3 Как компиляция и линкование влияет на скорость MySQL). Если создать код не удается и при этом выдаются ошибки с указанием на компилятор или если компоновщик не в состоянии создать совместную библиотеку `libmysqlclient.so.#' (`#' представляет собой номер версии), то эту проблему можно обойти путем добавления к
configure
опции
--disable-shared
. В этом случае configure
не будет создавать совместную
библиотеку `libmysqlclient.so.#'.
DEFAULT
на столбцах не-NULL
(т.е. на столбцах, которые не
могут принимать значение NULL
). При указании этой опции команды INSERT
будут генерировать ошибку в случае, если явно не указаны величины для
всех столбцов, которые не могут принимать значение NULL
. Чтобы
запретить использование величин по умолчанию, запустите configure
, как
показано ниже:
shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure
--with-charset
:
shell> ./configure --with-charset=CHARSET
CHARSET
может принимать одно из следующих значений: big5
, cp1251
,
cp1257
, czech
, danish
, dec8
, dos
, euc_kr
, gb2312
, gbk
, german1
, hebrew
,
hp8
, hungarian
, koi8_ru
, koi8_ukr
, latin1
, latin2
, sjis
, swe7
, tis620
,
ujis
, usa7
или win1251ukr
(see section 4.6.1 Набор символов, применяющийся для записи данных и сортировки). Если требуется преобразовывать символы между сервером и
клиентом, следует рассмотреть команду SET CHARACTER SET
(see section 5.5.6 Синтаксис команды SET
).
Предупреждение: если набор символов изменяется после создания
таблиц, необходимо запустить myisamchk -r -q --set-characted-set=charset
на каждой таблице. В
противном случае индексы могут сортироваться неправильно (такое может
случиться, если вы установите MySQL, создадите ряд таблиц, затем
переконфигурируете MySQL с целью использования другого набора символов и
заново установите MySQL).
С помощью опции --with-extra-charsets=LIST
можно
определить, какие дополнительные кодировки необходимо скомпилировать в
данном сервере.
Здесь LIST
либо представляет собой разделенный пробелами
список кодировок, либо имеет значение complex
для включения всех символов,
которые не могут быть загружены динамически, либо имеет значение all
для
включения всех кодировок в бинарники.
--with-debug
:
shell> ./configure --with-debugЗадание этой опции вызывает подключение надежного распределителя памяти, который может найти некоторые ошибки и обеспечить вывод информации о том, что происходит (see section E.1 Отладка сервера MySQL).
--enable-thread-safe-client
. При указании
этой опции будет создана библиотека libmysqlclient_r
, с которой
следует линковать потоковые приложения (see section 8.4.8 Как создать клиентскую программу с потоками).
Предупреждение: этот раздел необходимо читать только в том случае, если вы хотите помочь нам в тестировании нового кода. Пользователи, которые просто хотят установить MySQL и запустить его на своей системе, должны использовать стандартную версию дистрибутива (либо исходный код, либо бинарный дистрибутив).
Чтобы получить самый последний из разработанных наборов исходных кодов, используйте следующие инструкции:
BitKeeper
с
http://www.bitmover.com/cgi-bin/download.cgi. Для доступа к нашему
хранилищу вам понадобится версия Bitkeeper
3.0 или более новая.
BitKeeper
сначала перейдите в каталог, из которого
собираетесь работать, затем используйте одну из приведенных ниже команд,
для получения желаемой копии ветви MySQL.
Чтобы клонировать ветку 3.23:
shell> bk clone bk://mysql.bkbits.net/mysql-3.23 mysql-3.23Чтобы клонировать ветку 4.0:
shell> bk clone bk://mysql.bkbits.net/mysql-4.0 mysql-4.0Чтобы клонировать ветку 4.1:
shell> bk clone bk://mysql.bkbits.net/mysql-4.1 mysql-4.1В предыдущих примерах набор исходных кодов будет установлен в подкаталогах `mysql-3-23/', `mysql-4.0/' или `mysql-4.1/' вашего текущего каталога. Если вы находитесь за брендмауером, и можете только делать HTTP-запросы, вы можете также использовать BitKeeper по HTTP. Если вы используете прокси-сервер, просто установите переменную окружения
http_proxy
:
shell> export http_proxy="http://your.proxy.server:8080/"И теперь просто замените
bk://
на http://
когда будете делать клонирование. Например:
shell> bk clone http://mysql.bkbits.net/mysql-4.1 mysql-4.1Первоначальная загрузка набора исходных кодов может потребовать времени в зависимости от скорости вашего соединения; будьте терпеливы.
make
, autoconf 2.53
(или новее), automake 1.5
,
libtool 1.4
и m4
. Программа automake 1.7
(или новее) еще
не работает.
Если вы хотите настроить MySQL 4.1, вам также потребуется bison 1.75
.
Более старые версии bison
могут давать такую ошибку:
sql_yacc.yy:#####: fatal error: maximum table size (32767) exceeded
. На
самом деле максимальный размер таблиц не превышается, как утверждает это
сообщение, но просто-напросто такое сообщение есть следствие ошибки в более
ранних версиях bison
.
Типичные команды к выполнению в оболочке:
cd mysql-4.0 bk -r get -Sq aclocal; autoheader; autoconf; automake (cd innobase ; aclocal; autoheader; autoconf; automake) # для InnoDB (cd bdb/dist ; sh s_all ) # для Berkeley DB ./configure # Ваши любимые опции здесь makeЕсли вы получаете некие странные сообщения на этом этапе - удостоверьтесь, что у вас действительно стоит
libtool
!
Собрание наших стандартных конфигурационных скриптов находится в
подкаталоге `BUILD/'. Если вы предпочитаете наиболее легкий путь, можно
использовать скрипт `BUILD/compile-pentium-debug'. При компилировании с
использованием другой архитектуры модифицируйте этот скрипт путем удаления
флагов, относящихся к Pentium.
make install
. Следует проявлять
осторожность при работе на машине, находящейся в эксплуатации; данная
команда может выполнить установку поверх вашей существующей
установленной версии. Если у вас уже установлена иная версия MySQL, мы
рекомендуем запускать ./configure
со значениями для опций prefix
,
with-tcp-port
и unix-socket-path
, отличными от тех, что были
использованы для сервера, находящегося в эксплуатации.
make test
(see section 9.1.2 Пакет тестирования MySQL).
make
и дистрибутив не будет
компилироваться, просьба сообщить нам об этом по адресу
bugs@lists.mysql.com. Просьба информировать нас и в том случае, если
вы установили последнюю версию требуемых инструментальных средств GNU
и они терпят крах при попытке обработать наш конфигурационный файл.
Однако если при выполнении aclocal
вы получите ошибку command not
found
или возникнет аналогичная проблема, об этом сообщать не надо. В
таком случае следует убедиться, что у вас установлены все необходимые
инструментальные программы и что ваша переменная PATH
указана
правильно, чтобы оболочка могла найти их.
bk clone
, необходимо периодически запускать bk pull
для получения
обновлений.
bk
sccstool
. При обнаружении каких-либо отличий, которые покажутся вам
странными, или кода, по которому возникают вопросы, не раздумывайте -
посылайте письмо на internals@lists.mysql.com. Кроме того, если вы
считаете, что у вас есть лучшие идеи по разработке, отправьте по тому
же адресу сообщение со своим патчем. bk diffs
создает патч после
внесения изменений в исходный код. Если у вас нет времени написать
код, реализующий вашу идею, просто пришлите ее описание.
bk helptool
.
bk ci
или bk citool
) инициирует постинг
сообщения с изменениями в наш внутренний список рассылки (internals).
В общем случае, вам не нужно использовать commit (поскольку публично-доступное
дерево не допустит bk push
), но скорее, метод bk diffs
, описанный ранее.
Вы также можете просматривать изменения, комментарии и исходный код в онлайн, например, по адресу http://mysql.bkbits.net:8080/mysql-4.1 для MySQL 4.1.
Руководство находится в отдельном дереве, которое можно клонировать так:
shell> bk clone bk://mysql.bkbits.net/mysqldoc mysqldoc
На Solaris или Linux с использованием компилятора gcc
все программы MySQL у нас
компилируются чисто и без каких-либо предупреждений. В других системах
могут возникать предупреждения из-за различий включаемых системных файлов
(по поводу предупреждений, которые могут возникать при использовании
потоков MIT-pthreads
, обращайтесь к разделу see section 2.3.6 Замечания по потокам MIT-pthreads).
Относительно других проблем сверьтесь с приведенным ниже списком.
Решение многих проблем предполагает выполнение переконфигурирования. В случаях, когда переконфигурирование действительно необходимо, следует учитывать следующее:
configure
запускается после того, как эта команда уже
запускалась, то можно использовать информацию, которая была собрана во
время предыдущего вызова команды (такая информация хранится в
`config.cache'). При запуске configure
ищет данный файл и, если он
существует, читает его содержимое, исходя из предположения, что данная
информация все еще правильна. При выполнении переконфигурации это
предположение является некорректным.
configure
необходимо опять запускать make
для
перекомпилирования. Однако, возможно, вначале вам потребуется удалить
старые объектные файлы из предыдущих компоновок, поскольку они были
скомпилированы с использованием других опций конфигурации.
Чтобы не допустить использования старой конфигурационной информации или
объектных файлов, перед перезапуском configure
запустите следующие
команды:
shell> rm config.cache shell> make cleanВ качестве альтернативного варианта можно использовать команду
make
distclean
.
В следующем списке представлены некоторые проблемы компилирования MySQL,
которые, как оказалось, возникают наиболее часто:
Internal compiler error: program cc1plus got fatal signal 11 или Out of virtual memory или Virtual memory exhaustedПроблема заключается в том, что для компиляции `sql_yacc.cc' со встраиваемыми функциями компилятору
gcc
требуется значительное количество
памяти. Попробуйте произвести запуск configure
с опцией --with-low-memory
:
shell> ./configure --with-low-memoryДанная опция вызывает добавление
-fno-inline
к компилируемой строке для
gcc
и -O0
- при использовании какого-либо другого компилятора. Даже если у
вас столько памяти и пространства для свопинга, что, по вашему мнению,
невозможно выйти за их пределы, все же стоит попытаться использовать опцию
with-low-memory
. Эта проблема, по нашим наблюдениям, возникала даже на
системах с аппаратными реализациями, обладающими широкими возможностями;
обычно она устраняется с помощью опции --with-low-memory
.
configure
выбирает c++ как имя компилятора и GNU c++
линкуется с -lg++
. При использовании gcc
этот режим работы может
вызывать такие проблемы в процессе конфигурации, как:
configure: error: installation or configuration problem: C++ compiler cannot create executables.Во время компиляции могут также возникать проблемы, относящиеся к
g++
,
libg++
или libstdc++
. Одна из причин их возникновения заключается в том,
что, возможно, у вас нет g++
или есть g++
, но нет библиотеки libg++
или
libstdc++
. Следует изучить файл `config.log' - по нему вы должны точно
определить причину, по которой не работал компилятор c++ ! Чтобы обойти
эти проблемы, можно в качестве компилятора C++ использовать gcc.
Попробуйте установить переменную окружения CXX
в gcc -O3
. Например:
shell> CXX="gcc -O3" ./configureЭта команда работает, поскольку gcc компилирует исходные коды C++ так же хорошо, как и
g++
, но по умолчанию не линкует libg++
или libstdc++
.
Есть, конечно, и другая возможность устранения этих проблем, которая
заключается в установке g++
, libg++
и libstdc++
. Однако мы не
рекомендовали бы использовать libg++
или libstdc++
с MySQL, поскольку это
только увеличит размер бинарного кода mysqld
без предоставления каких-либо
преимуществ. Некоторые версии этих библиотек в прошлом также вызывали
непонятные проблемы у пользователей MySQL.
make
до GNU make
:
making all in mit-pthreads make: Fatal error in reader: Makefile, line 18: Badly formed macro assignment или make: file `Makefile' line 18: Must be a separator (: или pthread.h: No such file or directoryОперационные системы Solaris и FreeBSD, как известно, имеют ненадежные программы
make
.
Известно также, что версия GNU make
3.75 работает.
CFLAGS
и
CXXFLAGS
. Точно так же можно также указать имена компиляторов,
используя CC
и CXX
. Например:
shell> CC=gcc shell> CFLAGS=-O3 shell> CXX=gcc shell> CXXFLAGS=-O3 shell> export CC CFLAGS CXX CXXFLAGSВ разделе section 2.2.9 Бинарные коды MySQL, скомпилированные в MySQL AB приведен список полезных для различных систем определений флагов.
gcc
:
client/libmysql.c:273: parse error before `__attribute__'Компилятор
gcc
2.8.1 известен как работающий, но мы рекомендуем вместо
него использовать gcc
2.95.2 или egcs
1.0.3a.
mysqld
вы получаете ошибки, подобные приведенным
ниже, то это означает, что команда configure
некорректно определила
тип последнего аргумента в функциях accept()
, getsockname()
или
getpeername()
:
cxx: Error: mysqld.cc, line 645: In this statement, the referenced type of the pointer value "&length" is "unsigned long", which is not compatible with "int". new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);Чтобы устранить эту ошибку, отредактируйте файл `config.h' (который генерируется
configure
). Найдите в нем следующие строки:
/* Define as the base type of the last arg to accept */ #define SOCKET_SIZE_TYPE XXXи измените
XXX
на size_t
или int
- в зависимости от своей операционной
системы (учтите, что эти действия необходимо будет повторять каждый раз
при запуске configure
, поскольку configure восстанавливает файл
`config.h').
"sql_yacc.yy", line xxx fatal: default action causes potential...Это признак того, что ваша версия
yacc
является неполной. Возможно,
следует установить bison
(GNU-версия yacc) и использовать вместо yacc
.
mysqld
или клиента MySQL запустите configure
с опцией --with-debug
, затем перекомпилируйте и слинкуйте эти
программы с новой клиентской библиотекой (see section E.2 Отладка клиента MySQL).
В этом разделе описываются некоторые аспекты использования потоков MIT-pthreads.
Следует иметь в виду, что под Linux использовать потоки MIT-pthreads нельзя, для этого необходимо установить LinuxThreads! See section 2.6.1 Примечания к Linux (Все версии Linux).
Если ваша система сама по себе не обеспечивает поддержку потоков, то необходимо скомпоновать MySQL, используя пакет поддержки MIT-pthreads. К таким системам относятся старые системы FreeBSD, SunOS 4.x, Solaris 2.4 и более ранние, а также некоторые другие (see section 2.2.5 Операционные системы, поддерживаемые MySQL).
Заметьте, с версии MySQL 4.0.2 потоки MIT более не присутствуют в поставке исходных текстов. Если вам действительно нужен этот пакет, вы можете его забрать с http://www.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz
После загрузки, распакуйте этот архив в каталог исходных текстов MySQL.
Создастся новый каталог mit-pthreads
.
configure
с опцией --with-mit-threads
:
shell> ./configure --with-mit-threadsПри использовании потоков MIT-pthreads не поддерживается возможность сборки MySQL в каталоге, не содержащем исходный код, поскольку мы хотим минимизировать наши изменения в данном коде.
--without-server
для сборки только клиентского кода,
то клиенты не будут знать, применяются ли потоки MIT-pthreads, и будут
использовать подключения через сокеты Unix по умолчанию. Поскольку сокеты Unix
не работают с потоками MIT-pthreads на некоторых платформах, то при запуске
клиентских программ следует использовать -h
или --host
.
--use-external-locking
. Это только
необходимо если вы собираетесь использовать два MySQL-сервера на одних
и тех же файлах данных (не рекомендуется!).
bind()
не удается подсоединить сокет без
какого-либо сообщения об ошибке (по крайней мере, под Solaris). В
результате все подключения к серверу обрываются. Например:
shell> mysqladmin version mysqladmin: connect to server at '' failed; error: 'Can't connect to mysql server on localhost (146)'Для решения этой проблемы следует завершить выполнение сервера
mysqld
и
перезапустить его. У нас это происходило только в тех случаях, когда мы
прерывали работу сервера и сразу же снова его запускали.
sleep()
не прерывается с помощью SIGINT
(break
). Это заметно только в том
случае, если запускать mysqladmin --sleep
. Следует ждать окончания
работы sleep()
, прежде чем прерывание будет обслужено и процесс
завершит работу.
ld: warning: symbol `_iob' has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file /usr/lib/libc.so value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken ld: warning: symbol `__iob' has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file /usr/lib/libc.so value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
implicit declaration of function `int strtoll(...)' implicit declaration of function `int strtoul(...)'
readline
с потоками
MIT-pthreads (это не является необходимым, но для кого-то может
представлять интерес).
Вам потребуются следующие средства:
Сборка MySQL
workdir
).
File
выберите Open Workspace
.
mysql.dsw
, находящуюся в рабочем каталоге.
Build
выберите подменю Set Active Configuration
.
mysqld
- Win32 Debug
и нажмите OK
.
F7
, чтобы начать процесс построения отладочных версий
сервера, библиотек и некоторых клиентских приложений.
workdir
скопируйте в каталог `c:\mysql' следующие
подкаталоги:
После установки MySQL (из бинарного дистрибутива или исходного кода) необходимо проинициализировать таблицы привилегий, запустить сервер и убедиться, что сервер работает нормально. Можно также организовать автоматический запуск и остановку сервера, когда операционная система соответственно начинает и прекращает работу.
Обычно при установке из исходного кода для установки таблиц привилегий и запуска сервера нужно выполнить следующие команды:
shell> ./scripts/mysql_install_db shell> cd mysql_installation_directory shell> ./bin/safe_mysqld --user=mysql &
Для бинарного дистрибутива (но не для пакетов RPM или pkg) сделайте так:
shell> cd mysql_installation_directory shell> ./scripts/mysql_install_db shell> ./bin/safe_mysqld --user=mysql &
или
shell> ./bin/mysqld_safe --user=mysql &
Если вы используете MySQL 4.x.
Эти операции создают базу данных mysql
, которая будет поддерживать все
привилегии доступа к базе данных, базу данных test
, которую можно
использовать для тестирования MySQL, а также записи привилегий для
пользователя, который запускает mysql_install_db
и для пользователя root
(без каких-либо паролей). При этом также запускается сервер mysqld
.
mysql_install_db
не перезаписывает старые таблицы привилегий, так что ее
запуск будет безопасным в любом случае. Если вам не нужна база данных
test
, ее можно удалить с помощью mysqladmin -u root drop test
.
Тестирование проще всего выполнить из каталога наивысшего уровня дистрибутива MySQL. Для бинарного дистрибутива таковым является ваш каталог инсталляции (обычно что-нибудь вроде `/usr/local/mysql'). Для дистрибутива в виде исходного кода это - главный каталог вашего набора исходных кодов MySQL.
В командах, представленных в настоящем разделе и последующих подразделах,
BINDIR
представляет собой путь к тому местоположению, где устанавливаются
программы вроде mysqladmin
и safe_mysqld
. Для бинарного дистрибутива это
каталог `bin' внутри дистрибутива. Для дистрибутива в виде исходного кода
BINDIR
может представлять собой `/usr/local/bin', если при запуске
configure
не указан иной, чем `/usr/local' инсталляционный каталог.
EXECDIR
- место, где устанавливается сервер mysqld
. Для бинарного
дистрибутива это то же самое, что и BINDIR
. Для дистрибутива в виде
исходного кода EXECDIR
может представлять собой `/usr/local/libexec'.
Подробное описание тестирования:
mysqld
и установите исходные
таблицы привилегий MySQL, содержащие те привилегии, которые
определяют, каким способом пользователям разрешено подключаться к
серверу. Обычно это делается с помощью скрипта mysql_install_db
:
shell> scripts/mysql_install_dbКак правило,
mysql_install_db
требует запуска только первый раз при
установке MySQL. Таким образом, если производится модернизация
существующей установки, то данный этап можно пропустить (однако скрипт
mysql_install_db
совершенно безопасен для использования и не обновляет
никаких уже существующих таблицы; поэтому если у вас нет уверенности в
том, как поступать, то всегда можно запустить mysql_install_db
). Скрипт
mysql_install_db
создает шесть таблиц (user
, db
, host
, tables_priv
,
columns_priv
, and func
) в базе данных mysql
. Описание исходных привилегий
дается в разделе See section 4.3.4 Задание изначальных привилегий MySQL. Если в двух
словах, то эти привилегии позволяют пользователю root MySQL делать все,
что угодно, и любому пользователю позволяют создавать или использовать
базы данных с именем test
или начинающимся с test_
. Если таблицы
привилегий не установлены, то в системном журнале при запуске сервера
появится следующая ошибка:
mysqld: Can't find file: 'host.frm'Такая ошибка может появиться и в случае бинарного дистрибутива MySQL, если вы не начали работу MySQL с точного выполнения команды `./bin/safe_mysqld'! See section 4.7.2
safe_mysqld
, оболочка mysqld
.
Возможно, вам потребуется запускать mysql_install_db
как root
. Однако при
желании вы можете запускать сервер MySQL как непривилегированный (не-root
)
пользователь, при условии, что этот пользователь может только читать файлы
из каталога базы данных и записывать в него файлы. Инструкции по запуску
MySQL в качестве непривилегированного пользователя даются в разделе See section A.3.2 Запуск MySQL от обычного пользователем. Если возникнут проблемы с
mysql_install_db
, обращайтесь к разделу See section 2.4.1 Проблемы при запуске mysql_install_db
. Дистрибутив MySQL обеспечивает несколько вариантов
запуска скрипта mysql_install_db
:
mysql_install_db
перед запуском. Это полезно, если нужно установить
MySQL на нескольких машинах с одними и теми же привилегиями. В
таком случае вам, возможно, потребуется только добавить несколько
дополнительных команд INSERT
к таблицам mysql.user
и mysql.db
!
mysql_install_db
, затем использовать
mysql -u root mysql
для доступа к таблицам привилегий как
пользователь MySQL с привилегиями root
и применять команды SQL для
модификации таблиц привилегий напрямую.
mysql_install_db
.
shell> cd mysql_installation_directory shell> bin/safe_mysqld &Если возникнут проблемы с запуском сервера, See section 2.4.2 Проблемы при запуске сервера MySQL.
mysqladmin
для проверки, что сервер работает. Простую
проверку того, что сервер функционирует и отвечает на подключения,
обеспечивают следующие команды:
shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variablesВывод из
mysqladmin version
будет иметь небольшие различия в зависимости
от используемой платформы и версии MySQL, но должен быть похож на
приведенный ниже:
shell> BINDIR/mysqladmin version mysqladmin Ver 8.14 Distrib 3.23.32, for linux on i586 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license. Server version 3.23.32-debug Protocol version 10 Connection Localhost via Unix socket TCP port 3306 UNIX socket /tmp/mysql.sock Uptime: 16 sec Threads: 1 Questions: 9 Slow queries: 0 Opens: 7 Flush tables: 2 Open tables: 0 Queries per second avg: 0.000 Memory in use: 132K Max memory used: 16773KЧтобы получить представление о том, что еще можно делать с помощью
BINDIR/mysqladmin
, запустите эту команду с опцией --help
.
shell> BINDIR/mysqladmin -u root shutdown
safe_mysqld
или путем прямого вызова mysqld
. Например:
shell> BINDIR/safe_mysqld --log &Если
safe_mysqld
терпит неудачу, попытайтесь запустить команду из каталога
установки MySQL (если вы уже не там). Если команда по-прежнему не
работает, см. раздел See section 2.4.2 Проблемы при запуске сервера MySQL.
shell> BINDIR/mysqlshow +-----------+ | Databases | +-----------+ | mysql | +-----------+ shell> BINDIR/mysqlshow mysql Database: mysql +--------------+ | Tables | +--------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +--------------+ shell> BINDIR/mysql -e "SELECT host,db,user FROM db" mysql +------+--------+------+ | host | db | user | +------+--------+------+ | % | test | | | % | test_% | | +------+--------+------+В подкаталоге `sql-bench' каталога установки MySQL находится набор тестов производительности, который можно использовать для сравнения работы MySQL на различных платформах. Каталог `sql-bench/Results' содержит результаты большого количества запусков для различных баз данных и платформ. Чтобы запустить все тесты, выполните следующие команды:
shell> cd sql-bench shell> run-all-testsЕсли у вас отсутствует каталог `sql-bench', то, вероятно, вы работаете с пакетом RPM для бинарного дистрибутива (в пакеты RPM с дистрибутивами исходного кода включается каталог тестов производительности). В этом случае прежде чем использовать набор тестов производительности, необходимо его установить. Начиная с версии MySQL 3.22, существуют RPM-файлы тестов производительности, `mysql-bench-VERSION-i386.rpm', которые содержат код тестов производительности и данные. Имея дистрибутив исходного кода, можно также запустить эти тесты в подкаталоге `tests'. Например, чтобы запустить `auto_increment.tst', сделайте следующее:
shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tstРезультаты будут выводиться в файл `./tests/auto_increment.res'.
mysql_install_db
Скрипт mysql_install_db
предназначен только для создания новых таблиц
привилегий MySQL. Он не влияет ни на какие другие данные! А если таблицы
привилегий MySQL уже установлены, этот скрипт ничего не будет делать!
Для того чтобы создать таблицы привилегий заново, необходимо остановить
сервер mysqld
, если он работает, и затем выполнить что-нибудь вроде:
mv mysql-data-directory/mysql mysql-data-directory/mysql-old mysql_install_db
В этом разделе перечислены проблемы, с которыми можно столкнуться при
запуске mysql_install_db
:
mysql_install_db
не устанавливает таблицы привилегий
mysql_install_db
не в состоянии установить таблицы
привилегий и заканчивает свою работу после вывода следующих сообщений:
starting mysqld daemon with databases from XXXXXX mysql daemon endedВ таком случае необходимо очень тщательно изучить системный журнал! Этот журнал должен находиться в каталоге `XXXXXX', указанном в данном сообщении об ошибке. В нем содержится информация о том, почему не запустился
mysqld
.
Если вам не удалось разобраться в том, что произошло, при посылке отчета
об ошибке включите в него данный журнал, используя mysqlbug
! См.раздел
See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах.
mysqld
mysql_install_db
. Скрипт
mysql_install_db
должен запускаться только однажды при установке MySQL
первый раз.
mysqld
установка второго демона не работает
Can't start
server: Bind on TCP/IP port: Address already in use
или Can't start server:
Bind on unix socket...
. See section 4.1.3 Установка нескольких серверов на один компьютер.
mysql_install_db
или при
запуске или использовании mysqld
. Необходимо указать другой каталог для
сокета и временных файлов следующим образом:
shell> TMPDIR=/some_tmp_dir/ shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysqld.sock shell> export TMPDIR MYSQL_UNIX_PORTSee section A.4.5 Как защитить или изменить сокет-файл MySQL `/tmp/mysql.sock'. Путь `some_tmp_dir' должен указывать на некоторый каталог, для которого у вас есть доступ для записи. See section F Переменные окружения. После этого у вас должна появиться возможность запустить
mysql_install_db
и начать работу сервера с помощью следующих
команд:
shell> scripts/mysql_install_db shell> BINDIR/safe_mysqld &
mysqld
glibc
более старой, чем
2.0.7-5, следует позаботиться о том, чтобы установить все патчи для glibc
!
В архивах рассылки MySQL имеется большое количество писем об этом. Ссылки
на архивы писем доступны в онлайновом режиме на http://lists.mysql.com/.
Обращайтесь также к разделу See section 2.6.1 Примечания к Linux (Все версии Linux). Можно
также запустить mysqld
вручную, используя опцию --skip-grant-tables
, и
самостоятельно добавить информацию о привилегиях, при помощи mysql
:
shell> BINDIR/safe_mysqld --skip-grant-tables & shell> BINDIR/mysql -u root mysqlИз
mysql
в ручном режиме выполните команды SQL в mysql_install_db
.
Удостоверьтесь, что после этого вы запустили mysqladmin flush-privileges
или mysqladmin reload
, чтобы сервер перегрузил таблицы привилегий.
Если вы собираетесь использовать таблицы, поддерживающие транзакции (InnoDB, BDB), следует прежде всего создать файл `my.cnf' и установить опции запуска для тех типов таблиц, с которыми планируется работать. See section 7 Типы таблиц MySQL.
В общем случае сервер mysqld
запускается одним из следующих способов:
mysql.server
. Этот скрипт используется преимущественно для
запуска и останова системы. Более подробно он описан в разделе
See section 2.4.3 Автоматический запуск и остановка MySQL.
safe_mysqld
, которая определяет соответствующие опции
для mysqld
и затем запускает mysqld
с этими опциями.
See section 4.7.2 safe_mysqld
, оболочка mysqld
.
mysqld
напрямую.
При своем запуске демон mysqld
изменяет свой каталог на каталог данных
(datadir
). В нем он ожидает найти журнальные файлы, файлы pid (ID
процессов) и собственно базы данных.
Местоположение каталога данных жестко устанавливается при компиляции
дистрибутива. Однако если mysqld
ожидает найти каталог данных где-либо в
другом месте, а не там, где он действительно расположен в вашей системе,
то демон mysqld
не будет работать правильно. Если есть проблемы с
неправильными путями, то, вызывая mysqld
с опцией --help
, вы можете найти
информацию о том, что разрешают опции mysqld
и какие установки путей
приняты по умолчанию. Можно переопределить установки по умолчанию
указанием правильных имен путей как аргументов mysqld
в командной строке
(эти опции также можно использовать с safe_mysqld
).
Обычно требуется указывать mysqld
только каталог, в котором
устанавливается MySQL. Это можно сделать с помощью опции --basedir
. Можно
также использовать --help
для проверки эффекта от изменения опций путей
(учтите, что --help
должна быть последней опцией в команде mysqld
).
Например:
shell> EXECDIR/mysqld --basedir=/usr/local --help
После определения требуемых установок путей запускайте сервер без опции
--help
.
Какой бы метод вы ни использовали для запуска сервера, если его неудачный
запуск завершается корректно, то проверьте журнальный файл, чтобы узнать,
почему запуск происходит неудачно. Журнальные файлы находятся в каталоге
данных (обычно `/usr/local/mysql/data' для бинарного дистрибутива,
`/usr/local/var' для дистрибутива исходного кода и `\mysql\data\mysql.err'
под Windows). В каталоге данных следует искать файлы с именами в виде
`host_name.err' и `host_name.log', где host_name
- имя вашего серверного
хоста. Затем проверьте последние несколько строк этих файлов:
shell> tail host_name.err shell> tail host_name.log
В журнальном файле нужно искать что-нибудь похожее на следующее:
000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed 000729 14:50:10 bdb: warning: ./test/t1.db: No such file or directory 000729 14:50:10 Can't init databases
Это означает, что вы не запустили mysqld
с --bdb-no-recover
и база данных
Berkeley DB нашла что-то ошибочное в своих журнальных файлах при попытке
восстановить ваши базы данных. Чтобы иметь возможность продолжить,
необходимо переместить старый журнальный файл Berkeley DB из каталога баз
данных в некоторое другое место, где позже можно будет изучить его.
Журнальные файлы имеют имена `log.0000000001' и т.д.; номер возрастает
при каждом запуске.
Если вы запускаете mysqld
работает с поддержкой таблиц BDB и mysqld
при
старте выводит дамп оперативной памяти (coredump), то причиной этого это
могут быть какие-либо проблемы с журналом восстановления BDB. В этом
случае можно попробовать запуск mysqld с --bdb-no-recover
. Если это
помогает, то следует удалить все файлы `log.*' из каталога данных и
попробовать запустить mysqld
опять.
Если выдается приведенная ниже ошибка, то это означает, что некоторая
другая программа (или другой сервер mysqld
) уже использует данный TCP/IP
порт или сокет, на которых mysqld
пытается слушать:
Can't start server: Bind on TCP/IP port: Address already in use или Can't start server : Bind on unix socket...
Чтобы убедиться, что другого работающего сервера mysqld
нет, используйте
ps
. Если другой работающий сервер не найден, то можно попробовать
выполнить команду telnet your-host-name tcp-ip-port-number
и нажать пару
раз клавишу ``Enter''. Если вы не получаете сообщения об ошибке вроде
следующего telnet: Unable to connect to remote host: Connection refused
,
значит, что порт TCP/IP порт, который mysqld
пытается использовать, уже
занят другой программой. section 2.4.1 Проблемы при запуске mysql_install_db
и
раздел See section 4.1.4 Запуск нескольких серверов MySQL на одном компьютере.
Если mysqld
в настоящее время работает, то можно найти используемые им
установки путей при помощи следующей команды:
shell> mysqladmin variables или shell> mysqladmin -h 'your-host-name' variables
Если при запуске mysqld
вы получили ошибку Errcode 13
, что значит
Permission denied
, это означает, что у вас не было прав читать/создавать
файлы в базе данных MySQL или в журнальном каталоге. В таком случае вам
следует либо запускать mysqld
как пользователь root
, либо изменить права
доступа к упомянутым файлам и каталогам, чтобы иметь права использовать
их.
Если safe_mysqld
запускает сервер, но вы не можете подключиться к нему, то
следует убедиться, что в `/etc/hosts' есть запись, которая выглядит
примерно так:
127.0.0.1 localhost
Эта проблема возникает только в системах, не имеющих рабочей библиотеки потоков, и для которых MySQL следует конфигурировать для использования потоков MIT-pthreads.
Если вы не можете запустить mysqld
, то можно попробовать создать
трассировочный файл, чтобы обнаружить данную проблему.
See section E.1.2 Создание трассировочных файлов.
При использовании таблиц InnoDB следует указывать опции запуска, специфические для InnoDB. See section 7.5.2 Параметры запуска InnoDB.
При использовании таблиц BDB (Berkeley DB) необходимо хорошо знать различные специфические для BDB опции запуска. See section 7.6.3 Параметры запуска BDB.
Скрипты mysql.server
и safe_mysqld
могут применяться для автоматического
запуска сервера во время загрузки операционной системы. Скрипт
mysql.server
можно также использовать для остановки сервера.
Чтобы применять скрипт mysql.server
для запуска или остановки сервера, его
следует вызывать с аргументами start
или stop
соответственно:
shell> mysql.server start shell> mysql.server stop
mysql.server
можно найти в подкаталоге `share/mysql'
инсталляционного каталога MySQL или в каталоге `support-files' набора
исходных кодов MySQL.
Перед тем как скрипт mysql.server
запустит сервер, он изменяет данный
каталог на инсталляционный каталог MySQL, затем вызывает safe_mysqld
.
Возможно, понадобится отредактировать скрипт mysql.server
, если бинарный
дистрибутив установлен вами не в стандартном месте. Модифицируйте его,
указав cd
в соответствующий каталог перед тем, как он запустит
safe_mysqld
. Если вы хотите запустить сервер от определенного
пользователя, то добавьте соответствующую строку user
к файлу
`/etc/my.cnf' как показано далее в этом разделе.
mysql.server stop
останавливает сервер путем посылки ему сигнала.
Можно остановить сервер вручную - при помощи команды mysqladmin shutdown
.
Вам следует добавить эти команды запуска и остановки в соответствующее место в файлах `/etc/rc*', если вы хотите автоматически запускать MySQL на вашем сервере.
На современных поставках Linux, достаточно скопировать файл mysql.server
в каталог `/etc/init.d' (или `/etc/rc.d/init.d' на более старших
системах Red Hat). После этого, выполните такую команду, чтобы включить
автоматический запуск MySQL при загрузке системы:
shell> chkconfig --add mysql.server
В качестве альтернативы, в некоторых ОС также используются `/etc/rc.local' или `/etc/init.d/boot.local' для запуска дополнительных сервисов при загрузке. Для того, чтобы MySQL стартовал с использованием этого метода, вы можете добавить нечто вроде этого к указанным файлам:
/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld --user=mysql &'
Можно также добавить опции для скрипта mysql.server
в глобальный файл
`/etc/my.cnf'. Типовой файл `/etc/my.cnf' может выглядеть следующим
образом:
[mysqld] datadir=/usr/local/mysql/var socket=/var/tmp/mysql.sock port=3306 user=mysql [mysql_server] basedir=/usr/local/mysql
Скрипт mysql.server
понимает следующие опции: datadir
, basedir
и
pid-file
.
В таблице представлены группы опций, которые каждый из перечисленных запускающих скриптов читает из файлов опций:
Скрипт | Группы опций |
mysqld | mysqld и server
|
mysql.server | mysql.server , mysqld , и server
|
safe_mysqld | mysql.server , mysqld , и server
|
See section 4.1.2 Файлы параметров `my.cnf'.
Файлы MySQL, содержащие структуру и данные, всегда можно перемещать между
различными версиями одной и той же архитектуры, если используется одна и
та же базовая версия MySQL. В настоящее время базовой является версия с
номером 3. При изменении кодировки во время работы MySQL (при этом также
может измениться порядок сортировки) необходимо запустить myisamchk -r -q --set-character-set=charset
на всех таблицах. В противном случае индексы могут сортироваться
неправильно.
В случае недоверия к новым версиям всегда можно переименовать старую
версию mysqld
, изменив ее имя на что-нибудь вроде
mysqld-old-version-number
. Если после этого mysqld
новой версии начнет
вести себя не так, как ожидалось, то можно просто прекратить работу новой
версии и перезапустить старую!
И, разумеется, при модернизации следует также сделать резервную копию старых баз данных.
После модернизации у вас могут возникнуть проблемы с перекомпилированными
клиентскими программами, такими как Commands out of sync
, или произойти
неожиданная смерть приложения (coredump). Причина может быть в том, что
при компиляции программ были использованы старые заголовочные или
библиотечные файлы. В этом случае следует проверить даты создания вашего
файла `mysql.h' и библиотеки `libmysqlclient.a', чтобы убедиться, что они
из нового дистрибутива MySQL. Если это не так, то программы нужно
перекомпилировать!
Если возникнут проблемы с запуском нового сервера mysqld
или трудности с
подключением без пароля, то нужно убедиться, что вы не используете старый
файл `my.cnf' из старой установки! Это можно проверить с помощью
program-name --print-defaults
. Если эта программа вместо имени программы
выводит что-нибудь иное, то ваш файл `my.cnf' является активным и
оказывает влияние на ход событий!
Каждый раз при установке нового релиза MySQL есть смысл создавать наново и
переустанавливать дистрибутив Msql-Mysql-modules
, особенно если вы
замечаете симптомы того, что ваши скрипты DBI
умирают после модернизации
MySQL.
В общем случае, чтобы выполнить апгрейд до версии 4.1 с более ранней:
mysql_fix_privilege_tables
для создания новых столбцов с паролями. Это нужно для более безопасной работы
с паролями.
Далее идет более подробный список вещей, на которые следует обратить внимание при апгрейде на 4.1:
mysql> SELECT cast("2001-1-1" as DATE) -> '2001-01-01'
SHOW CREATE TABLE
и mysqldump
.
(MySQL 4.0.6 и выше могут читать новые dump-файлы, но не прежние версии MySQL).
'YYYY-MM-DD HH:MM:DD'
.
Если вы хотите получить ее как числов - вам следует добавить +0
к столбцу timestamp
.
Различные длины временных меток теперь не поддерживаются.
В общем случае, вот что вам следует сделать для апгрейда к версии 4.0 с более старой:
mysql_fix_privilege_tables
чтобы добавить новые
привилегии и возможности в таблицы привилегий MySQL.
mysql_convert_table_format база данных
.
Обратите внимание, это нужно делать только если все таблицы в базе данных
являются таблицами типа ISAM или MyISAM. Если это не тот случай, вам тогда
следует выполнить ALTER TABLE имя_таблицы TYPE=MyISAM
для всех
ISAM-таблиц.
MySQL 4.0 будет работать, даже если вы не выполните эти шагы, но у вас не будет возможности использовать новые привилегии, которые предоставляет MySQL 4.0, и у вас могут быть проблемы при дальнейшем апгрейде к 4.1 или более новым серверам. Формат ISAM в MySQL 4.0 все еще работает, но он уже морально устарел и будет исключен из версии MySQL 5.0.
Старые клиенты должны работать с версией 4.0 без каких-либо проблем.
И даже если вы выполните эти шаги, вы сможете произвести даунгрейд к MySQL 3.23.52 или более новой, если у вас возникнут проблемы с MySQL 4.0. В этом случае вам потребуется выполнить mysqldump на всех таблицах, использующих полнотекстовые индексы и восстановить dump на версии 3.23. Причина заключается в том, что MySQL 4.0 использует новый формат полнотекстовых индексов.
Вот подробный список того, на что следует обратить внимание при апгрейде к 4.0:
mysql.user
. See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
Чтобы заставить эти
новые привилегии работать, следует запустить скрипт
mysql_fix_privilege_tables
. До выполнения данного скрипта у всех
пользователей будут привилегии SHOW DATABASES
, CREATE TEMPORARY TABLES
и LOCK TABLES
. Значения для привилегий SUPER
и EXECUTE
берутся
из PROCESS
, для REPLICATION SLAVE
и REPLICATION CLIENT
- из FILE
.
Чтобы скрипты, создающие новых пользователей, могли использовать новые
привилегии, их нужно модифицировать. Если в этих скриптах не
используется команда GRANT
, то сейчас самое время изменить их.
В версии
4.0.2 опция --safe-show-database
устарела и не рекомендуется (и она
больше ничего не делает). See section 4.2.3 Опции запуска mysqld
, относящиеся к безопасности.
Если в версии 4.0.2 для новых пользователей
возникают ошибки отказа в доступе, то следует проверить, не требуются
ли вам некоторые новые привилегии, которые не были нужны раньше. В
частности, для новых репликаций понадобится REPLICATION SLAVE
(вместо
FILE
).
myisam_max_extra_sort_file_size
и
myisam_max_extra_sort_file_size
теперь указываются в байтах (до 4.0.3
указывались в мегабайтах).
Внешняя блокировка файлов MyISAM/ISAM теперь выключена по умолчанию. Можно
включить ее обратно опцией --external-locking
. Для большинства
пользователей этого никогда не потребуется делать.
Из | В. |
myisam_bulk_insert_tree_size | bulk_insert_buffer_size
|
query_cache_startup_type | query_cache_type
|
record_buffer | read_buffer_size
|
record_rnd_buffer | read_rnd_buffer_size
|
sort_buffer | sort_buffer_size
|
warnings | log-warnings
|
err-log | --log-error (для mysqld_safe )
|
record_buffer
, sort_buffer
и warnings
все
еще работают в MySQL 4.0, но считаются уже морально устаревшими.
Из | В. |
SQL_BIG_TABLES | BIG_TABLES
|
SQL_LOW_PRIORITY_UPDATES | LOW_PRIORITY_UPDATES
|
SQL_MAX_JOIN_SIZE | MAX_JOIN_SIZE
|
SQL_QUERY_CACHE_TYPE | QUERY_CACHE_TYPE
|
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=#
вместо
SET SQL_SLAVE_SKIP_COUNTER=#
.
mysqld
--skip-locking
в
--skip-external-locking
и --enable-locking
в
--external-locking
.
SHOW MASTER STATUS
теперь возвращает пустой результат если двоичный журнал обновлений
не включен.
SHOW SLAVE STATUS
возвращает пустой результат если подчиненный сервер не инициализирован.
--temp-pool
включенной по умолчанию, т.к. это
дает лучшую производительность на некоторых ОС (в основном, на Linux).
DOUBLE
и FLOAT
теперь учитывают флаг
UNSIGNED
при хранении (раньше UNSIGNED
игнорировался для этих столбцов).
ORDER BY столбец DESC
теперь сортирует величины NULL
в первую очередь; в 3.23 это было не всегда так. Внимание: в MySQL 4.0.11 восстанавлено
оригинальное поведение.
SHOW INDEX
имеет на 2 столбца больше (Null
и Index_type
), чем в версии
3.23.
CHECK
, SIGNED
, LOCALTIME
и LOCALTIMESTAMP
теперь являются зарезервированными словами.
|
, &
, <<
, >>
и ~
сейчас
является беззнаковым. Это может вызвать проблемы при использовании их
в контексте, где желателен результат со знаком. See section 6.3.5 Функции приведения типов.
UNSIGNED
, будет беззнаковым! Другими словами,
перед модернизацией до MySQL 4.0 вы должны проверить свои приложения
для случаев, где производится вычитание величины из беззнакового
объекта и предполагается ответ с отрицательным знаком, или вычитание
беззнаковой величины из целочисленного столбца. Данный режим можно
заблокировать, используя опцию --sql-mode=NO_UNSIGNED_SUBTRACTION
при
запуске mysqld
. See section 6.3.5 Функции приведения типов.
MATCH ... AGAINST (... IN BOOLEAN MODE)
на
таблицах, следует перестроить их заново при помощи REPAIR TABLE table_name USE_FRM
.
LOCATE()
и INSTR()
чувствительны к регистру, если один из аргументов
является двоичной строкой. В противном случае они не зависят от
регистра.
STRCMP()
при выполнении сравнений сейчас использует текущий набор
символов; это означает, что операция сравнения по умолчанию начиная с
данной версии является независимой от регистра.
HEX(string)
сейчас возвращает символы строки, преобразованные в
шестнадцатеричные. Если необходимо преобразовать число в
шестнадцатеричное представление, убедитесь, что HEX()
вызывается с
числовым аргументом.
INSERT INTO ... SELECT
параметр IGNORE
всегда
был разрешен. В версии 4.0.1 MySQL остановится (и, возможно,
произойдет откат) в случае ошибки, если IGNORE
не задан явно.
safe_mysqld
переименован в mysqld_safe
. Некоторое время
мы будем включать safe_mysqld
в дистрибутив как символическую ссылку на mysqld_safe
.
mysql_drop_db
, mysql_create_db
и mysql_connect
больше не будут поддерживаться, если вы не скомпилируете MySQL с
CFLAGS=-DUSE_OLD_FUNCTIONS
). Вместо перекомпиляции лучше пересобрать
клиента для использования нового 4.0 API.
MYSQL_FIELD
величины length
и max_length
изменены с
unsigned int
на unsigned long
. Это не должно вызывать проблем, за
исключением того, что при использовании величин с такими типами в
качестве аргументов в функциях класса printf()
могут генерироваться
предупреждающие сообщения.
TRUNCATE TABLE
при
(поскольку TRUNCATE TABLE
значительно быстрее, чем DELETE FROM
table_name
).
TRUNCATE TABLE
или DROP DATABASE
при наличии
активной команды LOCK TABLES
или транзакции вы получите ошибку.
BIGINT
необходимо использовать целые
числа (вместо строк, как было в MySQL 3.23). Возможность использования
строк для данного случая пока еще работает, но применение целых чисел
более эффективно.
SHOW OPEN TABLE
.
mysql_thread_init()
и
mysql_thread_end()
. See section 8.4.8 Как создать клиентскую программу с потоками.
DBD::mysql
необходимо
получить версию Msql-Mysql-modules
1.2218 или более новую, поскольку в
более старых модулях DBD
использовался не поддерживаемый вызов функции
drop_db()
.
RAND(seed)
возвращает иные последовательности случайных
чисел, чем в 3.23; это сделано для того, чтобы лучше различать
RAND(seed)
и RAND(seed+1)
.
IFNULL(A,B)
теперь по умолчанию
устанавливается более "общий" по отношению к типам A
и B
. Порядок
выбора - STRING
, REAL
или INTEGER
.
В версии MySQL 3.23 поддерживаются таблицы нового типа MyISAM
и старого
типа ISAM
. Старые таблицы не нуждаются в преобразовании для использования
их в версии 3.23. По умолчанию все новые таблицы будут создаваться с типом
MyISAM
(если вы не запускаете mysqld
с опцией --default-table-type=isam
).
Можно преобразовать таблицу ISAM
в таблицу MyISAM
при помощи команды
ALTER TABLE table_name TYPE=MyISAM
или при помощи Perl-скрипта
mysql_convert_table_format
.
Клиенты версий 3.22 и 3.21 должны работать с сервером версии 3.23 без каких-либо проблем.
Ниже перечислены моменты, на которые следует обратить внимание при модернизации до версии 3.23:
tis620
, должны быть
исправлены с помощью myisamchk -r
или REPAIR TABLE
.
DROP DATABASE
над базой данных, связанной
символической ссылкой, удаляются как данная ссылка, так и исходная
база данных (в 3.22 это было не так, поскольку программа configure
не
распознавала системный вызов readlink
).
OPTIMIZE TABLE
сейчас работает только с таблицами MyISAM
. Для других
типов таблиц можно использовать команду ALTER TABLE
для оптимизации
таблицы. Во время выполнения команды OPTIMIZE TABLE
оптимизируемая
таблица сейчас заблокирована для других потоков.
mysql
сервера MySQL сейчас по умолчанию начинает свою работу с
опцией --no-named-commands
(-g
). Данную опцию можно отключить с
помощью --enable-named-commands
(-G
). В некоторых случаях это может
вызывать проблемы несовместимости, например, в скриптах SQL, в которых
названные команды используются без точки с запятой! Команды большого
формата пока еще работают с начала строки.
MONTH()
), сейчас будут возвращать 0
для даты 0000-00-00
(в версии
MySQL 3.22 возвращалась величина NULL
).
isamchk -r
, так как в порядке
сортировки произведены некоторые изменения!
IF
теперь зависит от обоих
аргументов, а не только от первого.
AUTO_INCREMENT
теперь не будет работать с отрицательными числами;
причина в том, что отрицательные числа вызывали проблемы при переходе
от -1
к 0
. Для таблиц MyISAM
AUTO_INCREMENT
не обрабатывается на более
низком уровне и работает намного быстрее, чем раньше. Для таблиц
MyISAM
старые автоинкрементные номера также не используются повторно,
даже при удалении из таблицы строк.
CASE
, DELAYED
, ELSE
, END
, FULLTEXT
, INNER
, RIGHT
, THEN
и WHEN
сейчас являются зарезервированными словами.
FLOAT(X)
сейчас является настоящим типом данных с плавающей точкой, а
не величиной с фиксированным числом десятичных знаков.
DECIMAL(length,dec)
аргумент length
больше не включает
в себя место для знака или десятичной точки.
TIME
теперь должна представлять собой один из следующих
форматов: [[[DAYS] [H]H:]MM:]SS[.fraction]
или
[[[[[H]H]H]H]MM]SS[.fraction]
.
LIKE
сейчас сравнивает строки, используя те же правила сравнения
символов, что и =
. Если необходим старый режим работы, то можно
скомпилировать MySQL с флагом CXXFLAGS=-DLIKE_CMP_TOUPPER
.
REGEXP
сейчас является независимым от регистра символов для
нормальных (не двоичных) строк.
CHECK TABLE
или myisamchk
для таблиц MyISAM
(`.MYI') и isamchk
для таблиц ISAM
(`.ISM').
mysqldump
между версией MySQL
3.22 и версией 3.23, не следует использовать опцию --opt
или --all
для mysqldump
.
DATE_FORMAT()
, чтобы убедиться, что
перед каждым символом формата имеется `%' (в версии MySQL 3.22 и более
поздних этот синтаксис уже допускается).
mysql_fetch_fields_direct
сейчас является функцией (был макрос) и
возвращает указатель на MYSQL_FIELD
вместо MYSQL_FIELD
.
mysql_num_fields()
больше нельзя использовать на объектах
MYSQL*
(сейчас это функция, принимающая MYSQL_RES*
в качестве
аргумента, так что вместо нее следует применять mysql_field_count()
).
SELECT DISTINCT ...
почти всегда был
отсортированным. Чтобы получить отсортированный вывод в версии 3.23,
необходимо использовать GROUP BY
или ORDER BY
.
SUM()
сейчас возвращает NULL
вместо 0
при отсутствии
сопоставляемых строк: это сделано для соответствия с ANSI SQL.
AND
или OR
с величинами NULL
теперь будут возвращать NULL
вместо 0
. В основном, это влияет на запросы, в которых используется
NOT
на выражениях AND
/OR
, так как NOT NULL = NULL
. LPAD()
и RPAD()
будут укорачивать результирующую строку, если она длиннее, чем
аргумент длины.
В версии 3.21 по сравнению с 3.22 не было сделано никаких изменений,
влияющих на совместимость. Единственный подводный камень - это то, что для
новых таблиц, создающихся со столбцами типа DATE
, будет применяться новый
способ хранения даты. При использовании старой версии mysqld
получить
доступ к этим новым полям будет нельзя.
После установки версии MySQL 3.22 необходимо запустить новый сервер, а
затем выполнить скрипт mysql_fix_privilege_tables
. В результате будут
добавлены новые привилегии, необходимые для использования команды GRANT
.
Если вы забудете выполнить эти действия, то получите Access denied
при
попытке использовать ALTER TABLE
, CREATE INDEX
или DROP INDEX
. Если для
вашего привилегированного (root
) пользователя MySQL требуется пароль, то
следует указать его как аргумент в mysql_fix_privilege_tables
.
Изменен интерфейс C API к функции mysql_real_connect()
.Если вы
располагаете старой клиентской программой, вызывающей данную функцию, то
необходимо задать значение 0
для нового аргумента db
(или перекодировать
данный клиент, чтобы посылать значение элемента db
для более быстрых
подключений). Необходимо также вызывать mysql_init()
перед вызовом функции
mysql_real_connect()
! Это изменение было проведено для того, чтобы дать
возможность новой функции mysql_options()
сохранять опции в структуре
обработчика MYSQL
.
Имя относящейся к mysqld
переменной key_buffer
изменено на
key_buffer_size
, однако старое имя можно использовать по-прежнему.
Если вы работаете с версией выше, чем 3.20.28, и хотите перейти к 3.21, то необходимо сделать следующее:
Можно запустить сервер mysqld
версии 3.21 с опцией safe_mysqld
--old-protocol
, чтобы использовать его с клиентами из дистрибутива версии
3.20. В этом случае функция mysql_errno()
нового клиента не возвращает
никаких серверных ошибок, кроме CR_UNKNOWN_ERROR
(она предназначена для
клиентских ошибок), при этом сервер использует не новую, а старую функцию
проверки password()
.
Если вы не собираетесь использовать опцию --old-protocol
к mysqld
, то
необходимо будет выполнить следующие изменения:
MyODBC
2.x.
Password
в таблице mysql.user
к CHAR(16)
.
mysql.user
должны быть переназначены (чтобы
получить 62- разрядные пароли вместо 31- разрядных).
Версия MySQL 3.20.28 и выше может обрабатывать новый формат таблиц user
так, что это не отражается на клиентах. В более ранних, чем 3.20.28,
версиях MySQL пароли больше не будут работать с клиентами, если таблица
user
преобразована. Для уверенности следует прежде провести апгрейд по
меньшей мере до версии 3.20.28 и затем модернизировать до версии 3.21.
Новый код клиента работает с сервером mysqld
версии 3.20.x, так что в
случае каких-либо проблем с версией 3.21.x можно использовать старый
сервер 3.20.x без необходимости повторной перекомпиляции клиентов.
Если не применить опцию --old-protocol
для mysqld
, то старые клиенты
выдадут следующее сообщение об ошибке:
ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
Новый интерфейс Perl DBI
/DBD
также поддерживает старый интерфейс
mysqlperl
. Единственное изменение, которое следует произвести при
использовании mysqlperl
, модифицировать аргументы в функции connect()
.
Новыми аргументами являются: host
, database
, user
, и password
(аргументы
user
и password
поменялись местами). See section 8.2.2 Интерфейс DBI
.
Ниже перечислены изменения, которые могут повлиять на запросы в старых приложениях:
HAVING
теперь необходимо указывать перед любым выражением ORDER BY
.
LOCATE()
.
DATE
, TIME
и TIMESTAMP
.
При использовании MySQL 3.23 можно копировать файлы `.frm', `.MYI' и `.MYD' между различными архитектурами, поддерживающими одинаковый формат чисел с плавающей точкой (все проблемы, связанные с перестановкой байтов, берет на себя MySQL).
Имеющиеся в MySQL файлы данных и индексные файлы типа ISAM
(`.ISD' и
`*.ISM' соответственно) являются архитектурно-независимыми, а в ряде
случаев - зависимыми от операционной системы. Для переноса приложений на
компьютер с архитектурой или операционной системой, которые отличаются от
используемых на исходном компьютере, не следует пытаться перенести базу
данных путем простого копирования файлов на другой компьютер. Используйте
вместо этого mysqldump
.
По умолчанию mysqldump
создаст файл со всеми командами SQL. После этого
данный файл можно перенести на другой компьютер и подать его на вход
клиента mysql
.
Используя mysqldump --help
, просмотрите все доступные опции. При
перемещении данных на более новую версию MySQL следует применять mysqldump
--opt
более новой версии, чтобы получить быструю и компактную копию.
Самый простой (хотя и не самый быстрый) способ перемещения базы данных с компьютера на компьютер - запустить на компьютере, где размещается исходная база данных, следующие команды:
shell> mysqladmin -h 'other hostname' create db_name shell> mysqldump --opt db_name \ | mysql -h 'other hostname' db_name
Если вы хотите скопировать базу данных с удаленного компьютера через медленную сеть, то можно использовать:
shell> mysqladmin create db_name shell> mysqldump -h 'other hostname' --opt --compress db_name \ | mysql db_name
Можно также сохранять результат в файле, затем передавать этот файл на требуемый компьютер и загружать этот файл в расположенную там базу данных. Например, можно скопировать базу данных в файл на исходном компьютере как показано ниже:
shell> mysqldump --quick db_name | gzip > db_name.contents.gz
(Созданный в данном примере файл сжимается). Передайте этот файл с содержимым базы данных на требуемый компьютер и запустите там эти команды:
shell> mysqladmin create db_name shell> gunzip < db_name.contents.gz | mysql db_name
Для выполнения передачи базы данных можно также использовать mysqldump
и
mysqlimport
. В случае больших таблиц это намного более быстрый способ, чем
простое применение mysqldump
. В следующих командах DUMPDIR
представляет
собой полный путь к каталогу, используемому для хранения вывода из
mysqldump
.
Во-первых, создайте каталог для файлов вывода и дампа базы данных:
shell> mkdir DUMPDIR shell> mysqldump --tab=DUMPDIR db_name
Затем передайте эти файлы в каталог DUMPDIR
некоторого соответствующего
каталога на требуемом компьютере и загрузите там данные файлы в MySQL:
shell> mysqladmin create db_name # создание базы данных shell> cat DUMPDIR/*.sql | mysql db_name # создание таблиц в базе данных shell> mysqlimport db_name DUMPDIR/*.txt # загрузка данных в таблицы
Помимо этого, не забудьте скопировать базу данных mysql
, поскольку в ней
хранятся таблицы привилегий (user
, db
, host
). Возможно, на новом
компьютере будет нужно запустить команды в качестве пользователя root
MySQL, пока база данных mysql
не займет свое место.
После импорта базы данных mysql
на новый компьютер выполните mysqladmin
flush-privileges
, чтобы сервер перезагрузил информацию в таблицах
привилегий.
Приведенные ниже замечания о glibc
будут полезны только для случая, когда
вы собираете MySQL самостоятельно. Но обычно, если Linux работает на
машине с архитектурой x86, гораздо лучше использовать наши бинарные файлы.
Они линкуются с glibc
, к которой применены наиболее удачные патчи, и с
наиболее удачными опциями компилятора - все это сделано для того, чтобы
программа была пригодной для работы на сильно нагруженном сервере. Поэтому
если после прочтения данного раздела у вас возникнут сомнения относительно
дальнейших действий, попробуйте сначала использовать бинарные файлы -
возможно, они удовлетворят вашим требованиям. Если же окажется, что
бинарные файлы вас не устраивают, то можно попробовать заняться
собственноручной сборкой. Мы будем очень признательны за сообщение о том,
почему вам пришлось отказаться от работы с нашими бинарниками, - это
поможет нам в следующий раз собрать более удачную версию программы. Что же
касается обычных пользователей, то для них даже при установке,
рассчитанной на большое количество параллельных соединений и/или таблиц,
превосходящих по объему ограничение в 2 Гб, наши бинарные файлы будут
наилучшим вариантом выбора.
В операционной системе Linux MySQL использует LinuxThreads. Если у вас
старая система Linux, в которой отсутствует glibc2
, то прежде чем
предпринимать попытку компиляции MySQL, необходимо установить
LinuxThreads. Получить LinuxThreads можно по адресу
http://www.mysql.com/downloads/os-linux.html.
Примечание: на Linux 2.2.14 и MySQL, установленных на многопроцессорных (SMP) системах, могут возникать некоторые непонятные проблемы. В таком случае мы рекомендуем как можно быстрее сделать апгрейд версии ядра до 2.4: оно станет гораздо более быстрым и устойчивым.
Необходимо отметить, что версии glibc
до 2.1.1 включительно содержат
фатальную ошибку в обработке pthread_mutex_timedwait
, которая проявляется
при использовании INSERT DELAYED
. Поэтому мы рекомендуем не использовать
INSERT DELAYED
, пока не будет сделан апгрейд glibc
.
Если планируется использовать более 1000 одновременных соединений,
необходимо сделать некоторые изменения в LinuxThreads, пересобрать их и
перелинковать MySQL с новой `libpthread.a'. Следует увеличить
PTHREAD_THREADS_MAX
в файле `sysdeps/unix/sysv/linux/bits/local_lim.h' до
4096 и уменьшить STACK_SIZE
в `linuxthreads/internals.h' до 256 Kб.
Пути указаны относительно корневого каталога glibc
. Заметим, что MySQL не
будет устойчиво работать при 600-1000 соединениях, если размер STACK_SIZE
останется по умолчанию 2 Mб.
Если MySQL не может открыть достаточное количество файлов или принять достаточное количество соединений, то это значит, что в Linux не сконфигурирована возможность открытия необходимого количества файлов.
В Linux 2.2 и более свежих версиях можно получить значение максимального количества файлов, которые можно открыть одновременно. Для этого необходимо выполнить:
cat /proc/sys/fs/file-max cat /proc/sys/fs/dquot-max cat /proc/sys/fs/super-max
В случае, если на машине установлено более 16 Mб памяти, к загрузочному скрипту (`/etc/init.d/boot.local' на SuSE) необходимо добавить записи наподобие следующих:
echo 65536 > /proc/sys/fs/file-max echo 8192 > /proc/sys/fs/dquot-max echo 1024 > /proc/sys/fs/super-max
Эти команды можно также запустить из командной строки от имени пользователя
root
, но в таком случае при перезагрузке компьютера будут использоваться
старые ограничения.
Альтернативно, вы можете установить эти параметры при загрузке, используя
утилиту sysctl
, которая используется во множестве поставок Linux (SuSE также добавила
ее, начиная с SuSE 8.0). Просто напишите такие значения в файл `/etc/sysctl.conf':
# увеличить некоторые значения для MySQL fs.file-max = 65536 fs.dquot-max = 8192 fs.super-max = 1024
Кроме того, необходимо добавить в `/etc/my.cnf':
[safe_mysqld] open-files-limit=8192
Добавление такой записи позволит MySQL создавать до 8192 соединений и файлов.
Размером стеков потоков в адресном пространстве управляет константа
STACK_SIZE
в LinuxThreads. Ее значение должно быть достаточно большим,
чтобы хватило места стеку каждого потока, но достаточно малым, чтобы
предотвратить попадание стеков некоторых потоков в область общих данных
mysqld
. К сожалению, опытным путем нам удалось обнаружить, что реализация
mmap()
на Linux в случае поступления запроса на выделение адреса, который
уже используется, вместо возвращения сообщения об ошибке успешно
освобождает все ранее выделенные области и обнуляет данные на всей
странице. Поэтому безопасность использования mysqld
или любого другого
потокового приложения зависит от "джентльменского" поведения кода,
создающего потоки. Пользователь должен принять меры для обеспечения
достаточно малого количества выполняемых потоков в любой момент времени,
чтобы стеки потоков не пересекались с динамически выделяемой памятью. В
случае mysqld
необходимо навязать это "джентльменское" поведение
установкой переменной max_connection
в разумных пределах.
Если вы собираете MySQL самостоятельно и не хотите заниматься патчами
LinuxThreads, то необходимо установить значение max_connections
так, чтобы
оно не превышало 500. Это значение должно быть еще меньше, если у вас
достаточно велик буфер ключей, большая таблица динамически выделяемой
памяти или имеются другие причины, по которым mysqld
занимает большие
объемы памяти, а также в случае, если вы используете ядро 2.2 с патчами
для 2 Гб. Если используются наши бинарные файлы или RPM версии не старше
3.23.25, то можно безопасно устанавливать max_connections
равным 1500 -
при условии, что буфер ключей или таблицы динамически выделяемой памяти
имеют небольшие размеры. Чем меньше STACK_SIZE
в LinuxThreads, тем больше
потоков можно безопасно создать. Рекомендуемая нами величина составляет от
128K до 256K.
При использовании множества одновременных соединений вы можете пострадать
от одной "особенности" ядра 2.2. Данная особенность заключается в том, что
процесс штрафуется за ветвление или порождение дочерних процессов - чтобы
предотвратить атаки ветвлением. Это приводит к неудачному масштабированию
MySQL при увеличении количества одновременных соединений. По нашим данным,
на однопроцессорных машинах из-за данной особенности создание потоков
происходит очень медленно, что может привести к большим затратам времени
на соединение с MySQL (до 1 минуты), и столько же может занять завершение
соединения. Что же касается многопроцессорных систем, то на них
наблюдалось постепенное снижение скорости по мере роста числа клиентов.
Пока мы пытались найти решение проблемы, один из пользователей прислал
патч к ядру, утверждая, что патч заметно улучшил работу его сайта. Патч
доступен по адресу
http://www.mysql.com/Downloads/Patches/linux-fork.patch. Мы провели
достаточно обширное тестирование этого патча как на развивающейся, так и
на промышленной версиях системы. Применение патча заметно улучшило
производительность MySQL
, не вызвав при этом никаких проблем, поэтому
теперь мы рекомендуем его пользователям, которые до сих пор используют
ядро 2.2 на сильно нагруженных серверах. Кроме того, эта проблема была
решена в ядре 2.4, поэтому если вас не устраивает производительность
системы, то, по-видимому, проще сделать ее апгрейд до 2.4, чем
использовать патчи к ядру 2.2. При обновлении системы, помимо исправления
этой ошибки, вы также получите возможность воспользоваться преимуществами
SMP.
При тестировании MySQL на двухпроцессорной машине с ядром 2.4 мы
обнаружили, что MySQL масштабируется гораздо лучше - фактически
отсутствовало замедление обработки запросов вплоть до 1000 соединений, а
фактор масштабируемости MySQL (который вычисляется как отношение
максимальной производительности к производительности при работе с одним
клиентом) достигал 180%. Подобные результаты мы наблюдали на
четырехпроцессорной системе - фактическое отсутствие замедления при росте
количества соединений до 1000 при факторе масштабируемости в 300%. Поэтому
для интенсивно нагруженных серверов мы настоятельно рекомендуем ядро 2.4.
Оказалось также, что для достижения максимума производительности на ядре
2.4 весьма важно запускать mysqld
с наибольшим возможным приоритетом. Для
этого следует добавить в скрипт safe_mysqld
команду renice -20 $$
. В наших
тестах на четырехпроцессорной машине увеличение приоритета привело к
повышению производительности на 60% при работе 400 клиентов.
В дополнение к этому мы сейчас занимаемся сбором информации о производительности MySQL с ядром 2.4 на четырех- и восьмипроцессорных системах. Если у вас есть доступ к таким системам и вы тестировали их производительность, пожалуйста, отправьте сообщение с результатами по адресу docs@mysql.com - мы добавим эти результаты в документацию.
Существует еще один нюанс, заметно влияющий на производительность
MySQL, особенно на многопроцессорных системах. В LinuxThreads в glibc-2.1
очень плохо реализованы mutex'ы для программ со множеством потоков, в
которых mutex хранится непродолжительное время. Парадоксально, но факт: в
случае, если на многопроцессорных системах собрать MySQL с
немодифицированными LinuxThreads, то при удалении процессора во много раз
увеличивается производительность. Для решения этой проблемы мы предлагаем
патч к glibc 2.1.
3
(http://www.mysql.com/Downloads/Linux/linuxthreads-2.1-patch).
В glibc-2.2.2
MySQL версии 3.23.36 использует адаптивный mutex, который
гораздо лучше даже ``патченного'' в glibc-2.3.1
. Однако предупреждаем, что
при некоторых условиях код mutex'а в glibc-2.2.2
"закручивается"
(overspin), а это ухудшает производительность MySQL. Шансы возникновения
такого события можно понизить, если повысить приоритет выполнения mysqld
.
Можно также исправить "закручивание" с помощью патча, доступного по адресу
http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch. Он содержит
в себе коррекцию "закручивания", максимальное количество потоков и размеры
стека - все вместе. Необходимо применить его в каталоге linuxthreads
командой patch -p0 </tmp/linuxthreads-2.2.2.patch
. Мы надеемся, что данный
патч будет в некотором виде включен в следующие выпуски glibc-2.2
. В любом
случае - если вы линкуете с использованием библиотеки glibc-2.2.2
, то пока
что необходимо исправлять STACK_SIZE
и PTHREAD_THREADS_MAX
. Мы не теряем
надежду, что в будущем значения по умолчанию будут приведены к более
приемлемым для сборки интенсивно нагруженного MySQL величинам, так что
самостоятельная сборка сведется к выполнению ./configure; make; make
install
.
Вышеупомянутые патчи мы рекомендуем использовать только для создания специальной статической версии `libpthread.a', а последнюю - применять только для статического линкования MySQL. Мы уверены, что для MySQL эти патчи безопасны и заметно улучшают его производительность, но относительно других приложений данных нет. Линкуя другие приложения с ``патченной'' версией библиотеки или собирая ее динамическую версию и устанавливая ее на свою систему, вы осознанно идете на риск по отношению к другим приложениям, использующим LinuxThreads.
В случае, если вам придется столкнуться с непонятными проблемами при инсталляции MySQL или при работе утилит, то причина, вероятнее всего, связана с библиотеками или компилятором. В таком случае проблему должно решить использование наших бинарных файлов.
Существует одна известная проблема с бинарным дистрибутивом, касающаяся
старых систем Linux, в которых используется libc
(таких как RedHat 4.x или
Slackware). Она проявляется в виде некоторых некритичных проблем с
разрешением имен (see section 2.6.1.1 Примечания к бинарным дистрибутивам Linux).
При использовании LinuxThreads одновременно работают как минимум три процесса. По сути это потоки. Один поток управляет LinuxThreads, один - обрабатывает соединения и еще один - обрабатывает различные сигналы.
Заметим, что ядро Linux и библиотека LinuxThreads по умолчанию могут поддерживать только 1024 потока. Это значит, что может существовать не более 1021 соединения с MySQL на системе, к которой не применялись патчи. Информацию о том, как обойти это ограничение, можно найти на странице http://www.volano.com/linuxnotes.html.
Если по результату работы команды ps вы видите, что mysqld
прекратил
работу,
то обычно причиной этого является либо обнаружение ошибки в MySQL, либо испорченная таблица (see section A.4.1 Что делать, если работа MySQL сопровождается постоянными сбоями).
Если при получении сигнала SIGSEGV
mysqld
просто умирает, то для получения
образа памяти (core dump) на Linux можно запустить mysqld
с опцией
--core-file
. Заметим, что при этом вам, возможно, придется увеличить
размер допустимого объема файла образа памяти путем добавления строки
ulimit -c 1000000
в safe_mysqld
или запуском safe_mysqld
с опцией
--core-file-size=1000000
(see section 4.7.2 safe_mysqld
, оболочка mysqld
).
Если при линковании собственного MySQL-клиента возникла ошибка:
ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory
то проблему можно обойти одним из следующих способов:
-Wl,r/path-libmysqlclient.so
. (вместо -Lpath
);
LD_RUN_PATH
перед запуском клиента.
Если вы используете компилятор Fujitsu (fcc / FCC
), то возможны некоторые
проблемы компиляции MySQL поскольку заголовки в Linux в значительной
степени ориентированы на gcc
.
Данная конфигурация должна работать с fcc/FCC
:
CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE \ -DCONST=const -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib \ -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const \ -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO \ '-D_EXTERN_INLINE=static __inline'" ./configure --prefix=/usr/local/mysql\ --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared \ --with-low-memory
Для работы MySQL необходим Linux версии не ниже 2.0.
Предупреждение: По данным, полученным нами от некоторых пользователей MySQL, на Linux с ядром 2.2.14 имеются серьезные проблемы с устойчивостью работы MySQL. Если вы используете это ядро, необходимо обновить его до версии 2.2.19 или выше, либо до ядра версии 2.4. Аргументы в пользу 2.4 становятся еще более весомыми при использовании многопроцессорной системы, поскольку переход на эту версию ядра приводит к заметному увеличению скорости.
Как правило, бинарный дистрибутив линкуется с опцией -static
, а это
значит, что обычно нет необходимости беспокоиться о том, какая версия
системных библиотек у вас установлена. Не требуется также устанавливать
LinuxThreads. Размер программы, слинкованной с опцией -static
, обычно
больше в сравнении с версией, собранной динамически, однако скорость
работы у нее выше (3-5%). Существует, однако, одна проблема. Она
заключается в том, что со статически слинкованными программами невозможно
использовать определяемые пользователем функции (user-definable function,
UDF). Если вы собираетесь писать или использовать UDF'ы (это информация,
касающаяся только программистов на C или C++), вам следует собственноручно
собрать MySQL с использованием динамического линкования.
При использовании систем, базирующихся на libc
(в отличие от
glibc2
-систем), могут возникать некоторые проблемы с разрешением имен
удаленных компьютеров и использованием getpwnam()
с бинарной версией (это
происходит из-за того, что, к сожалению, glibc
зависит от некоторых
внешних библиотек при разрешении имен и использовании getpwent()
, даже при
сборке с опцией -static
). В таком случае при запуске mysql_install_db
возможно появление следующего сообщения об ошибке:
Sorry, the host 'xxxx' could not be looked up
Или же - при запуске mysqld
с опцией --user
- сообщение об ошибке может
быть таким:
getpwnam: No such file or directory
Эту проблему можно решить одним из следующих способов:
tar.gz
).
mysql_install_db --force
, чтобы избежать проверки
resolveip
в mysql_install_db
. Оборотной стороной такого подхода
является невозможность работать с именами машин в таблицах прав
доступа - вместо них следует должны использовать IP-адреса (за
исключением localhost
). Если у вас старая поставка MySQL,
которая не поддерживает ключ --force
, то нужно просто удалить в редакторе
проверку resolveip
из mysql_install
.
mysqld
с помощью команды su вместо использования опции --user
.
RPM и бинарные файлы MySQL для Linux на архитектуре Intel оптимизированы для достижения наибольшей возможной скорости работы. Мы всегда стараемся использовать компиляторы, которые дают наиболее быстрый и устойчивый код.
Поддержка Perl в MySQL требует Perl версии не ниже 5.004_03.
На некоторых Linux версии 2.2 при попытке создать большое количество новых
соединений с сервером mysqld через TCP/IP вы можете получить сообщение об
ошибке Resource temporarily unavailable
(Ресурс временно недоступен).
Проблема заключается в задержке между закрытием сокета TCP/IP и реальным его освобождением системой в Linux. Поскольку существует ограниченное количество областей для поддержки TCP/IP, вы получите вышеназванную ошибку, если попытаетесь создать слишком много новых соединений TCP/IP на протяжении короткого отрезка времени (нечто подобное происходит при запуске теста на производительность MySQL `test-connect' поверх TCP/IP).
Об этой проблеме мы несколько раз сообщали в различные списки рассылки по Linux, однако удачного решения получить не удалось.
Единственное известное 'решение' данной проблемы заключается в том, что ваши клиенты должны работать с постоянными соединениями или использовать сокеты (в случае, если клиентская и серверная части находятся на одной машине). Остается надеяться, что эта проблема будет решена в ядре Linux 2.4.
Для MySQL необходимо наличие libc
версии 5.4.12 или выше. Известно, что
MySQL работает с libc
5.4.46, а также с glibc
версии 2.0.6 и более новыми.
Существуют некоторые проблемы с glibc
из пакетов в RedHat, поэтому в
случае возникновения проблем следует проверить, нет ли обновлений данной
версии! Известно, что glibc
из RPM версий 2.0.7-19 и 2.0.7-29
работоспособны.
Если вы используете Red Hat 8.0 или новую glibc 2.2.x вам следует запускать
mysqld с опцией --thread-stack=192K
. Если вы этого не сделаете, то
mysqld будет умирать в gethostbyaddr()
потому что новая glibc требует >
128Кбайт памяти стека для этого вызова. Такой размер стека установлен по
умолчанию в MySQL 4.0.10 и более новых.
При использовании для сборки MySQL gcc 3.0 и выше библиотеку libstdc++v3
необходимо установить до сборки; если вы не сделаете этого, то получите
сообщение об отсутствии символа __cxa_pure_virtual
во время линкования!
На некоторых старых версиях Linux configure
может приводить к ошибкам
такого типа:
Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file. See the Installation chapter in the Reference Manual.
Сделайте именно то, о чем говорится в сообщении об ошибке - добавьте дополнительный символ подчеркивания к имени макроса _P
, которое имеет
только один символ подчеркивания в начале, и попробуйте выполнить те же
действия еще раз.
При компиляции могут выводиться некоторые предупреждения. Ниже приведены те из них, которые можно проигнорировать:
mysqld.cc -o objs-thread/mysqld.o mysqld.cc: In function `void init_signals()': mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int' mysqld.cc: In function `void * signal_hand(void *)': mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int'
mysql.server
находится либо в каталоге `share/mysql' каталога инсталляции MySQL, либо в каталоге `support-files' каталога дерева исходных текстов
MySQL.
Возникновение следующей ошибки при линковании mysqld
говорит о
некорректной установке libg++.a
:
/usr/lib/libc.a(putc.o): In function `_IO_putc': putc.o(.text+0x0): multiple definition of `_IO_putc'
Использования libg++.a
можно избежать путем запуска configure
следующим
образом:
shell> CXX=gcc ./configure
В некоторых версиях Linux SPARC испорчена функция readdir_r()
. Это
проявляется в том, что SHOW DATABASES
всегда возвращает пустой набор.
Проблема может быть решена удалением HAVE_READDIR_R
из `config.h' - это
нужно делать после конфигурирования, но до компиляции.
Для решения некоторых проблем необходимо добавить патч к своей установке
Linux. Патч находится по адресу
http://www.mysql.com/Downloads/patches/Linux-sparc-2.0.30.diff. Этот патч
применим к дистрибутиву Linux `sparclinux-2.0.30.tar.gz', который находится
на vger.rutgers.edu
(версия Linux, которая никогда не сливалась с
официальной 2.0.30). Также необходимо установить LinuxThreads версии 0.6
или выше.
MySQL версии 3.23.12 - первая версия MySQL, протестированная на Linux-Alpha. Поэтому если вы собираетесь использовать MySQL на Linux-Alpha, следует прежде всего убедиться, что вы используете либо эту версию, либо более свежую.
Мы тестировали MySQL на Alpha при помощи наших тестов на производительность и все работает превосходно.
При компиляции стандартных бинарных файлов MySQL мы использовали SuSE 7.0 для AXP с ядром 2.4.4-SMP, компилятор Compaq C (6.2-505) и компилятор Compaq C++ (6.3-006) на компьютере Compaq DS20 с процессором Alpha EV6.
Вышеупомянутый компилятор можно найти на http://www.support.compaq.com/alpha-tools/. Использование этого компилятора вместо gcc привело к улучшению производительности MySQL на 9-14%.
Отметим, что до версии MySQL 3.23.52 и 4.0.2 мы оптимизировали исполняемые файлы
только для единственной модели процессора (используя опцию компиляции -fast
); это означало
что вы можете использовать наши двоичные файлы только если у вас процессор Alpha EV6.
Для всех следующих версий мы добавили флаг -arch generic
к нашим опциям
компиляции, что позволяет работать бинарному файлу на всех процессорах Alpha.
Мы также собираем MySQL статически - во избежание проблем.
CC=ccc CFLAGS="-fast -arch generic" CXX=cxx \ CXXFLAGS="-fast -arch generic -noexceptions -nortti" \ ./configure --prefix=/usr/local/mysql --disable-shared \ --with-extra-charsets=complex --enable-thread-safe-client \ --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared
Если вы хотите использовать egcs
, то у нас применялась следующая командная
строка конфигурирования:
CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc \ CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors \ -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \ --disable-shared
Некоторые известные проблемы при запуске MySQL на Linux-Alpha:
gdb 4.18
.
Вместо него необходимо установить и использовать gdb 5.1!
mysqld
с использованием gcc
результирующий файл при попытке запуска сбрасывает образ памяти на
диск (core dump) и умирает. Иными словами, не следует использовать с
gcc
опцию --with-mysqld-ldflags=-all-static
.
MySQL должен работать на MkLinux при наличии самого свежего пакета glibc
(проверено с glibc
2.0.7).
Для того чтобы MySQL работал на Qube2 (Linux Mips), необходима самая
свежая версия библиотеки glibc
(известно, что MySQL работает с
glibc-2.0.7-29C2
). Помимо этого, следует использовать компилятор egcs
C++
(egcs-1.0.2-9
, gcc 2.95.2
или выше).
Для компиляции MySQL на Linux IA64 мы применяем следующую команду
конфигурирования: используется gcc-2.96
:
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc \ CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \ -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \ "--with-comment=Official MySQL binary" --with-extra-charsets=complex
На IA64 бинарные файлы MySQL-клиента используют динамические библиотеки.
Это значит, что при установке нашего бинарного дистрибутива куда-либо,
кроме `/usr/local/mysql', необходимо либо модифицировать `/etc/ld.so.conf',
либо добавить путь к каталогу, в котором находится `libmysqlclient.so', к
переменной окружения LD_LIBRARY_PATH
.
See section A.3.1 Проблемы при линковании с клиентской библиотекой MySQL.
В данном разделе описывается использование MySQL в среде Windows. Эта информация также находится в файле `README', поставляемом с дистрибутивом MySQL Windows. See section 2.1.2 Установка MySQL на Windows.
В MySQL для соединения клиента с сервером используется TCP/IP (это обеспечивает для любого компьютера в сети возможность соединиться с вашим MySQL-сервером). Поэтому TCP/IP необходимо установить на машине до запуска MySQL. TCP/IP, в частности, имеется на CD-диске с дистрибутивом Windows.
Обратите внимание: если вы используете один из старых выпусков Windows 95 (например OSR2), то вполне вероятно, что у вас установлен старый пакет Winsock; а для работы MySQL необходим Winsock 2! Самую свежую версию Winsock можно получить по адресу http://www.microsoft.com/. Windows 98 содержит новую библиотеку Winsock 2, поэтому данное замечание к ней не относится.
Для запуска mysqld
необходимо открыть окно MS-DOS и выполнить:
C:\> C:\mysql\bin\mysqld
Это позволит запустить mysqld
в фоновом режиме без окна.
Работу MySQL-сервера можно остановить командой:
C:\> C:\mysql\bin\mysqladmin -u root shutdown
Это вызов программы администрирования MySQL от имени пользователя root
,
который по умолчанию соответствует пользователю Administrator
в системе
привилегий MySQL. Обратите внимание: система привилегий MySQL абсолютно
независима от каких-либо аккаунтов пользователей в среде Windows.
Заметим, что в Windows 95/98/Me не поддерживается создание именованных
каналов. Таким образом, именованные каналы вы можете использовать для
соединения с MySQL-сервером, работающем в системе Windows NT/2000/XP.
(Разумеется, MySQL-сервер также должен поддерживать именованные каналы.
Например, при работе mysqld-opt
в системе NT/2000/XP нельзя создавать
соединения с использованием именованных каналов; следует применять либо
mysqld-nt
, либо mysqld-max-nt
.)
Если mysqld
не запускается, следует проверить файл `\mysql\data\mysql.err',
на предмет записей, сделанных сервером, - они содержат объяснения причин,
вызвавших проблему. Можно также попробовать запустить сервер командой
mysqld --standalone
; в этом случае на экран будет выводиться некоторая
полезная информация, которая может помочь решить проблему.
В качестве последней попытки можно попробовать запустить mysqld
с флагами
--standalone --debug
. В этом случае mysqld
будет помещать записи в файл
отладки `C:\mysqld.trace'. Возможно, по содержимому этого файла вы сумеете
определить причину, по которой не запускается mysqld
.
See section E.1.2 Создание трассировочных файлов.
Для вывода всех флагов, которые ``понимает'' mysqld
, используйте команду
mysqld --help
.
Для того чтобы MySQL работал с TCP/IP на Windows NT 4, необходимо установить Service Pack 3 (или выше)!
Обычно MySQL устанавливается на Windows NT/2000/XP как сервис. В случае, если сервер уже работает, необходимо сначала завершить его работу при помощи следующей команды:
C:\mysql\bin> mysqladmin -u root shutdown
Это вызов программы администрирования MySQL от имени пользователя root
,
который по умолчанию соответствует пользователю Administrator
в системе
привилегий MySQL. Обратите внимание: система привилегий MySQL абсолютно
независима от каких-либо аккаунтов пользователей в системе Windows.
Теперь установим сервис сервера:
C:\mysql\bin> mysqld-max-nt --install
Если требуются какие-либо опции, они должны быть определены, как ``Start
parameters
'' в инструментальной программе Services
системы Windows перед
запуском сервиса MySQL.
Доступ к инструментальной программе Services
(Windows Service Control
Manager
) можно получить в Control Panel
(в Administrative Tools
в Windows
2000). Рекомендуется закрывать Services
при выполнении операций --instal
или --remove
- это предотвратит возникновение некоторых ошибок неизвестной
природы.
За информацией о том, какие бинарные файлы следует использовать для запуска сервера, обращайтесь к разделу See section 2.1.2.2 Подготовка конфигурации MySQL для Windows.
Отметим, что начиная с версии 3.23.44 MySQL имеется возможность
альтернативной установки сервиса - в режиме Manual
(если вам не требуется
автоматический запуск сервиса при загрузке операционной системы):
C:\mysql\bin> mysqld-max-nt --install-manual
Сервис устанавливается под именем MySQL. Сразу же после установки он может
быть запущен при помощи инструментальной программы Services
или командой
NET START MySQL
.
После запуска работа mysqld-max-nt
может быть завершена при помощи
mysqladmin из инструментальной программы Services
или командой NET STOP
MySQL
.
Если MySQL функционирует в качестве сервиса, то операционная система
автоматически завершает работу MySQL
-сервиса при программном завершении
работы компьютера. В версиях MySQL < 3.23.47 Windows ожидает всего лишь
несколько секунд завершения остановки, после чего уничтожает процесс
сервера базы данных, если превышено время ожидания (что может быть
потенциальной причиной возникновения проблем). Например, при следующем
запуске обработчик таблицы InnoDB
должен выполнять восстановление после
аварийного завершения. Начиная с MySQL версии 3.23.48, Windows ожидает
завершения процесса MySQL-сервера дольше. Если вы считаете, что этого
времени для вашей версии недостаточно, безопаснее запускать MySQL-сервер
не как сервис, а из командной строки и завершать его работу командой
mysqladmin shutdown
.
В Windows NT (но не в Windows 2000/XP) существует проблема, которая
заключается в том, что система по умолчанию ожидает окончания работы
сервиса только 20 секунд, после чего уничтожает процесс сервиса. Это
заданное по умолчанию значение можно увеличить с помощью редактора
Registry (Реестра), запустив `\winnt\system32\regedt32.exe' и отредактировав
значение WaitToKillServiceTimeout
в записи
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
. Следует задать
другое, большее значение в миллисекундах, например 120000, чтобы Windows
NT ожидала 120 секунд.
Необходимо заметить, что при работе в качестве сервиса mysqld-max-nt
не
имеет доступа к консоли, а следовательно, невозможно увидеть его
сообщения. Информация об ошибках находится в файле
`c:\mysql\data\mysql.err'.
Если вы столкнулись с проблемами установки mysqld-max-nt
в качестве
сервиса, попробуйте запустить его с указанием полного пути:
C:\> C:\mysql\bin\mysqld-max-nt --install
Если это не поможет, можно принудить mysqld-max-nt
стартовать
соответствующим образом, исправив путь в Registry!
Если вы не хотите запускать mysqld-max-nt
в качестве сервиса, его можно
запустить следующим образом:
C:\> C:\mysql\bin\mysqld-max-nt --standalone или C:\> C:\mysql\bin\mysqld --standalone --debug
В случае последнего варианта вы получите отладочную информацию в `C:\mysqld.trace'. See section E.1.2 Создание трассировочных файлов.
MySQL поддерживает TCP/IP на всех Windows-системах и именованные каналы в среде NT/2000/XP. По умолчанию MySQL использует именованные каналы для соединений с локальной машиной в среде NT/2000/XP и TCP/IP - во всех остальных случаях, если на клиентской машине установлен TCP/IP. Имя машины определяет используемый протокол:
Имя машины | Протокол |
NULL(отсутствует) | На NT/2000/XP пытается установить соединение через именованные каналы; если это не работает, используется TCP/IP. На 9x/Me используется TCP/IP. |
. | Именованные каналы. |
localhost | Соединение TCP/IP с локальной машиной |
имя удаленной машины | TCP/IP |
Чтобы заставить MySQL-клиента использовать именованные каналы, следует
добавить опцию --pipe
или задать .
в качестве имени машины для
соединения. Для определения имени канала используйте опцию --socket
.
Отметим, что начиная с версии 3.23.50 именованные каналы применяются
только в случае, если mysqld
запущен с опцией --enable-named-pipe
. Это
вызвано тем, что у некоторых пользователей применение именованных каналов
приводило к прекращению работы сервера MySQL.
Для проверки работоспособности MySQL нужно выполнить следующие команды:
C:\> C:\mysql\bin\mysqlshow C:\> C:\mysql\bin\mysqlshow -u root mysql C:\> C:\mysql\bin\mysqladmin version status proc C:\> C:\mysql\bin\mysql test
Если при ответе mysqld
на входящие соединения под Windows 9x/Me возникают
задержки, то это, скорее всего, вызвано проблемами с вашим DNS. В таком
случае следует запускать mysqld с опцией --skip-name-resolve
и в таблицах
привилегий MySQL использовать только localhost
и IP-адреса. Избежать
работы с DNS при соединении с MySQL-сервером mysqld-nt
, работающим под
NT/2000/XP, можно путем применения опции --pipe
, которая задает
использование именованных каналов. Сказанное выше справедливо для
большинства клиентов MySQL.
Существует две версии программы работы с MySQL из командной строки:
Бинарный файл | Описание |
mysql | Собран ``родными'' средствами Windows, обеспечивает весьма ограниченные возможности редактирования текста. |
mysqlc | Собран с использованием компилятора и библиотек Cygnus GNU, которые обеспечивают редактор readline .
|
Если вы хотите использовать `mysqlc.exe', сначала необходимо скопировать `C:\mysql\lib\cygwinb19.dll' в системный каталог Windows (`\windows\system' или в другое аналогичное место).
По умолчанию всем пользователям Windows предоставляются полные права
доступа ко всем базам данных без ввода пароля. Чтобы обеспечить большую
безопасность MySQL, необходимо задать пароль для каждого пользователя и
удалить запись в таблице mysql.user
, содержащую Host='localhost'
и User='
`
.
Необходимо также установить пароль для пользователя root
. Приведенный ниже
пример начинается с удаления возможности анонимного доступа, который может
быть использован любым пользователем для доступа к базе данных test
, после
чего устанавливается пароль для пользователя root
:
C:\> C:\mysql\bin\mysql mysql mysql> DELETE FROM user WHERE Host='localhost' AND User=' '; mysql> QUIT C:\> C:\mysql\bin\mysqladmin reload C:\> C:\mysql\bin\mysqladmin -u root password your_password
Если вы хотите остановить сервер mysqld
после того, как установлен пароль
для пользователя root
, нужно использовать команду:
C:\> mysqladmin --user=root --password=your_password shutdown
Если у вас работает старая испытательная версия MySQL 3.21 под Windows,
вышеприведенная команда не выполнится и приведет к сообщению об ошибке:
parse error near `SET OPTION password'
. Для решения этой проблемы следует
выполнить загрузку и обновление до последней доступной бесплатно версии
MySQL.
В текущей версии MySQL вы можете легко добавлять новых пользователей и
изменять их привилегии при помощи команд GRANT
и REVOKE
(see section 4.3.1 Синтаксис команд GRANT
и REVOKE
).
В этом разделе приведены замечания относительно получения безопасного соединения с удаленным MySQL-сервером с использованием SSH. Автором этих замечаний является Дэвид Карлсон (David Carlson) - dcarlson@mplcomm.com:
SecureCRT
по адресу http://www.vandyke.com/. Другой возможный
вариант - f-secure
от http://www.f-secure.com/. Есть и бесплатные версии -
их можно получить на Google
по адресу
http://directory.google.com/Top/Computers/Security/Products_and_Tools/CryptographySSH/Clients/Windows/
Host_Name=адрес_своего_MySQL-сервера
. Задайте userid=свой_userid
для
соединения со своим сервером (может отличатся от вашего имени
пользователя/пароля для MySQL).
локальный порт - 3306
, удаленный хост
- адреса_вашего_mysql_сервера
, удаленный порт - 3306
) либо локальный
форвардинг (порт - 3306
, хост - localhost
, удаленный порт - 3306
).
localhost
, а не yourmysqlservername
.
В результате этих действий вы должны получить ODBC-соединение со своим MySQL-сервером, защищенное при помощи SSH-кодирования.
Начиная с MySQL версии 3.23.16 серверы mysqld-max
и mysql-max-nt
в
дистрибутиве MySQL компилируются с флагом -DUSE_SYMDIR
. Это обеспечивает
возможность устанавливать базу данных на другом диске путем добавления
символической ссылки на нее (подобно тому, как работают символические
ссылки в Unix).
В Windows для создания символической ссылки на базу данных создается файл, содержащий путь к каталогу, на который указывает ссылка. Этот файл сохраняется в каталоге `mysql_data' под именем `database.sym'. Отметим, что такая символическая ссылка будет работать только в случае отсутствия каталога `mysql_data_dir\database'.
Например, если каталог данных MySQL находится в `C:\mysql\data', а вы хотите
разместить базу данных foo
в каталоге `D:\data\foo', необходимо создать файл
`C:\mysql\data\foo.sym', содержащий текст `D:\data\foo\'. После этого все
таблицы, создаваемые в базе данных foo
, будут создаваться в `D:\data\foo'.
Отметим, что из-за потерь в скорости при открытии каждой таблицы в MySQL не включается использование символических ссылок по умолчанию, даже если вы собрали MySQL с поддержкой данной возможности. Чтобы обеспечить возможность разрешения символических ссылок, вы должны поместить в свой файл `my.cnf' или `my.ini' следующие строки:
[mysqld] use-symbolic-links
В MySQL 4.0 использование символических ссылок по умолчанию будет
включено. Если вы хотите запретить эту возможность, то для данной версии
MySQL необходимо использовать опцию skip-symlink
.
В файлах исходных текстов следует перед `mysql.h' включить `windows.h':
#if defined(_WIN32) || defined(_WIN64) #include <windows.h> #endif #include <mysql.h>
Линковать свою программу можно либо с использованием динамической библиотеки `libmysql.lib', которая является просто оболочкой для загрузки `libmysql.dll' по требованию, либо со статической библиотекой `mysqlclient.lib'.
Отметим, что поскольку библиотеки mysqlclient
компилируются как потоковые
библиотеки, следует скомпилировать вашу программу так, чтобы была
разрешена многопочность!
На настоящий момент версия MySQL под Windows зарекомендовала себя как весьма устойчивая. Возможности этой версии и версии под Unix аналогичны, за исключением следующих моментов:
mysqld
на продолжительное
время, если ваш сервер обрабатывает много соединений! Другие версии
Windows не подвержены этой ошибке.
SELECT
и INSERT
в MySQL используются
функции pread()
и pwrite()
. В настоящее время для эмуляции
pread()
/pwrite()
мы применяем mutex'ы. Однако в наши планы на будущее
входит замена интерфейса файлового уровня виртуальным интерфейсом, чтобы
иметь возможность использовать интерфейс readfile()
/writefile()
на
NT/2000/XP - с целью ускорения работы. В текущей реализации число
одновременно открытых в MySQL файлов не может быть больше 1024; это
означает, что вы не сможете создать такое же количество одновременных
соединений с MySQL в NT/2000/XP, как в Unix.
mysqladmin kill
не работает для ``спящих'' соединений
mysqladmin shutdown
не может отработать до тех пор, пока существуют
``спящие'' соединения.
shutdown
; это можно сделать с помощью
mysqladmin shutdown
.
LOAD DATA
INFILE
или SELECT ... INTO OUTFILE
, символ `\' необходимо вводить дважды:
mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;В качестве альтернативы можно использовать имена файлов Unix-стиля:
mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
can't open named pipe
(невозможно открыть именованный канал)
mysql
можно получить следующее сообщение об ошибке:
error 2017: can't open named pipe to host: . pipe...Это происходит из-за того, что в данной версии MySQL на NT именованные каналы применяются по умолчанию. Чтобы избежать таких ошибок, следует использовать с новым клиентом MySQL флаг
--host=localhost
или создать файл
флагов `C:\my.cnf', содержащий следующие строки:
[client] host = localhostНачиная с версии 3.23.50 именованные каналы используются только в случае, если
mysqld
запущен с флагом --enable-named-pipe
.
access denied for user
(доступ пользователю запрещен)
Access denied for user:
`some-user@unknown' to database `mysql'
при поюытке доступа к
MySQL-серверу, находящемуся на той же машине, с которой происходит доступ,
это значит, что MySQL не может правильно определить адрес вашей машины.
Для решения данной проблемы следует создать файл `\windows\hosts',
содержащий:
127.0.0.1 localhost
ALTER TABLE
ALTER TABLE
доступ к таблице для других потоков
блокируется. Именно поэтому Windows не может удалить файл, который
используется другим потоком (возможно, в будущем мы найдем какой-нибудь
способ обойти эту проблему). Выполнение DROP TABLE
над таблицей, входящей
в состав сводной таблицы MERGE
, не будет работать в Windows, так как
отображение таблицы, которое выполняет обработчик MERGE
, скрыто от
верхнего уровня MySQL. Поскольку в Windows нельзя удалять открытые файлы,
вначале следует сбросить все MERGE
-таблицы (используя FLUSH TABLES
) или
удалить все MERGE
-таблицы перед удалением таблицы. Мы исправим эту ошибку
одновременно с введением оператора VIEW
. Операторы DATA DIRECTORY
и INDEX
DIRECTORY
в CREATE TABLE
в Windows игнорируются, поскольку Windows не
поддерживает символические ссылки.
Ниже приведены некоторые открытые вопросы для всех, кто захочет помочь нам в работе над выпусками под Windows:
mysqld
в качестве сервиса с флагом --install
(на NT)
было бы неплохо иметь возможность добавлять флаги по умолчанию к командной
строке. Сейчас эта проблема решается путем записи списка параметров в файл
`C:\my.cnf'.
mysqld
из диспетчера задач. Сейчас для
этого нужно применять mysqladmin shutdown
.
readline
в Windows для использования с
инструментальной программой, запускаемой из командной строки mysql
.
mysql
, mysqlshow
, mysqladmin
и
mysqldump
) будет очень полезна.
mysqladmin kill
в Windows.
mysqld
всегда стартует в местоположении "C", а не в местоположении,
установленном по умолчанию. С благодарностью будет принято исправление,
позволяющее использование программой mysqld
текущего значения
местоположения для порядка сортировки.
README
,
который находится в поставке MySQL-Windows.
В системе Solaris проблемы подстерегают вас еще до распаковки дистрибутива MySQL! Программа tar в Solaris ``не умеет'' работать с длинными именами файлов, поэтому при попытке распаковать MySQL вы можете увидеть сообщение об ошибке, подобное следующему:
x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,\ informix,ms-sql,mysql,oracle,solid,sybase, 0 bytes, 0 tape blocks tar: directory checksum error
В этом случае для распаковки дистрибутива необходимо использовать
GNU-версию программы tar
(gtar
). Скомпилированную версию данной программы
для Solaris можно загрузить с http://www.mysql.com/Downloads/.
Собственные потоки Sun работают только начиная с версии Solaris 2.5. Для версии 2.4 и более ранних MySQL автоматически использует MIT-pthreads (see section 2.3.6 Замечания по потокам MIT-pthreads).
Следующее сообщение об ошибке конфигурации:
checking for restartable system calls... configure: error can not run test programs while cross compiling
означает, что имели место какие-то ошибки в установке компилятора! В этом случае необходимо обновить ваш компилятор до более свежей версии. Эту проблему можно также решить, вставив в файл `config.cache' следующую строку:
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
При использовании Solaris на SPARC мы рекомендуем компилятор gcc
2.95.2.
Его можно получить по адресу http://gcc.gnu.org/. Отметим, что egcs
1.1.1
и gcc
2.8.1 работают на SPARC ненадежно!
Рекомендуемая строка для configure
при использовании gcc
2.95.2:
CC=gcc CFLAGS="-O3" \ CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler
Если используется UltraSPARC, то при добавлении строки "-mcpu=v8 -Wa,-xarch=v8plusa" к переменным CFLAGS и CXXFLAGS можно получить повышение производительности на 4%.
При использовании компилятора Sun Workshop (Fortre) версии 5.3 (или выше)
можно запускать configure
следующим образом:
CC=cc CFLAGS="-Xa -fast -xO4 -native -xstrconst -mt" \ CXX=CC CXXFLAGS="-noex -xO4 -mt" \ ./configure --prefix=/usr/local/mysql --enable-assembler
В тестах на производительность MySQL с Sun Workshop 5.3 мы получили 6%-ное ускорение на UltraSPARC по сравнению с gcc с опцией -mcpu.
В случае возникновения проблем с fdatasync
или sched_yield
их можно решить
путем добавления LIBS=-lrt
к командной строке запуска конфигурирования.
Последующий абзац относится только к более ранним, чем WorkShop 5.3, компиляторам:
Отредактировать скрипт configure можно, заменив строку:
#if !defined(__STDC__) || __STDC__ != 1
строкой:
#if !defined(__STDC__)
При включении __STDC__
с помощью опции -Xc
компилятор Sun не сможет
откомпилировать программу с файлом `pthread.h' из системы Solaris. Это
ошибка Sun (испорченный компилятор или испорченный включаемый файл).
Если при запуске mysqld
выдает приведенное ниже сообщение об ошибке:
libc internal error: _rmutex_unlock: rmutex not held
необходимо попробовать собрать MySQL, используя компилятор Sun с опцией
запрещения многопоточности (-mt
). Добавьте опцию -mt
к CFLAGS
и CXXFLAGS
и
попробуйте запустить mysqld
еще раз.
При использовании SFW версии gcc (поставляемой с Solaris 8) необходимо к
переменной окружения LD_LIBRARY_PATH
перед конфигурированием добавить
`/opt/sfw/lib'.
При работе с gcc
от sunfreeware
.com может возникнуть множество
неприятностей. Во избежание проблем необходимо перекомпилировать gcc и
бинарные инструментальные программы GNU в той системе, где вы собираетесь
их использовать.
Получение нижеследующей ошибки при компиляции MySQL компилятором gcc
означает, что gcc
не сконфигурирован под вашу версию Solaris:
shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ... ./thr_alarm.c: In function `signal_hand': ./thr_alarm.c:556: too many arguments to function `sigwait'
В этом случае нужно взять самую свежую версию gcc
и скомпилировать ее
установленным gcc
-компилятором! Почти все бинарные версии gcc
(по крайней
мере для Solaris 2.5) содержат старые, непригодные к использованию
включаемые файлы, которые портят все программы, использующие потоки (а
возможно, и другие программы)!
В Solaris не обеспечиваются статические версии всех системных библиотек
(libpthreads
и libdl
), поэтому компилировать MySQL с опцией -static
нельзя. При попытке такой компиляции вы получите одно из приведенных ниже
сообщений об ошибке:
ld: fatal: library -ldl: not found или undefined reference to `dlopen' или cannot find -lrt
Если слишком много процессов одновременно пытаются установить соединение с
mysqld
, то в файле протокола MySQL появится следующее сообщение об ошибке:
Error in accept: Protocol error
Для решения этой проблемы можно попытаться запустить сервер с опцией
--set-variable back_log=50
(see section 4.1.1 Параметры командной строки mysqld
).
Если вы линкуете собственный MySQL-клиент, то при попытке его запустить может выдаваться следующее сообщение об ошибке:
ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory
Проблему можно решить одним из следующих способов:
-Lpath
):
-Wl,r/полный-путь-к-libmysqlclient.so
.
LD_RUN_PATH
.
Если вы столкнулись с проблемами конфигурирования, пытаясь линковать с
опцией -lz
и у вас не установлена zlib
, существует два варианта:
--with-named-z-libs=no
.
Если при использовании gcc
вы столкнулись с проблемами загрузки
UDF-функций в MySQL, попробуйте добавить -lgcc
к строке, отвечающей за
линкование UDF-функций.
Для того чтобы MySQL-сервер стартовал автоматически, можно скопировать `support-files/mysql.server' в `/etc/init.d' и создать на него символическую ссылку `/etc/rc3.d/S99mysql.server'.
Поскольку Solaris не поддерживает файлы образа памяти для приложений,
использующих setuid()
, невозможно получить файл образа памяти программы
mysqld
при использовании опции --user
.
На Solaris 2.7 и 2.8 можно нормально использовать бинарные файлы для Solaris 2.6. Большинство вопросов по работе с Solaris 2.6 относятся также и к Solaris 2.7 и 2.8.
Необходимо отметить, что MySQL версии 3.23.4 и последующих может автоматически определять новые версии Solaris и избегать описанных ниже проблем!
В Solaris 2.7/2.8 имеются некоторые ошибки во включаемых файлах. При использовании gcc вы можете получить следующие сообщения об ошибках:
/usr/include/widec.h:42: warning: `getwc' redefined /usr/include/wchar.h:326: warning: this is the location of the previous definition
В этом случае для исправления ошибки нужно выполнить следующие действия:
Скопируйте /usr/include/widec.h
в .../lib/gcc-lib/os/gcc-version/include
и
измените строку с номером 41, содержащую:
#if !defined(lint) && !defined(__lint) на #if !defined(lint) && !defined(__lint) && !defined(getwc)
Есть и альтернативный вариант - отредактировать `/usr/include/widec.h'
непосредственно на месте. В любом случае после исправления необходимо
удалить `config.cache' и запустить configure
повторно!
Если при запуске make
выдаются сообщения об ошибках наподобие упомянутых
ниже, причина в том, что программа configure
не обнаружила файл `curses.h'
(возможно, из-за ошибок в `/usr/include/widec.h'):
In file included from mysql.cc:50: /usr/include/term.h:1060: syntax error before `,' /usr/include/term.h:1081: syntax error before `;'
Решить эту проблему можно одним из способов:
CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure
(эта запись должна быть цельной строкой, без пробелов).
configure
.
#define HAVE_TERM
из `config.h' и запустить make
повторно.
Если редактор связей не может обнаружить -lz
при линковании вашей
клиентской программы, то проблема, возможно, заключается в том, что файл
`libz.so' установлен в `/usr/local/lib'. Данную проблему можно решить любым из
приведенных выше способов:
LD_LIBRARY_PATH
.
--with-named-z-libs=no
.
На Solaris 2.8 на x86-й архитектуре mysqld
аварийно завершится с
сохранением образа памяти на диске, если он обработан программой strip
.
Если при использовании gcc
или egcs
на Solaris x86 при большой нагрузке вы
столкнетесь с проблемой аварийного завершения программы с сохранением
образа памяти на диске, используйте при сборке команду configure
со
следующими параметрами:
CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \ CXX=gcc \ CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions \ -fno-rtti -DHAVE_CURSES_H" \ ./configure --prefix=/usr/local/mysql
Это позволит избежать проблем с библиотекой libstdc++
и исключительными
ситуациями в C++.
Если приведенные рекомендации не помогают, соберите версию с отладочной
информацией и запустите программу с созданием трассировочного файла или в
отладчике gdb
(see section E.1.3 Отладка mysqld при помощи gdb).
В этом разделе находится информация относительно различных BSD-систем, а также конкретных версий этих систем.
Для работы Mysql рекомендуется FreeBSD версий 3.x, поскольку версия с потоками является намного более интегрированной.
Простейшим, а поэтому и более предпочтительным способом установки является
использование портов mysql-server
и mysql-client
из коллекции портов
FreeBSD, которая доступна по адресу http://www.freebsd.org/.
Использование этих портов обеспечивает:
pkg_info -L
и удаления их при помощи команды pkg_delete
в случае, если вы более не
нуждаетесь в MySQL на данной машине.
Рекомендуется использовать MIT-pthreads на FreeBSD версий 2.x и
собственные потоки для 3.x и более поздних версий FreeBSD. На некоторых
последних версиях 2.2.x возможно применение собственных потоков, но при
этом не исключены проблемы с остановкой mysqld
.
Для сборки MySQL в соответствии с Makefile
'ом необходима программа GNU
make (gmake
). Прежде чем выполнять сборку MySQL, следует установить GNU
make.
Удостоверьтесь, что используемый вами сервер имен работает корректно. В
противном случае возможны задержки или ошибки при соединении с mysqld
.
Убедитесь в корректности записи localhost
в файле `/etc/hosts' (при
отсутствии или ошибочности этой записи возникнут проблемы соединения с
базой). Файл `/etc/hosts' должен начинаться с записи:
127.0.0.1 localhost localhost.your.domain
Предлагаемый способ сборки и установки MySQL на FreeBSD с использованием
gcc
(версии 2.95.2 или более поздней):
CC=gcc CFLAGS="-O2 -fno-strength-reduce" \ CXX=gcc CXXFLAGS="-O2 -fno-rtti -fno-exceptions -felide-constructors \ -fno-strength-reduce" \ ./configure --prefix=/usr/local/mysql --enable-assembler gmake gmake install ./scripts/mysql_install_db cd /usr/local/mysql ./bin/mysqld_safe &
Если программа configure
решила использовать MIT-pthreads, необходимо
ознакомится с примечаниями по MIT-pthreads (see section 2.3.6 Замечания по потокам MIT-pthreads).
Если при выполнении make install
возникла ошибка, сообщающая о
невозможности нахождения `/usr/include/pthreads' (can't find
`/usr/include/pthreads'), это значит, что configure
не определил
необходимость использования MIT-pthreads. Для исправления данной ошибки
необходимо выполнить следующие команды:
shell> rm config.cache shell> ./configure --with-mit-threads
Как известно, в FreeBSD по умолчанию установлено очень небольшое значение
для количества одновременно открытых файлов (see section A.2.16 Не найден файл (File not found
)).
Чтобы исправить положение, следует раскомментировать секцию ulimit -n
в
скрипте safe_mysqld
или повысить ограничение для пользователя mysqld
в
`/etc/login.conf' (не забудьте перестроить его командой cap_mkdb
`/etc/login.conf'). Помимо этого, имеет смысл проверить установку
подходящего класса для этого пользователя в файле паролей, если не
используется значение по умолчанию (при помощи chpass mysqld-user-name
).
See section 4.7.2 safe_mysqld
, оболочка mysqld
.
При наличии значительного объема оперативной памяти можно рассмотреть
вариант перестройки ядра, чтобы разрешить MySQL использовать более чем
512Mб оперативной памяти. Чтобы получить больше информации, обратитесь к
option MAXDSIZ
в конфигурационном файле LINT.
В случае возникновения проблем с текущей датой в MySQL ситуацию может
исправить правильная установка переменной TZ
. See section F Переменные окружения.
Для получения безопасной и устойчивой системы следует использовать
только те ядра системы FreeBSD, которые обозначены как -RELEASE
.
Для компиляции на NetBSD необходимо, чтобы была установлена программа GNU
make
. В противном случае компиляция завершится аварийно при попытке make
запустить lint
на файлах C++.
На OpenBSD версии 2.5 можно компилировать MySQL с использованием собственных потоков. Необходимо указать следующие опции:
CFLAGS=-pthread CXXFLAGS=-pthread ./configure -with-mit-threads=no
По сообщениям наших пользователей, OpenBSD 2.8 содержит ошибку в реализации потоков, которая вызывает проблемы с MySQL. Разработчики OpenBSD устранили эту ошибку, но к 25 января 2001 года исправленная версия доступна только в ветви ``-current''. Симптомы этой ошибки реализации потоков следующие: медленный ответ, высокая загрузка, большая загрузка процессора и аварийная остановка программы.
Получение сообщения об ошибке вроде Error in accept:: Bad file
descriptor
или ошибки 9 при попытке открыть таблицу либо каталог
означает, что вы не заказали достаточно дескрипторов файлов для MySQL.
В этом случае попробуйте запустить safe_mysqld
от имени пользователя root
с опциями:
--user=mysql --open-files-limit=2048
Получение приведенной ниже ошибки при компиляции MySQL означает, что
установленное с помощью ulimit
значение размера виртуальной памяти слишком
мало:
item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)': item_func.h:28: virtual memory exhausted make[2]: *** [item_func.o] Error 1
Попробуйте выполнить ulimit -v 80000
и запустить make
еще раз. Если это не
поможет, а в качестве оболочки используется bash
, попробуйте перейти на
csh
или sh
: некоторые пользователи BSDI сообщали нам о проблемах с bash
и
ulimit
.
Если вы используете gcc
, то, возможно, необходимо добавить флаг
--with-low-memory
при запуске configure
, чтобы обеспечить возможность
компиляции `sql_yacc.cc'.
При возникновении проблем с текущей датой в MySQL может помочь установка
переменной TZ
(see section F Переменные окружения).
Для конфигурирования MySQL следует использовать следующую команду:
shell> env CXX=shlicc++ CC=shlicc2 \ ./configure \ --prefix=/usr/local/mysql \ --localstatedir=/var/mysql \ --without-perl \ --with-unix-socket-path=/var/mysql/mysql.sock
Сработает и следующая командная строка:
shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure \ --prefix=/usr/local/mysql \ --with-unix-socket-path=/var/mysql/mysql.sock
При желании вы можете изменить местоположение каталогов или использовать значения по умолчанию, не определяя никаких путей.
Если возникнут проблемы с производительностью при большой нагрузке,
попробуйте при запуске mysqld
использовать опцию --skip-thread-priority
!
Применение данной опции приведет к тому, что все потоки будут работать с
одинаковым приоритетом; на BSDI версии 3.1 это обеспечивало повышение
производительности (по крайней мере, пока не был исправлен планировщик
потоков).
В случае получения сообщения об ошибке virtual memory exhausted
во время
компиляции попробуйте выполнить ulimit -v 80000
и запустить make
повторно.
Если это не поможет, а в качестве оболочки у вас используется bash
,
попробуйте перейти на csh
или sh
: некоторые пользователи BSDI сообщали о
проблемах с bash
и ulimit
.
BSDI версий 4.x содержит ошибку, имеющую отношение к потокам. Если вы планируете использовать MySQL на этой системе, необходимо предварительно установить все патчи, относящиеся к реализации потоков. По крайней мере, должен быть установлен M400-023.
На некоторых системах BSDI версий 4.x вы можете столкнуться с проблемами
при использовании динамических библиотек. Проявляется это как
невозможность выполнить какую-либо клиентскую программу, например
mysqladmin
. В данном случае необходимо переконфигурировать MySQL с
запретом использовать динамические библиотеки, указав для скрипта
configure опцию --disable-shared
.
Некоторые пользователи сообщали нам о проблемах на BSDI 4.0.1, которые
проявляются в том, что через некоторое время после начала работы mysqld
не
может открыть таблицы. Это происходит потому, что из-за какой-то системной
или библиотечной ошибки mysqld
изменяет текущий каталог без какого-либо
запроса!
Для решения проблемы необходимо либо обновить MySQL до версии 3.23.34,
либо после запуска configure
удалить строку #define HAVE_REALPATH
из файла
`config.h' перед запуском make
.
Отметим, что вышеописанные действия приведут к невозможности создать символическую ссылку из одних каталогов базы данных на другой каталог базы данных или символическую ссылку на таблицу в другой базе данных на BSDI! (Создание символической ссылки на другой диск допускается.)
На общедоступной бета-версии Mac OS X (Darwin) MySQL должен работать без каких-либо проблем. Для этой операционной системы нет необходимости в патчах к pthread!
Прежде чем попытаться отконфигурировать MySQL на сервере Mac OS X,
необходимо установить пакет pthread
, который находится по адресу
http://www.prnet.de/RegEx/mysql.html.
Наши бинарные файлы для Mac OS X компилируются на Rhapsody 5.5 со следующими конфигурационными параметрами:
CC=gcc CFLAGS="-O2 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O2 \ -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql \ "--with-comment=Official MySQL binary" --with-extra-charsets=complex \ --disable-shared
Возможно, вам понадобится добавить псевдонимы в файл ресурсов оболочки -
для доступа к mysql
и mysqladmin
из командной строки:
alias mysql '/usr/local/mysql/bin/mysql' alias mysqladmin '/usr/local/mysql/bin/mysqladmin'
Некоторые бинарные поставки MySQL для HP-UX распространяются как файлы HP depot и tar. Для использования файла depot у вас должна быть установлена версия HP-UX не выше 10.x - для того, чтобы обеспечить возможность работы с HP-инструментарием работы с depot-файлами.
Версия MySQL для HP была скомпилирована на сервере HP 9000/8xx в системе HP-UX 10.20 с использованием MIT-pthreads. Известно, что она хорошо работает в этой конфигурации. MySQL версии 3.22.26 и выше можно также собрать с использованием собственных потоков HP.
Другие конфигурации, на которых возможна работа MySQL:
На следующих конфигурациях MySQL, скорее всего, работать не будет:
Для установки дистрибутива используйте одну из представленных ниже команд;
здесь /path/to/depot
- полный путь к depot-файлу:
shell> /usr/sbin/swinstall -s /path/to/depot mysql.full
shell> /usr/sbin/swinstall -s /path/to/depot mysql.server
shell> /usr/sbin/swinstall -s /path/to/depot mysql.client
shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer
depot помещает бинарные исполняемые файлы и библиотеки в `/opt/mysql', а
данные - в `/var/opt/mysql'. depot также создает соответствующие строки в
`/etc/init.d' и `/etc/rc2.d' для автоматического запуска сервера при загрузке
машины. Очевидно, что для установки необходимо обладать правами
пользователя root
.
Для установки на HP-UX дистрибутива tar.gz на машине должен быть
установлен GNU tar
.
При компиляции MySQL на HP-UX существует пара небольших проблем. Мы
рекомендуем применять вместо собственного компилятора HP-UX gcc
, потому
что код, созданный gcc
, лучше!
Для HP-UX рекомендуется использование gcc 2.95. Не следует применять высокие уровни оптимизации (наподобие -O6), поскольку на HP-UX это может быть небезопасно.
Заметим, что MIT-pthreads не могут быть скомпилированы компилятором HP-UX,
поскольку он не компилирует ассемблерные файлы .S
.
Должна работать следующая строка конфигурации:
CFLAGS="-DHPUX -I/opt/dce/include -fpic" \ CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions \ -fno-rtti" CXX=gcc ./configure --with-pthread \ --with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared
Если вы компилируете gcc
2.95 самостоятельно, то для того, чтобы
компилировать MySQL с MIT-pthreads, НЕ следует линковать его с
DCE-библиотеками (libdce.a
или libcma.a
). Если смешать пакеты DCE и
MIT-pthreads, то в результате получится mysqld
, к которому нельзя
подсоединиться. Удалите DCE-библиотеки во время компиляции gcc
2.95!
Для HP-UX версий 11.x мы рекомендуем использовать MySQL не ниже 3.23.15.
Из-за некоторых критических ошибок в стандартных библиотеках HP-UX до попытки запуска MySQL на HP-UX 11.0 необходимо установить следующие патчи:
PHKL_22840 Streams cumulative PHNE_22397 ARPA cumulative
Применение данных патчей решит проблему получения EWOULDBLOCK
от recv()
и
EBADF
от accept()
в потоковых приложениях.
При использовании gcc
2.95.1 в системе, к которой не были применены патчи,
возникнет ошибка:
In file included from /usr/include/unistd.h:11, from ../include/global.h:125, from mysql_priv.h:15, from item.cc:19: /usr/include/sys/unistd.h:184: declaration of C function ... /usr/include/sys/pthread.h:440: previous declaration ... In file included from item.h:306, from mysql_priv.h:158, from item.cc:19:
Проблема заключается в том, что HP-UX существуют несовместимые определения
функции pthreads_atfork()
. Конфликтующие прототипы находятся в
`/usr/include/sys/unistd.h':184 и в `/usr/include/sys/pthread.h':440
(подробности приведены ниже).
Одно из возможных решений заключается в том, чтобы скопировать
`/usr/include/sys/unistd.h' в `mysql/include' и отредактировать `unistd.h' так,
чтобы определение совпадало с определением из `pthread.h'. Ниже приведен
результат работы diff
:
183,184c183,184 < extern int pthread_atfork(void (*prepare)(), void (*parent)(), < void (*child)()); --- > extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), > void (*child)(void));
После этого должна работать конфигурационная программа со следующими параметрами:
CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O3" \ ./configure --prefix=/usr/local/mysql --disable-shared
Ниже приведена информация, которую прислал нам пользователь HP-UX версии 11.x. Она касается компиляции MySQL компилятором Hp-UX:x:
Окружение: подходящие компиляторы. setenv CC cc setenv CXX aCC опции setenv CFLAGS -D_REENTRANT setenv CXXFLAGS -D_REENTRANT setenv CPPFLAGS -D_REENTRANT % aCC -V aCC: HP ANSI C++ B3910B X.03.14.06 % cc -V /tmp/empty.c cpp.ansi: HP92453-01 A.11.02.00 HP C Preprocessor (ANSI) ccom: HP92453-01 A.11.01.00 HP C Compiler cc: "/tmp/empty.c", line 1: warning 501: Empty source file. конфигурация: ./configure --with-pthread \ --prefix=/source-control/mysql \ --with-named-thread-libs=-lpthread \ --with-low-memory
к `include/m_ctype.h' добавлена запись #define _CTYPE_INCLUDED
. Это одно из
обозначений, определенных в HP в `/usr/include/ctype.h':
/* Don't include std ctype.h when this is included */ #define _CTYPE_H #define __CTYPE_INCLUDED #define _CTYPE_INCLUDED #define _CTYPE_USING /* Don't put names in global namespace. */
localtime_r
, во
время компиляции необходимо использовать флаг -D_REENTRANT
. Можно также
написать собственный прототип для localtime_r
. Но я хочу устранить
существующие ошибки без внесения новых. Поскольку я не знаю точно, когда
этот ключ действительно нужен, я добавил его использование во всех
случаях.
При получении следующего сообщения об ошибке при работе configure
checking for cc option to accept ANSI C... no configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the Installation chapter in the Reference Manual.
следует удостовериться, что путь к компилятору K&R не указан раньше, чем путь к компиляторам HP-UX C и C++.
В Autoconf пропущено автоматическое определение xlC
, поэтому при
компиляции MySQL следует задавать команду configure
наподобие следующей (в
этом примере используется компилятор IBM):
export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 " export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192" export CFLAGS="-I /usr/local/include" export LDLFAGS="-L /usr/local/lib" export CPPFLAGS=$CFLAGS export CXXFLAGS=$CFLAGS ./configure --prefix=/usr/local \ --localstatedir=/var/mysql \ --sysconfdir=/etc/mysql \ --sbindir='/usr/local/bin' \ --libexecdir='/usr/local/bin' \ --enable-thread-safe-client \ --enable-large-files
Здесь указаны опции, используемые для компиляции дистрибутива MySQL, который находится по адресу http://www-frec.bull.com/.
Если в приведенных выше строках конфигурации вы изменяете -O3
на -O2
,
следует также удалить опцию -qstrict
(это ограничение компилятора IBM C).
При использовании gcc
или egcs
для компиляции MySQL следует применять флаг
-fno-exceptions
, потому что обработчик исключительных ситуаций в gcc
/egcs
не безопасен в реализации потоков! (Это проверено на egcs
1.1.) Существуют
также некоторые известные проблемы с ассемблером IBM, которые могут
привести к генерации неудачного кода при использовании его с gcc
.
Для использования egcs
или gcc
2.95 на AIX мы рекомендуем следующую строку
конфигурирования:
CC="gcc -pipe -mcpu=power -Wa,-many" \ CXX="gcc -pipe -mcpu=power -Wa,-many" \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory
Для того чтобы компиляция была успешной, здесь необходимо указывать ключи
-Wa
,-many
. В IBM известно о существовании данной проблемы, но ее
специалисты не торопятся исправлять ошибку, поскольку существует способ
обхода. Нам неизвестно, необходимо ли использование -fno-exceptions
с gcc
2.95, но поскольку в MySQL нет обработчика исключительных ситуаций, а эта
опция способствует созданию более быстрого кода, мы рекомендуем всегда
использовать ее с egcs
/gcc
.
В случае возникновения проблем в программах на ассемблере необходимо привести -mcpu=xxx в соответствие со своим процессором. Обычно достаточно использовать power2, power или powerpc, но, возможно, необходимо будет указать 604 или 604e. Хотя это и не приветствуется, но использование "power" будет безопасным почти всегда, даже на power2-машинах.
Если вы не знаете, какой у вас процессор, следует запустить uname -m. Данная команда возвращает строку наподобие "000514676700", формат которой xxyyyyyymmss, где xx и ss всегда 0, yyyyyy - уникальный идентификатор системы и mm - идентификатор процессора Planar. Карта этих значений находится по адресу http://publib.boulder.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm.
В соответствии с данной картой можно узнать тип и модель машины, а уже по ним -определить тип процессора.
Возникновение проблем с сигналами (MySQL неожиданно умирает при большой нагрузке) может означать, что вы столкнулись с ошибкой операционной системы в работе с потоками и сигналами. В этом случае можно запретить MySQL использовать сигналы при помощи следующей строки конфигурации:
shell> 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
Это не повлияет на производительность MySQL, но приведет к побочному
эффекту, состоящему в невозможности оборвать работу клиента со спящим
соединением при помощи команд mysqladmin kill
или mysqladmin shutdown
.
Вместо этого клиент завершит работу при попытке послать следующую команду.
На некоторых версиях AIX линкование с libbind.a
приводит к тому, что
getservbyname вызывает аварийную остановку программы с сохранением образа
памяти на диск (core dump). Это ошибка AIX и о ней следует сообщить в IBM.
Для AIX 4.2.1 и gcc необходимо сделать следующие изменения:
После конфигурации следует отредактировать файлы `config.h' и `include/my_config.h', а также изменить строку, содержащую
#define HAVE_SNPRINTF 1
на
#undef HAVE_SNPRINTF
И напоследок необходимо в файле `mysqld.cc' добавить прототип функции
initgoups
.
#ifdef _AIX41 extern "C" int initgroups(const char *,int); #endif
На SunOS 4 для компиляции MySQL необходимо использовать MIT-pthreads, что,
в свою очередь, влечет за собой необходимость в GNU make
.
На некоторых SunOS 4 возникают проблемы с динамическими библиотеками и
libtool
. Во избежание этих проблем можно использовать приведенную ниже
строку configure
:
shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static
При компиляции readline
могут выдаваться предупреждения о дублирующихся
определениях. На них можно не обращать внимания.
При компиляции mysqld
возникают предупреждения об implicit declaration of
function
. На них также можно не обращать внимания.
При использовании egcs на Digital Unix необходимо обновить свою версию до gcc 2.95.2, поскольку известно о нескольких серьезных ошибках в egcs для DEC!
В документации рекомендуется для компиляции потоковых программ под Digital
Unix использовать опцию -pthread
для cc
и cxx
, а также библиотеки -lmach
-lexc
(в дополнение к -lpthread
). Запускать configure
нужно в следующей
форме:
CC="cc -pthread" CXX="cxx -pthread -O" \ ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc"
При компиляции mysqld
может быть выдано несколько предупреждений наподобие
следующих:
mysqld.cc: In function void handle_connections()': mysqld.cc:626: passing long unsigned int *' as argument 3 of accept(int,sockadddr *, int *)'
На них можно не обращать внимания. Они возникают из-за того, что configure
может обнаруживать только ошибки, но не предупреждения.
При запуске сервера непосредственно из командной строки могут возникнуть
проблемы с тем, что он прекращает работу при выходе из системы (при выходе
из системы все процессы, запущенные вами во время работы, получают сигнал
SIGHUP
). Если такое происходит, следует запускать сервер командой:
shell> nohup mysqld [options] &
При указании nohup
следующая за ней команда будет игнорировать все сигналы
SIGHUP
, посланные терминалом. В качестве альтернативного варианта можно
запускать сервер командой safe_mysqld
, которая при запуске mysqld
выполнит
вызов nohup
вместо вас (see section 4.7.2 safe_mysqld
, оболочка mysqld
).
Если вы столкнулись с проблемами компиляции `mysys/get_opt.c', следует
просто удалить строку #define _NO_PROTO
в начале этого файла!
Для компилятора CC от Compaq используйте следующий код:
CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host \ -noexceptions -nortti" export CC CFLAGS CXX CXXFLAGS ./configure \ --prefix=/usr/local/mysql \ --with-low-memory \ --enable-large-files \ --enable-shared=yes \ --with-named-thread-libs="-lpthread -lmach -lexc -lc" gnumake
В случае возникновения проблем с libtool при компиляции с динамическими
библиотеками (как показано выше), при линковании mysql
вы можете избежать
этих проблем с помощью:
cd mysql /bin/sh ../libtool --mode=link cxx -pthread -O3 -DDBUG_OFF \ -O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all \ -arch host -DUNDEF_HAVE_GETHOSTBYNAME_R \ -o mysql mysql.o readline.o sql_string.o completion_hash.o \ ../readline/libreadline.a -lcurses \ ../libmysql/.libs/libmysqlclient.so -lm cd .. gnumake gnumake install scripts/mysql_install_db
В случае проблем компиляции при установленных DEC CC
и gcc
попробуйте
запустить configure
следующим образом:
CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql
Если возникнут проблемы с файлом `c_asm.h', можно создать и использовать ``фиктивный'' `c_asm.h' при помощи следующих команд:
touch include/c_asm.h CC=gcc CFLAGS=-I./include \ CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql
Отметим, что перечисленные ниже проблемы с программой ld
могут быть решены
путем загрузки последнего набора патчей от DEC (Compaq) с
http://ftp.support.compaq.com/public/unix/.
При использовании OSF/1 4.0D и компилятора DEC C V5.6-071 на Digital Unix
V4.0 (Rev. 878) компилятор начинает вести себя странно (неопределенные
asm-символы). Кроме того, /bin/ld
также, похоже, содержит ошибки (проблемы
с ошибками _exit undefined
возникающими при линковании mysqld
). На этих
системах нам удалось организовать компиляцию MySQL с помощью следующей
строки configure
, заменив /bin/ld
аналогичным файлом из версии OSF 4.0C:
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
С Digital-компилятором "C++ V6.1-029" должно работать:
CC=cc -pthread CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all \ -arch host CXX=cxx -pthread CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all \ -arch host -noexceptions -nortti export CC CFLAGS CXX CXXFLAGS ./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static \ --disable-shared --with-named-thread-libs="-lmach -lexc -lc"
В некоторых версиях OSF/1 испорчена функция alloca()
. Ситуацию можно
поправить удалением из файла `config.h' строки, в которой определяется
HAVE_ALLOCA
.
Может также существовать некорректный прототип для функции alloca()
в
`/usr/include/alloca.h'. Предупреждение, вызванное этим, можно игнорировать.
configure
будет автоматически использовать следующие потоковые библиотеки:
--with-named-thread-libs="-lpthread -lmach -lexc -lc"
.
При использовании gcc можно попробовать запустить configure
следующей
строкой:
shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ...
Возникновение проблем с сигналами (MySQL неожиданно аварийно завершает работу при большой нагрузке), может означать, что вы обнаружили ошибку при работе операционной системы с потоками и сигналами. В данном случае можно запретить MySQL использовать сигналы путем конфигурации его следующим образом:
shell> CFLAGS=-DDONT_USE_THR_ALARM \ CXXFLAGS=-DDONT_USE_THR_ALARM \ ./configure ...
Это не повлияет на производительность MySQL, но приведет к побочному
эффекту, который проявляется как невозможность оборвать работу клиента со
спящим соединением командами mysqladmin kill
или mysqladmin shutdown
.
Вместо этого клиент завершит работу при попытке послать следующую команду.
При использовании gcc
2.95.2 может возникать следующая ошибка компиляции:
sql_acl.cc:1456: Internal compiler error in `scan_region', at except.c:2566 Please submit a full bug report.
Чтобы выйти из положения в этом случае, следует перейти в каталог `sql' и
выполнить последнюю строку gcc
(просто выделите ее, например, мышкой и
вставьте в терминал), изменив в ней -O3
на -O0
(или добавьте -O0
непосредственно после gcc
, если у вас в строке компиляции отсутствует
какая-либо опция -O
). После выполнения указанных действий вернитесь в
каталог верхнего уровня и запустите make
повторно.
При использовании Irix 6.5.3 или выше mysqld
может создавать потоки только
в случае, если он запущен от имени пользователя с привилегиями
CAP_SCHED_MGT
(подобными тем, что у root
) или если такие привилегии даются
серверу mysqld
следующей командой:
shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
Возможно, вам придется убрать некоторые определения из `config.h'. Это
делается после выполнения configure
, но до компиляции.
В некоторых реализациях Irix неправильно реализована функция alloca()
.
Если сервер mysqld
аварийно завершает работу при выполнении некоторых
выражений SELECT
, удалите из `config.h' строки, в которых определяются
HAVE_ALLOC
и HAVE_ALLOCA_H
. Если не работает mysqladmin create
, удалите из
`config.h' строку, определяющую HAVE_READDIR_R
. Можно также удалить строку,
содержащую HAVE_TERM_H
.
SGI рекомендует установить все патчи, как указано на странице
http://support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html.
Вам следует, как минимум, установить последние обновления (rollup) ядра,
последние обновления rld
и последние обновления libc
.
Для поддержки pthreads обязательно следует установить все патчи POSIX со страницы:
http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html
Если при компиляции `mysql.cc' вы получили сообщение об ошибке наподобие:
"/usr/include/curses.h", line 82: error(1084): invalid combination of type
то необходимо выполнить следующие команды в каталоге верхнего уровня дерева каталогов исходных текстов MySQL:
shell> extra/replace bool curses_bool < /usr/include/curses.h \ > include/curses.h shell> make
Мы получали также сообщения о проблемах управления. Если выполняется только один поток, то работа идет очень медленно. Однако если запустить еще одну программу-клиент, то можно получить ускорение в несколько раз (от двукратного до десятикратного соответственно) и для других потоков. Причины описанной проблемы с потоками в Irix пока неясны; возможно, вам удастся найти временное решение, пока она не будет решена.
При компиляции с помощью gcc
можно использовать следующую команду
configure
:
CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql --enable-thread-safe-client \ --with-named-thread-libs=-lpthread
Сообщают, что для Irix 6.5.11 с собственными Irix C и C++ компиляторами версии 7.3.1.2, должно работать:
CC=cc CXX=CC CFLAGS='-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \ -L/usr/local/lib' CXXFLAGS='-O3 -n32 -TARG:platform=IP22 \ -I/usr/local/include -L/usr/local/lib' ./configure \ --prefix=/usr/local/mysql --with-innodb --with-berkeley-db \ --with-libwrap=/usr/local \ --with-named-curses-libs=/usr/local/lib/libncurses.a
В настоящее время пакет тестировался только на системах ``sco3.2v5.0.4'' и ``sco3.2v5.0.5''. Заметный прогресс отмечается в отношении пакета на ``sco3.2v4.2''.
В настоящее время в качестве компилятора под OpenServer мы рекомендуем gcc 2.95.2. Используя его, можно скомпилировать MySQL при помощи следующей строки:
CC=gcc CXX=gcc ./configure ... (опции)
./configure
в каталоге threads/src
и выберите опцию SCO
OpenServer. Эта команда скопирует Makefile.SCO5
в Makefile
.
make
.
root
, перейдите в каталог thread/src
и запустите make
install
.
make
при сборке MySQL.
safe_mysqld
не с правами пользователя root
вы получите
разрешение открывать одновременно только 110 файлов на процесс (это
значение установлено по умолчанию). mysqld
сообщит об этом в файле
протокола.
configure
должна выполняться корректно:
shell> ./configure --prefix=/usr/local/mysql --disable-shared
configure
должна выполняться корректно:
shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \ ./configure \ --prefix=/usr/local/mysql \ --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \ --with-named-curses-libs="-lcurses"У вас могут возникнуть проблемы с некоторыми включаемыми файлами. В таком случае новые, специфические для SCO включаемые файлы можно найти по адресу http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Этот архив следует распаковать в каталог дерева исходных текстов MySQL с именем
include
Замечания по разработке под Caldera (SCO):
mysqld
с использованием -lgthreads -lsocket -lgthreads
.
malloc
. При возникновении проблем с
использованием памяти, убедитесь, что `gmalloc.o' включен в `libgthreads.a' и
`libgthreads.so'.
read()
,
write()
, getmsg()
, connect()
, accept()
, select()
, and wait()
.
mysqld
. Если вы собираетесь
запускать mysqld
на машине с установленным OpenServer 5.0.6, этот патч
применять не следует.
Если необходимо установить DBI на Caldera (SCO), следует отредактировать
Makefile
в DBI-xxx и каждом подкаталоге.
Для приведенного ниже кода подразумевается использование gcc 2.95.2 или более новой версии:
СТАРЫЙ: НОВЫЙ: CC = cc CC = gcc CCCDLFLAGS = -KPIC -W1,-Bexport CCCDLFLAGS = -fpic CCDLFLAGS = -wl,-Bexport CCDLFLAGS = LD = ld LD = gcc -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 = ld LD = gcc -G -fpic OPTIMISE = -Od OPTIMISE = -O1 OLD: CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include НОВЫЙ: CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
Это вызвано тем, что dynaloader
из Perl не загружает DBI-модулей, если они
скомпилированы компиляторами icc
или cc
.
Perl будет работать лучше, если его скомпилировать компилятором cc
.
Вы должны использовать MySQL версий не ниже 3.22.13, поскольку в этой версии исправлены некоторые проблемы, связанные с переносимостью под Unixware.
Нам удалось скомпилировать MySQL следующей командой configure
на Unixware
версии 7.0.1:
CC=cc CXX=CC ./configure --prefix=/usr/local/mysql
Если вы хотите использовать gcc
, необходимо использовать gcc
версии 2.95.2
или новее.
Caldera поставляет libsocket.so.2 с ftp://stage.caldera.com/pub/security/tools для исправлений безопасности в более ранних, чем OSR506, системах. Кроме того, исправление telnetd на ftp://stage.caldera.com/pub/security/openserver/CSSA-2001-SCO.10/ предназначено и для libsocket.so.2, и для libresolv.so.1. Там же находятся инструкции для установки на более ранние, чем OSR506, системы.
Устанавливать вышеупомянутые патчи лучше до попытки компиляции/использования MySQL.
В MySQL используется достаточно много открытых файлов. Поэтому в свой файл `CONFIG.SYS' вам нужно добавить код вроде приведенного ниже:
SET EMXOPT=-c -n -h1024
В противном случае вы можете столкнуться со следующей ошибкой:
File 'xxxx' not found (Errcode: 24)
При использовании MySQL с OS/2 Warp 3 требуется FixPack 29 или выше, а с OS/2 Warp 4 -FixPack 4 или выше. Это требуется для библиотеки Pthreads. MySQL может быть установлен на файловой системе, поддерживающей длинные имена, такой как HPFS, FAT32, и т.п.
Скрипт `INSTALL.CMD' должен запускаться из собственной оболочки OS/2 - `CMD.EXE'; и может не работать в заменяющих ее оболочках, таких как `4OS2.EXE'.
Скрипт `scripts/mysql-install-db' был переименован. Теперь он называется `install'.cmd и является REXX-скриптом, который задает установки безопасности MySQL по умолчанию и создает иконку WorkPlace Shell для MySQL.
Поддержка динамических модулей скомпилирована, но полностью не проверена. Динамические модули должны быть скомпилированы с использованием динамической библиотеки Pthreads.
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \ -o example udf_example.cc -L../lib -lmysqlclient udf_example.def mv example.dll example.udf
Примечание: в соответствии с ограничениями OS/2 размер основной части имен
модулей UDF не должен превышать 8-ми символов. Модули хранятся в каталоге
`/mysql2/udf'; скрипт s`afe-mysqld.cmd' помещает путь к этому каталогу в
переменную окружения BEGINLIBPATH
. При использовании UDF-модулей
определенные расширения игнорируются - они все принимаются как `.udf'.
Например, в Unix динамический модуль может иметь имя `example.so' и функция
из него будет загружаться следующим образом:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";
В OS/2 модуль будет иметь имя `example.udf', но вы не должны определять расширение модуля:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example";
Мы заинтересованы в том, чтобы MySQL работал в BeOS, но, к сожалению, среди нас нет никого, кто знал бы BeOS или обладал временем для создания портированной версии.
Если найдутся желающие создать портированную версию, то мы готовы оказать им помощь в решении любых технических вопросов, которые могут возникнуть при создании портированной версии.
У нас было предварительное общение с некоторыми разработчиками BeOS, утверждавших, что на 80% создана портированная версия MySQL под BeOS, однако уже на протяжении длительного времени мы не получали от них никаких известий.
Мы заинтересованы в том, чтобы MySQL работал на Novell NetWare, но, к сожалению, среди нас нет никого, кто достаточно хорошо разбирался бы в NetWare или обладал временем для создания портированной версии.
Мы хотели бы найти желающих создать портированную версию и готовы помочь им в решении любых технических вопросов, которые могут возникнуть при работе над ней.
Поддержка Perl для MySQL обеспечивается средствами клиентского интерфейса
DBI
/DBD
. See section 8.2 Интерфейс Perl API для MySQL. Для клиентского кода Perl DBD
/DBI
требуется версия Perl 5.004 или выше. При использовании более старой
версии Perl данный интерфейс не будет работать.
Для поддержки Perl в MySQL также требуется, чтобы была установлена
программная поддержка клиентов MySQL. Если вы установили MySQL из файлов
RPM, то клиентские программы находятся в RPM-пакете MySQL-client
, а их
программная поддержка - в RPM-пакете MySQL-devel
. Убедитесь, что у вас
установлена последняя версия RPM.
С версии 3.22.8 поддержка Perl поставляется отдельно от основного дистрибутива MySQL. Если вы хотите установить поддержку Perl, то необходимые файлы можно получить с http://www.mysql.com/Downloads/Contrib/.
Дистрибутивы Perl поставляются как сжатые tar-архивы с именами
наподобие `MODULE-VERSION.tar.gz', где MODULE
- имя модуля и VERSION
- номер версии. Необходимо взять дистрибутивы Data-Dumper
, DBI
и
Msql-Mysql-modules
и установить их в указанном порядке. Процедура
установки приведена ниже. Показанный пример приведен для модуля
Data-Dumper
, но сама процедура одинакова для всех трех дистрибутивов:
shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -Эта команда создает каталог с именем `Data-Dumper-VERSION'. Перейдите в каталог, куда распаковался дистрибутив:
shell> cd Data-Dumper-VERSIONСоберите дистрибутив и скомпилируйте:
shell> perl Makefile.PL shell> make shell> make test shell> make install
Команда make test
является важной, поскольку она проверяет, работает ли
модуль. Следует учитывать, что если эта команда выполняется во время
установки Msql-Mysql-modules
для проверки кода интерфейса, то сервер MySQL
при этом должен работать, или же данный тест потерпит неудачу.
Каждый раз при установке нового выпуска MySQL полезно создать заново и
переустановить дистрибутив Msql-Mysql-modules
, особенно если замечаются
такие симптомы, как смерть скриптов DBI
после модернизации MySQL (имеется
в виду coredump).
Если вы не обладаете правами установки модулей Perl в системном каталоге или локальных модулей Perl, то для вас окажется полезной следующая ссылка:
http://www.iserver.com/support/contrib/perl5/modules.html
Следует смотреть в рубрике Installing New Modules that Require Locally
Installed Modules
.
Для установки модуля DBD
для MySQL под ActiveState Perl на Windows
необходимо выполнить следующие действия:
set HTTP_proxy=my.proxy.com:3128
C:\> c:\perl\bin\ppm.pl
DBI
, если этого еще не сделано:
ppm> install DBI
install \ ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd
Эти команды должны работать по крайней мере с версией ActiveState Perl 5.6.
Если приведенные выше команды у вас не работают, то вместо этого
необходимо установить драйвер MyODBC
и подключить сервер MySQL через ODBC:
use DBI; $dbh= DBI->connect("DBI:ODBC:$dsn","$user","$password") || die "Got error $DBI::errstr when connecting to $dsn\n";
Дистрибутив Perl для MySQL содержит DBI
, DBD:MySQL
и DBD:ODBC
.
C:
, в результате чего вы получите
каталог `C:\PERL'.
perl
, выполнив команду perl -v
в оболочке DOS.
DBI
/DBD
Если Perl сообщает, что не может найти модуль `../mysql/mysql.so', то проблема, возможно, заключается в том, что Perl не может найти динамическую библиотеку `libmysqlclient.so'.
Эту проблему можно устранить, используя любой из следующих методов:
Msql-Mysql-modules
используйте perl
Makefile.PL -static -config
вместо perl Makefile.PL
.
LD_RUN_PATH
.
Если вы получаете от DBD-mysql
представленные ниже ошибки, то, скорее
всего, у вас используется компилятор gcc
(или старый бинарный код,
скомпилированный с gcc
):
/usr/bin/perl: can't resolve symbol '__moddi3' /usr/bin/perl: can't resolve symbol '__divdi3'
Добавьте в команду линкования при сборке библиотеки `mysql.so',
-L/usr/lib/gcc-lib/... -lgcc
(нужно проверить вывод из make
для
`mysql.so' при компиляции клиента Perl). Опция -L
должна указывать путь
к каталогу, где находится `libgcc.a' в вашей системе.
Еще одна причина появления ошибок может заключаться в том, что оба модуля
- Perl и MySQL не скомпилированы вместе компилятором gcc
. В этом случае
данное несоответствие можно устранить, скомпилировав оба модуля
компилятором gcc
.
Если при выполнении тестов вы получаете от модуля Msql-Mysql-modules
следующие ошибки:
t/00base............install_driver(mysql) failed: Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169,
то это означает, что в строку линкования необходимо включить библиотеку
сжатия -lz
. Для этого необходимо внести следующее изменение в файл
`lib/DBD/mysql/Install.pm':
$sysliblist .= " -lm"; на $sysliblist .= " -lm -lz";
После этого необходимо выполнить команду make realclean
и затем
повторить процесс инсталляции сначала.
Если вы хотите использовать эти модули в системе, которая не поддерживает
динамического линкования (вроде Caldera/SCO), то можно сгенерировать
статическую версию Perl, включающую DBI
и DBD-mysql
. Она будет работать
следующим образом: нужно создать версию Perl, слинкованную с кодом DBI
, и
установить ее поверх текущего Perl. Затем эта версия используется для
сборки версии Perl, которая дополнительно включает слинкованный код DBD, и
устанавливается уже она.
В операционной системе Caldera (SCO) необходимо иметь следующий набор переменных окружения:
shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib или shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/lib shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/lib shell> MANPATH=scohelp:/usr/man:/usr/local1/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
, которую необходимо будет выполнить для
завершения установки. Для Caldera (SCO) это будет команда make -f
Makefile.aperl inst_perl MAP_TARGET=perl
.
Затем нужно использовать только что созданный модуль Perl для создания еще
одного модуля Perl, который также включает в себя статически слинкованный
модуль DBD::mysql
. Это делается путем выполнения следующих команд в
каталоге, где располагается дистрибутив Msql-Mysql-modules
:
shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl
И в завершение осталось установить этот новый модуль Perl. Какую команду
для этого использовать, вы опять узнаете из вывода make perl
.
Эта глава представляет собой обучающий курс по MySQL: в ней
демонстрируется использование клиентской программы mysql
для создания
несложной базы данных и работы с ней. Утилита mysql
(иногда называемая
также ``терминальным монитором'' или просто ``монитором'') представляет
собой интерактивную программу, позволяющую подсоединяться к MySQL-серверу,
запускать запросы, и просматривать результаты. Программа mysql
может
работать и в пакетном режиме: для этого необходимо записать все запросы в
файл, а затем передать его содержимое на исполнение mysql
. Ниже описаны
оба способа использования mysql
.
Увидеть список команд программы mysql
можно, запустив ее с параметром
--help
:
shell> mysql --help
Текст главы построен с расчетом на то, что на вашем компьютере установлен
mysql
и существует связь с сервером MySQL. Если это не так, свяжитесь со
своим администратором MySQL (если вы и есть администратор, обратитесь к
другим разделам настоящего руководства).
В этой главе дано подробное описание всего процесса установки и использования базы данных. Если вы хотите лишь работать с ранее созданной базой, можете пропустить разделы, посвященные созданию базы и содержащихся в ней таблиц.
Так как эта глава задумывалась как учебное пособие, многие детали пришлось опустить. Дополнительную информацию о раскрытых в этой главе темах можно почерпнуть из соответствующих разделов руководства.
При подключении к серверу с помощью mysql
обычно нужно ввести имя
пользователя MySQL и, в большинстве случаев, пароль. Если сервер запущен
не на том компьютере, с которого вы вошли в систему, необходимо также
указать имя хоста. Параметры соединения (а именно - соответствующее имя
хоста, пользователя и пароль) вы сможете узнать у администратора. Получив
соответствующие параметры, подсоединиться к серверу можно следующим
образом:
shell> mysql -h host -u user -p Enter password: ********
Символы ******** обозначают ваш пароль; введите его, когда mysql
выведет
на экран запрос Enter password:
.
Если все сработает, на экране должна появиться следующая информация и
метка командной строки mysql>
:
shell> mysql -h host -u user -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 459 to server version: 3.22.20a-log Type 'help' for help. mysql>
Метка обозначает, что программа mysql
готова к вводу команд.
В некоторых вариантах установки MySQL возможно подсоединение к запущенному
на локальном хосте серверу без ввода имени пользователя (пользователь
anonymous). Если ваша система настроена именно так, подсоединиться к
серверу вы сможете, запустив mysql
со следующими параметрами:
shell> mysql
После установки соединения можно в любой момент отключиться от сервера,
набрав в командной строке mysql>
команду QUIT
:
mysql> QUIT Bye
Отсоединиться от сервера можно и при помощи сочетания клавиш Control-D.
Большая часть приведенных ниже примеров построена с учетом того, что
соединение с сервером уже установлено. Это видно по наличию в них
командной строки mysql>
.
Подсоединитесь к серверу, как было описано выше. Таким образом никакая
база выбрана не будет, но это не страшно. На данном этапе нам гораздо
важней разобраться с созданием запросов, нежели сразу усложнять себе жизнь
созданием таблиц, загрузкой в них данных и извлечением их оттуда. В этом
разделе разъясняются основные принципы ввода команд; на примере нескольких
запросов вы можете поближе познакомиться с работой mysql
.
Ниже приведена простая команда, запрашивающая у сервера информацию об его
версии и текущей дате. Введите ее в командной строке mysql>
и нажмите
Enter:
mysql> SELECT VERSION(), CURRENT_DATE; +--------------+--------------+ | VERSION() | CURRENT_DATE | +--------------+--------------+ | 3.22.20a-log | 1999-03-19 | +--------------+--------------+ 1 row in set (0.01 sec) mysql>
Этот запрос иллюстрирует следующие особенности mysql
:
QUIT
, остальные
мы рассмотрим позднее.)
mysql
отправляет ее серверу для
выполнения и выводит на экран сначала результаты, а затем - новую
строку mysql>
, что означает готовность к выполнению новых команд.
mysql
дает столбцу имя
запрашиваемого выражения.
Для ввода ключевых слов можно использовать любой регистр символов. Приведенные ниже запросы абсолютно идентичны:
mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql> SeLeCt vErSiOn(), current_DATE;
А это - еще один запрос. В нем демонстрируется использование mysql
в
качестве несложного калькулятора:
mysql> SELECT SIN(PI()/4), (4+1)*5; +-------------+---------+ | SIN(PI()/4) | (4+1)*5 | +-------------+---------+ | 0.707107 | 25 | +-------------+---------+
Все команды, представленные выше, были относительно короткими и состояли из одной строки. В одну строку можно поместить и несколько команд. Но каждая из них должна заканчиваться точкой с запятой:
mysql> SELECT VERSION(); SELECT NOW(); +--------------+ | VERSION() | +--------------+ | 3.22.20a-log | +--------------+ +---------------------+ | NOW() | +---------------------+ | 1999-03-19 00:15:33 | +---------------------+
Втискивать все команды в одну строку совсем не обязательно, так что
создание длинных команд, занимающих несколько строк, никаких проблем не
вызывает. Для mysql
признаком завершения выражения является точка с
запятой, а не конец строки (другими словами, mysql
принимает команды без
форматирования: строки с командами собираются, но не исполняются до тех
пор, пока программа не обнаружит точку с запятой).
Вот пример несложного выражения, занимающего несколько строк:
mysql> SELECT -> USER() -> , -> CURRENT_DATE; +--------------------+--------------+ | USER() | CURRENT_DATE | +--------------------+--------------+ | joesmith@localhost | 1999-03-18 | +--------------------+--------------+
Обратите внимание на то, как изменилась метка командной строки (с mysql>
на ->
) после ввода первой строки этого запроса. Таким образом программа
mysql показывает, что завершенного выражения она пока что не получила и
ожидает его полного ввода. Эта метка очень полезна, так как предоставляет
весьма ценную информацию о состоянии программы. С ее помощью всегда можно
узнать, чего ждет mysql
.
Если вы решите отменить исполнение набираемой команды, наберите \c
:
mysql> SELECT -> USER() -> \c mysql>
Обратите внимание на метку: после ввода команды \c
она снова принимает вид
mysql>, показывая, что программа mysql
перешла в режим ожидания указаний.
В этой таблице приведены все возможные варианта вида метки командной
строки и соответствующие им состояния mysql
:
Метка | Значение |
mysql> | Ожидание новой команды. |
-> | Ожидание следующей строки многострочной команды. |
'> | Ожидание следующей строки, сбор строкового выражения, начинающегося с одиночной кавычки (`''). |
"> | Ожидание следующей строки, сбор строкового выражения, начинающегося с двойной кавычки (`"'). |
Обычно многострочные команды получаются случайно, когда хочешь создать
обычную команду, но забываешь поставить завершающую точку с запятой. В
таком случае mysql
ожидает продолжения:
mysql> SELECT USER() ->
Если с вами произошло подобное (вы думаете, что завершили команду, но
программа выдает только метку ->
), то mysql
, вероятнее всего, ждет точки с
запятой. Не обратив внимание на метку командной строки, можно довольно
долго ждать выполнения команды, не понимая в чем дело. А достаточно лишь
поставить точку с запятой, завершив команду, которую mysql
и выполнит:
mysql> SELECT USER() -> ; +--------------------+ | USER() | +--------------------+ | joesmith@localhost | +--------------------+
Метки '>
и ">
используются при сборе строк. В MySQL строки можно заключать
как в одинарные (`''), так и в двойные (`"') кавычки (можно, например,
написать 'hello'
или "goodbye"
), к тому же, mysql
позволяет вводить
строковые выражения, состоящие из нескольких строчек текста. Метка '>
или
">
обозначает, что вы ввели строку, открывающуюся символом кавычек `'' или
`"', но еще не ввели завершающую строковое выражение закрывающую кавычку.
Это, конечно, нормально, если вы собираетесь создать большое строковое выражение из нескольких строчек. Но это не слишком частый случай. Гораздо чаще оказывается, что вы просто забыли поставить закрывающую кавычку. Например:
mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30; ">
Если ввести такую команду SELECT
, нажать Enter и подождать результатов,
ничего не произойдет. Тут-то и нужно обратить внимание на метку командной
строки, выглядящую вот так: ">
. Это значит, что mysql
ждет ввода
завершающей части строки. (Теперь заметили ошибку в команде? В строке
"Smith
нет закрывающей кавычки.)
Что делать в этом случае? Проще всего было бы отменить команду. Однако
теперь просто набрать \c
нельзя, так как mysql
примет эти символы за часть
собираемой строки! Вместо этого нужно ввести закрывающие кавычки (тем
самым дав mysql
понять, что строка закончилась) и лишь затем набрать \c
:
mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30; "> "\c mysql>
Метка командной строки снова примет вид mysql>
, показывая готовность mysql
к выполнению команд.
Знать значение меток '>
и ">
необходимо, так как при вводе незавершенной
строки все последующие строки будут игнорироваться mysql
- включая строку
с командой QUIT
! Это может основательно сбить с толку, особенно если не
знать, что для отмены команды перед соответствующей последовательностью
символов необходимо поставить закрывающую кавычку.
Теперь, когда вы знаете, как вводить команды, пора начать работу с базой данных.
Предположим, у вас дома (или в вольере) живет несколько домашних любимцев и вы хотите создать систему для хранения разнообразной информации о своем живом уголке. Для того чтобы это сделать, нужно просто создать таблицы и записать в них информацию. После этого любые данные можно будет получить, извлекая данные из таблиц. В этом разделе вы научитесь:
Наша база данных будет чрезвычайно проста (это мы сделали намеренно), но
совсем несложно придумать реальные задачи, решение которых потребовало бы
применения подобной базы данных. Такая база, например, может пригодиться
скотоводу для хранения информации о поголовье или ветеринару - для учета
пациентов. Готовая база данных menagerie
, в которой содержатся некоторые
из запросов и данные из приведенных ниже разделов, находится на web-сайте
MySQL. Ее можно загрузить в виде сжатого tar
-файла
(http://www.mysql.com/Downloads/Contrib/Examples/menagerie.tar.gz) или Zip
(http://www.mysql.com/Downloads/Contrib/Examples/menagerie.zip).
Узнать, какие базы существуют в настоящее время на сервере, можно при
помощи команды SHOW
:
mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | | tmp | +----------+
На вашем компьютере список баз, вероятно, будет другим, но в нем все
равно, скорее всего, будут присутствовать базы mysql
и test
. База данных
mysql
просто необходима, так как в ней она описываются пользовательские
права доступа. База test
часто применяется для экспериментов.
Впрочем, всех баз вы можете и не увидеть, если у вас нет привилегии SHOW
DATABASES
. See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
Если база данных test
существует, попробуйте обратиться к ней:
mysql> USE test Database changed
В команде USE
, как и QUIT
, точка с запятой не нужна (конечно, данные
команды тоже можно завершать точкой с запятой - никакого вреда от этого не
будет). Команда USE
отличается от остальных и кое-чем еще: она должна
задаваться одной строкой.
Базу данных test
(если, конечно, у вас есть доступ к ней) можно
использовать для работы с приведенными ниже примерами, но все созданное в
ней может быть уничтожено любым другим пользователем, имеющим к ней
доступ. Поэтому вам лучше попросить у своего администратора MySQL
разрешение на создание собственной базы. Предположим, вы захотите назвать
ее menagerie (``зверинец''). В таким случае администратору нужно будет
набрать примерно такую команду:
mysql> GRANT ALL ON menagerie.* TO your_mysql_name;
где your_mysql_name - присвоенное вам имя MySQL.
Если администратор при выдаче разрешения создаст для вас базу, с ней можно сразу начинать работу. В противном случае вам придется создать ее самостоятельно:
mysql> CREATE DATABASE menagerie;
В Unix имеет значение регистр символов в именах баз данных (в отличие от
ключевых слов SQL), так что в этой ОС вам всегда придется называть свою
базу menagerie
, а не Menagerie
, MENAGERIE
или еще как-нибудь. Это же
правило распространяется и на имена таблиц (в Windows данное ограничение
не действует, однако при обращении к базам и таблицам в пределах одного
запроса, тем не менее, можно использовать только один регистр).
При создании базы данных она автоматически не выбирается; выбирать ее нужно отдельно. Сделать menagerie текущей базой можно с помощью следующей команды:
mysql> USE menagerie Database changed
Создавать базу нужно только однажды, но выбирать ее приходится в каждом
сеансе работы с mysql
. Делать это можно с помощью команды USE,
представленной выше. А можно выбирать базу и из командной строки при
запуске mysql
. Для этого достаточно лишь ввести ее имя после параметров
соединения, которые нужно вводить в любом случае. Например:
shell> mysql -h host -u user -p menagerie Enter password: ********
Обратите внимание: в вышеприведенной команде menagerie
не является
паролем. Ввести пароль в командной строке после параметра -p можно без
пробела (например, -pmypassword
, а не -p mypassword
). Впрочем, пароль в
командной строке все равно лучше не вводить, так как таким образом его
могут и подсмотреть.
Как вы уже успели убедиться, создать базу данных было просто. Однако пока
что в ней ничего нет - в этом можно удостовериться при помощи команды SHOW
TABLES
:
mysql> SHOW TABLES; Empty set (0.00 sec)
Гораздо труднее определиться со структурой своей базы, т.е. с тем, какие могут понадобиться таблицы, и какие столбцы должны содержаться в каждой из них.
Вам обязательно будет нужна таблица, содержащая по записи на каждое из
животных. Назвать ее можно pet
, и храниться в ней будут, как минимум,
имена. Но так как само по себе имя неинформативно, в таблице должны будут
присутствовать и другие данные. Например, если домашние животные есть
более чем у одного члена вашей семьи, в таблицу можно добавить и имя
владельца каждого животного. Кроме того, в базу стоит внести и
описательную информацию - например, вид и пол животного.
Но вот как быть с возрастом? Эта информация тоже может оказаться полезной, но хранить такие данные в базе неудобно. Возраст со временем меняется, а это значит, что придется довольно часто обновлять записи. Значительно удобнее хранить фиксированные значения - например, даты рождения. В таком случае возраст всегда можно получить, вычислив разницу между текущей датой и датой рождения. В MySQL есть функции для арифметических действий над данными, так что это совсем несложно. Хранение даты рождения имеет и другие преимущества:
Можно было бы придумать и еще какие-нибудь данные, которые неплохо было бы
хранить в таблице pet, но пока что мы ограничимся уже выбранными: именем
(name
), именем владельца (owner
), видом (species
), полом (sex
), датой
рождения (birth
) и датой смерти (death
).
При помощи команды CREATE TABLE
определим структуру новой таблицы:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
Тип VARCHAR
отлично подойдет для хранения имени животного, имени владельца
и названия вида, так как длина данных этого типа может варьироваться.
Конечно, длины таких столбцов вовсе не должны совпадать и не должны быть
равны 20 - можно выбрать любое значение в пределах от 1 до 255 (если при
выборе длины столбца вы ошибетесь, и при работе с базой окажется, что
столбец маловат, можно будет исправить ошибку при помощи команды ALTER
TABLE
).
Пол животного можно обозначать несколькими способами, например буквами "m" и "f", или словами male (мужской) и female (женский). С буквами "m" и "f" будет проще.
Применение типа данных DATE
для хранения дат рождения и смерти вполне
очевидно.
Теперь, когда таблица создана, команда SHOW TABLES
должна вывести
следующее:
mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | pet | +---------------------+
Проверить, правильно была ли таблица создана в соответствии с планом,
можно при помощи команды DESCRIBE
:
mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
Использовать команду DESCRIBE
можно в любое время, например, если вы
забудете имена столбцов или типы, к которым они относятся.
Создав таблицу, нужно позаботиться об ее заполнении. Для этого
предназначены команды LOAD DATA
и INSERT
.
Предположим, ваши записи соответствуют приведенным в этой таблице
(обратите внимание: MySQL принимает даты в формате ГГГГ-ММ-ДД
; возможно, к
такой записи вы не привыкли).
name | owner | species | sex | birth | death |
Fluffy | Harold | cat | f | 1993-02-04 | |
Claws | Gwen | cat | m | 1994-03-17 | |
Buffy | Harold | dog | f | 1989-05-13 | |
Fang | Benny | dog | m | 1990-08-27 | |
Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 |
Chirpy | Gwen | bird | f | 1998-09-11 | |
Whistler | Gwen | bird | 1997-12-09 | ||
Slim | Benny | snake | m | 1996-04-29 |
Так как вы начинаете работу с пустой таблицей, заполнить ее будет проще всего, если создать текстовый файл, содержащий по строке на каждое из животных, а затем загрузить его содержимое в таблицу одной командой.
Создайте текстовый файл с именем `pet.txt', содержащий по одной записи в
каждой строке (значения столбцов должны быть разделены символами табуляции
и даны в том порядке, который был определен командой CREATE TABLE
).
Незаполненным полям (например, неизвестный пол или даты смерти живых на
сегодняшний день животных), можно присвоить значение NULL
. В текстовом
файле это значение представляется символами \N
. Например, запись для птицы
Whistler
должна выглядеть примерно так (между значениями должны
располагаться одиночные символы табуляции):
name | owner | species | sex | birth | death |
Whistler | Gwen | bird | \N | 1997-12-09 | \N
|
Загрузить файл `pet.txt' в таблицу можно с помощью следующей команды:
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
Маркер конца строки и символ, разделяющий значения столбцов, можно
специально задать в команде LOAD DATA
, но по умолчанию используются
символы табуляции и перевода строки. Воспринимая их, команда сможет
корректно прочитать файл `pet.txt'.
При добавлении одиночных записей используется команда INSERT
. В самом
простом варианте ее применения необходимо задать значения каждого столбца,
в том порядке, в каком они были перечислены в команде CREATE TABLE
.
Предположим, Диана (Diane) купила хомячка по имени Puffball.
Соответствующую запись в таблицу с можно внести с помощью команды INSERT
примерно так:
mysql> INSERT INTO pet -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Обратите внимание на то, что здесь строковые выражения и даты представлены
в виде ограниченных кавычками строк. Кроме того, в команде INSERT
отсутствующие данные можно прямо заменять на NULL
. Пользоваться эвфемизмом
\N
, как в команде LOAD DATA
, нужды нет.
Этот пример наглядно показывает, что если бы с самого начала все данные
вносились в базу при помощи нескольких команд INSERT
, а не одной команды
LOAD DATA
, то набирать пришлось бы гораздо больше текста.
Информация извлекается из таблиц при помощи команды SELECT
. Вызывается она
так:
SELECT what_to_select FROM which_table WHERE conditions_to_satisfy
где what_to_select
обозначает нужные данные. Это может быть список
столбцов или символ *
(``все столбцы''). which_table указывает таблицу, из
которой должны быть извлечены данные. Условие WHERE
использовать
необязательно, но если оно все же присутствует в вызове команды, то
параметр conditions_to_satisfy
задает условия, которым должны
соответствовать нужные строки.
В самом простом варианте вызова SELECT
из таблицы извлекаются сразу все
данные:
mysql> SELECT * FROM pet; +----------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+--------+---------+------+------------+------------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Fang | Benny | dog | m | 1990-08-27 | NULL | | Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 | | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+--------+---------+------+------------+------------+
Использовать SELECT
таким образом удобно, когда нужно просмотреть всю
таблицу, например, после того, как в нее была загружена первая порция
данных. Как часто случается, в выведенных на экран данных сразу можно
увидеть ошибку в таблице: Bowser
, оказывается, успел умереть еще до того,
как родился! Заглянув в его родословную обнаруживаем, что пес родился в
1989, а не в 1998 году.
Исправить ошибку можно как минимум двумя способами:
mysql> SET AUTOCOMMIT=1; # Used for quick re-create of the table mysql> DELETE FROM pet; mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;Однако в таком случае придется снова ввести запись о Puffball.
UPDATE
:
mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";
Как видно из приведенного выше примера, загрузить всю таблицу сразу очень просто. Но на практике обычно этого не требуется, особенно когда таблица достигает значительных размеров. Чаще всего нужно просто ответить на какой-нибудь вопрос, для чего необходимо ввести ограничения, указывающие, какая же информация вам нужна. Давайте рассмотрим несколько запросов с точки зрения вопросов, на которые они отвечают.
Из таблицы можно выбрать и только нужные строки. Например, если вы хотите проверить правильность внесенных в дату рождения собаки Bowser изменений, соответствующую запись можно получить следующим способом:
mysql> SELECT * FROM pet WHERE name = "Bowser"; +--------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+-------+---------+------+------------+------------+ | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+-------+---------+------+------------+------------+
Теперь видно, что год рождения теперь записан правильно -1989, а не 1998.
В операции сравнения строк обычно не учитывается регистр символов, так что
имя можно записать как "bowser"
, "BOWSER"
и т.п. Результаты запросов будут
идентичными.
В условиях может указываться любой из столбцов, а не только name
. Если,
например, вам нужно узнать, какие их животных родились после 1998 года, в
условие вводится значение столбца birth
:
mysql> SELECT * FROM pet WHERE birth >= "1998-1-1"; +----------+-------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+-------+ | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+-------+---------+------+------------+-------+
Условия можно и комбинировать, например для того, чтобы выделить всех собак женского пола:
mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
В предыдущем запросе использован оператор AND
. Существует еще и оператор
OR
:
mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird"; +----------+-------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+-------+ | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | +----------+-------+---------+------+------------+-------+
Операторы AND
и OR
можно использовать совместно. В таком случае с помощью
скобок можно указать порядок группировки условий:
mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m") -> OR (species = "dog" AND sex = "f"); +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
Если строки целиком вам не нужны, достаточно просто перечислить имена нужных столбцов, разделив их запятыми. Например, если вы хотите узнать, когда родились животные, выберите столбцы с именами и датами рождения:
mysql> SELECT name, birth FROM pet; +----------+------------+ | name | birth | +----------+------------+ | Fluffy | 1993-02-04 | | Claws | 1994-03-17 | | Buffy | 1989-05-13 | | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Puffball | 1999-03-30 | +----------+------------+
Получить имена владельцев животных можно с помощью следующего запроса:
mysql> SELECT owner FROM pet; +--------+ | owner | +--------+ | Harold | | Gwen | | Harold | | Benny | | Diane | | Gwen | | Gwen | | Benny | | Diane | +--------+
Однако этот запрос просто загружает поля с именем владельца из каждой
записи, а некоторые имена встречаются более одного раза. Сократить
количество выводимых строк можно, воспользовавшись ключевым словом
DISTINCT
- тогда будут выводиться только уникальные записи:
mysql> SELECT DISTINCT owner FROM pet; +--------+ | owner | +--------+ | Benny | | Diane | | Gwen | | Harold | +--------+
При помощи выражения WHERE
можно комбинировать выбор строк и столбцов.
Например для того, чтобы загрузить даты рождения только кошек и собак,
можно воспользоваться следующим запросом:
mysql> SELECT name, species, birth FROM pet -> WHERE species = "dog" OR species = "cat"; +--------+---------+------------+ | name | species | birth | +--------+---------+------------+ | Fluffy | cat | 1993-02-04 | | Claws | cat | 1994-03-17 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | +--------+---------+------------+
Вы уже, наверное, заметили, что результаты, выдававшиеся запросами из
предыдущих примеров, выводились без какой-либо сортировки. Но ведь часто
разобраться в результатах легче, если они отсортированы. Для этого
используется выражение ORDER BY
.
Так выглядят даты рождения животных в отсортированном виде:
mysql> SELECT name, birth FROM pet ORDER BY birth; +----------+------------+ | name | birth | +----------+------------+ | Buffy | 1989-05-13 | | Bowser | 1989-08-31 | | Fang | 1990-08-27 | | Fluffy | 1993-02-04 | | Claws | 1994-03-17 | | Slim | 1996-04-29 | | Whistler | 1997-12-09 | | Chirpy | 1998-09-11 | | Puffball | 1999-03-30 | +----------+------------+
Над столбцами с символьными значениями операция сортировки - как и все
другие операции сравнения - обычно проводится без учета регистра символов.
Это значит, что порядок расположения столбцов, совпадающих во всем, кроме
регистра символов, относительно друг друга будет не определен. Провести
сортировку с учетом регистра символов можно при помощи команды BINARY
:
ORDER BY BINARY(поле)
.
Для сортировки в обратном порядке к имени столбца следует добавить
ключевое слово DESC
(по убыванию):
mysql> SELECT name, birth FROM pet ORDER BY birth DESC; +----------+------------+ | name | birth | +----------+------------+ | Puffball | 1999-03-30 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Claws | 1994-03-17 | | Fluffy | 1993-02-04 | | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Buffy | 1989-05-13 | +----------+------------+
Сортировку можно проводить по нескольким столбцам сразу. Например для того, чтобы отсортировать таблицу сначала по типу животного, потом - по дате рождения и затем - расположить наиболее молодых животных определенного типа в начале списка, выполните следующий запрос:
mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC; +----------+---------+------------+ | name | species | birth | +----------+---------+------------+ | Chirpy | bird | 1998-09-11 | | Whistler | bird | 1997-12-09 | | Claws | cat | 1994-03-17 | | Fluffy | cat | 1993-02-04 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | | Buffy | dog | 1989-05-13 | | Puffball | hamster | 1999-03-30 | | Slim | snake | 1996-04-29 | +----------+---------+------------+
Обратите внимание: действие ключевого слова DESC
распространяется только
на тот столбец, имя которого располагается в запросе прямо перед этим
словом (в данном случае - birth
); значения поля species по-прежнему
отсортированы в возрастающем порядке.
В MySQL имеется несколько функций, реализующих арифметические операции над датами. Эти функции позволяют, например, вычислять возраст или получать части даты.
Определить возраст любого из животных в базе можно, если вычислить разницу между текущим годом и годом его рождения, а из результата вычесть единицу, если текущий день находится к началу календаря ближе, нежели день рождения животного. Приведенный ниже запрос выводит дату рождения каждого животного, его возраст и текущую дату.
mysql> SELECT name, birth, CURRENT_DATE, -> (YEAR(CURRENT_DATE)-YEAR(birth)) -> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)) -> AS age -> FROM pet; +----------+------------+--------------+------+ | name | birth | CURRENT_DATE | age | +----------+------------+--------------+------+ | Fluffy | 1993-02-04 | 2001-08-29 | 8 | | Claws | 1994-03-17 | 2001-08-29 | 7 | | Buffy | 1989-05-13 | 2001-08-29 | 12 | | Fang | 1990-08-27 | 2001-08-29 | 11 | | Bowser | 1989-08-31 | 2001-08-29 | 11 | | Chirpy | 1998-09-11 | 2001-08-29 | 2 | | Whistler | 1997-12-09 | 2001-08-29 | 3 | | Slim | 1996-04-29 | 2001-08-29 | 5 | | Puffball | 1999-03-30 | 2001-08-29 | 2 | +----------+------------+--------------+------+
В этом примере функция YEAR()
выделяет из даты год, а RIGHT()
- пять
крайних справа символов, представляющих календарный день (MM-DD). Часть
выражения, сравнивающая даты, выдает 1 или 0, что позволяет уменьшить
результат на единицу, если текущий день (CURRENT_DATE
) находится к началу
календаря ближе, нежели день рождения животного. Все выражение смотрится
несколько неуклюже, поэтому вместо него в заголовке соответствующего
столбца результатов выводится псевдоним (age
- "возраст").
Запрос неплохо работает, но разобраться в результатах было бы проще, если
бы строки располагались в определенном порядке. Этого можно достичь,
добавив в запрос выражение ORDER BY
name и отсортировав таким образом
результаты по имени:
mysql> SELECT name, birth, CURRENT_DATE, -> (YEAR(CURRENT_DATE)-YEAR(birth)) -> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY name; +----------+------------+--------------+------+ | name | birth | CURRENT_DATE | age | +----------+------------+--------------+------+ | Bowser | 1989-08-31 | 2001-08-29 | 11 | | Buffy | 1989-05-13 | 2001-08-29 | 12 | | Chirpy | 1998-09-11 | 2001-08-29 | 2 | | Claws | 1994-03-17 | 2001-08-29 | 7 | | Fang | 1990-08-27 | 2001-08-29 | 11 | | Fluffy | 1993-02-04 | 2001-08-29 | 8 | | Puffball | 1999-03-30 | 2001-08-29 | 2 | | Slim | 1996-04-29 | 2001-08-29 | 5 | | Whistler | 1997-12-09 | 2001-08-29 | 3 | +----------+------------+--------------+------+
Отсортировать результаты по возрасту также можно при помощи выражения
ORDER BY
:
mysql> SELECT name, birth, CURRENT_DATE, -> (YEAR(CURRENT_DATE)-YEAR(birth)) -> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY age; +----------+------------+--------------+------+ | name | birth | CURRENT_DATE | age | +----------+------------+--------------+------+ | Chirpy | 1998-09-11 | 2001-08-29 | 2 | | Puffball | 1999-03-30 | 2001-08-29 | 2 | | Whistler | 1997-12-09 | 2001-08-29 | 3 | | Slim | 1996-04-29 | 2001-08-29 | 5 | | Claws | 1994-03-17 | 2001-08-29 | 7 | | Fluffy | 1993-02-04 | 2001-08-29 | 8 | | Fang | 1990-08-27 | 2001-08-29 | 11 | | Bowser | 1989-08-31 | 2001-08-29 | 11 | | Buffy | 1989-05-13 | 2001-08-29 | 12 | +----------+------------+--------------+------+
подобный же запрос поможет определить возраст, которого достигли умершие
животные на момент смерти. Выделить умерших животных можно, проверив
значение поля death
на предмет равенства NULL
. Затем для записей, значения
поля death
которых не равно NULL
, можно вычислить разницу между датами
смерти и рождения:
mysql> SELECT name, birth, death, -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) -> AS age -> FROM pet WHERE death IS NOT NULL ORDER BY age; +--------+------------+------------+------+ | name | birth | death | age | +--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+
В этом запросе используется выражение death IS NOT NULL
, а не death <>
NULL
, так как NULL
- особое значение (более подробные пояснения приведены
в разделе see section 3.3.4.6 Работа с значениями NULL).
А как поступать, если потребуется определить, дни рождения каких животных
наступят в следующем месяце? Для таких расчетов день и год значения не
имеют; из столбца, содержащего дату рождения, нас интересует только месяц.
В MySQL предусмотрено несколько функций для получения частей дат - YEAR()
,
MONTH()
, и DAYOFMONTH()
. В данном случае нам подойдет функция MONTH()
.
Увидеть работу этой функции можно с помощью простого запроса, выводящего
дату рождения birth
и MONTH(birth)
:
mysql> SELECT name, birth, MONTH(birth) FROM pet; +----------+------------+--------------+ | name | birth | MONTH(birth) | +----------+------------+--------------+ | Fluffy | 1993-02-04 | 2 | | Claws | 1994-03-17 | 3 | | Buffy | 1989-05-13 | 5 | | Fang | 1990-08-27 | 8 | | Bowser | 1989-08-31 | 8 | | Chirpy | 1998-09-11 | 9 | | Whistler | 1997-12-09 | 12 | | Slim | 1996-04-29 | 4 | | Puffball | 1999-03-30 | 3 | +----------+------------+--------------+
Найти животных, дни рождения которых наступят в следующем месяце, тоже несложно. Предположим, что сейчас на дворе апрель. Тогда номер текущего месяца - 4, а искать надо животных, родившихся в мае (5-м месяце), таким образом:
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; +-------+------------+ | name | birth | +-------+------------+ | Buffy | 1989-05-13 | +-------+------------+
Конечно, в декабре возникают некоторые осложнения. Если просто добавить единицу к номеру месяца (12) и поискать животных, родившихся в тринадцатом месяце, найти что-нибудь вряд ли удастся. Вместо этого нужно искать животных, родившихся в январе (1-м месяце).
Можно даже написать небольшой запрос, который будет работать вне
зависимости от того, какой нынче месяц. Функция DATE_ADD()
позволяет
прибавить к дате некоторый интервал времени. Если добавить к значению,
возвращаемому функцией NOW()
, месяц, а затем извлечь из получившейся даты
номер месяца при помощи функции MONTH()
, мы получим именно тот месяц,
который нам нужен:
mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
Ту же задачу можно решить и другим методом - для этого нужно прибавить единицу к номеру месяца, следующего за текущим (воспользовавшись функцией расчета по модулю (MOD) для перехода к 0, если номер текущего месяца равен 12):
mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
Функция MONTH
возвращает число от 1 до 12, а выражение MOD(число,12)
-
число от 0 до 11. Поэтому операцию сложения нужно проводить после MOD()
,
иначе результат перепрыгнет с ноября (11) сразу на январь (1).
К NULL
-значениям нужно привыкнуть. По идее, NULL
обозначает отсутствующее
или неизвестное значение и обрабатывается отличным от других значений
образом. Проверить значение на равенство NULL
с помощью обычных
арифметических операторов сравнения (=, < или <>) нельзя. Это отлично
иллюстрирует следующий запрос:
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+ | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ | NULL | NULL | NULL | NULL | +----------+-----------+----------+----------+
Очевидно, что от таких сравнений значащих результатов ожидать нечего.
Вместо этого нужно пользоваться операторами IS NULL
и IS NOT NULL
:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL | +-----------+---------------+ | 0 | 1 | +-----------+---------------+
Отметим, что два значения NULL
считаются равными при выполнении команды
GROUP BY
.
В MySQL 0 или NULL
приравнивается к логическому false, а все остальное - к
true. По умолчанию значение "истина" для булевого оператора равно 1.
При выполнении команды ORDER BY
значения NULL
всегда располагаются в самом
начале списка результатов, даже при использовании параметра DESC
.
Именно из-за того, что при работе с NULL
действуют особые правила, в
предыдущем разделе для поиска умерших животных использовалось выражение
death IS NOT NULL
, а не death <> NULL
.
В MySQL реализовано стандартное для SQL сравнение по шаблонам, а также особый тип такого сравнения - он основан на использовании выражений, подобных применяющимся в служебных программах Unix (таких, как vi, grep и sed).
В SQL при сравнении по шаблону символ `_' обозначает любой одиночный
символ, а `%' - определенное количество символов (включая ноль символов).
В MySQL в SQL-шаблонах по умолчанию не учитывается регистр символов. При
работе с шаблонами SQL использование операторов =
или <>
не допускается,
вместо этого применяются операторы сравнения LIKE
или NOT LIKE
.
Найти все имена, начинающиеся с `b', можно следующим образом:
mysql> SELECT * FROM pet WHERE name LIKE "b%"; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+
Найти все имена, заканчивающиеся на `fy', можно следующим образом:
mysql> SELECT * FROM pet WHERE name LIKE "%fy"; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+
Найти все имена, содержащие `w', можно следующим образом:
mysql> SELECT * FROM pet WHERE name LIKE "%w%"; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+
Найти все имена, содержащие ровно пять символов, можно при помощи шаблонного символа `_':
mysql> SELECT * FROM pet WHERE name LIKE "_____"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
Во втором типе шаблонов, предусмотренных в MySQL, используются расширенные
регулярные выражения. При поиске совпадений на основе такого шаблона
шаблоном нужно пользоваться операторами REGEXP
и NOT REGEXP
(или их
синонимами - RLIKE
и NOT RLIKE
).
Ниже приведены некоторые характеристики расширенных регулярных выражений:
Чтобы продемонстрировать работу регулярных выражений, приведенные выше
запросы LIKE
здесь переписаны с использованием REGEXP
.
Найти все имена, начинающиеся с `b', можно при помощи символа `^', привязывающего шаблон к началу имени:
mysql> SELECT * FROM pet WHERE name REGEXP "^b"; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+
В версиях MySQL до 3.23.4 REGEXP
учитывает регистр символов, и приведенный
запрос не возвратит никаких результатов. Для поиска символов `b' верхнего
или нижнего регистра воспользуйтесь следующим запросом:
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
Начиная с версии MySQL 3.23.4, заставить REGEXP
учитывать регистр символов
можно с помощью ключевого слова BINARY
. В этом запросе положительный
результат поиска будет получен только при обнаружении символа 'b' нижнего
регистра в начале имени:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";
Найти все имена, заканчивающиеся на `fy', можно при помощи символа `$', привязывающего шаблон к концу имени:
mysql> SELECT * FROM pet WHERE name REGEXP "fy$"; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+
Найти все имена, содержащие символ `w' любого регистра, можно так:
mysql> SELECT * FROM pet WHERE name REGEXP "w"; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+
Поскольку регулярное выражение выдает положительный результат при совпадении шаблона с любым фрагментом значения, в приведенном выше примере привязывать поиск к любому из концов имени для сравнения полного значения с шаблоном, как это пришлось бы делать для шаблона SQL, не нужно.
Найти все имена, содержащие ровно пять символов, можно, если привязать поиск к началу и концу имени с помощью символов `^' и `$' и поставить пять символов `.' между ними:
mysql> SELECT * FROM pet WHERE name REGEXP "^.....$"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
Предыдущий запрос можно записать и при помощи оператора `{n}'
(``повторить-n
-раз''):
mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
Базы данных часто используются для получения ответа на вопросы типа: ``как часто данные определенного типа встречаются в таблице?'' Вам, например, может понадобиться узнать общее количество животных, или то, сколько животных имеется у каждого из владельцев, или провести статистические исследования на базе хранящейся информации.
Процедура подсчета количества животных в сущности идентична подсчету
количества строк в таблице, так как на каждое животное приходится по одной
записи. Функция COUNT()
подсчитает количество непустых результатов, и с ее
помощью можно составить следующий запрос для определения числа животных:
mysql> SELECT COUNT(*) FROM pet; +----------+ | COUNT(*) | +----------+ | 9 | +----------+
Ранее мы уже извлекали из таблицы имена владельцев животных. При помощи
функции COUNT()
можно узнать, сколько животных принадлежит каждому из
владельцев:
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+
Обратите внимание на использование команды GROUP BY
для объединения всех
записей по каждому из владельцев. Без этой команды запрос выдал бы только
сообщение об ошибке:
mysql> SELECT owner, COUNT(owner) FROM pet; ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause
Команды COUNT()
и GROUP BY
очень помогают характеризовать данные
различными способами. В примерах, приведенных ниже, вы увидите и другие
способы проведения статистических подсчетов.
Количество животных каждого вида:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+
Количество животных каждого пола:
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+
(в этой таблице результатов NULL
обозначает, что пол животного неизвестен)
Количество животных каждого вида с учетом пола:
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
При использовании функции COUNT()
вовсе не обязательно загружать всю
таблицу. Например, предыдущий запрос, в котором учитываются только кошки и
собаки, выглядит следующим образом:
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE species = "dog" OR species = "cat" -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+
Можно узнать и количество животных каждого пола с учетом только тех экземпляров, пол которых известен:
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE sex IS NOT NULL -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
В таблице pet
хранятся только основные данные о животных. Если же нужно
держать в базе какую-либо дополнительную информацию о них (скажем, записи
о событиях наподобие посещения ветеринара или рождения потомства),
понадобится еще одна таблица. Давайте определимся с ее структурой. Эта
таблица должна содержать:
С учетом всех приведенных выше требований можно составить примерно такую
команду CREATE TABLE
:
mysql> CREATE TABLE event (name VARCHAR(20), date DATE, -> type VARCHAR(15), remark VARCHAR(255));
Как и в случае с таблицей pet
, начальные данные в таблицу проще всего
загрузить, создав текстовый файл с информацией, разделенной символами
табуляции:
name | date | type | remark |
Fluffy | 1995-05-15 | litter | 4 kittens, 3 female, 1 male |
Buffy | 1993-06-23 | litter | 5 puppies, 2 female, 3 male |
Buffy | 1994-06-19 | litter | 3 puppies, 3 female |
Chirpy | 1999-03-21 | vet | needed beak straightened |
Slim | 1997-08-03 | vet | broken rib |
Bowser | 1991-10-12 | kennel | |
Fang | 1991-10-12 | kennel | |
Fang | 1998-08-28 | birthday | Gave him a new chew toy |
Claws | 1998-03-17 | birthday | Gave him a new flea collar |
Whistler | 1998-12-09 | birthday | First birthday |
Загрузите записи с помощью следующей команды:
mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
Используя знания, усвоенные при работе с таблицей pet
, вы сможете
загружать данные из таблицы event
; принципы здесь те же. Но что если самой
по себе таблицы event
перестанет хватать для получения нужных вам ответов?
Предположим, нужно узнать, в каком возрасте животные давали приплод. В
таблице event
указаны даты родов, но для того, чтобы рассчитать возраст
матери, нужно знать и дату ее рождения. Так как даты рождения хранятся в
таблице pet
, в этом запросе нужно использовать обе таблицы:
mysql> SELECT pet.name, -> (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, -> remark -> FROM pet, event -> WHERE pet.name = event.name AND type = "litter"; +--------+------+-----------------------------+ | name | age | remark | +--------+------+-----------------------------+ | Fluffy | 2.27 | 4 kittens, 3 female, 1 male | | Buffy | 4.12 | 5 puppies, 2 female, 3 male | | Buffy | 5.10 | 3 puppies, 3 female | +--------+------+-----------------------------+
На некоторые аспекты этого запроса следует обратить особое внимание:
FROM
указаны две таблицы, так как запрос будет получать
информацию из обеих.
WHERE
используется для сопоставления записей из
двух таблиц по значениям имен.
Для объединения не обязательно иметь две отдельные таблицы; иногда можно
объединить таблицу с самой собой - если нужно сравнить одни записи таблицы
с другими записями той же таблицы. Например, для того, чтобы обнаружить
среди животных ``семейные пары'', можно объединить таблицу pet
с ней
самой, составив пары животных разного пола, но одного вида:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species -> FROM pet AS p1, pet AS p2 -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m"; +--------+------+--------+------+---------+ | name | sex | name | sex | species | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | | Buffy | f | Bowser | m | dog | +--------+------+--------+------+---------+
В этом запросе мы указываем псевдонимы имен таблицы, для обращения к столбцам и определения, к какой из таблиц относится каждая ссылка на столбец.
Как быть, если вы забыли имя базы или таблицы, или структуру какой-либо из таблиц (например имена столбцов)? В MySQL эта проблема решается при помощи нескольких команд, выводящих информацию о базе данных и содержащихся в ней таблицах.
Вы уже познакомились с командой SHOW DATABASES
, выводящей список
управляемых сервером баз данных. Определить, какая из них выбрана в данный
момент, можно с помощью функции DATABASE()
:
mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | menagerie | +------------+
Если ни одна из баз не выбрана, результат будет пуст.
Выяснить, какие таблицы содержит текущая база данных (что необходимо, если, например, никак не получается вспомнить имя нужной таблицы), можно при помощи следующей команды:
mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | event | | pet | +---------------------+
Узнать структуру таблицы можно при помощи команды DESCRIBE
, которая
выводит информацию о каждом из столбцов таблицы:
mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
Field
- имя столбца, Type
- тип данных, к которому относится этот столбец,
NULL
указывает, может ли данный столбец содержать значения NULL
, Key -
является ли этот столбец индексным, и, наконец, Default
указывает значение
данного столбца по умолчанию.
Если для таблицы созданы индексы, информацию о них можно получить с
помощью команды SHOW INDEX FROM tbl_name
.
Здесь представлены примеры решения некоторых стандартных задач средствами MySQL.
В некоторых из примеров используется таблица shop
(магазин), в которой
содержатся цены по каждому изделию (item number
)для определенных
продавцов (dealer
). Предположим, что каждый продавец имеет одну
фиксированную цену для каждого изделия; тогда пара изделие-продавец
(article, dealer
) является первичным ключом для записей таблицы.
Запустите клиента mysql
:
mysql имя-вашей-базы-данных
(Для большинства инсталляций MySQL можно использовать базу данных 'test
'.)
Таблицу примера можно создать таким образом:
CREATE TABLE shop ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, dealer CHAR(20) DEFAULT '' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00' NOT NULL, PRIMARY KEY(article, dealer)); INSERT INTO shop VALUES (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69), (3,'D',1.25),(4,'D',19.95);
Ну и, скажем, данные для примера будут такими:
mysql> SELECT * FROM shop; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0001 | A | 3.45 | | 0001 | B | 3.99 | | 0002 | A | 10.99 | | 0003 | B | 1.45 | | 0003 | C | 1.69 | | 0003 | D | 1.25 | | 0004 | D | 19.95 | +---------+--------+-------+
"Как определить наибольшее значение в столбце?"
SELECT MAX(article) AS article FROM shop +---------+ | article | +---------+ | 4 | +---------+
"Как определить номер, дилера и цену самого дорогого изделия?"
В ANSI SQL это легко делается при помощи вложенного запроса:
SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop)
В MySQL (в котором вложенные операторы SELECT
еще не реализованы) такая
задача выполняется в два этапа:
SELECT article, dealer, price FROM shop WHERE price=19.95
Существует еще одно решение: отсортировать все строки по убыванию цен и
после этого получить первую строку, используя специальный оператор LIMIT
:
SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1
Примечание: если существует несколько самых дорогих изделий (например,
каждое из них стоит 19,95), запрос, использующий LIMIT
, возвращает лишь
одно из них!
"Как определить наибольшую цену по каждому изделию?"
SELECT article, MAX(price) AS price FROM shop GROUP BY article +---------+-------+ | article | price | +---------+-------+ | 0001 | 3.99 | | 0002 | 10.99 | | 0003 | 1.69 | | 0004 | 19.95 | +---------+-------+
"Для каждого изделия, как определить дилер(ов) с самыми высокими ценами?"
В ANSI SQL это легко делается при помощи вложенного запроса:
SELECT article, dealer, price FROM shop s1 WHERE price=(SELECT MAX(s2.price) FROM shop s2 WHERE s1.article = s2.article);
В MySQL такая задача выполняется в два этапа:
Это легко делается с помощью временной таблицы:
CREATE TEMPORARY TABLE tmp ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00' NOT NULL); LOCK TABLES shop read; INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article; SELECT shop.article, dealer, shop.price FROM shop, tmp WHERE shop.article=tmp.article AND shop.price=tmp.price; UNLOCK TABLES; DROP TABLE tmp;
Если вы не используете ключевое слово TEMPORARY
, вам также следует поставить блокировку
на таблицу tmp
.
"А можно ли это сделать одним запросом?"
Да, но только используя совершенно неэффективный трюк, который я называю "Трюк MAX-CONCAT":
SELECT article, SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer, 0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price FROM shop GROUP BY article; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0001 | B | 3.99 | | 0002 | A | 10.99 | | 0003 | C | 1.69 | | 0004 | D | 19.95 | +---------+--------+-------+
Разумеется, последний пример можно сделать чуть эффективнее, если разбиение катенизированной строки делать на стороне клиента.
В MySQL для хранения результатов, чтобы не держать их во временных переменных на клиенте, можно применять пользовательские переменные (see section 6.1.4 Переменные пользователя).
Например, для того чтобы найти изделия с максимальной или минимальной ценой, можно выполнить следующие действия:
mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop; mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0003 | D | 1.25 | | 0004 | D | 19.95 | +---------+--------+-------+
В MySQL 3.23.44 и выше в таблицах InnoDB
осуществляется проверка
ограничений целостности внешних ключей (обратитесь к разделам
section 7.5 Таблицы InnoDB и section 1.9.4.5 Внешние ключи).
Фактически для соединения двух таблиц внешние ключи не нужны.
Единственное, что MySQL в настоящее время не осуществляет (в типах таблиц,
отличных от InnoDB
), это проверку (CHECK
) что ключи, которые вы
используете, действительно существуют в таблице(ах) на которые вы
ссылаетесь, и не удаляет автоматически записи из таблиц с определением
внешних ключей. Если же ключи используются обычным образом, все будет
работать просто чудесно:
CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(60) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE shirt ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM('t-shirt', 'polo', 'dress') NOT NULL, color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES persons, PRIMARY KEY (id) ); INSERT INTO person VALUES (NULL, 'Antonio Paz'); INSERT INTO shirt VALUES (NULL, 'polo', 'blue', LAST_INSERT_ID()), (NULL, 'dress', 'white', LAST_INSERT_ID()), (NULL, 't-shirt', 'blue', LAST_INSERT_ID()); INSERT INTO person VALUES (NULL, 'Lilliana Angelovska'); INSERT INTO shirt VALUES (NULL, 'dress', 'orange', LAST_INSERT_ID()), (NULL, 'polo', 'red', LAST_INSERT_ID()), (NULL, 'dress', 'blue', LAST_INSERT_ID()), (NULL, 't-shirt', 'white', LAST_INSERT_ID()); SELECT * FROM person; +----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+ SELECT * FROM shirt; +----+---------+--------+-------+ | id | style | color | owner | +----+---------+--------+-------+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t-shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | | 7 | t-shirt | white | 2 | +----+---------+--------+-------+ SELECT s.* FROM person p, shirt s WHERE p.name LIKE 'Lilliana%' AND s.owner = p.id AND s.color <> 'white'; +----+-------+--------+-------+ | id | style | color | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+
MySQL пока не осуществляет оптимизации, если поиск производится по двум
различным ключам, которые связаны при помощи оператора OR
(поиск по одному
ключу с различными частями OR
оптимизируется хорошо):
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1' OR field2_index = '1'
Причина заключается в том, что у нас не было времени, чтобы придумать
эффективный способ обработки этого случая (сравните: обработка оператора
AND
теперь работает хорошо)
В настоящее время данную проблему очень эффективно можно решить при помощи временной таблицы. Этот способ оптимизации также хорошо подходит, если вы запускаете очень сложные запросы, когда SQL-сервер делает оптимизацию в неправильном порядке.
CREATE TEMPORARY TABLE tmp SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'; INSERT INTO tmp SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1'; SELECT * from tmp; DROP TABLE tmp;
Вышеупомянутый способ выполнения этого запроса - это фактически UNION
(объединение) двух запросов. See section 6.4.1.2 Синтаксис оператора UNION
.
В этом разделе представлен пример использования групповых побитовых функций для вычисления дней месяца, когда пользователь заходил на веб-сайт.
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED ZEROFILL); INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2), (2000,2,23),(2000,2,23); SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month; Which returns: +------+-------+------+ | year | month | days | +------+-------+------+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | +------+-------+------+
Этот запрос подсчитывает, сколько различных дней входит в данную комбинацию год/месяц, автоматически исключая дублирующиеся значения.
Атрибут AUTO_INCREMENT
может использоваться для генерации уникального
идентификатора для новых строк:
CREATE TABLE animals (id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id)); INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"), ("lax"),("whale"); SELECT * FROM animals;
Что вернет:
+----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | +----+---------+
В таблицах MyISAM
и BDB
можно определить AUTO_INCREMENT
для вторичного
столбца составного ключа. В этом случае значение, генерируемое для
автоинкрементного столбца, вычисляется как
MAX(auto_increment_column)+1) WHERE prefix=given-prefix
. Столбец с
атрибутом AUTO_INCREMENT
удобно использовать, когда данные нужно помещать
в упорядоченные группы.
CREATE TABLE animals (grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY (grp,id)); INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"), ("bird","penguin"),("fish","lax"),("mammal","whale"); SELECT * FROM animals ORDER BY grp,id;
Что вернет:
+--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | +--------+----+---------+
Обратите внимание, что в этом случае значение AUTO_INCREMENT
будет
использоваться повторно, если в какой-либо группе удаляется строка,
содержащая наибольшее значение AUTO_INCREMENT
.
Последнее значение поля AUTO_INCREMENT
, которое было создано
автоматически, можно получить при помощи функции SQL LAST_INSERT_ID()
или
функции API mysql_insert_id()
.
mysql
в пакетном режиме
В предыдущих разделах было показано, как использовать mysql
в
интерактивном режиме, вводя запросы и тут же просматривая результаты.
Запускать mysql
можно и в пакетном режиме. Для этого нужно собрать все
команды в один файл и передать его на исполнение mysql
:
shell> mysql < batch-file
Если вы работаете с mysql
в ОС Windows, и некоторые из специальных
символов, содержащихся в пакетном файле, могут вызвать проблемы,
воспользуйтесь следующей командой:
dos> mysql -e "source batch-file"
Если необходимо указать параметры соединения в командной строке, она может иметь следующий вид:
shell> mysql -h host -u user -p < batch-file Enter password: ********
Работая с mysql
таким образом, вы, в сущности, создаете сценарий и затем
исполняете его.
Если нужно продолжать обработку сценария даже при обнаружении в нем
ошибок, воспользуйтесь параметром командной строки --force
.
Зачем вообще нужны сценарии? Причин тому несколько:
shell> mysql < batch-file | more
shell> mysql < batch-file > mysql.out
По умолчанию при работе с mysql
в пакетном режиме используется более
сжатый формат вывода результатов, чем при интерактивной работе. В
интерактивном режиме результаты работы запроса SELECT DISTINCT species
FROM pet
выглядят так:
+---------+ | species | +---------+ | bird | | cat | | dog | | hamster | | snake | +---------+
А в пакетном - вот так:
species bird cat dog hamster snake
Если вам нужно, чтобы в пакетном режиме программа выводила данные так же,
как и в интерактивном, воспользуйтесь ключом mysql -t
. Включить "эхо"
исполняемых команд можно с помощью ключа mysql -vvv
.
В командную строку mysql
можно включать и сценарии - при помощи команды
source
:
mysql> source filename;
В Analytikerna и Lentus мы проводили сбор и систематизацию данных в рамках крупного исследовательского проекта. Этот проект разрабатывается совместно Институтом экологической медицины Karolinska Institutet, Стокгольм и отделением клинических исследований в области старения и психологии университета Южной Калифорнии.
В проекте предусмотрен этап опросов, на котором происходит опрос по телефону всех проживающих в Швеции близнецов старше 65 лет. Близнецы, отвечающие критериям отбора, переходят на следующий этап. На этом этапе желающих участвовать в проекте близнецов посещает врач с медсестрой. Проводятся физические и нейропсихологические исследования, лабораторные анализы, неврологическое обследование, оценка психологического состояния, а также собираются данные по истории семьи. Кроме того, осуществляется сбор информации о медицинских и экологических факторах риска.
Дополнительную информацию о проекте вы можете получить по адресу: http://www.imm.ki.se/TWIN/TWINUKW.HTM
На поздних этапах администрирование проекта осуществляется с помощью
web-интерфейса, написанного на Perl
и MySQL
.
Каждую ночь собранные во время интервью данные заносятся в базу данных MySQL.
Этот запрос определяет, которые из близнецов переходят во второй этап проекта:
SELECT CONCAT(p1.id, p1.tvab) + 0 AS tvid, CONCAT(p1.christian_name, " ", p1.surname) AS Name, p1.postal_code AS Code, p1.city AS City, pg.abrev AS Area, IF(td.participation = "Aborted", "A", " ") AS A, p1.dead AS dead1, l.event AS event1, td.suspect AS tsuspect1, id.suspect AS isuspect1, td.severe AS tsevere1, id.severe AS isevere1, p2.dead AS dead2, l2.event AS event2, h2.nurse AS nurse2, h2.doctor AS doctor2, td2.suspect AS tsuspect2, id2.suspect AS isuspect2, td2.severe AS tsevere2, id2.severe AS isevere2, l.finish_date FROM twin_project AS tp /* For Twin 1 */ LEFT JOIN twin_data AS td ON tp.id = td.id AND tp.tvab = td.tvab LEFT JOIN informant_data AS id ON tp.id = id.id AND tp.tvab = id.tvab LEFT JOIN harmony AS h ON tp.id = h.id AND tp.tvab = h.tvab LEFT JOIN lentus AS l ON tp.id = l.id AND tp.tvab = l.tvab /* For Twin 2 */ LEFT JOIN twin_data AS td2 ON p2.id = td2.id AND p2.tvab = td2.tvab LEFT JOIN informant_data AS id2 ON p2.id = id2.id AND p2.tvab = id2.tvab LEFT JOIN harmony AS h2 ON p2.id = h2.id AND p2.tvab = h2.tvab LEFT JOIN lentus AS l2 ON p2.id = l2.id AND p2.tvab = l2.tvab, person_data AS p1, person_data AS p2, postal_groups AS pg WHERE /* p1 gets main twin and p2 gets his/her twin. */ /* ptvab is a field inverted from tvab */ p1.id = tp.id AND p1.tvab = tp.tvab AND p2.id = p1.id AND p2.ptvab = p1.tvab AND /* Just the sceening survey */ tp.survey_no = 5 AND /* Skip if partner died before 65 but allow emigration (dead=9) */ (p2.dead = 0 OR p2.dead = 9 OR (p2.dead = 1 AND (p2.death_date = 0 OR (((TO_DAYS(p2.death_date) - TO_DAYS(p2.birthday)) / 365) >= 65)))) AND ( /* Twin is suspect */ (td.future_contact = 'Yes' AND td.suspect = 2) OR /* Twin is suspect - Informant is Blessed */ (td.future_contact = 'Yes' AND td.suspect = 1 AND id.suspect = 1) OR /* No twin - Informant is Blessed */ (ISNULL(td.suspect) AND id.suspect = 1 AND id.future_contact = 'Yes') OR /* Twin broken off - Informant is Blessed */ (td.participation = 'Aborted' AND id.suspect = 1 AND id.future_contact = 'Yes') OR /* Twin broken off - No inform - Have partner */ (td.participation = 'Aborted' AND ISNULL(id.suspect) AND p2.dead = 0)) AND l.event = 'Finished' /* Get at area code */ AND SUBSTRING(p1.postal_code, 1, 2) = pg.code /* Not already distributed */ AND (h.nurse IS NULL OR h.nurse=00 OR h.doctor=00) /* Has not refused or been aborted */ AND NOT (h.status = 'Refused' OR h.status = 'Aborted' OR h.status = 'Died' OR h.status = 'Other') ORDER BY tvid;
Дадим к этому запросу некоторые пояснения:
CONCAT(p1.id, p1.tvab) + 0 AS tvid
id
и tvab
в числовом порядке. Прибавление нуля к
результату заставляет MySQL обращаться с результатом как с числом.
id
tvab
ptvab
tvab
. Если значение tvab
равно 1, значение этого поля - 2, и
наоборот. Данное поле облегчает MySQL задачу оптимизации запроса и
экономит время ввода данных.
Этот запрос иллюстрирует, помимо всего прочего, сравнение значений одной
таблицы с помощью команды JOIN (p1 и p2)
. В этом примере таким образом
проверяется, не умер ли один из близнецов до достижения им 65-летнего
возраста. Если так и произошло, строка не попадает в список возвращаемых.
Все вышеприведенные поля имеются во всех таблицах, в которых хранится
относящаяся к близнецам информация. Ключевыми полями для ускорения работы
запросов назначены id,tvab
(во всех таблицах), а также id,ptvab
(person_data)
.
На нашем рабочем компьютере (200МГц UltraSPARC) этот запрос возвращает 150-200 строк, и его выполнение занимает менее секунды.
Текущее количество строк в таблицах, использовавшихся выше:
Таблица | Строки |
person_data | 71074 |
lentus | 5291 |
twin_project | 5286 |
twin_data | 2012 |
informant_data | 663 |
harmony | 381 |
postal_groups | 100 |
Каждый опрос оканчивается кодом состояния, называющимся event
(``событие''). Приведенный здесь запрос выводит данные обо всех парах
близнецов, объединенные по полю event
. Таблица наглядно показывает, с
каким количеством пар близнецов работа полностью завершена, а в каком
количестве пар работа с одним близнецом завершена, а с другим - нет и т.п.
SELECT t1.event, t2.event, COUNT(*) FROM lentus AS t1, lentus AS t2, twin_project AS tp WHERE /* We are looking at one pair at a time */ t1.id = tp.id AND t1.tvab=tp.tvab AND t1.id = t2.id /* Just the sceening survey */ AND tp.survey_no = 5 /* This makes each pair only appear once */ AND t1.tvab='1' AND t2.tvab='2' GROUP BY t1.event, t2.event;
Существуют программы, позволяющие проводить идентификацию пользователей с помощью базы данных MySQL, а также записывать журналы в таблицу MySQL (См. @xref{Portals}).
Формат записи журналов Apache можно привести в легко понятную MySQL форму, введя в файл настроек Apache следующие строки:
LogFormat \ "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\", \ \"%U\",\"%{Referer}i\",\"%{User-Agent}i\""
В MySQL же можно сделать примерно следующее:
LOAD DATA INFILE '/local/access_log' INTO TABLE table_name FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
mysqld
В большинстве случаев управление параметрами mysqld осуществляется при помощи файлов параметров (see section 4.1.2 Файлы параметров `my.cnf').
mysqld
и mysqld.server
считывают параметры из групп mysqld
и server
.
mysqld_safe
считывает параметры из групп mysqld
, server
, mysqld_safe
и
safe_mysqld
. Встроенный сервер MySQL обычно считывает параметры из server
,
embedded
и xxxxx_SERVER
, где xxxxx
- имя приложения.
mysqld принимает следующие параметры командной строки:
--ansi
-b, --basedir=path
--big-tables
--bind-address=IP
--character-sets-dir=path
--chroot=path
LOAD DATA INFILE
и SELECT ... INTO OUTFILE
.
--core-file
mysqld
.
В некоторых системах также необходимо указать --core-file-size
для
safe_mysqld (see section 4.7.2 safe_mysqld
, оболочка mysqld
). Обратите
внимание на то, что в некоторых системах, таких как Solaris, не удастся
записать файл ядра, если используется параметр --user
.
-h, --datadir=path
--debug[...]=
--with-debug
, то этот параметр позволяет
получить файл трассировки, в котором отражена работа mysqld
(see section E.1.2 Создание трассировочных файлов).
--default-character-set=charset
--default-table-type=type
--delay-key-write-for-all-tables
MyISAM
между
записями (see section 5.5.2 Настройка параметров сервера).
--des-key-file=filename
DES_ENCRYPT()
и DES_DECRYPT()
.
--enable-locking
lockd
полностью не
работает (например, в Linux), это может привести к зависанию mysqld.
--enable-named-pipe
-T, --exit-info
--flush
-?, --help
--init-file=file
-L, --language=...
-l, --log[=file]
--log-isam[=file]
ISAM
/MyISAM
(используется только при
отладке ISAM
/MyISAM
).
--log-slow-queries[=file]
long_query_time
секунд (see section 4.9.5 Журнал медленных запросов).
--log-update[=file]
file.#
где #
представляет собой уникальный
номер, если он не был задан (see section 4.9.3 Журнал обновлений (update)).
--log-long-format
--log-slow-queries
, то запросы, не использующие индексов,
будут заноситься в журнал медленных запросов.
--low-priority-updates
INSERT
/DELETE
/UPDATE
) будет назначен более
низкий приоритет, чем операциям выбора. Это также можно реализовать при
помощи {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ...
, чтобы
понизить приоритет только одного запроса, или через SET OPTION
SQL_LOW_PRIORITY_UPDATES=1
, чтобы изменить приоритет в одном потоке (see section 5.3.2 Вопросы блокирования таблиц).
--memlock
mysqld
в памяти. Этот параметр работает только в том
случае, если ваша система поддерживает системный вызов mlockall()
,
например Solaris. Такая мера может быть полезной, если операционная
система записывает mysqld
в файл подкачки на диск.
--myisam-recover [=параметр[,параметр...]]]
DEFAULT
, BACKUP
, FORCE
или QUICK
. Если
необходимо отключить данную функцию, укажите вместо набора параметров явно
""
. Если эта функция используется, mysqld
проверит таблицу на предмет
того, была ли она отмечена как сбойная или не была закрыта надлежащим
образом (последний вариант действует только в том случае, если был включен
параметр --skip-locking
). В любом из этих случаев mysqld
произведет полную
проверку таблицы. Если таблица была повреждена, mysqld
попытается ее
восстановить. Приведенные ниже параметры влияют на работу процесса
восстановления.
Параметр | Описание |
DEFAULT | Аналогично отсутствию каких-либо параметров для функции
--myisam-recover .
|
BACKUP | Если во время восстановления таблица данных была изменена, сохраняется резервная копия файла данных `table_name.MYD' под именем `table_name-datetime.BAK'. |
FORCE | Запуск восстановления, даже если будет утрачено более одной строки из файла `.MYD'. |
QUICK | Не проверять строки в таблице, в которых отсутствуют удаленные блоки. |
BACKUP
и FORCE
. Тогда восстановление будет производиться даже в
случае, если некоторые строки будут удалены, но файл данных будет
сохраняться в виде резервной копии, поэтому впоследствии всегда можно
будет определить, что произошло.
--pid-file=path
safe_mysqld
.
-P, --port=...
-o, --old-protocol
--one-thread
-O, --set-variable var=option
--help
- выводит список переменных.
Подробное описание всех переменных можно найти в разделе SHOW VARIABLE
S
этого руководства (see section 4.5.6.4 SHOW VARIABLES
). Раздел по настройке
параметров сервера включает информацию по их оптимизации (see section 5.5.2 Настройка параметров сервера).
--safe-mode
--skip-delay-key-write
.
--safe-show-database
SHOW DATABASES
выдает только те
базы данных, для которых у пользователя есть какие-либо привилегии.
Начиная с версии 4.0.2 этот параметр является недействительным и больше ни
на что не влияет (его значение установлено по умолчанию), так как в новой
версии появилась привилегия SHOW DATABASES
(see section 4.3.1 Синтаксис команд GRANT
и REVOKE
).
--safe-user-create
GRANT
, если он не имеет привилегии INSERT
для таблицы mysql.user
или для любого столбца этой таблицы.
--skip-concurrent-insert
MyISAM
(используется только в том случае, если в этой функции найдена
ошибка).
--skip-delay-key-write
delay_key_write
для всех таблиц (see section 5.5.2 Настройка параметров сервера).
--skip-grant-tables
mysqladmin flush-privileges
или mysqladmin
reload
.)
--skip-host-cache
--skip-locking
isamchk
или myisamchk
, необходимо выключить сервер (see section 1.4.3 Насколько стабильным является MySQL?). Обратите внимание на то, что в MySQL версии 3.23 для
восстановления или проверки таблиц MyISAM
можно использовать REPAIR
и
CHECK
.
--skip-name-resolve
--skip-networking
mysqld
должна
осуществляться через сокеты Unix. Этот параметр рекомендуется для систем,
в которых разрешены только локальные запросы (see section 5.5.5 Как MySQL использует DNS).
--skip-new
--skip-delay-key-write
. Также задается принятый по умолчанию тип таблицы
для ISAM
(see section 7.3 Таблицы ISAM).
--skip-symlink
symlinked
в каталоге данных.
--skip-safemalloc
--with-debug=full
, все программы будут
проверять память на наличие выхода за границы области памяти при каждом
заполнении и освобождении памяти. Поскольку такая проверка осуществляется
довольно медленно, от нее можно отказаться, воспользовавшись этим
параметром.
--skip-show-database
SHOW DATABASES
, если пользователь не
имеет привилегии SHOW DATABASES
. Начиная с версии 4.0.2 этот параметр
больше не нужен, поскольку доступ теперь может быть разрешен при помощи
привилегии SHOW DATABASES
.
--skip-stack-trace
mysqld
запущен под отладчиком. В некоторых системах данный параметр
также необходимо использовать для получения файла ядра (see section E.1 Отладка сервера MySQL).
--skip-thread-priority
--socket=path
/tmp/mysql.sock
.
--sql-mode=параметр[,параметр[,параметр...]]
REAL_AS_FLOAT
,
PIPES_AS_CONCAT
, ANSI_QUOTES
, IGNORE_SPACE
, SERIALIZE
, ONLY_FULL_GROUP_BY
.
Если нужно произвести сброс значения, параметр может быть пустым ("")
.
Указание всех приведенных выше параметров аналогично использованию --ansi
.
При помощи этого параметра можно включать только необходимые режимы SQL
(see section 1.9.2 Запуск MySQL в режиме ANSI).
--temp-pool
--transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED |
SET TRANSACTIO
N).
-t, --tmpdir=path
/tmp
расположен на слишком маленьком диске и не может вместить все
временные таблицы.
-u, --user= [user_name | userid]
mysqld
от имени пользователя user_name
или userid
(число).
Этот параметр является обязательным при запуске mysqld
в качестве главной
программы.
-V, --version
-W, --warnings
Aborted connection...
в
файл `.err' (see section A.2.9 Коммуникационные ошибки / Оборванные соединения.
Начиная с версии 3.22 MySQL может считывать принятые по умолчанию параметры запуска для сервера и клиентов из файлов параметров.
В Unix считывание принятых по умолчанию параметров MySQL производится из следующих файлов:
Имя файла | Назначение |
/etc/my.cnf | Общие параметры |
DATADIR/my.cnf | Параметры для сервера |
defaults-extra-file | Файл, указанный при помощи -defaults-extra-file=# |
~/.my.cnf | Параметры для пользователя |
DATADIR
является каталогом данных MySQL (обычно `/usr/local/mysql/data' для
бинарной установки или `/usr/local/var' для установки из исходных текстов).
Обратите внимание, что это тот каталог, который был задан во время
настройки, а не указанный при помощи --datadir
при запуске mysqld
!
(--datadir
не оказывает влияния на просмотр файлов параметров сервером,
так как их просмотр происходит до обработки аргументов командной строки).
В Windows считывание принятых по умолчанию параметров MySQL производится из следующих файлов:
Имя файла | Назначение |
windows-system-directory\my.ini | Общие параметры |
C:\my.cnf | Общие параметры |
Обратите внимание на то, что в Windows все пути необходимо указывать при
помощи /
вместо \.
Если необходимо использовать \,
то его нужно указать
дважды, так как \
является знаком перехода в MySQL.
MySQL пытается прочитать файлы параметров в указанном выше порядке. Если существует несколько таких файлов, то параметр, указанный в файле, идущем позже, имеет преимущество над таким же параметром, указанным в файле, расположенном ранее. Параметры, указанные в командной строке, обладают более высоким приоритетом по отношению к параметрам, указанным в любом из файлов параметров. Некоторые параметры можно задавать при помощи переменных окружения. Параметры, указанные в командной строке или в файлах параметров, обладают преимуществом по отношению к переменным окружения (see section F Переменные окружения).
Приводим список программ, поддерживающих файлы параметров: mysql
,
mysqladmin
, mysqld
, mysqld_safe
, mysql.server
, mysqldump
, mysqlimport
,
mysqlshow
, mysqlcheck
, myisamchk
и myisampack
.
Любой параметр, который может быть задан в командной строке при запуске
программы MySQL, может быть также задан в файле параметров (без
предваряющего двойного слэша). Чтобы получить список доступных параметров,
следует запустить программу с параметром --help
.
Файлы параметров могут содержать строки следующего вида:
#comment
[group]
option
--option
в командной строке.
option=value
--option=value
в командной строке.
set-variable = variable=value
--set-variable variable=value
в командной строке. Данный
синтаксис необходимо использовать для задания переменных mysqld
.
Группа client
обеспечивает возможность задавать параметры, относящиеся ко
всем клиентам MySQL (кроме самого mysqld
). Эта группа великолепно подходит
для указания пароля, используемого при подсоединении к серверу (но при
этом следует убедиться, что разрешение на чтение и запись этого файла есть
только у вас).
Обратите внимание на то, что для параметров и значений все введенные перед ними и после них пробелы автоматически удаляются. В строках значений можно использовать такие экранирующие секвенции: `\b', `\t', `\n', `\r', `\\' и `\s' (`\s' - это пробел).
Пример типичного глобального файла параметров:
[client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick
Пример типичного файла параметров пользователя:
[client] # Указанный пароль будет направлен всем стандартным клиентам MySQL password=my_password [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysqlhotcopy] interactive-timeout
Если у вас дистрибутив исходного кода, то примеры конфигурационных файлов
с именами `my-xxxx.cnf' можно найти в каталоге `support-files'. В случае
бинарного дистрибутива следует обратиться к каталогу `DIR/support-files',
где DIR
- имя каталога установки MySQL (обычно `/usr/local/mysql'). На
данный момент там приведены примеры файлов конфигурации для малых,
средних, больших и очень больших систем. Чтобы поэкспериментировать с
файлом, можно скопировать `my-xxxx.cnf' в свой домашний каталог
(переименуйте копию в `.my.cnf').
Все поддерживающие файлы параметров клиенты MySQL принимают следующие параметры:
Параметр | Описание |
--no-defaults | Не читать информацию из файлов параметров. |
--print-defaults | Вывести имя программы и все параметры, которые ей передаются. |
--defaults-file=full-path-to-default-file | Использовать только указанный файл конфигурации. |
--defaults-extra-file=full-path-to-default-file | Прочитать этот файл конфигурации после глобального файла конфигурации, но перед файлом конфигурации пользователя. |
Обратите внимание на то, что указанные выше параметры должны идти первыми
в командной строке! Однако параметр --print-defaults
может использоваться
сразу после команд --defaults-xxx-file
.
Примечание для разработчиков: обработка файла параметров происходит следующим образом: все совпадающие параметры (т.е. параметры в соответствующих группах) обрабатываются перед любыми аргументами командной строки. Этот алгоритм хорошо подходит для программ, которые в случае, если один и тот же параметр указывается несколько раз, используют последний экземпляр параметра. Если же вы работаете со старой программой, которая считывает заданные несколько раз параметры указанным образом, но не читает файлы параметров, необходимо добавить только две строки, чтобы у нее появилась эта возможность. Чтобы увидеть, как это делается, достаточно ознакомиться с исходным кодом любого стандартного клиента MySQL.
В скриптах оболочки для анализа файлов config
можно использовать команду
`my_print_defaults':
shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash
Приведенные выше выходные данные содержат все параметры для групп client
и
mysql
.
В некоторых случаях необходимо, чтобы на одном компьютере работало
несколько различных серверов mysqld
: например, если нужно запустить для
тестирования новую версию MySQL совместно со старой версией, которая
находится в работе, или когда разным пользователям нужно предоставить
доступ к различным серверам mysqld
, с которыми они умеют обращаться
самостоятельно.
Один из способов запустить новый сервер -- указать ему другой канал и порт, например, таким образом:
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock shell> MYSQL_TCP_PORT=3307 shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT shell> scripts/mysql_install_db shell> bin/safe_mysqld &
Приложение, в котором описаны переменные окружения, включает список других
переменных окружения, которые можно использовать для управления mysqld
(see section F Переменные окружения).
В приведенном выше примере представлен грубый быстрый метод, который обычно применяется для тестирования. Преимуществом данного метода является то, что все соединения, которые устанавливаются в указанной выше оболочке, автоматически направляются на новый запущенный сервер!
Если работать с несколькими серверами необходимо постоянно, то нужно создать файл параметров для каждого сервера (see section 4.1.2 Файлы параметров `my.cnf'). В скрипте запуска, который выполняется при каждой загрузке, следует указать оба сервера:
safe_mysqld --default-file=path-to-option-fil
e
Для серверов должны быть различными по крайней мере следующие параметры:
Приведенные ниже параметры, если они используются, также должны различаться:
Если требуется увеличить производительность, необходимо также задать разные значения для следующих параметров:
See section 4.1.1 Параметры командной строки mysqld
.
Если производится установка бинарной версии MySQL (файлы .tar), которая
запускается из ./bin/safe_mysqld
, то в большинстве случаев единственными
параметрами, которые необходимо добавить/изменить, являются аргументы
socket
и port
для safe_mysqld
.
See section 4.1.4 Запуск нескольких серверов MySQL на одном компьютере.
Иногда возникают обстоятельства, когда необходимо запустить несколько серверов на одном компьютере. Например, может понадобиться произвести тестирование новой версии MySQL, не изменяя текущей установки программы. Или еще вариант: вы являетесь поставщиком услуг Internet, который хочет предоставить независимые установки MySQL для различных клиентов.
Если необходимо запустить несколько серверов, то проще всего
скомпилировать серверы с различными портами TCP/IP и файлами сокетов (see section 4.7.3 Mysqld_multi
, программа для управления множеством серверов MySQL).
Предположим, что существующий сервер настроен на принятые по умолчанию
номер порта и файл сокета. Настроим новый сервер при помощи команды
configure
следующим образом:
shell> ./configure --with-tcp-port=port_number \ --with-unix-socket-path=file_name \ --prefix=/usr/local/mysql-3.22.9
Здесь port_number
и file_name
должны отличаться от принятого по умолчанию
номера порта и пути файла сокета, а значение --prefix
должно указывать
каталог установки, который отличается от того, в котором установлен
текущий MySQL.
Проверить сокет, используемый установленным на данный момент сервером MySQL, можно при помощи следующей команды:
shell> mysqladmin -h hostname --port=port_number variables
Обратите внимание: если указать ``localhost
'' как имя удаленного компьютера,
mysqladmin
по умолчанию будет использовать сокеты Unix вместо TCP/IP.
Если на используемом порту находится сервер MySQL, то будет выдан список самых важных настраиваемых переменных в MySQL, включая имя сокета.
Повторно компилировать новый сервер MySQL нет необходимости, его просто
нужно запустить с другими параметрами для порта и сокета. Используемые
порт и сокет можно изменить, указав их как параметры запуска для
safe_mysqld
:
shell> /path/to/safe_mysqld --socket=file_name --port=port_number
Модуль mysqld_multi
может также в качестве аргумента принимать safe_mysqld
(или mysqld
) и передавать параметры из файла конфигурации для safe_mysqld
и дальше для mysqld
.
Если новый сервер запускается на том же каталоге базы данных, что и другой
сервер с включенной записью в журналы, необходимо также указать имена
файлов журналов для safe_mysqld
при помощи параметров --log
, --log-update
или --log-slow-queries
. Иначе оба сервера могут попытаться осуществить
запись в один и тот же файл журнала.
Предупреждение: обычно нельзя допускать, чтобы два сервера одновременно заносили данные в одну и ту же базу данных! Если ваша операционная система не поддерживает безотказную блокировку доступа, это может привести к возникновению неприятных сюрпризов!
Если для второго сервера понадобится использовать другой каталог базы
данных, можно воспользоваться параметром --datadir=path
для safe_mysqld
.
Обратите внимание: запуск нескольких серверов MySQL (mysqlds
) на различных
компьютерах с доступом к одному каталогу данных через сетевую файловую
систему обычно не приводит ни к чему хорошему! Проблема состоит в том,
что сетевая файловая система становится узким местом для передачи данных.
Она не предназначена для такого использования. И даже в этом случае
придется искать решение, которое позволит обеспечить отсутствие конфликтов
между двумя или более модулями mysqld
. На данный момент не существует
платформы, которая обеспечивает на 100% надежную блокировку доступа к
файлам (обычно демон lockd
) во всех возможных ситуациях. Кроме того,
существует еще одна опасность при использовании сетевой файловой системы:
эта система может еще больше усложнить работу программы lockd
. Поэтому
лучше смотреть на вещи проще и забыть об этой идее. Оптимальным решением
будет использование одного компьютера с несколькими центральными
процессорами и с операционной системой, которая эффективно управляет
потоками.
Если нужно подсоединиться к серверу MySQL, который работает с портом, отличным от того, с которым откомпилирован ваш клиент, можно воспользоваться одним из следующих методов:
--host 'hostname' --port=port_number
,
чтобы подсоединиться через TCP/IP, или [--host localhost
--socket=file_name]
, чтобы подсоединиться через сокет Unix.
DBD::mysql
можно прочитать параметры из
файлов параметров MySQL (see section 4.1.2 Файлы параметров `my.cnf').
$dsn = "DBI:mysql:test;mysql_read_default_group=client; mysql_read_default_file=/usr/local/mysql/data/my.cnf" $dbh = DBI->connect($dsn, $user, $password);
MYSQL_UNIX_PORT
и MYSQL_TCP_PORT
, чтобы
указать на сокет Unix и порт TCP/IP до запуска клиентов. Если обычно
используются конкретные сокет или порт, команды для задания этих
переменных окружения необходимо поместить в свой файл `.login' (see section F Переменные окружения).
MySQL имеет развитую, но нестандартную систему обеспечения безопасности и привилегий доступа. В этом разделе дается описание ее работы.
С данным разделом должны ознакомиться все, кто использует MySQL на компьютерах, подключенных к Internet, - чтобы избежать наиболее распространенных ошибок, приводящих к нарушению безопасности системы.
При обсуждении вопросов безопасности мы акцентируем внимание на необходимости защиты всего серверного хоста (а не одного лишь сервера MySQL) от всех возможных типов атак: перехвата, внесения изменений, считывания и отказа в обслуживании. Данный раздел не охватывает всех аспектов готовности к работе и отказоустойчивости.
Используемая в MySQL система безопасности для всех подключений, запросов и иных операций, которые может пытаться выполнить пользователь, базируется на списках контроля доступа ACLs (Access Control Lists). Обеспечивается также некоторая поддержка SSL-соединений между клиентами и серверами MySQL. Многие из рассматриваемых здесь концепций не относятся исключительно к MySQL; те же общие соображения применимы практически ко всем приложениям.
При работе в MySQL старайтесь следовать приведенным ниже инструкциям:
mysql
под именем
root
) доступа к таблице user
в базе данных mysql
! Это чрезвычайно
важно. В MySQL зашифрованный пароль является реальным паролем. Узнав
пароль, занесенный в таблицу user
, и имея доступ к удаленному
компьютеру, занесенному в соответствующую учетную запись, войти в
систему под именем зарегистрированного владельца пароля легко может
кто угодно.
GRANT
и REVOKE
. Предоставляйте ровно столько прав,
сколько необходимо, и не больше. Никогда не предоставляйте права всем
хостам. Полезно проводить следующие контрольные проверки:
mysql -u root
. Если удается успешно установить
соединение с сервером без получения запроса пароля, значит, у вас
имеются проблемы. Это означает, что кто угодно может
подсоединиться к вашему серверу MySQL как клиент MySQL под именем
root
, получая таким образом право неограниченного доступа!
Проанализируйте инструкцию по инсталляции MySQL, обращая особое
внимание на ту часть, которая касается задания пароля
пользователя root
.
SHOW GRANTS
проверьте, кто и к каким ресурсам
имеет доступ. Воспользуйтесь командой REVOKE
, отмените права
доступа, которые не являются необходимыми.
MD5()
, SHA1()
или другие односторонние хеш-функции.
nmap
. MySQL использует по умолчанию порт 3306. Этот
порт должен быть недоступен с неблагонадежных компьютеров. Еще
один простой способ проверить, открыт или нет ваш MySQL-порт, -
попытаться выполнить с какой либо удаленной машины следующую
команду, где server_host
- имя хоста, на котором установлен ваш
сервер MySQL:
shell> telnet server_host 3306Если соединение будет установлено, и вы получите какие-либо бессмысленные символы, это будет означать, что порт открыт, и его нужно закрыть на брандмауэре или маршрутизаторе (если, конечно, нет действительно веских причин держать его открытым). Если же
telnet
просто зависнет или в
подсоединении будет отказано, тогда все в порядке: порт заблокирован.
'; DROP
DATABASE mysql;
''. Это крайний случай, но действия хакеров,
использующих подобную технологию, могут привести к потере информации и
появлению брешей в системе безопасности, если вы не готовы к ним. Не
следует также забывать о необходимости проверки цифровых данных
(распространенной ошибкой является защита только строк). Некоторые
полагают, что если в базе данных хранятся только открытые данные, то в
ее защите нет необходимости. Это неверно. Такие базы могут стать
объектом успешных атак типа отказа от обслуживания. Простейший способ
защиты от взломов такого типа - заключать числовые константы в
кавычки: SELECT * FROM table WHERE ID='234'
, а не SELECT * FROM table
WHERE ID=23
4. MySQL автоматически преобразует эту строку в число и
выбросит из нее все нецифровые символы. Полезно проводить следующие
контрольные проверки:
%22
(`"'), %23
(`#'), и %27
(`'').
addslashes()
. Что касается PHP 4.0.3, то в
нем имеется функция mysql_escape_string()
, базирующаяся на
функции с тем же именем из MySQL C API.
mysql_real_escape_string()
.
escape
и quote
, - для
потоков запросов.
quote()
или используйте для проверки
заполнители.
PreparedStatement
и
символы-заполнители.
tcpdump
и strings
. В большинстве
случаев проверить, являются ли потоки данных MySQL зашифрованными,
можно с помощью команды, подобной той, которая приведена ниже:
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings(Она работает под Linux, и будет, с незначительными изменениями, работать под другими системами.) Предупреждение: если вы не видите данных, это еще не гарантирует того, что они зашифрованы. Если требуется высокий уровень безопасности, обратитесь к экспертам в этой области.
При подключении к серверу MySQL используется, как правило, пароль. По линии связи пароль не передается в виде открытого текста, но алгоритм шифрования не очень сложный. Толковый хакер, если ему удастся перехватить трафик между клиентом и сервером, при определенной настойчивости может взломать пароль. Поэтому если связь между клиентом и сервером осуществляется по ненадежной сети, для шифрования связи следует использовать SSH-туннель.
Вся остальная информация передается в текстовом виде и может быть
прочитана кем угодно, кто в состоянии отлеживать подключение. Если это вас
беспокоит, можно воспользоваться протоколом со сжатием данных (в MySQL
3.22 и последующих версиях), что значительно затруднит подобные действия.
Чтобы еще более повысить безопасность связи, следует использовать протокол
ssh
. Open source
-клиент ssh
доступен на веб-сайте http://www.openssh.org/,
а коммерческий ssh
-клиент можно получить на веб-сайте
http://www.ssh.com/. С помощью такого протокола можно обеспечить
зашифрованную связь по протоколу TCP/IP между сервером MySQL и клиентом
MySQL.
Если вы используете MySQL 4.0, то можете также использовать предусмотренную в этой версии поддержку протокола OpenSSL. Обратитесь к разделу See section 4.3.9 Использование безопасных соединений.
Для обеспечения безопасности MySQL-системы необходимо строго придерживаться следующих рекомендаций:
other_user
не задан пароль, то кто
угодно может зайти под любым именем, просто введя mysql -u other_user
db_name
. Чтобы этого избежать, можно изменить пароль для всех
пользователей, отредактировав скрипт mysql_install_db
перед запуском
приложения, или только пароль для root
-пользователя MySQL, как это
показано ниже:
shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root'; mysql> FLUSH PRIVILEGES;
root
. Это очень
опасно, потому что любой пользователь, имеющий привилегию FILE
, будет
в состоянии создавать файлы как пользователь root
(например
~root/.bashrc
). Чтобы предотвратить это, mysqld
откажется запускаться
от имени пользователя root
, если это не будет задано напрямую с
помощью опции --user=root
. В то же время mysqld
может быть запущена от
имени обычного непривилегированного пользователя. Можно также, в целях
еще большего укрепления безопасности, создать новый аккаунт
Unix-пользователя mysql
. При запуске mysqld
от имени другого
пользователя Unix у вас отпадает необходимость заменять имя
пользователя root
в таблице user
, так как имена пользователя в MySQL
не имеют ничего общего с аккаунтами пользователей Unix. Для запуска
mysqld
от имени другого пользователя Unix добавьте в группу [mysqld]
файла опций `/etc/my.cnf' или файла опций `my.cnf', находящегося в
каталоге данных сервера, строку user
, задающую имя пользователя.
Например:
[mysqld] user=mysqlВ результате сервер будет запущен от имени назначенного пользователя, независимо от того, производится запуск вручную или посредством
safe_mysqld
или mysql.server
. Для получения дополнительной информации
обратитесь к разделу See section A.3.2 Запуск MySQL от обычного пользователем.
--skip-symlink
). Это особенно важно в том
случае, если вы запускаете mysqld
от имени пользователя root
,
поскольку у того, кто имеет право доступа для записи в каталоги данных
mysqld
, появляется возможность стереть любой файл в системе!
Обратитесь к разделу See section 5.6.1.2 Использование символических ссылок для таблиц.
PROCESS
всем пользователям. Команда
mysqladmin processlist
выводит текст запросов, обрабатываемых в данный
момент. Следовательно, любой пользователь, имеющий право на выполнение
этой команды, получает возможность прочитать, например, такой запрос
другого пользователя, как UPDATE
user SET
password=PASSWORD('not_secure')
. mysqld
резервирует добавочное
подключение для пользователей, имеющих привилегию PROCESS
, так что
пользователь MySQL под именем root
может подключиться и осуществлять
контроль даже в том случае, когда все обычные подключения заняты.
FILE
всем пользователям. Любой
пользователь, имеющий такую привилегию, может записать в любом месте
файловой системы файл с привилегиями демона mysqld
! Чтобы обеспечить
здесь хоть минимальную защиту, все файлы создаваемые с помощью команды
SELECT ... INTO OUTFILE
, сделаны общедоступными для чтения, но
перезаписать существующие файлы нельзя. Привилегия FILE
может быть
также использована для чтения любого файла, доступного пользователю
Unix, от имени которого запускается сервер. Это может быть
использовано в корыстных целях. Возможно, например, с помощью команды
LOAD DATA
загрузить `/etc/passwd' в таблицу и прочесть ее позже с
помощью SELECT
.
mysqld
задать значение переменной
max_user_connections
.
mysqld
, относящиеся к безопасности
К безопасности имеют отношение следующие опции mysqld
:
--local-infile[=(0|1)]
--local-infile=0
теряется возможность выполнять
команду LOAD DATA LOCAL INFILE
.
--safe-show-database
SHOW DATABASES
возвращает только те
базы данных, для которых пользователь имеет какую-либо привилегию. Начиная
с версии 4.0.2 эта опция отменена и не служит ни для чего (она включена по
умолчанию), т.к. сейчас у нас имеется привилегия SHOW DATABASES
.
Обратитесь к разделу See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
--safe-user-create
GRANT
, если у него отсутствует привилегия
INSERT
для таблицы mysql.user
. Чтобы предоставить пользователю доступ
именно для создания новых пользователей с теми привилегиями, которые он
имеет право предоставлять, для этого пользователя следует установить
следующую привилегию:
mysql> GRANT INSERT(user) ON mysql.user TO 'user''hostname';Задание такой привилегии гарантирует, что этот пользователь не сможет непосредственно вносить изменения ни в одном из столбцов привилегий, а для предоставления привилегий другим пользователям должен будет использовать команду
GRANT
.
--skip-grant-tables
flush-privileges
или
mysqladmin reload
.)
--skip-name-resolve
Host
таблиц привилегий должны быть либо IP-адресами, либо
localhost
.
--skip-networking
mysqld
должны осуществляться посредством сокетов Unix. Эта опция непригодна для
систем, в которых используются MIT-потоки, так как MIT-потоки не
поддерживают сокеты Unix.
--skip-show-database
SHOW DATABASES
только в том случае, если
пользователь имеет привилегию SHOW DATABASES
. Начиная с версии 4.0.2 в
этой опции больше нет необходимости, т.к. теперь доступ может
предоставляться избирательно с помощью привилегии SHOW DATABASES
.
Чтобы решить проблемы безопасности, которые могут возникнуть при
использовании команды LOAD DATA LOCAL
,в MySQL 3.23.49 и MySQL 4.0.2 были
добавлены новые опции.
При поддержке этой команды могут возникнуть две проблемы:
Первая: поскольку чтение файла инициируется сервером, теоретически имеется возможность создать ``доработанный'' при помощи патча сервер MySQL, способный читать любые файлы на клиентской машине, к которой текущий пользователь имеет доступ для чтения, в то время, когда клиент направляет запрос к таблице.
Вторая: в веб-среде, в которой подсоединение клиентов осуществляется с
веб-сервера, пользователь может использовать команду LOAD DATA LOCAL
для
чтения любых файлов, к которым процесс веб-сервера имеет доступ для чтения
(если предположить, что пользователь может выполнять на сервере SQL любые
команды).
Эти проблемы решаются с помощью двух следующих исправлений:
Если вы конфигурируете MySQL без опции --enable-local-infile
, то команда
LOAD DATA LOCAL
будет запрещена для всех клиентов, если, конечно, они не
будут вызывать mysql_options (... MYSQL_OPT_LOCAL_INFILE, 0)
. Обратитесь
к разделу See section 8.4.3.159 mysql_options()
.
В случае клиента mysql, LOAD DATA LOCAL
может быть разблокирована заданием
опции --local-infile[=1]
или заблокирована с помощью опции
--local-infile=0
.
По умолчанию все MySQL-клиенты и библиотеки компилируются с опцией
--enable-local-infile
для обеспечения совместимости с MySQL 3.23.48 и
более старыми версиями.
Блокировку всех команд LOAD DATA LOCAL
на MySQL-сервере можно осуществить
путем запуска mysqld
с опцией --local-infile=0
.
В случае, если команда LOAD DATA LOCAL INFILE
заблокирована на сервере или
клиенте, вы получите следующее сообщение об ошибке (1148):
The used command is not allowed with this MySQL version
Основной функцией системы привилегий MySQL является аутентификация
пользователя, подключающегося с указанного хоста, и ассоциирование его с
привилегиями базы данных, такими как SELECT
, INSERT
, UPDATE
и DELETE
.
К дополнительным функциональным возможностям системы привилегий относятся
следующие: возможность обслуживания анонимного пользователя и
предоставление привилегий для таких специфических для MySQL функций, как
LOAD DATA INFILE
и функции администрирования.
Система привилегий MySQL обеспечивает пользователям возможность выполнять только те действия, которые им разрешены в соответствии с их обязанностями. Когда вы подсоединяетесь к серверу MySQL, ваша личность устанавливается по имени хоста, с которого вы подсоединяетесь, и имени пользователя, которое вы указываете. Система предоставляет привилегии в соответствии с вашей личностью и тем, что вы хотите делать.
MySQL идентифицирует пользователя как по имени хоста, так и по имени
пользователя, т.к. нет оснований полагать что данное имя пользователя
принадлежит во всей Сети единственному человеку. Например, пользователь
joe
, устанавливающий соединение с office.com
, вовсе не обязательно один и
тот же человек, что и пользователь joe
, подсоединяющийся с elsewhere.com
.
MySQL решает эту проблему, обеспечивая возможность различать
пользователей, подсоединяющихся с различных хостов под одним и тем же
именем пользователя: вы можете предоставлять joe
один набор привилегий,
если он подсоединяется с office.com
, и другой набор привилегий, если joe
подсоединяется с elsewhere.com
.
Управление доступом в MySQL осуществляется в два этапа:
SELECT
, а во втором - имеется ли у вас для этой базы данных
привилегия DROP
.
На обеих стадиях управления доступом сервер использует таблицы user
, db
и
host
из базы данных mysql
. Ниже перечислены поля этих таблиц привилегий:
Имя таблицы | user | db | host
|
Поля контекста | Host | Host | Host
|
User | Db | Db
| |
Password | User | ||
Поля привилегий | Select_priv | Select_priv | Select_priv
|
Insert_priv | Insert_priv | Insert_priv
| |
Update_priv | Update_priv | Update_priv
| |
Delete_priv | Delete_priv | Delete_priv
| |
Index_priv | Index_priv | Index_priv
| |
Alter_priv | Alter_priv | Alter_priv
| |
Create_priv | Create_priv | Create_priv
| |
Drop_priv | Drop_priv | Drop_priv
| |
Grant_priv | Grant_priv | Grant_priv
| |
References_priv | |||
Reload_priv | |||
Shutdown_priv | |||
Process_priv | |||
File_priv |
На втором этапе управления доступом (верификация запросов) сервер может (в
случае, если запрос относится к таблицам базы данных) дополнительно
обратиться к таблицам tables_priv
и columns_priv
. Поля этих таблиц
привилегий перечислены ниже:
Имя таблицы | tables_priv | columns_priv
|
Поля контекста | Host | Host
|
Db | Db
| |
User | User
| |
Table_name | Table_name
| |
Column_name
| ||
Поля привилегий | Table_priv | Column_priv
|
Column_priv | ||
Иные поля | Timestamp | Timestamp
|
Grantor |
Каждая таблица привилегий включает в себя поля контекста и поля привилегий.
Поля контекста определяют область действия каждой из записей в таблицах,
т.е. контекст, к которому имеет отношение та или иная запись. Например,
запись в таблице user
, в полях Host
и User
которой указаны значения
'thomas.loc.gov'
'bob'
, предназначена для аутентификации подсоединений к
серверу с хоста thomas.loc.gov
под именем пользователя bob
. Аналогично
запись в таблице db
, в полях Host
, User
и Db
которой указаны значения
'thomas.loc.gov'
, 'bob'
и 'reports'
, будет использоваться при попытке
пользователя по именем bob
подсоединиться с хоста thomas.loc.gov
и
получить доступ к базе данных reports
. В полях контекста в таблицах
tables_priv
и columns_priv
указаны таблицы или комбинации таблиц/столбцов,
к которым применяется каждая запись.
При контроле доступа сравнение значений в полях Host
осуществляется без
учета регистра. Значения в полях User
, Password
, Db
и Table_name
также
являются независимыми от регистра символов. Значения в поле Column_name
являются независимыми от регистра символов, начиная с MySQL 3.22.12.
В полях привилегий указываются привилегии, предоставляемые записью в таблице, т.е. то, какие операции разрешено выполнять. Сервер формирует полное описание привилегий пользователя, комбинируя информацию, хранящуюся в разных таблицах привилегий. Это осуществляется по правилам, которые описаны в разделе See section 4.2.10 Управление доступом, этап 2: верификация запросов.
Поля контекста - это строковые значения, объявленные, как показано ниже; устанавливаемым по умолчанию значением для каждого из них является пустая строка:
Имя поля | Тип | Примечания |
Host | CHAR(60) | |
User | CHAR(16) | |
Password | CHAR(16) | |
Db | CHAR(64) | (CHAR(60) для таблиц
tables_priv и columns_priv tables)
|
Table_name | CHAR(60) | |
Column_name | CHAR(60) |
В таблицах user
, db
и host
все поля привилегий имеют объявленный тип
ENUM('N','Y')
, т.е. возможно одно из двух значений - 'N'
и 'Y'
, а
устанавливаемым по умолчанию является 'N'
.
В таблицах tables_priv
and columns_priv
поля привилегий объявляются как
SET
:
Имя таблицы | Имя поля | Допустимые элементы набора |
tables_priv
| Table_priv
| 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
|
tables_priv
| Column_priv
| 'Select', 'Insert', 'Update', 'References'
|
columns_priv
| Column_priv
| 'Select', 'Insert', 'Update', 'References'
|
Если кратко, то сервер использует таблицы привилегий следующим образом:
user
определяют, разрешить входящее
подсоединение или отказать в нем. Для разрешенных подсоединений любые
привилегии, предоставленные в таблице user
, означают глобальные
привилегии пользователя (привилегии суперпользователя). Эти привилегии
распространяются на все базы данных, размещенные на сервере.
db
и host
используются совместно:
db
определяют, каким пользователям, при
подсоединении с каких хостов разрешен доступ к каким базам
данных. Поля привилегий определяют разрешенные операции.
host
используется в качестве расширения таблицы db
в
случае, если необходимо применить некоторую запись из таблицы db
к разным хостам. Например, если вы хотите предоставить
пользователю возможность обращаться к базе данных с различных
хостов сети, оставьте пустым поле в записи этого пользователя в
таблице db
, а затем внесите в таблицу host
запись для каждого из
этих хостов. Более подробно данный механизм описан в разделе
See section 4.2.10 Управление доступом, этап 2: верификация запросов.
tables_priv
и columns_priv
подобны таблице db
, но областью их
действия является уже уровень таблиц и столбцов, а не баз данных.
Заметим, что привилегии администрирования (RELOAD
, SHUTDOWN
и т.д..)
задаются только в таблице user
. Это связано с тем, что операции
администрирования являются операциями над самим сервером, а не над базами
данных, поэтому не смысла перечислять такие привилегии в других таблицах
привилегий. Фактически для того, чтобы выяснить, имеете ли вы привилегии
выполнять операции администрирования, достаточно обратиться только к
таблице user
.
Привилегия FILE
также задается только в таблице user
. Она не является
привилегией администрирования как таковой, но возможность производить
чтение или запись файлов на серверном хосте не связана с базой данных, к
которой вы получаете доступ.
Сервер mysqld
считывает содержимое таблиц привилегий единожды, при его
запуске. О том, каким образом изменения, вносимые в таблицы привилегий,
вступают в силу, рассказывается в разделе See section 4.3.3 Когда изменения в привилегиях вступают в силу.
При внесении изменений в таблицы привилегий стоит убедиться в том, что
ваши изменения задают привилегии именно так, как задумано вами. Помощь по
диагностике проблем вы найдете в разделе See section 4.2.11 Причины появления ошибок Access denied
("в доступе отказано"). По вопросам, связанным с безопасностью, следует обращаться к разделу See section 4.2.2 Как обезопасить MySQL от хакеров.
Полезным диагностическим инструментом является скрипт mysqlaccess
,
которым Ив Карлье (Yves Carlier) укомплектовал дистрибутив MySQL.
Запустите mysqlaccess
с опцией --help
чтобы посмотреть, как он работает.
Заметим, что mysqlaccess
контролирует доступ, используя только таблицы
user
, db
и host
. Он не проверяет привилегии на уровне таблиц или
столбцов.
Информация о привилегиях пользователя хранится в таблицах user
, db
, host
,
tables_priv
и columns_priv
базы данных mysql
(т.е. в базе данных с именем
mysql). Сервер MySQL считывает содержимое этих таблиц во время запуска, и
в случаях, указанных в разделе See section 4.3.3 Когда изменения в привилегиях вступают в силу.
Ниже приведены имена, используемые в данном руководстве для ссылок на привилегии, предоставляемые в MySQL 4.0.2. Здесь же указаны имена табличных столбцов, ассоциированных с каждой из привилегий в таблицах привилегий, наряду с контекстом, в котором эти привилегии имеют силу:
Привилегия | Столбец | Контекст |
ALTER | Alter_priv | таблицы |
DELETE | Delete_priv | таблицы |
INDEX | Index_priv | таблицы |
INSERT | Insert_priv | таблицы |
SELECT | Select_priv | таблицы |
UPDATE | Update_priv | таблицы |
CREATE | Create_priv | базы данных, таблицы или индексы |
DROP | Drop_priv | базы данных или таблицы |
GRANT | Grant_priv | базы данных или таблицы |
REFERENCES | References_priv | базы данных или таблицы |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | администрирование сервера |
EXECUTE | Execute_priv | администрирование сервера |
FILE | File_priv | доступ к файлам на сервере |
LOCK TABLES | Lock_tables_priv | администрирование сервера |
PROCESS | Process_priv | администрирование сервера |
RELOAD | Reload_priv | администрирование сервера |
REPLICATION CLIENT | Repl_client_priv | администрирование сервера |
REPLICATION SLAVE | Repl_slave_priv | администрирование сервера |
SHOW DATABASES | Show_db_priv | администрирование сервера |
SHUTDOWN | Shutdown_priv | администрирование сервера |
SUPER | Super_priv | администрирование сервера |
Привилегии SELECT
, INSERT
, UPDATE
и DELETE
позволяют выполнять операции
над строками таблиц баз данных.
Для операторов SELECT
привилегия SELECT
требуется только в том случае,
если они действительно извлекают строки из таблицы.. В ряде случае можно
выполнять операторы SELECT
, даже не имея разрешения на доступ ни к одной
базе данных на сервере. Например: клиент mysql
вы можете использовать в
качестве обычного калькулятора:
mysql> SELECT 1+1; mysql> SELECT PI()*2;
Привилегия INDEX
позволяет создавать или уничтожать (удалять) индексы.
Привилегия ALTER
позволяет использовать команду ALTER TABLE
.
Привилегии CREATE
и DROP
позволяют создавать новые базы данных и таблицы
или уничтожать (удалять) существующие базы данных и таблицы.
Заметим, что в случае, если пользователю предоставляется привилегия DROP
по отношению к базе данных mysql
, он может уничтожить базу данных, в
которой хранятся привилегии доступа в MySQL!
Привилегия GRANT
позволяет вам предоставлять другим пользователям
привилегии, которыми обладаете вы сами.
Привилегия FILE
дает вам право читать и записывать файлы на сервере с
помощью операторов LOAD DATA INFILE
и SELECT ... INTO OUTFILE
. Любой
пользователь, которому предоставлена такая привилегия, имеет право
прочитать или записать любой файл, который может прочитать или записать
сервер MySQL.
Остальные привилегии используются для операций администрирования,
выполняемых с помощью программы mysqladmin
. В таблице, приведенной ниже,
для каждой из привилегий администрирования показано, какие команды
mysqladmin
она позволяет выполнять.
Привилегия | Команды, разрешенные обладателю привилегии |
RELOAD | reload , refresh ,
flush-privileges , flush-hosts , flush-logs , and
flush-tables
|
SHUTDOWN | shutdown
|
PROCESS | processlist
|
SUPER | kill
|
Команда reload
заставляет сервер перечитать таблицы привилегий. Команда
refresh
очищает все таблицы, а также открывает и закрывает файлы журналов.
flush-privileges
является синонимом reload
. Остальные команды flush-*
выполняют функции, аналогичные функциям команды refresh
, но с более узкой
областью действия. В некоторых случаях такие команды могут оказаться более
предпочтительными. Например, если вы хотите очистить только системные
журналы, команда flush-logs
лучше, чем refresh
.
Команда shutdown
завершает работу сервера.
Команда processlist
выводит информацию о задачах, выполняющихся на
сервере. Команда kill
уничтожает серверные потоки. Собственные потоки
всегда можно просмотреть или уничтожить, но для отображения потоков,
запущенных другими пользователями, нужна привилегия PROCESS
,а для
уничтожения потоков, запущенных другими пользователями, потребуется
привилегия SUPER
. Обратитесь к разделу See section 4.5.5 Синтаксис команды KILL
.
В общем случае идея предоставлять привилегии только тем пользователям, которым они необходимы, хорошая, но к предоставлению некоторых из них следует относиться особенно внимательно:
GRANT
позволяет пользователям передавать свои привилегии
другим пользователям. Два пользователя с неодинаковыми привилегиями,
имея привилегию GRANT
, способны объединить свои привилегии.
ALTER
может быть использована для переименования таблиц и
разрушения таким образом всей системы привилегий.
FILE
может использоваться злонамеренно для считывания
любого самого засекреченного файла, хранящегося на сервере, в таблицу
базы данных, к содержимому которой можно затем получить доступ с
помощью команды SELECT
. Это относится и к содержимому всех баз данных,
которые находятся под управлением сервера!
SHUTDOWN
может использоваться злонамеренно для полного
прекращения работы сервера и, таким образом, полного запрещения
обслуживания других пользователей.
PROCESS
может быть использована для просмотра открытого
текста запросов выполняющихся в данный момент, включая запросы на
установку или изменение паролей.
mysql
могут быть использованы для
изменения паролей и другой информации, относящейся к привилегиям
доступа. (Пароли хранятся в зашифрованном виде, поэтому злоумышленник
не сможет просто прочесть их, чтобы получить пароли в виде обычного
текста). Получив доступ к столбцу паролей mysql.user
, любой
пользователь может войти на сервер MySQL под именем другого
пользователя (имея достаточные привилегии, тот же самый пользователь
может заменить пароль на другой).
Есть вещи, которые система привилегий MySQL делать не может:
Обычно для получения доступа к серверу MySQL необходимо сообщить
клиентской программе параметры подсоединения: указать хост, с которым вы
хотите соединиться, ваши имя пользователя и пароль. Например, клиент mysql
можно запустить следующим образом (необязательные аргументы заключены в
квадратные скобки `[' и `]'):
shell> mysql [-h host_name] [-u user_name] [-pyour_pass]
Альтернативной формой опций -h
, -u
, и -p
являются --host=host_name
,
--user=user_name
и --password=your_pass
. Заметим, что между -p
или
--password=
и следующим за ними паролем пробела нет.
Внимание: Указывать пароль в командной строке небезопасно! Любой
пользователь в вашей системе может впоследствии отыскать ваш пароль, введя
команду типа ps auxww
. Обратитесь к разделу See section 4.1.2 Файлы параметров `my.cnf'.
В mysql
используются следующие значения по умолчанию для параметров
подсоединения, пропущенных в командной строке:
localhost
.
-p
никакого пароля не указывается.
Таким образом, для Unix-пользователя joe
следующие команды являются
эквивалентными:
shell> mysql -h localhost -u joe shell> mysql -h localhost shell> mysql -u joe shell> mysql
Другие клиенты MySQL ведут себя подобным же образом.
В Unix-системах можно задавать различные значения по умолчанию, которые будут использоваться при соединении с сервером, чтобы избавиться от необходимости каждый раз при вызове клиентской программы вводить их в командной строке. Это можно сделать двумя способами:
[client]
файла
конфигурации `my.cnf', который находится в вашей домашней директории.
Соответствующий раздел этого файла может иметь следующий вид:
[client] host=host_name user=user_name password=your_passОбратитесь к разделу See section 4.1.2 Файлы параметров `my.cnf'.
mysql
можно задать хост при помощи MYSQL_HOST
. Для задания имени
пользователя для MySQL можно использовать USER
(это относится только к
ОС Windows). Пароль может быть задан с помощью MYSQL_PWD
(но это
небезопасно, см. следующий раздел). Обратитесь к разделу See section F Переменные окружения.
При попытке соединения с сервером MySQL он либо устанавливает соединение, либо отказывает в нем - на основе данных о вашей личности и того, можете ли вы подтвердить их соответствующим паролем. Если нет, сервер полностью отказывает вам в доступе. В противном случае сервер устанавливает соединение, затем переходит ко второму этапу и ожидает запросов.
Личность задается двумя порциями информации:
Проверка личности осуществляется с помощью трех полей контекста таблицы
user
(Host
, User
и Password
). Сервер устанавливает соединение только в том
случае, если находит в таблице user
запись, в которой имя хоста и имя
пользователя совпадают с введенными вами, и вы указываете правильный
пароль.
Значения в полях контекста таблицы user
могут задаваться следующим
образом:
Host
может указываться имя хоста, либо его IP-адрес, либо
'localhost'
для обозначения локального хоста.
'%'
в поле Host
означает любое имя хоста.
Host
означает, что к этой привилегии должна
быть добавлена запись в таблице host
, совпадающая с заданным именем
хоста. Дополнительную информацию по данной теме вы найдете в следующем
разделе.
Host
,
определенных в виде IP-адресов, можно задавать сетевую маску,
указывающую, сколько разрядов адреса будет использоваться для указания
номера сети. Например:
mysql> GRANT ALL PRIVILEGES ON db.* -> TO david'192.58.197.0/255.255.255.0';В этом случае все IP-адреса, для которых выполняется следующее условие:
user_ip & netmask = host_ip.являются разрешенными для подсоединения. В предыдущем примере все IP-адреса в диапазоне от 192.58.197.0 до 192.58.197.255 являются разрешенными для подсоединения к серверу MySQL.
User
запрещено использовать шаблонные символы, но пустое
значение разрешено, и оно соответствует любому имени. Если запись в
таблице user
, соответствующая входящему подсоединению, содержит пустое
имя пользователя, данный пользователь считается анонимным
пользователем (пользователем без имени), а заданное клиентом имя
пользователя игнорируется. Это означает, что при всех последующих
проверках доступа, осуществляемых на протяжении данного соединения
(т.е. на этапе 2), будет использоваться пустое имя пользователя.
Password
может быть пустым. Это не означает, что в данном случае
подходит любой пароль. Если поле пароля пусто, пользователь должен
быть подсоединен без указания какого либо пароля.
Непустые значения в поле Password
представляют собой зашифрованные пароли.
В MySQL пароли не хранятся в виде открытого текста, который может
прочитать кто угодно. Напротив, пароль, который вводится пользователем при
попытке подсоединения, шифруется (с помощью функции PASSWORD()
). В
дальнейшем зашифрованный пароль используется клиентом/сервером в процессе
проверки его правильности (это делается вообще без пересылки пароля во
время подсоединения). Заметим, что с MySQL считает зашифрованный пароль
РЕАЛЬНЫМ паролем, поэтому не следует допускать к нему кого бы то ни было!
В частности, не разрешайте обычным пользователям доступ для чтения к
таблицам в базе mysql
!
Примеры, приведенные ниже, показывают, каким входящим подсоединениям
соответствуют различные комбинации значений, указанных в полях Host
и User
таблицы user
:
Значение в поле Host | Значение в поле User | Подсоединения, которым соответствует запись |
'thomas.loc.gov' | 'fred' | fred , подключающийся с thomas.loc.gov
|
'thomas.loc.gov' | '' | Любой пользователь, подключающийся с thomas.loc.gov
|
'%' | 'fred' | fred , подключающийся с любого хоста
|
'%' | '' | Любой пользователь, подключающийся с любого хоста |
'%.loc.gov' | 'fred' | fred , подключающийся с любого хоста, принадлежащего домену loc.gov
|
'x.y.%' | 'fred' | fred , подключающийся с x.y.net , x.y.com ,x.y.edu , и т.д. (это, по-видимому, бесполезный вариант)
|
'144.155.166.177' | 'fred' | fred , подключающийся с хоста, имеющего IP-адрес 144.155.166.177
|
'144.155.166.%' | 'fred' | fred , подключающийся с любого хоста в подсети 144.155.166 класса C
|
'144.155.166.0/255.255.255.0' | 'fred' | То же самое, что и в предыдущем примере |
Поскольку в IP-адресе, указываемом в поле Host
, могут использоваться
шаблонные символы (например '144.155.166.%'
- данное значение
соответствует всем без исключения хостам указанной подсети), возникает
опасность, что кто-нибудь может попытаться воспользоваться этой
возможностью, указав имя хоста, например, как 144.155.166.somewhere.com
.
Чтобы ``поставить заслон'' таким попыткам, в MySQL не разрешены имена
хостов, начинающиеся с цифр и точки. Другими словами, имени хоста типа
1.2.foo.com
, никогда не найдется соответствия в столбцах Host
таблиц
привилегий. IP-адресу с шаблонными символами может соответствовать только
IP-адрес.
Входящее подсоединение может совпадать с несколькими записями в таблице
user. Например, как было показано выше, подсоединению с thomas.loc.gov by
fred
могут подходить разные записи. Каким образом сервер определяет, какую
из записей использовать, при совпадении с более чем одной из них? Для
этого после считывания таблицы user
во время запуска сервер производит ее
сортировку, а затем, когда пользователь пытается установить соединение,
записи таблицы просматриваются в порядке их упорядочения,. Используется
первая подошедшая запись.
Сортировка таблицы user осуществляется следующим образом. Предположим,
таблица user
имеет следующий вид:
+-----------+----------+- | Host | User | ... +-----------+----------+- | % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+-
При считывании этой таблицы сервер упорядочивает записи, начиная с
наиболее конкретных значений в столбце Host
('%'
в столбце Host
означает
``любой хост'' и является наименее конкретным). Записи с одинаковым
значением в столбце Host
упорядочиваются между собой начиная с наиболее
конкретных значений в столбце User
(пустое значение в столбце User
означает ``любой пользователь'' и является наименее конкретным).
Окончательно отсортированная таблица user
имеет следующий вид:
+-----------+----------+- | Host | User | ... +-----------+----------+- | localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+-
При попытке подсоединения сервер просматривает отсортированные записи и
использует первую подходящую запись. Для подсоединения с localhost
пользователя jeffrey
первыми подходящими записями являются записи со
значением 'localhost'
в столбце Host
. Из них запись с пустым значением
имени пользователя соответствует и имени подсоединяющегося хоста и имени
пользователя. (запись '%'/'jeffrey'
тоже подошла бы, но она -- не первая
подходящая в этой таблице).
Рассмотрим другой пример. Пусть таблица user
имеет вид:
+----------------+----------+- | Host | User | ... +----------------+----------+- | % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+-
Отсортированная таблица выглядит следующим образом:
+----------------+----------+- | Host | User | ... +----------------+----------+- | thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+-
Для подсоединения пользователя jeffrey
с thomas.loc.gov
подходит первая
запись, в то время как для подсоединения jeffrey
с whitehouse.gov
-
вторая.
Существует распространенное заблуждение: иногда думают, что при поиске
записей для данного имени пользователя, соответствующих определенному
подсоединению, сервер первыми будет использовать записи, в которых этот
пользователь указан явно. Это абсолютно неверно, как и продемонстрировано
в предыдущем примере: для подсоединения пользователя jeffrey
с
thomas.loc.gov
первой подходящей записью является не запись, содержащая
значение 'jeffrey'
в поле User
, а запись, не содержащая имени пользователя
вовсе!
Если у вас возникают проблемы с подсоединением к серверу, распечатайте
таблицу user
и отсортируйте ее вручную, чтобы увидеть, где
происходит первое совпадение.
После установления соединения сервер приступает к выполнению второго
этапа. Для каждого поступающего запроса сервер проверяет, имеется ли у вас
достаточно привилегий для его выполнения, основываясь при этом на типе
операции, которую вы хотите выполнить. Теперь в действие вступают поля
привилегий в таблицах привилегий. Информация о привилегиях может
находиться в любой из таблиц привилегий - user
, db
, host
, tables_priv
или
columns_priv
. Обработка таблиц привилегий осуществляется с помощью команд
GRANT
и REVOKE
. Обратитесь к разделу See section 4.3.1 Синтаксис команд GRANT
и REVOKE
. Интерес
может представлять раздел See section 4.2.6 Как работает система привилегий, в котором перечислены поля, имеющиеся в каждой из
таблиц привилегий.
Таблица user
предоставляет привилегии глобального характера, и их
применение не зависит от того, в какой базе вы работаете в данный момент.
Например, если таблица user
предоставляет пользователю привилегию DELETE
,
он может удалять строки из любой базы данных на серверном хосте! Иными
словами, привилегии в таблице user
- это привилегии суперпользователя.
Поэтому целесообразно предоставлять привилегии в таблице user
только
суперпользователям, таким как администраторы сервера или администраторы
баз данных. Что касается других пользователей, для их привилегий в таблице
user следует установить значение 'N'
и предоставлять им привилегии только
на уровне баз данных, используя для этого таблицы db
и host
.
Таблицы db
и host
предоставляют привилегии на уровне базы данных. Значения
в полях контекста могут задаваться следующим образом:
Host
и Db
любой таблицы.
'%'
в колонке Host
таблицы db
означает ``любой хост''. Пустое
значение в поле Host
таблицы db
означает ``за дополнительной
информацией следует обратиться к таблице host
''.
'%'
или пустое значение в поле Host
таблицы host
означает
``любой хост''.
'%'
или пустое значение в поле Db
любой из таблиц означает
``любая база данных''.
User
любой из таблиц соответствует анонимному
пользователю.
Таблицы db
и host
считываются и сортируются при запуске сервера (тогда же,
когда он считывает таблицу user
). Таблица db
сортируется по полям
контекста Host
, Db
и User
, а таблица host
- по полям контекста Host
и Db
.
Как и в случае таблицы user
, при сортировке первыми отбираются наиболее
конкретные значения, а последними - наименее конкретные, а когда сервер
производит поиск совпадающих записей, используется первая совпадающая
запись, которую он находит.
Таблицы tables_priv
и columns_priv
предоставляют привилегии соответственно
на уровне таблиц и столбцов. Значения в полях контекста задаются следующим
образом:
Host
можно использовать шаблонные символы `%'
и `_'.
'%'
или пустое значение в поле Host
означает ``любой
хост''.
В обеих таблицах в полях Db
, Table_name
и Column_name
запрещено
использовать шаблонные символы или пустое значение.
Таблицы_priv
и columns_priv
сортируются по полям Host
, Db
и User
. Эта
сортировка проводится так же, как и в таблице db
, хотя в данном случае
задача несколько упрощается, т.к. шаблонные символы могут встретиться
только в поле Host
.
Ниже описывается процесс верификации запроса. (Если вы хорошо знакомы с исходным кодом проверки доступа, то заметите некоторые отличия: приведенное здесь описание несколько упрощено, чтобы сделать его более понятным, однако оно соответствует тому, что в действительности делает код).
Для запросов на администрирование (SHUTDOWN
, RELOAD
, etc.) сервер
проверяет запись только в таблице user
, т.к. это единственная таблица,
которая определяет привилегии администрирования. Доступ предоставляется
при условии, что выбранная запись разрешает затребованные операции, и
запрещается в противном случае. Например, вы хотите завершить работу mysql
с помощью mysqladmin shutdown
, но ваша запись в таблице user
не
предоставляет вам привилегию SHUTDOWN
. В этом случае в доступе будет
отказано без дальнейшей проверки таблицы db
и host
(поскольку в них
отсутствует столбец Shutdown_priv
, в такой проверке нет необходимости).
В случае запросов, относящихся к базам данных (INSERT
, UPDATE
и т.д.),
сервер сначала проверяет глобальные привилегии пользователя (привилегии
суперпользователя), просматривая запись в таблице user
. Если эта запись
разрешает затребованную операцию, доступ предоставляется. Если глобальные
привилегии, указанные в таблице user
, недостаточны, сервер проверяет
таблицы db
и host
и определяет привилегии пользователя на уровне баз
данных:
db
в поисках записи с подходящими
значениями в полях Host
, Db
и User
. Поля Host
и User
сравниваются с
именем подключающегося хоста и именем пользователя MySQL. Поле Db
сравнивается с именем базы данных, к которой пользователь хочет
получить доступ. Если запись с подходящими значениями в полях Host
и
User
отсутствует, в доступе будет отказано.
db
имеется подходящая запись и значение в поле Host
- не пустое, эта запись определяет привилегии пользователя, касающиеся
базы данных.
db
, значение в поле
Host пустое, это означает, что перечень хостов, которым разрешен
доступ к требуемой базе данных, приведен в таблице host
. В этом случае
дальнейший поиск производится в таблице host
, где ищется запись с
подходящими значениями в полях Host
и Db
. Если ни одной подходящей
записи в таблице host
нет, в доступе будет отказано. Если такая запись
имеется, привилегии пользователя на уровне базы данных вычисляются
путем логического умножения (не логического сложения!) привилегий,
найденных в записях, которые выбраны в таблицах db
и host
. Другими
словами, пользователю назначаются те привилегии, для которых в обеих
записях установлено значение 'Y'
. (Этот способ можно использовать
следующим образом: предоставить всеобщие привилегии в записи,
хранящейся в таблице db
, а затем выборочно ограничить их отдельно по
каждому хосту, используя для этого записи в таблице host
.)
Определив привилегии на уровне базы данных, предоставляемые записями в
таблицах db
и host
, сервер добавляет их к глобальным привилегиям, заданным
в таблице user
. Если в результате привилегий оказывается достаточно для
выполнения затребованной операции, доступ предоставляется. В противном
случае сервер проверяет по таблицам tables_priv
и columns_priv
привилегии
пользователя на уровне таблиц и столбцов и добавляет их к уже имеющимся
привилегиям. В зависимости от полученного результата доступ либо
предоставляется, либо нет.
Если приведенное выше описание вычислений привилегий пользователя перевести на язык алгебры логики, используя логические операторы, то в результате получится примерно следующее:
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges
Сам по себе алгоритм определения привилегий на первый взгляд может
показаться неочевидным. И в самом деле, если первоначально глобальных
привилегий, определяемых таблицей user
, оказывается недостаточно для
выполнения затребованной операции, то зачем впоследствии эти вроде бы
бесполезные привилегии добавляются к привилегиям на уровне баз данных,
таблиц и столбцов? Смысл такого добавления заключается в том, что для
выполнения запроса может потребоваться не один, а несколько типов
привилегий. Например, для выполнения оператора INSERT ... SELECT
вам
потребуется как привилегия INSERT
, так и привилегия SELECT
. Ваши
привилегии могут быть таковы, что запись в таблице user предоставляет вам
одну привилегию, а запись в таблице db
- другую. Другими словами,
привилегии, необходимые для выполнения запроса, у вас есть, но сервер не
может выяснить при просмотре каждой таблицы в отдельности, и поэтому
привилегии, предоставляемые записями из обеих таблиц, должны быть
объединены.
Таблицу host
можно использовать еще для одной цели - для поддержки списка
надежных серверов.
В таблицах на TcX host
содержит список всех машин локальной сети. Им
предоставляются все привилегии.
Таблицу host
можно также использовать для регистрации хостов, которые
являются ненадежными. Предположим, одна из ваших машин -
public.your.domain
находится в общедоступной области, которую вы считаете
незащищенной. В таком случае можно разрешить доступ всем хостам вашей
сети, за исключением одной ``неблагонадежной'' машины, используя записи в
таблице host
, подобные приведенным ниже:
+--------------------+----+- | Host | Db | ... +--------------------+----+- | public.your.domain | % | ... (для всех привилегий установлено значение 'N') | %.your.domain | % | ... (для всех привилегий установлено значение 'Y') +--------------------+----+-
Естественно, всегда нужно протестировать записи в таблицах привилегий
(например, с помощью mysqlaccess
), чтобы убедиться в том, что привилегии
доступа установлены вами действительно так, как задумано.
Access denied
("в доступе отказано")
Если при попытке подсоединения к серверу MySQL вы сталкиваетесь с ошибкой
Access denied
, то воспользуйтесь приведенным ниже списком. В нем
перечислены меры, которые можно принять для решения этой проблемы:
mysql_install_db
для
установки начального содержимого таблиц привилегий? Если нет, сделайте
это. Обратитесь к разделу See section 4.3.4 Задание изначальных привилегий MySQL.
Проверьте первоначальные привилегии с помощью следующей команды:
shell> mysql -u root testПодсоединение должно произойти без сбоя. Следует также убедиться, что в каталоге базы данных MySQL имеется файл `user.MYD'. Обычно он находится в директории `PATH/var/mysql/user.MYD', где
PATH
- путь к корневому каталогу
инсталляции MySQL.
shell> mysql -u root mysqlСервер разрешит подсоединение, т.к. пользователь MySQL с именем пользователя
root
исходно не имеет пароля. Но в этом заключается также и
риск нарушения безопасности системы, поэтому при создании остальных
пользователей MySQL, вам, помимо прочего, следует задать пароль для
пользователя root
. Если при попытке подсоединения от имени пользователя
root вы получите следующую ошибку:
Access denied for user: '@unknown' to database mysqlэто означает, что в таблице
user
отсутствует запись со значением 'root'
в
столбце User
и mysqld
не может определить имя хоста для вашего клиента. В
этом случае необходимо перезапустить сервер с опцией --skip-grant-tables
и
отредактировать файл `/etc/hosts' или `\windows\hosts', добавив в него запись
для вашего хоста.
shell> mysqladmin -u root -pxxxx ver Access denied for user: 'root@localhost' (Using password: YES)это означает, что используется неверный пароль. Обратитесь к разделу See section 4.3.7 Задание паролей. Если вы забыли пароль для пользователя
root
, то
перезапустите mysqld
с опцией --skip-grant-tables
и измените пароль.
Обратитесь к разделу See section A.4.2 Как переустановить забытый пароль пользователя root
. Такая
ошибка может появляться даже в том случае, если вы не задавали пароля
вообще - это значит, что в каком-то файле `my.ini' имеется неверный пароль.
Обратитесь к разделу See section 4.1.2 Файлы параметров `my.cnf'. Отменить использование файлов
опций можно с помощью опции the --no-defaults
, как показано ниже:
shell> mysqladmin --no-defaults -u root ver
mysql_fix_privilege_tables
при обновлении
имеющейся инсталляции MySQL, если установленная версия - более ранняя,
чем 3.22.11, а обновляется она до 3.22.11 или более поздней? Если нет,
сделайте это. Начиная с MySQL 3.22.11, когда оператор GRANT
стал
функциональным, структура таблиц привилегий изменилась.
PASSWORD()
должна использоваться, если вы задаете пароль с помощью
операторов INSERT
, UPDATE
или SET PASSWORD
. Если же вы задаете пароль
с помощью оператора GRANT ... INDENTIFIED BY
или команды mysqladmin
passwor
d, функция PASSWORD()
не нужна. Обратитесь к разделу See section 4.3.7 Задание паролей.
localhost
- это синоним имени вашего локального хоста, и, если хост
явно не задан, также устанавливаемое по умолчанию имя хоста, к
которому клиенты пытаются подключиться. Однако подсоединения к
localhost
не действуют, если в вашей рабочей системе используются
MIT-потоки (подсоединения к localhost
осуществляются с использованием
сокетов Unix, а они не поддерживаются технологией MIT-потоков). Чтобы
в таких системах эта проблема не возникала, следует явным образом
задать имя серверного хоста с помощью опции --host
. Таким образом
будет установлено подсоединение к серверу mysqld
по протоколу TCP/IP.
В этом случае в записях таблицы user
, хранящейся на серверном хосте,
должно быть указано реальное имя хоста. (Это справедливо даже для тех
случаев, когда клиентская программа и сервер запускаются на одном
хосте).
mysql
-u user_name db_name
возникает ошибка Access denied
, причина этого,
возможно, кроется в таблице user
. Чтобы проверить это, выполните
команду mysql -u root mysql
и введите следующий SQL-оператор:
mysql> SELECT * FROM user;В результате будет выведена запись со столбцами
Host
и User
,
соответствующими имени вашего компьютера и вашему имени пользователя
MySQL.
Access denied
информирует вас о том, под каким
именем вы пытаетесь войти в систему, об имени хоста, с которого вы
пытаетесь установить соединение, и о том, использовали ли вы при этом
пароль или нет. Как правило, в таблице user
будет одна запись, точно
соответствующая имени хоста и имени пользователя, указанным в
сообщении об ошибке. Например, если вы получите сообщение об ошибке, в
котором сказано Using password: NO
, это означает, что вы пытались
войти в систему, не указав пароль.
user
отсутствует строка с таким именем
хоста:
Host ... is not allowed to connect to this MySQL serverЧтобы исправить эту ошибку, с помощью утилиты командной строки
mysql
(на
серверном хосте!) добавьте строку в таблицу user
, db
или host
с
комбинацией имени пользователя/хоста, соответствующей той, которую вы
используете при попытке подсоединения. Затем выполните команду mysqladmin
flush-privileges
. Если вы используете MySQL версии, отличной от Version
3.22, и вам неизвестно имя хоста или IP-адрес компьютера, с которого вы
подсоединяетесь, введите в таблицу user запись со значением '%'
в поле
Host
и перезапустите mysqld
на серверной машине с опцией --log
. Когда
соединение с клиентской машины будет установлено, вы найдете в журнале
регистрации MySQL информацию об имени хоста, с которого вы подсоединились.
(После этого следует заменить в записи таблицы user
значение '%'
настоящим
именем хоста, из журнала регистрации. Иначе ваша система останется
незащищенной.)
В Linux причиной такой ошибки может быть то, что бинарная
версия MySQL скомпилирована с версией glibc, отличной от используемой
вами. В этом случае нужно будет либо обновить ОС/glibc, используемые вами,
либо загрузить исходный код MySQL и скомпилировать сервер самостоятельно.
Как правило, исходный RPM компилируется и инсталлируется элементарно, так
что это не составит серьезной проблемы.
shell> mysqladmin -u root -pxxxx -h some-hostname ver Access denied for user: 'root' (Using password: YES)то это означает, что ошибка возникает при попытке MySQL сопоставить IP-адрес с именем хоста. В этом случае вы можете выполнить команду
mysqladmin flush-hosts
, чтобы сбросить внутреннюю кэш-память DNS.
Обратитесь к разделу See section 5.5.5 Как MySQL использует DNS. Вот некоторые способы решения
этой проблемы:
mysqld
с опцией --skip-name-resolve
.
mysqld
с опцией --skip-host-cache
.
localhost
если ваш сервер и клиент работают на одном
и том же компьютере.
mysql -u root test
работает успешно, а команда mysql -h
your_hostname -u root tes
t приводит к ошибке Access denied
, то,
возможно, в таблице user
имя вашего хоста указано неверно. Одна из
распространенных проблем здесь заключается в том, что в поле Host
записи, хранящейся в таблице user
, задается только имя хоста, в то
время как процедуры разрешения имен, используемые вашей системой,
возвращают полностью определенное доменное имя (или наоборот).
Например, если в таблице user имеется запись со значением 'tcx'
в поле
host
, а DNS при этом сообщает MySQL, что имя хоста - 'tcx.subnet.se'
,
эта запись действовать не будет. Попробуйте добавить в таблицу user
запись, указав в колонке Host
IP-адрес хоста. (В качестве альтернативы
можно добавить в таблицу user
запись со значением в поле Host
,
содержащим шаблонный символ, например 'tcx.%'
. Но использовать имена
хостов, оканчивающиеся на '%'
- небезопасно и делать это не
рекомендуется!)
mysql -u user_name test
работает успешно, а команда mysql
-u user_name other_db_nam
e - нет, то в таблице db
нет записи,
соответствующей other_db_name
.
mysql -u user_name db_name
выполняется успешно на том
компьютере, где установлен сервер, а mysql -u host_name -u user_name
db_name
не работает при выполнении ее на другой клиентской машине, то
в таблицах user
или db
эта клиентская машина не зарегистрирована.
Access denied
, удалите из
таблицы user
все записи, в которых значение в поле Host
включает
шаблонные символы (записи, содержащие символы `'%'' или `'_''). Очень
распространенной ошибкой является следующая: пользователь вставляет
новую запись со значением '%'
в поле Host
и со значением 'some user'
-
в поле User
, полагая, что после этого для подсоединения с той же самой
машины он сможет использовать localhost
. Такой расчет неверен, и
причина здесь в том, что устанавливаемые по умолчанию привилегии
включают запись со значением 'localhost'
в поле Host
и пустым полем
User
. И поскольку в этой записи значение 'localhost'
более конкретно,
чем '%',
то именно она при подсоединении с localhost
предшествует
новой записи и, соответственно, будет выбрана и сработает! Правильным
в этом случае будет вставить вторую запись со значением 'localhost'
в
поле Host
и значением 'some_user'
- в поле User
или удалить запись со
значением 'localhost'
в поле Host
и пустым полем User
.
db
или таблицей host
:
Access to database deniedЕсли в записи, выбранной из таблицы
db
, столбец Host
- пустой,
удостоверьтесь, что в таблице host
имеется по крайней мере одна
соответствующая запись, указывающая, к каким хостам относится запись из
таблицы db
. Если ошибка возникает при выполнении SQL-команды SELECT ...
INTO OUTFILE
или LOAD DATA INFILE
, то в вашей записи из таблицы user
,
вероятно, отсутствует разрешение на предоставление привилегии FILE
.
Access denied
возникает при
выполнении вашей клиентской программы без каких-либо опций, убедитесь,
что ни в одном из ваших файлов опций не указан старый пароль!
Обратитесь к разделу See section 4.1.2 Файлы параметров `my.cnf'.
INSERT
или UPDATE
), а ваши изменения, похоже,
игнорируются, то следует выдать оператор FLUSH PRIVILEGES
или
выполнить команду mysqladmin flush-privileges
- для того, чтобы
заставить сервер перечитать таблицы привилегий. В противном случае
ваши изменения вступят в силу лишь при последующем перезапуске
сервера. Помните, что после того, как вы зададите пароль от имени
пользователя, вам нужно будет указывать его только после сброса
привилегий, т.к. серверу еще не будет известно о том, что вы изменили
пароль!
mysql -u user_name db_name
или команды mysql -u
user_name -pyour_pass db_name
. Если ваш клиент mysql
обеспечивает
подсоединение, то проблема связана не с привилегиями доступа, а с
вашей программой. (Заметим, что между -p
и паролем пробела нет; для
задания пароля можно также использовать синтаксическую структуру
--password=your_pass
. Если вы используете только саму опцию -p
, MySQL
запросит у вас пароль)
mysqld
с опцией --skip-grant-tables
.
Тогда вы сможете изменять таблицы привилегий MySQL и с помощью скрипта
mysqlaccess
проверять, произвели ли сделанные вами изменения желаемый
эффект. Если результаты вас устраивают, выполните команду mysqladmin
flush-privileges
, чтобы приказать серверу mysqld
приступить к
использованию новых таблиц привилегий. Внимание: перезагрузка таблиц
привилегий отменяет опцию --skip-grant-tables
. Это позволяет заставить
сервер приступить к использованию новых таблиц привилегий без
завершения его работы и перезагрузки.
mysqld
daemon с опцией
отладки (например --debug=d,general,query
). В результате будет
выведена информация о неудачных подсоединениях, с указанием хоста и
пользователя, а также обо всех обработанных командах. Обратитесь к
разделу See section E.1.2 Создание трассировочных файлов.
mysqldump mysql
. Отчет о
проблеме, как и в других случаях, отправляется с помощью скрипта
mysqlbug
. Обратитесь к разделу See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах. В некоторых случаях для выполнения скрипта mysqldump
возможно,
потребуется перезапустить mysqld
с опцией --skip-grant-tables
.
GRANT
и REVOKE
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY [PASSWORD] 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [REQUIRE [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...]
GRANT
включен в MySQL начиная с версии 3.22.11 и выше. В более ранних
версиях MySQL оператор GRANT
ничего не выполняет.
Команды GRANT
и REVOKE
позволяют системным администраторам создавать
пользователей MySQL, а также предоставлять права пользователям или лишать
их прав на четырех уровнях привилегий:
mysql.user
.
mysql.db
и mysql.host
.
mysql.tables_priv
.
mysql.columns_priv
.
Если привилегии предоставляются пользователю, которого не существует, то
этот пользователь создается. Чтобы просмотреть примеры работы команды
GRANT
, см. раздел section 4.3.5 Добавление новых пользователей в MySQL.
В таблице приведен список возможных значений параметра priv_type
для
операторов GRANT
и REVOKE
:
ALL [PRIVILEGES] | Задает все простые привилегии, кроме WITH GRANT OPTION
|
ALTER | Разрешает использование ALTER TABLE
|
CREATE | Разрешает использование CREATE TABLE
|
CREATE TEMPORARY TABLES | Разрешает использование CREATE TEMPORARY TABLE
|
DELETE | Разрешает использование DELETE
|
DROP | Разрешает использование DROP TABLE .
|
EXECUTE | Разрешает пользователю запускать хранимые процедуры (для MySQL 5.0) |
FILE | Разрешает использование SELECT ... INTO OUTFILE и LOAD DATA INFILE .
|
INDEX | Разрешает использование CREATE INDEX and DROP INDEX
|
INSERT | Разрешает использование INSERT
|
LOCK TABLES | Разрешает использование LOCK TABLES на таблицах, для которых есть привилегия SELECT .
|
PROCESS | Разрешает использование SHOW FULL PROCESSLIST
|
REFERENCES | Зарезервировано для использования в будущем |
RELOAD | Разрешает использование FLUSH
|
REPLICATION CLIENT | Предоставляет пользователю право запрашивать местонахождение головного и подчиненных серверов. |
REPLICATION SLAVE | Необходимо для подчиненных серверов при репликации (для чтения информации из бинарных журналов головного сервера). |
SELECT | Разрешает использование SELECT
|
SHOW DATABASES | SHOW DATABASES выводит все базы данных.
|
SHUTDOWN | Разрешает использование mysqladmin shutdown
|
SUPER | Позволяет установить одно соединение (один раз), даже если достигнуто значение max_connections, и запускать команды CHANGE MASTER , KILL thread , mysqladmin debug , PURGE MASTER LOGS и SET GLOBAL
|
UPDATE | Разрешает использование UPDATE
|
USAGE | Синоним для ``без привилегий''. |
Значение USAGE
можно задавать, если необходимо создать пользователя без
привилегий.
Привилегии CREATE TEMPORARY TABLES
, EXECUTE
, LOCK TABLES
, REPLICATION ...
,
SHOW DATABASES
и SUPER
являются новыми для версии 4.0.2. Чтобы
воспользоваться этими новыми привилегиями после обновления до версии
4.0.2, необходимо запустить скрипт mysql_fix_privilege_tables
.
В боле старых версиях MySQL привилегия PROCESS
предоставляет такие же
права, как и новая привилегия SUPER
.
Чтобы лишить пользователя привилегий, предоставленных командой GRANT
,
воспользуйтесь значением priv_type
в GRANT OPTION
:
mysql> REVOKE GRANT OPTION ON ... FROM ...;
Для таблицы можно указать только следующие значения priv_type
: SELECT
,
INSERT
, UPDATE
, DELETE
, CREATE
, DROP
, GRANT
, INDEX
и ALTER
.
Для столбца можно указать только следующие значения priv_type
(при
использовании оператора column_list
): SELECT
, INSERT
и UPDATE
.
Глобальные привилегии можно задать, воспользовавшись синтаксисом ON *.*
, а
привилегии базы данных - при помощи синтаксиса ON db_name.*
. Если указать
ON *
при открытой текущей базе данных, то привилегии будут заданы для этой
базы данных. (Предупреждение: если указать ON *
при отсутствии открытой
текущей базы данных, это повлияет на глобальные привилегии!)
С тем, чтобы можно было определять права пользователям с конкретных
компьютеров, в MySQL обеспечивается возможность указывать имя пользователя
(user_name
) в форме user@host
. Если необходимо указать строку user
, в
которой содержатся специальные символы (такие как `-') или строку host
, в
которой содержатся специальные или групповые символы (такие как `%'),
можно заключить имя удаленного компьютера или пользователя в кавычки
(например, 'test-user'@'test-hostname'
).
В имени удаленного компьютера также можно указывать групповые символы.
Например, user@"%.loc.gov"
относится к user
всех удаленных компьютеров
домена loc.gov
, а user@"144.155.166.%"
относится к user
всех удаленных
компьютеров подсети 144.155.166
класс C.
Простая форма user является синонимом для user@"%"
.
В MySQL не поддерживаются групповые символы в именах пользователей.
Анонимные пользователи определяются вставкой записей User=''
в таблицу
mysql.user
или созданием пользователя с пустым именем при помощи команды
GRANT
.
Примечание: если анонимным пользователям разрешается подсоединяться к
серверу MySQL, необходимо также предоставить привилегии всем локальным
пользователям как user@localhost
, поскольку в противном случае при попытке
пользователя зайти в MySQL с локального компьютера в таблице mysql.user
будет использоваться вход для анонимного пользователя!
Чтобы проверить, происходит ли подобное на вашем компьютере, выполните следующий запрос:
mysql> SELECT Host,User FROM mysql.user WHERE User='';
На данный момент команда GRANT
поддерживает имена удаленных компьютеров,
таблиц, баз данных и столбцов длиной не более 60 символов. Имя
пользователя должно содержать не более 16 символов.
Привилегии для таблицы или столбца формируются при помощи логического
оператора OR из привилегий каждого из четырех уровней. Например, если в
таблице mysql.user
указано, что у пользователя есть глобальная привилегия
SELECT
, эта привилегия не отменяется на уровне базы данных, таблицы или
столбца.
Привилегии для столбца могут быть вычислены следующим образом:
глобальные привилегии OR (привилегии базы данных AND привилегии удаленного компьютера) OR привилегии таблицы OR привилегии столбца
В большинстве случаев права пользователя определяются только на одном уровне привилегий, поэтому обычно эта процедура не настолько сложна, как описано выше. Подробная информация о последовательности действий проверки привилегий представлена в разделе section 4.2 Общие проблемы безопасности и система привилегий доступа MySQL.
Если привилегии предоставляются сочетанию пользователь/удаленный
компьютер, которое отсутствует в таблице mysql.user
, то в последнюю
добавляется запись, которая остается в таблице до тех пор, пока не будет
удалена при помощи команды DELETE
. Иначе говоря, команда GRANT
может
создавать записи user
в таблице, но команда REVOKE
не может их удалить.
Это необходимо делать при помощи команды DELETE
.
Если в MySQL версий 3.22.12 и выше создан новый пользователь или
предоставлены глобальные привилегии, пароль пользователя будет назначаться
оператором IDENTIFIED BY
, если он указан. Если у пользователя уже есть
пароль, то этот пароль будет заменен новым.
Если вы не хотите отправлять пароль открытым текстом, можно
воспользоваться параметром PASSWORD
с зашифрованным паролем, полученным
при помощи функции SQL PASSWORD()
или функции C API
make_scrambled_password(char *to, const char *password)
.
Предупреждение: если при создании нового пользователя не указать оператор
IDENTIFIED BY
, будет создан пользователь без пароля. Это ненадежно с точки
зрения безопасности.
Пароли также можно задавать при помощи команды SET PASSWORD
. See section 5.5.6 Синтаксис команды SET
.
Если у вас привилегии для базы данных, то при необходимости в таблице
mysql.db
создается запись. Данная запись удаляется после удаления всех
привилегий для этой базы данных командой REVOKE
.
Если у пользователя нет никаких привилегий для таблицы, то таблица не
отображается, когда пользователь запрашивает список таблиц (например, при
помощи оператора SHOW TABLES
).
Оператор WITH GRANT OPTION
предоставляет пользователю возможность наделять
других пользователей любыми привилегиями, которые он сам имеет на
указанном уровне привилегий. При предоставлении привилегии GRANT
необходимо проявлять осмотрительность, так как два пользователя с разными
привилегиями могут объединить свои привилегии!
Параметры MAX_QUERIES_PER_HOUR #
, MAX_UPDATES_PER_HOUR #
и
MAX_CONNECTIONS_PER_HOUR #
являются новыми в MySQL версии 4.0.2. Эти
параметры ограничивают количество запросов, обновлений и входов, которые
пользователь может осуществить в течение одного часа. Если установлено
значение 0 (принято по умолчанию), то это означает, что для данного
пользователя нет ограничений. See section 4.3.6 Ограничение ресурсов пользователя.
Нельзя предоставить другому пользователю привилегию, которой нет у вас
самого. Привилегия GRANT
позволяет предоставлять только те привилегии,
которыми вы обладаете.
Учтите, что если пользователю назначена привилегия GRANT
на определенном
уровне привилегий, то все привилегии, которыми этот пользователь уже
обладает (или которые будут ему назначены в будущем!) на этом уровне,
также могут назначаться этим пользователем. Предположим, пользователю
назначена привилегия INSERT
в базе данных. Если потом в базе данных
назначить привилегию SELECT
и указать WITH GRANT OPTION
, пользователь
сможет назначать не только привилегию SELECT
, но также и INSERT
. Если
затем в базе данных предоставить пользователю привилегию UPDATE
,
пользователь сможет после этого назначать INSERT
, SELECT
и UPDATE
.
Не следует назначать привилегии ALTER
обычным пользователям. Это дает
пользователю возможность разрушить систему привилегий путем переименования
таблиц!
Обратите внимание на то, что если используются привилегии для таблицы или столбца даже для одного пользователя, сервер проверяет привилегии таблиц и столбцов для всех пользователей, и это несколько замедляет работу MySQL.
При запуске mysqld
все привилегии считываются в память. Привилегии базы
данных, таблицы и столбца вступают в силу немедленно, а привилегии уровня
пользователя - при следующем подсоединении пользователя. Изменения в
таблицах назначения привилегий, которые осуществляются при помощи команд
GRANT
и REVOKE
, обрабатываются сервером немедленно. Если изменять таблицы
назначения привилегий вручную (используя команды INSERT
, UPDATE
и т.д.),
необходимо запустить оператор FLUSH PRIVILEGES
или mysqladmin
flush-privilege
s, чтобы указать серверу на необходимость перезагрузки
таблиц назначения привилегий. See section 4.3.3 Когда изменения в привилегиях вступают в силу.
Наиболее значительные отличия команды GRANT
версий ANSI SQL и MySQL
следующие:
TRIGGER
,
EXECUTE
или UNDER
.
INSERT
при
наличии у него привилегии INSERT
только для нескольких столбцов в этой
таблице. Столбцы, для которых отсутствует привилегия INSERT
, будут
установлены в свои значения, принятые по умолчанию. В ANSI SQL
требуется наличие привилегии INSERT
для всех столбцов.
REVOKE
или путем изменения таблиц назначения привилегий MySQL.
Чтобы ознакомиться с описанием использования REQUIRE
, см. раздел See section 4.3.9 Использование безопасных соединений.
Между MySQL и Unix или Windows существует несколько различий в использовании имен пользователей и паролей:
-u
или --user
. Это означает, что невозможно обеспечить
безопасность базы данных, если не все имена пользователей MySQL
снабжены паролями: ведь можно попытаться подсоединиться к серверу,
используя любое имя, а если воспользоваться именем, которому не
назначен пароль, то удастся войти в систему.
PASSWORD()
и ENCRYPT()
можно найти в разделе See section 6.3.6.2 Разные функции. Обратите
внимание: даже если ваш пароль хранится в 'зашифрованном виде', то
знания этого 'зашифрованного' пароля будет достаточно, чтобы
подсоединиться к серверу MySQL!
Пользователи MySQL и их привилегии обычно создаются при помощи команды
GRANT
. See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
Если подсоединение к серверу MySQL осуществляется с клиента командной
строки, необходимо указать пароль при помощи параметра
--password=your-password
. See section 4.2.8 Соединение с сервером MySQL.
mysql --user=monty --password=guess database_name
Если необходимо, чтобы клиент запрашивал пароль, то следует указать
--password
без каких-либо аргументов
mysql --user=monty --password database_name
или сокращенный вариант этого параметра:
mysql -u monty -p database_name
Обратите внимание на то, что в последнем примере database_name
не является
паролем.
Если необходимо указать пароль при помощи параметра -p
, то следует
поступить следующим образом:
mysql -u monty -pguess database_name
В некоторых системах вызов библиотеки, который MySQL использует для запроса пароля, автоматически обрезает пароль до 8 символов. В самом MySQL не существует никаких ограничений на длину пароля.
При запуске mysqld
все таблицы назначения привилегий загружаются в память
и с этого момента привилегии вступают в силу.
Изменения, которые вносятся в таблицы назначения привилегий при помощи
команд GRANT
, REVOKE
или SET PASSWORD
, учитываются сервером немедленно.
Если вносить изменения в таблицы назначения привилегий вручную (при помощи
команд INSERT
, UPDATE
и т.д.), необходимо запускать оператор FLUSH
PRIVILEGES
, mysqladmin flush-privileges
или mysqladmin reload
, чтобы
указать серверу на необходимость перезагрузить эти таблицы. В противном
случае изменения не вступят в силу, пока сервер не будет перезагружен.
Если внести изменения вручную, но не перезагрузить таблицы назначения
привилегий, то останется только удивляться, почему внесенные изменения не
действуют!
Когда сервер замечает, что были внесены изменения в таблицы назначения привилегий, он обрабатывает установленные соединения клиентов следующим образом:
USE db_name
После установки MySQL изначальные привилегии доступа задаются при помощи
`scripts/mysql_install_db'. See section 2.3.1 Обзор быстрой установки. Скрипт mysql_install_db
запускает
сервер mysqld
, а затем инициализирует таблицы предоставления привилегий со
следующим набором привилегий:
root
который может делать
все, что угодно. Соединения должны устанавливаться с локального
компьютера.
Примечание: Изначально пароль root
пуст, поэтому кто
угодно может подсоединиться в качестве root
без пароля и получить все
привилегии.
test
или начинающимися с test_
.
Соединения должны устанавливаться с локального компьютера. Это
означает, что любой локальный пользователь может подключиться без
пароля и будет воспринят сервером как анонимный пользователь.
mysqladmin shutdown
или mysqladmin
processlist
.
Примечание: В Windows принятые по умолчанию привилегии отличаются от указанных. See section 2.6.2.3 Работа MySQL в среде Windows.
Поскольку сразу после установки программа совершенно не защищена, первым
делом необходимо задать пароль для пользователя MySQL root
. Это можно
сделать следующим образом (обратите внимание, что пароль указывается при
помощи функции PASSWORD()
):
shell> mysql -u root mysql mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password');
Опытные пользователи могут работать непосредственно с таблицами назначения привилегий:
shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') -> WHERE user='root'; mysql> FLUSH PRIVILEGES;
Еще один способ задать пароль - воспользоваться командой mysqladmin
:
shell> mysqladmin -u root password new_password
Изменять пароли других пользователей могут только пользователи с правом
записи/обновления базы данных mysql
. Все обычные пользователи (не
анонимные) могут модифицировать только свой собственный пароль при помощи
указанных выше команд или команды SET PASSWORD=PASSWORD('new_password')
.
Обратите внимание на то, что если пароль в таблице user
обновляется
напрямую при помощи первого метода, требуется указать серверу на
необходимость перезагрузки таблиц привилегий (при помощи команды FLUSH
PRIVILEGES
), иначе изменения не будут учтены.
После того, как был задан пароль root
, этот пароль необходимо будет
вводить, подсоединяясь к серверу как root
.
Можно оставить пароль root
пустым, тогда не придется его указывать во
время проведения дополнительных установок и тестирования. Тем не менее,
обязательно укажите его, прежде чем использовать сервер для любой реальной
работы.
Ознакомьтесь со скриптом `scripts/mysql_install_db', чтобы увидеть, как задавать привилегии по умолчанию. Данный скрипт можно использовать как основу для добавления других пользователей.
Если необходимо, чтобы изначальные привилегии отличались от указанных
выше, можно изменить базу mysql_install_db
еще до ее запуска.
Чтобы полностью заново создать таблицы предоставления привилегий, удалите
все файлы с расширениями `.frm', `.MYI' и `.MYD' в каталоге, где находится база
данных mysql
(это каталог с именем mysql
в каталоге базы данных, который
выводится на экран при запуске команды mysqld --help
). Затем запустите
скрипт mysql_install_db
(возможно, после добавления в него необходимых
привилегий).
Примечание: в более старых, чем 3.22.10, версиях MySQL файлы с расширением
`.frm' удалять не следует. Если же случайно они были удалены, их следует
восстановить, скопировав из дистрибутива MySQL до запуска
mysql_install_db
.
Пользователей можно добавлять двумя различными способами - при помощи
команды GRANT
или напрямую в таблицы назначения привилегий MySQL.
Предпочтительнее использовать команду GRANT
- этот способ проще и дает
меньше ошибок. See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
Существует также большое количество программ (таких как phpmyadmin
),
которые служат для создания и администрирования пользователей.
@xref{Portals}.
В приведенных ниже примерах демонстрируется, как использовать клиент mysql
для задания новых пользователей. В примерах предполагается, что привилегии
установлены в соответствии с принятыми по умолчанию значениями, описанными
в предыдущем разделе. Это означает, что для внесения изменений на том же
компьютере, где запущен mysqld
, необходимо подсоединиться к серверу как
пользователь MySQL root
, и у пользователя root
должна быть привилегия
INSERT
для базы данных mysql
, а также административная привилегия RELOAD
.
Кроме того, если был изменен пароль пользователя root
, его необходимо
указать здесь для команды mysql
.
Новых пользователей можно добавлять, используя команду GRANT
:
shell> mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost -> IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" -> IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost;
Эти команды GRANT
создают трех новых пользователей:
monty
some_pass
. Обратите
внимание на то, что мы должны применить операторы GRANT
как для
monty@localhost
, так и для monty@"%"
. Если не добавить запись с localhost
,
запись анонимного пользователя для localhost
, которая создается при помощи
mysql_install_db
, будет иметь преимущество при подсоединении с локального
компьютера, так как в ней указано более определенное значение для поля
Host
, и она расположена раньше в таблице user
.
admin
localhost
без пароля; ему
назначены административные привилегии RELOAD
и PROCESS
. Эти привилегии
позволяют пользователю запускать команды mysqladmin reload
, mysqladmin
refres
h и mysqladmin flush-*
, а также mysqladmin processlist
. Ему не
назначено никаких привилегий, относящихся к базам данных (их можно
назначить позже, дополнительно применив оператор GRANT
).
dummy
'N'
-тип привилегии USAGE
, который позволяет создавать пользователей без
привилегий. Предполагается, что относящиеся к базам данных привилегии
будут назначены позже.
Можно напрямую добавить точно такую же информацию о пользователе при
помощи оператора INSERT
, а затем дать серверу команду перезагрузить
таблицы назначения привилегий:
shell> mysql --user=root mysql mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'), -> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'), -> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user SET Host='localhost',User='admin', -> Reload_priv='Y', Process_priv='Y'; mysql> INSERT INTO user (Host,User,Password) -> VALUES('localhost','dummy',''); mysql> FLUSH PRIVILEGES;
В зависимости от версии MySQL в примере, приведенном выше, может
указываться различное количество значений 'Y'
(в версиях до Version
3.22.11 было меньше столбцов привилегий). Для пользователя admin
используется более удобочитаемый расширенный синтаксис команды INSERT
,
который доступен начиная с версии 3.22.11.
Обратите внимание: чтобы создать суперпользователя, необходимо создать
запись таблицы user
с полями привилегий, установленными в значение 'Y'
.
Нет необходимости задавать значения в записях таблиц db
или host
.
Столбцы привилегий в таблице user в последнем операторе INSERT
(для
пользователя dummy
) не были заданы явно, поэтому данным столбцам был
присвоено принятое по умолчанию значение 'N'
. Точно так же действует
команда GRANT USAGE
.
В приведенном ниже примере добавляется пользователь custom
, который может
подсоединяться с компьютеров localhost
, server.domain
и whitehouse.gov
. Он
хочет получать доступ к базе данных bankaccount
только с компьютера
localhost
, к базе данных expenses
- только с whitehouse.gov
, и к базе
данных customer
- со всех трех компьютеров, а также использовать пароль
stupid
при подсоединении со всех трех компьютеров.
Чтобы задать эти привилегии пользователя при помощи оператора GRANT
,
выполните следующие команды:
shell> mysql --user=root mysql mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON bankaccount.* -> TO custom@localhost -> IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON expenses.* -> TO custom@whitehouse.gov -> IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON customer.* -> TO custom@'%' -> IDENTIFIED BY 'stupid';
Привилегии для пользователя custom мы назначаем потому, что этот
пользователь хочет получать доступ к MySQL как с локального компьютера
через сокеты Unix, так и с удаленного компьютера whitehouse.gov
через
протокол TCP/IP.
Чтобы задать привилегии пользователя путем непосредственного внесения
изменений в таблицы назначения привилегий, выполните следующие команды
(обратите внимание на команду FLUSH PRIVILEGES
в конце примера):
shell> mysql --user=root mysql mysql> INSERT INTO user (Host,User,Password) -> VALUES('localhost','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) -> VALUES('server.domain','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) -> VALUES('whitehouse.gov','custom',PASSWORD('stupid')); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, -> Create_priv,Drop_priv) -> VALUES -> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, -> Create_priv,Drop_priv) -> VALUES -> ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, -> Create_priv,Drop_priv) -> VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y'); mysql> FLUSH PRIVILEGES;
Первые три оператора INSERT
добавляют в таблицу user записи, которые
позволят пользователю custom
подключаться с различных компьютеров с
указанным паролем, но не дают ему никаких привилегий (все привилегии
установлены в принятое по умолчанию значение 'N'
). Следующие три оператора
INSERT
добавляют записи в таблицу db
, в которой назначаются привилегии для
пользователя custom
по отношению к базам данных bankaccount
, expenses
и
customer, но только если доступ осуществляется с определенных компьютеров.
Как обычно, после внесения изменений непосредственно в таблицы назначения
привилегий серверу необходимо дать команду на перезагрузку этих таблиц
(при помощи FLUSH PRIVILEGES
), чтобы внесенные изменения вступили в силу.
Если необходимо предоставить определенному пользователю доступ с любого
компьютера к определенному домену, можно воспользоваться оператором GRANT
следующим образом:
mysql> GRANT ... -> ON *.* -> TO myusername@"%.mydomainname.com" -> IDENTIFIED BY 'mypassword';
Чтобы сделать то же самое путем непосредственного внесения изменений в таблицы назначения привилегий, выполните следующие действия:
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername', -> PASSWORD('mypassword'),...); mysql> FLUSH PRIVILEGES;
Можно также воспользоваться программами xmysqladmin
, mysql_webadmin
и даже
xmysql
, чтобы вставить, обновить или изменить значения в таблицах
назначения привилегий. Эти утилиты можно найти в каталоге Contrib
веб-сайта MySQL (http://www.mysql.com/Downloads/Contrib/).
Начиная с MySQL версии 4.0.2 можно ограничивать определенные ресурсы, выделяемые пользователям.
До этой версии единственным возможным методом ограничения использования
ресурсов сервера MySQL была установка переменной запуска
max_user_connections
в значение, отличное от нуля. Но этот метод действует
только на глобальном уровне и не позволяет управлять отдельными
пользователями. Он может представлять определенный интерес только для
провайдеров услуг Internet.
На уровне отдельного пользователя теперь введено управление следующими тремя ресурсами:
Пользователь в упомянутом выше контексте представляет собой отдельную
запись в таблице user, которая уникальным образом идентифицируется своими
столбцами user
и host
.
По умолчанию все пользователи не ограничены в использовании указанных выше
ресурсов только в случае, только если эти ограничения не наложены на них.
Данные ограничения могут быть наложены только при помощи глобальной
команды GRANT (*.*)
с использованием следующего синтаксиса:
GRANT ... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3;
Можно указать любое сочетание приведенных выше ресурсов. N1, N2 и N3 являются целыми числами, представляющими собой значения количеств запросов/обновлений/соединений в час.
Если пользователь в течение часа достигает предела любого из вышеуказанных значений, его соединение будет прервано с выдачей соответствующего сообщения об ошибке.
Текущие значения для определенного пользователя могут быть сброшены
(установлены в нуль), если воспользоваться оператором GRANT
с любым из
приведенных выше пунктов, включая оператор GRANT
с текущими значениями.
Кроме того, текущие значения для всех пользователей сбрасываются, если
производится перезагрузка привилегий (на сервере или при использовании
команды mysqladmin reload
) или если выполняется команда FLUSH
USER_RESOURCES
.
Эта функция включается сразу после того, как на пользователя будут
наложены ограничения при помощи команды GRANT
.
Необходимым условием для включения данной функции является наличие в
таблице user
базы данных mysql
дополнительного столбца, как это определено
в скриптах создания таблиц mysql_install_db
и mysql_install_db.sh
в
подкаталоге `scripts'.
В большинстве случаев для задания пользователей и их паролей следует
пользоваться командой GRANT
, поэтому приведенная ниже информация
предназначена для опытных пользователей. See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
В примерах, приведенных в предыдущих разделах, демонстрируется важный
принцип, который заключается в следующем: при сохранении непустых паролей
с использованием операторов INSERT
или UPDATE
для их шифрования должна
применяться функция PASSWORD()
. Это делается потому, что в таблице user
пароли хранятся в зашифрованном виде, а не как простой текст. Предположим,
что мы упустили это из виду и задали пароли следующим образом:
shell> mysql -u root mysql mysql> INSERT INTO user (Host,User,Password) -> VALUES('%','jeffrey','biscuit'); mysql> FLUSH PRIVILEGES;
В результате выполнения этих команд в таблице user будет сохранено
значение пароля biscuit
в виде простого текста. Когда пользователь jeffrey
попытается подсоединиться к серверу, используя этот пароль, клиент mysql
зашифрует его при помощи функции PASSWORD()
, сгенерирует вектор
аутентификации, основанный на зашифрованном пароле и случайно выбранном
числе, полученном от сервера, и направит результат на сервер. Сервер
использует значение password
из таблицы user
(в данном случае, это
незашифрованное значение biscuit
), чтобы осуществить точно такие же
вычисления, и сравнит результаты. Результаты не совпадут, и сервер не
позволит установить соединение:
shell> mysql -u jeffrey -pbiscuit test Access denied
Перед занесением в таблицу user
пароли необходимо зашифровывать, поэтому
оператор INSERT
должен использоваться следующим образом:
mysql> INSERT INTO user (Host,User,Password) -> VALUES('%','jeffrey',PASSWORD('biscuit'));
При использовании оператора SET PASSWORD
также необходимо применять
функцию PASSWORD()
:
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
Если пароль задается при помощи оператора GRANT ... IDENTIFIED BY
или
команды mysqladmin password
, нет необходимости использовать функцию
PASSWORD()
. Обе эти команды самостоятельно производят шифровку пароля,
поэтому пароль следует указывать как biscuit
, например, таким образом:
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
или
shell> mysqladmin -u jeffrey password biscuit
Примечание: Функция PASSWORD()
шифрует пароли отличным от Unix образом. Не
следует полагать, что если ваши пароли для Unix и для MySQL совпадают, то
функция PASSWORD()
выдаст точно такой же результат шифрования, как и файл
паролей Unix. See section 4.3.2 Имена пользователей MySQL и пароли.
Не рекомендуется указывать пароль таким образом, чтобы его могли подобрать другие пользователи. Ниже приведены методы, которыми можно пользоваться при задании своего пароля при запуске указанных клиентских программ, а также степенью риска для каждого из методов:
mysql.user
. Зная
даже зашифрованный пароль пользователя, можно войти в систему под
именем этого пользователя. Пароли шифруются только для того, чтобы
нельзя было увидеть, какой именно пароль используется (если вы
используете один и тот же пароль для разных приложений).
-pyour_pass
или --password=your_pass
в
командной строке удобно, но не очень безопасно, так как ваш пароль
становится видимым для системных статусных утилит (таких как ps
), и
другие пользователи могут просмотреть командные строки (во время
запуска клиенты MySQL обычно перезаписывают аргументы командной строки
нулями, но существует небольшой промежуток времени, на протяжении
которого значение остается видимым).
-p
или --password
(без указания значения
your_pass
). В этом случае программа клиента запрашивает пароль с
терминала:
shell> mysql -u user_name -p Enter password: ********Ваш пароль будет представлен символами `*'. Вводить пароль таким образом намного безопаснее, чем из командной строки, поскольку он невидим для остальных пользователей. Тем не менее, этот метод подходит только для тех программ, которые вы запускаете самостоятельно. Если клиент требуется запустить из скрипта, то возможности ввести пароль с терминала не будет. В некоторых системах первая строка скрипта считывается и неправильно распознается как ваш пароль!
[client]
файла `.my.cnf' в своем каталоге:
[client] password=your_passЕсли пароль хранится в `.my.cnf', файл не должен быть доступен для чтения или записи для всех или для отдельных групп пользователей. Убедитесь, что права доступа к файлу установлены в 400 или 600.
MYSQL_PWD
, но этот
метод считается очень небезопасным и не должен использоваться. В
некоторые версии ps включена возможность отображать переменные
окружения работающего процесса. Поэтому если задать свой пароль при
помощи MYSQL_PWD
, он будет виден для всех,. Даже в системах без такой
версии ps
, неразумно предполагать, что не существует другого метода
получить информацию по переменным окружения. See section F Переменные окружения.
Исходя из всего сказанного выше, самыми безопасными методами указания пароля являются запрос программы клиента на ввод пароля с терминала или указание пароля в защищенном надлежащим образом файле `.my.cnf'.
MySQL поддерживает шифрованные SSL-соединения. Для лучшего понимания того, как в MySQL используется SSL, мы приводим здесь основные сведения по SSL и X509. Пользователи, которые уже знакомы с данным протоколом и стандартом, эту часть могут пропустить.
По умолчанию в MySQL используются незашифрованные соединения между клиентом и сервером. Это означает, что просматривать все данные, передаваемые между клиентом и сервером, может кто угодно. На практике можно даже изменять данные во время передачи их от клиента к серверу и наоборот. Помимо того, иногда возникает необходимость передать действительно секретные данные через общедоступную сеть - в таких случаях использование незашифрованных соединений просто неприемлемо.
В протоколе SSL используются различные алгоритмы шифрования, обеспечивающие безопасность для данных, передаваемых через общедоступные сети. Этот протокол содержит средства, позволяющие обнаруживать любые изменения, потери и повторы данных. В протоколе SSL также применяются алгоритмы для проведения идентификации при помощи стандарта X509.
Шифровка - это метод, позволяющий сделать прочтение любых данных невозможным. Фактически при современном положении дел для алгоритмов шифрования требуется использование дополнительных элементов безопасности. Они должны обеспечивать противодействие многим видам известных на настоящий момент атак, таких как изменение порядка зашифрованных сообщений или повторение данных.
Стандарт X509 позволяет производить идентификацию в Internet. Чаще всего он используется в приложениях электронной коммерции. Упрощенно схема его применения выглядит следующим образом: существует некая организация под названием "Certificate Authority" (можно перевести как ``Сертификационное Бюро''. - Прим. пер.), которая назначает электронные сертификаты всем, кому они нужны. Сертификаты основываются на асимметричных алгоритмах шифрования, содержащих два ключа - публичный и секретный. Владелец сертификата может подтвердить свою личность, предъявив свой сертификат другой стороне. Сертификат состоит из публичного ключа владельца. Любые данные, зашифрованные при помощи этого публичного ключа могут быть расшифрованы только при помощи соответствующего секретного ключа, который находится у владельца сертификата.
В MySQL по умолчанию не используется шифрование при соединениях, так как это значительно замедляет обмен данными между клиентом и сервером. Любые дополнительные функции приводят к дополнительной нагрузке для компьютера, а шифрование данных требует интенсивной работы процессора, что может вызвать задержку выполнения основных задач MySQL. По умолчанию MySQL настроен на максимально быструю работу.
Если вы хотите получить дополнительную информацию о SSL/X509/шифровании, необходимо воспользоваться своим любимым поисковым сервером Internet и произвести поиск по словам, которые вас интересуют.
Для того чтобы SSL-соединения могли работать с MySQL, необходимо выполнить следующие действия:
configure
) при помощи параметров
--with-vio --with-openssl
.
mysql.user
путем добавления в нее определенных новых столбцов. Это
можно сделать, запустив скрипт mysql_fix_privilege_tables.sh
.
mysqld
библиотека
OpenSSL можно, убедившись, что SHOW VARIABLES LIKE 'have_openssl'
показывает
YES
.
GRANT
В дополнение к обычной схеме имя пользователя/пароль MySQL может производить проверку атрибутов сертификата X509. Для этого необходимы также все обычные параметры (имя пользователя, пароль, маска IP-адреса, имя базы данных/таблицы).
Существует несколько возможностей ограничить соединения:
REQUIRE SSL
позволяет серверу устанавливать только
зашифрованные при помощи протокола SSL соединения. Обратите внимание,
что этот параметр может быть неприемлемым, если существуют записи ACL,
разрешающие не-SSL соединения.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY "goodsecret" REQUIRE SSL;
REQUIRE X509
означает, что у клиента должен быть действительный
сертификат, но мы не требуем наличия определенного сертификата,
сертификата определенной фирмы или темы. Единственное ограничение -
подпись должна поддаваться проверке при помощи одного из сертификатов
бюро сертификации.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY "goodsecret" REQUIRE X509;
REQUIRE ISSUER
issuer делает требования по соединению более
определенными: теперь клиент должен предоставить действительный
сертификат X509, выданный бюро сертификации "issuer". Использование
сертификатов X509 всегда означает применение шифрования, поэтому
параметр "SSL" больше не нужен.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY "goodsecret" -> REQUIRE ISSUER "C=FI, ST=Some-State, L=Helsinki, "> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com";
REQUIRE SUBJECT subject
требует наличия у клиента действительного
сертификата X509 с содержащейся в нем темой "subject". Если у клиента
есть действительный сертификат, но другой "subject", то соединение не
будет установлено.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY "goodsecret" -> REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn, "> O=MySQL demo client certificate, "> CN=Tonu Samuel/Email=tonu@mysql.com";
REQUIRE CIPHER cipher
требуется для обеспечения достаточно сложных
шифра и длины ключа. Протокол SSL сам по себе может быть ненадежным
из-за использования старых алгоритмов с короткими ключами шифрования.
Воспользовавшись этим параметром, мы можем указать определенный метод
шифрования, разрешающий соединение.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY "goodsecret" -> REQUIRE CIPHER "EDH-RSA-DES-CBC3-SHA";Разрешается также сочетать эти методы друг с другом, например, таким образом:
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY "goodsecret" -> REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn, "> O=MySQL demo client certificate, "> CN=Tonu Samuel/Email=tonu@mysql.com" -> AND ISSUER "C=FI, ST=Some-State, L=Helsinki, "> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com" -> AND CIPHER "EDH-RSA-DES-CBC3-SHA";Но не разрешается использовать одни и те же параметры дважды. Смешивать можно только разные параметры.
Поскольку таблицы MySQL хранятся в виде файлов, то резервное копирование
выполняется легко. Чтобы резервная копия была согласованной, выполните на
выбранных таблицах LOCK TABLES
, а затем FLUSH TABLES
для этих таблиц (см.
разделы section 6.7.2 Синтаксис команд LOCK TABLES/UNLOCK TABLES
и see section 4.5.3 Синтаксис команды FLUSH
). При этом
требуется блокировка только на чтение; поэтому другие потоки смогут
продолжать запросы на таблицах в то время, пока будут создаваться копии
файлов из каталога базы данных. Команда FLUSH TABLE
обеспечивает гарантию
того, что все активные индексные страницы будут записаны на диск прежде,
чем начнется резервное копирование.
Если есть необходимость провести резервное копирование на уровне SQL, то
можно воспользоваться SELECT INTO OUTFILE
или BACKUP TABLE
(см. разделы
section 6.4.1 Синтаксис оператора SELECT
и see section 4.4.2 Синтаксис BACKUP TABLE
).
Существует еще один способ создать резервную копию базы данных -
использовать программу mysqldump
или сценарий mysqlhotcopy
(см. разделы
section 4.8.5 mysqldump
, Получение дампов данных и структуры таблицы и see section 4.8.6 mysqlhotcopy
, Копирование баз данных и таблиц MySQL). Для этого нужно выполнить следующие действия:
shell> mysqldump --tab=/path/to/some/dir --opt --full или shell> mysqlhotcopy database /path/to/some/dirМожно также просто скопировать табличные файлы (файлы `*.frm', `*.MYD' и `*.MYI') в тот момент, когда сервер не проводит никаких обновлений. Этот метод используется в сценарии
mysqlhotcopy
.
mysqld
выполняется, остановить его, и затем запустить с опцией
--log-update[=file_name]
(see section 4.9.3 Журнал обновлений (update)). В файлах журнала
обновлений находится информация, необходимая для того, чтобы повторить
в базе данных последовательность изменений, внесенных с момента
выполнения mysqldump
.
Если дело дошло до восстановления, сначала надо попробовать восстановить
таблицы с помощью REPAIR TABLE
или myisamchk -r
- это должно сработать в
99,9% случаев. Если myisamchk
не даст результата, попробуйте применить
следующую процедуру (эти действия применимы только в случае, если MySQL
запускался с --log-update
(see section 4.9.3 Журнал обновлений (update))):
mysqldump
.
shell> mysqlbinlog hostname-bin.[0-9]* | mysqlЕсли используется журнал обновлений, то можно применить:
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
ls
используется для того, чтобы расположить все файлы журнала обновлений в
правильном порядке.
Можно проводить избирательное резервное копирование посредством SELECT *
INTO OUTFILE 'file_name' FROM tbl_name
, а восстановление - при помощи LOAD
DATA INFILE 'file_name' REPLACE ...
Чтобы избежать повторения записей, в
таблице должен быть первичный
или уникальный ключ
. Ключевое слово REPLACE
задает замену старых записей новыми в случае, когда новая запись в
значении уникального ключа повторяет старую.
Если в системе, где выполняется резервное копирование, возникают проблемы с производительностью, то решить их можно, установив репликацию и выполняя резервное копирование на подчиненном сервере вместо головного (see section 4.10.1 Введение).
Пользователи файловой системы Veritas могут поступить следующим образом:
FLUSH TABLES WITH READ LOCK
.
mount vxfs snapshot
.
UNLOCK TABLES
.
BACKUP TABLE
BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory'
Копирует в каталог резервного копирования тот минимум табличных файлов,
который достаточен для восстановления таблицы. На данный момент работает
только для таблиц MyISAM
. Для таблиц MyISAM
копирует файлы `.frm'
(определений) и `.MYD' (данных). Индексные файлы могут быть реконструированы
по этим двум.
Перед использованием этой команды, пожалуйста, ознакомьтесь с разделом See section 4.4.1 Резервное копирование баз данных.
В процессе резервного копирования будет установлена блокировка чтения
отдельно для каждой таблицы на время ее копирования. Если необходимо
сделать резервное копирование в виде мгновенного образа нескольких таблиц,
необходимо сначала запросить LOCK TABLES
установки блокировки чтения для
каждой таблицы в группе.
Команда возвращает таблицу со следующими столбцами:
Столбец | Значение |
Table | Имя таблицы |
Op | Всегда ``backup'' |
Msg_type | Одно из значений status , error , info или warning .
|
Msg_text | Само сообщение. |
Заметим, что BACKUP TABLE
доступна только в версии MySQL 3.23.25 и выше.
RESTORE TABLE
RESTORE TABLE tbl_name[,tbl_name...] FROM '/path/to/backup/directory'
Восстанавливает таблицу(ы) из резервной копии, созданной с помощью BACKUP
TABLE
. Существующие таблицы не перезаписываются: при попытке
восстановления поверх существующей таблицы будет выдана ошибка.
Восстановление занимает больше времени, нежели BACKUP
- из-за
необходимости повторного построения индекса. Чем больше в таблице будет
ключей, тем больше времени заберет реконструкция. Эта команда, так же как
и BACKUP TABLE
, в настоящее время работает только для таблиц MyISAM
.
Команда возвращает таблицу со следующими столбцами:
Столбец | Значение |
Table | Имя таблицы |
Op | Всегда ``restore'' |
Msg_type | Одно из значений status , error , info или warning .
|
Msg_text | Само сообщение. |
CHECK TABLE
CHECK TABLE tbl_name[,tbl_name...] [option [option...]] option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED
CHECK TABLE
работает только на таблицах MyISAM
и InnoDB
. На таблицах типа
MyISAM
команда эквивалентна запуску на таблице myisamchk -m table_name
.
Если опция не указана, используется MEDIUM
.
Проверяет таблицу(ы) на наличие ошибок. Для таблиц MyISAM
обновляется
статистика ключей. Команда возвращает таблицу со следующими столбцами:
Столбец | Значение |
Table | Имя таблицы. |
Op | Всегда ``check''. |
Msg_type | Одно из значений status , error , info , или warning .
|
Msg_text | Само сообщение. |
Заметим, что по каждой проверяемой таблице может быть выдано много строк
информации. Последняя строка будет представлять Msg_type status
и, как
правило, должна содержать OK
. Если выдается что-либо отличное от OK
и Not
checked
, то обычно следует провести ремонт таблицы (see section 4.4.6 Использование myisamchk
для профилактики таблиц и послеаварийного). Not checked
свидетельствует о
том, что указанный для таблицы тип (TYPE
) не нуждается в проверке.
Различные типы проверки означают следующее:
Тип | Действия |
QUICK | Не сканировать строки для проверки на неправильные связи. |
FAST | Проверять только таблицы, которые не были корректно закрыты. |
CHANGED | Проверять только таблицы, которые изменились со времени последней проверки или не были закрыты корректно. |
MEDIUM | Сканировать строки для проверки того, что уничтоженные связи в порядке. При этом также подсчитывается ключевая контрольная сумма для строки и сравнивается с подсчитанной контрольной суммой для ключей. |
EXTENDED | Выполнить полный просмотр ключа для всех ключей для каждой строки. Успех такой проверки гарантирует 100%-ное отсутствие противоречий в таблице, но на проверку уйдет немало времени! |
Для таблиц MyISAM
с динамическими размерами при запуске проверки всегда
выполняется проверка MEDIUM
. Для строк со статическими размерами мы
пропускаем сканирование строк для QUICK
и FAST
, поскольку повреждение
строк происходит крайне редко.
Проверочные опции можно сочетать:
CHECK TABLE test_table FAST QUICK;
Эта команда просто вызовет быструю проверку таблицы для выявления того, была ли она закрыта корректно.
Примечание: в некоторых случаях CHECK TABLE
изменяет таблицу! Это
происходит, если таблица помечена как 'поврежденная/corrupted' или 'не
закрытая корректно/not closed properly', а CHECK TABLE
не находит никаких
проблем в таблице. В этом случае CHECK TABLE
отметит в таблице, что с ней
все нормально.
Если таблица повреждена, то, скорее всего, проблема в индексах, а не в данных. Проверки всех типов обеспечивают всестороннюю проверку индексов и тем самым должны обнаруживать большинство ошибок.
Если проверяется таблица, с которой предположительно все нормально, то
можно опустить проверочные опции или указать опцию QUICK
. Последнюю
возможность следует использовать в случае ограничений по времени и тогда,
когда можно пойти на риск (очень незначительный), что QUICK
пропустит
ошибку в файле данных. (В большинстве случаев MySQL должен найти - при
нормальной работе - любые ошибки в файле с данными. Если ошибки найдены,
то таблица будет отмечена как 'поврежденная/corrupted', и в таком случае
ее нельзя будет использовать, пока она не будет исправлена.)
FAST
и CHANGED
главным образом предназначены для использования в сценариях
(например, для запуска из cron
), если необходимо время от времени
проверять таблицы. В большинстве случаев следует отдавать предпочтение
FAST
перед CHANGED
(иначе надо поступать только в случае, когда возникает
подозрение, что найдена ошибка в самом коде MyISAM
).
Прибегать к EXTENDED
следует только тогда, когда после выполнения
нормальной проверки для таблицы по-прежнему выдаются странные ошибки при
попытке MySQL обновить строку или найти строку по ключу (что очень
маловероятно в случае успеха нормальной проверки!).
Некоторые проблемы, о которых сообщается при проверке таблицы, нельзя исправить автоматически:
Found row where the auto_increment column has the value 0
.
Это означает, что в таблице есть строка, где индексированный столбец
AUTO_INCREMENT
содержит значение 0 (строку, в которой столбец
AUTO_INCREMENT
имеет значение 0, можно создать, явно установив столбец
в 0 командой UPDATE
).
Это само по себе не является ошибкой, но может
вызвать неприятности, если понадобится сделать дамп таблицы или
восстановить ее или выполнить над ней ALTER
TABLE. В этом случае
столбец с атрибутом AUTO_INCREMENT
изменит значение в соответствии с
правилами для столбцов AUTO_INCREMENT
, что может вызвать проблемы,
подобные ошибке дублирования ключа.
Чтобы избавиться от
предупреждения, просто выполните команду UPDATE
для установки в
столбце значения, отличного от 0.
REPAIR TABLE
REPAIR TABLE tbl_name[,tbl_name...] [QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE
работает только на таблицах типа MyISAM
и эквивалентна
выполнению на таблице myisamchk -r table_name
.
При обыкновенной работе запускать эту команду не приходится, но если
случится катастрофа, то с помощью REPAIR TABLE
практически наверняка
удастся вернуть все данные из таблицы MyISAM
. Если таблицы сильно
повреждены, то следует постараться выяснить, что послужило этому причиной!
Обращайтесь к разделам section A.4.1 Что делать, если работа MySQL сопровождается постоянными сбоями и See section 7.1.3 Проблемы с таблицами MyISAM..
REPAIR TABLE
ремонтирует таблицу, которая, возможно, повреждена. Команда
возвращает таблицу со следующими столбцами:
Столбец | Значение |
Table | Имя таблицы |
Op | Всегда ``repair'' |
Msg_type | Одно из значений status , error , info или warning .
|
Msg_text | Само сообщение. |
Заметим, что по каждой ремонтируемой таблице может быть выдано много строк
информации. Последняя строка будет представлять Msg_type status
и, как
правило, должна содержать OK
. Если выдается что-либо отличное от OK
, то
следует попробовать исправить таблицу с помощью myisamchk -o
, поскольку в
REPAIR TABLE
пока реализованы не все опции myisamchk
. В скором будущем мы
сделаем команду более гибкой.
Если указан QUICK
, то MySQL будет пытаться сделать REPAIR
только
индексного дерева.
Если используется EXTENDED
, то MySQL будет создавать индекс строка за
строкой вместо создания по одному индексу единоразово с помощью
сортировки; такая техника может работать лучше сортировки для ключей
фиксированной длины, если речь идет о хорошо сжимаемых ключах типа char()
большой длины.
Что касается MySQL 4.0.2, то тут для REPAIR
существует режим USE_FRM
.
Используйте его, если отсутствует файл `.MYI' или поврежден его заголовок. В
этом режиме MySQL воссоздаст таблицу, используя информацию из файла `.frm'.
Этот вид исправления в myisamchk
недоступен.
myisamchk
для профилактики таблиц и послеаварийноговосстановления
Начиная с версии MySQL 3.23.13 таблицы MyISAM
можно проверять с помощью
команды CHECK TABLE
(see section 4.4.4 Синтаксис CHECK TABLE
). Для исправления
таблиц используется команда REPAIR TABLE
(see section 4.4.5 Синтаксис REPAIR TABLE
).
Для проверки/ремонта таблиц типа MyISAM
(`.MYI' и `.MYD') следует использовать
утилиту myisamchk
, а для ISAM
(`.ISM' и `.ISD'') - утилиту isamchk
(see section 7 Типы таблиц MySQL).
Ниже мы будем говорить о myisamchk
, но все сказанное справедливо также и
для более старой isamchk
.
Утилиту myisamchk
можно использовать для получения информации о таблицах
рабочей базы данных, для их проверки и исправления или же оптимизации. В
следующих разделах описывается, как запускать myisamchk
(включая описание
ее опций), как настроить график профилактики таблицы и как использовать
myisamchk для выполнения различных функций.
В большинстве случаев для оптимизации и исправления таблиц можно также
использовать команду OPTIMIZE
TABLES, но этот вариант не такой быстрый и
не такой надежный (в случае действительно фатальных ошибок), как
myisamchk
. С другой стороны, OPTIMIZE TABLE
проще в использовании и
освобождает от забот со сбросом таблиц на диск (see section 4.5.1 Синтаксис команды OPTIMIZE TABLE
).
Хотя исправление при помощи myisamchk
и достаточно безопасно, никогда не
будет лишним сделать резервную копию прежде, чем выполнять ремонт (или
любые другие действия, которые могут привнести в таблицу значительные
изменения)
myisamchk
myisamchk
запускается следующим образом:
shell> myisamchk [options] tbl_name
Опции options определяют, что должна сделать myisamchk
. В данном разделе
дается описание этих опций (список опций можно также получить, запустив
myisamchk --help
). Если опции не указаны, myisamchk
просто проверяет
таблицу. Чтобы получить дополнительную информацию или указать myisamchk
выполнить корректирующие действия, надо задать опции, как это описано в
этом и в следующих разделах.
tbl_name
- это таблица базы данных, которую нужно проверить/исправить.
Если myisamchk
запускается не из каталога базы данных, то следует задать
путь к файлу, поскольку myisamchk
не имеет представления о том, где искать
базу данных. В действительности для myisamchk
не важно, где находятся
рабочие файлы - в каталоге базы данных или нет; можно скопировать файлы,
относящиеся к базе данных, в другое место и выполнить операции
восстановления над ними там.
При желании в командной строке myisamchk
можно перечислить имена
нескольких таблиц. В качестве имени можно также указать имя индексного
файла (с суффиксом `.MYI'), что позволит задавать все таблицы в каталоге при
помощи шаблона `*.MYI'. Например, находясь в каталоге базы данных, можно
проверить все таблицы этого каталога следующим образом:
shell> myisamchk *.MYI
Если каталог базы данных не является текущим, то все таблицы каталога можно проверить, указав к нему путь:
shell> myisamchk /path/to/database_dir/*.MYI
Можно даже проверить все таблицы во всех базах данных, если задать шаблон вместе с путем к каталогу данных MySQL:
shell> myisamchk /path/to/datadir/*/*.MYI
Быстро проверять все таблицы рекомендуется следующим образом:
myisamchk --silent --fast /path/to/datadir/*/*.MYI isamchk --silent /path/to/datadir/*/*.ISM
Если необходимо проверить все таблицы и исправить все поврежденные из них, можно использовать следующую строку:
myisamchk --silent --force --fast --update-state -O key_buffer=64M \ -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \ /path/to/datadir/*/*.MYI isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M \ -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.ISM
Эти команды предполагают, что имеется более чем 64 Mб свободного пространства.
Следует отметить, что если выдается ошибка, подобная следующей:
myisamchk: warning: 1 clients is using or hasn't closed the table properly
то это означает, что делается попытка проверить таблицу, обновленную
другой программой (такой как mysqld
), которая еще не закрыла файл или чье
выполнение было прервано без возможности корректно закрыть файл.
Если mysqld
запущен, то необходимо принудительно вызвать
синхронизацию/закрытие всех таблиц с помощью FLUSH TABLES
и обеспечить,
чтобы никто не использовал таблиц, пока выполняется myisamchk
. В версии
MySQL 3.23 самый простой способ избежать этой проблемы заключается в
применении для проверки таблиц команды CHECK TABLE
вместо myisamchk
.
myisamchk
myisamchk
поддерживает следующие опции.
-# или --debug=debug_options
debug_options
имеет следующий
вид d:t:o,filename
.
-? или --help
-O var=option, --set-variable var=option
myisamchk
можно с помощью myisamchk --help
:
Переменная | Значение |
key_buffer_size | 523264 |
read_buffer_size | 262136 |
write_buffer_size | 262136 |
sort_buffer_size | 2097144 |
sort_key_blocks | 16 |
decode_bits | 9 |
sort_buffer_size
применяется, когда ключи исправляются посредством
сортировки ключей (обычный случай при указании --recover
), а
key_buffer_size
- если таблица проверяется с --extended-check
или если
ключи исправляются посредством вставки ключей в таблицу построчно (как при
выполнении обычных вставок). Исправление через ключевой буфер применяется
в следующих случаях:
--safe-recover
.
CHAR
, VARCHAR
или TEXT
, поскольку при сортировке необходимо
сохранять ключи целиком. Имея временное пространство на диске в избытке,
можно заставить myisamchk
делать исправления посредством сортировки, задав
опцию --sort-recover
.
-s или --silent
-s
дважды (-ss
), чтобы предельно ограничить выдачу
сообщений утилитой myisamchk
.
-v или --verbose
-d
и -e
. Можно использовать -v
многократно (-vv
, -vvv
) - чтобы еще более
расширить сводку!
-V или --version
myisamchk
и завершение работы.
-w или, --wait
mysqld
выполняется на таблице с --skip-locking
, то таблица может быть
заблокирована только другой командой myisamchk
.
myisamchk
-c или --check
myisamchk
не передаются другие опции, меняющие это поведение.
-e или --extend-check
myisamchk
или myisamchk
--medium-check
вполне достаточно для выявления ошибок в таблице. Если
используется --extended-check
и система располагает приличным объемом
памяти, то следует значительно увеличить значение key_buffer_size
!
-F или --fast
-C или --check-only-changed
-f или --force
myisamchk
с -r
(исправить) на таблице, если myisamchk
найдет в ней хоть одну ошибку.
-i или --information
-m или --medium-check
extended-check
), но при этом
обнаруживается только 99,99% из общего числа ошибок (чего, однако, в
большинстве случаев вполне достаточно).
-U или --update-state
--check-only-changed
, однако ее применение недопустимо, если mysqld
работает с таблицей и был запущен с опцией --skip-locking.
-T или --read-only
mysqld
--skip-locking
).
myisamchk
Следующие опции используются, если myisamchk
запускается с -r
или -o
:
ISAM
, то данный параметр предписывает обработчику таблиц
ISAM
на необходимость обновить только первые #
индексов. Если используется
MyISAM
, то определяет, какие ключи использовать, при этом каждый двоичный
бит соответствует одному ключу (первый ключ - это бит 0). Может
использоваться для ускорения вставок! Отключенные индексы можно снова
активизировать с помощью myisamchk -r. keys
.
myisamchk
исправляет
таблицы, на которые указывают символические ссылки. Данная опция
отсутствует в MySQL 4.0, в связи с тем, что MySQL 4.0 не удаляет
символические ссылки во время восстановления.
ISAM
/MyISAM
). Если необходимо восстановить таблицу, то начинать надо с этой опции. Только если myisamchk
сообщит, что таблица не может быть восстановлена с помощью -r
, тогда следует пытаться применять -o
(отметим, что в тех маловероятных случаях, когда -r
не срабатывает, файл
данных остается неизменным), В случае большого объема памяти следует
увеличить размер sort_buffer_size
!
-o или --safe-recover
-r
, но метод справляется с
несколькими редкими случаями, непосильными для -r
. При этом методе
восстановления также используется значительно меньше дискового
пространства, нежели в случае -r
. Обычно всегда следует начинать с
исправления посредством -r
, и только если результат не будет достигнут,
использовать -o
. Для систем с большим объемом памяти следует увеличить
размер key_buffer_size
!
-n или --sort-recover
myisamchk
использовать сортировку при разрешении ключей, даже
если это потребует временных файлов очень большого размера.
--character-sets-dir=...
--set-character-set=name
-t или --tmpdir=path
myisamchk
использует
для пути переменную окружения TMPDIR
.
-q или --quick
-q
,
чтобы дать myisamchk
санкцию на изменение исходного файла данных в случае
дублирования ключей
-u или --unpack
myisampack
.
myisamchk
Кроме ремонта и проверки таблиц, myisamchk
может выполнять другие
операции:
-a или --analyze
myisamchk --describe --verbose table_name
или посредством
SHOW KEYS
в MySQL.
-d или --description
-A или --set-auto-increment[=value]
AUTO_INCREMENT
начинался с value
или
большего значения. Если значение не указано, то в качестве следующего
значения AUTO_INCREMENT
берется наибольшее использованное значение для
автоинкрементного ключа + 1.
-S или --sort-index
-R или --sort-records=#
SELECT
и ORDER BY
, которые
выполняются по индексу и выбирают данные по какому-либо интервалу.
(Возможно, что первая сортировка будет выполняться очень медленно!) Чтобы
узнать номера индексов таблицы, нужно использовать команду SHOW INDEX
,
показывающую индексы таблицы в том же порядке, в каком их видит myisamchk
.
Индексы нумеруются начиная с 1.
myisamchk
При работе myisamchk
очень важно распределение памяти. Объем используемой
myisamchk
памяти не превышает количества, указанного с помощью опций -O
.
Когда речь идет о применении myisamchk
на очень больших файлах, следует
сначала принять решение о том, какое количество памяти будет при этом
использоваться. По умолчанию для целей исправления ошибок отводится только
около 3Mб. Применяя большие величины, можно достичь большей скорости
работы myisamchk
. К примеру, если имеется более 32Mб оперативной памяти,
то можно задать следующие опции (в дополнение к любым другим указанным опциям):
shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
В большинстве случаев достаточно использовать -O sort=16M
.
Важно понимать, что myisamchk
использует временные файлы, для указания на
которые служит TMPDIR
. Если TMPDIR
указывает на файловую систему с
размещением в памяти, то велика вероятность ошибок нехватки памяти (out of
memory). Если такое произойдет, то в TMPDIR
следует поместить имя
некоторого другого каталога с большим пространством и перезапустить
myisamchk
.
При выполнении ремонта myisamchk
также понадобится большое количество
дискового пространства; :
--quick
, поскольку в этом случае повторно
создается только индексный файл. Дополнительное место необходимо на том же
диске, где находится оригинальный файл записи!
--recover
или --sort-recover
(но не в случае использования
--safe-recover
) потребуется место для буфера сортировки:
(largest_key + row_pointer_length)*number_of_rows * 2
.
Можно узнать длину ключей и row_pointer_length
с помощью
myisamchk -dv table
.
Это пространство выделяется на временном диске (который определяется при помощи TMPDIR
либо
--tmpdir=#
).
Если возникнут проблемы в связи с нехваткой дискового пространства во
время исправления, можно попробовать использовать --safe-recover
вместо
--recover
.
При выполнении mysqld
со --skip-locking
(установка по умолчанию в
некоторых системах, подобных Linux) применение myisamchk
для проверки
таблицы, когда она используется mysqld
, не совсем безопасно. Если есть
уверенность, что никто не обратится к таблицам через mysqld
во время
выполнения myisamchk
, то достаточно до начала проверки таблиц выполнить
mysqladmin flush-tables
, если нет - то на время проверки таблиц необходимо
приостановить mysqld
. При запуске myisamchk
в то время, когда mysqld
обновляет таблицы, может быть выдано предупреждение о повреждении таблицы
- даже в случае, если этого не произошло.
Если --skip-locking
не используется, то проверять таблицы с помощью
myisamchk
можно в любое время. Во время проверки все пытающиеся обновить
таблицу клиенты получат возможность сделать это, только дождавшись
готовности myisamchk
.
Если myisamchk
применяется для ремонта или оптимизации таблиц, то всегда
необходимо обеспечить отсутствие обращений сервера mysqld
к таблице (это
также относится к случаю использования --skip-locking
). Если mysqld
не
может быть приостановлен, то до myisamchk
, как минимум, надо выполнить
mysqladmin flush-tables
. Таблицы могут быть повреждены, если сервер и
myisamchk
обратятся к таблицам одновременно.
В данном разделе описывается, как выявлять повреждения данных в базах данных MySQL и что делать с повреждениями дальше. Если таблица повреждается часто, то надо постараться отыскать причину этих повреждений! Обращайтесь к разделу See section A.4.1 Что делать, если работа MySQL сопровождается постоянными сбоями.
Причины повреждения таблиц рассматриваются также в разделе по таблицам
MyISAM
. Обращайтесь к разделу See section 7.1.3 Проблемы с таблицами MyISAM..
При выполнении послеаварийного восстановления важно понимать, что каждой
таблице tbl_name
в базе данных соответствуют три файла в каталоге базы
данных:
Файл | Назначение |
`tbl_name.frm' | Файл определения таблицы (формы) |
`tbl_name.MYD' | Файл данных |
`tbl_name.MYI' | Индексный файл |
Каждый из этих трех типов файлов ``имеет'' свои виды повреждений, но наиболее часто проблемы возникают с файлами данных и индексными файлами.
Во время своей работы myisamchk
построчно создает копию файла (данных)
`.MYD'. Стадия исправления завершается тем, что программа удаляет старый
файл `.MYD' и переименовывает новый путем присвоения ему имени исходного.
Если используется --quick
, myisamchk
не создает временного файла `.'MYD
, а,
исходя из предположения, что файл `.MYD' правилен, только формирует новый
индексный файл, никак не меняя файл `.'MYD
. Это безопасно, поскольку
myisamchk
автоматически распознает, что файл `.MYD' запорчен, и в этом
случае прерывает исправление. Можно также задавать для myisamchk
две опции
--quick
. В этом случае myisamchk
не прерывается аварийно по некоторым
ошибкам (таким как дублирование ключа), а пытается исправить их путем
модификации файла `.MYD'. Обычно использование двух опций --quick
имеет
смысл только в случае, если свободного места на диске недостаточно для
выполнения нормального исправления. Тогда перед запуском myisamchk
следует
по крайней мере выполнить резервное копирование.
Для проверки таблицы MyISAM
используются следующие команды:
myisamchk tbl_name
myisamchk -m tbl_name
myisamchk -e tbl_name
-e
означает ``расширенная проверка''). Происходит тестовое чтение каждого ключа
для каждой строки с целью контроля того, что ключи указывают на нужные
строки. Для большой таблицы с множеством ключей на это может потребоваться
много времени. myisamchk
обычно останавливается после обнаружения первой
ошибки, но если желательно получить более подробную информацию, можно
добавить опцию --verbose
(-v
) - таким образом выполнение myisamchk
будет
продолжаться вплоть до максимума в 20 ошибок. При нормальной работе
достаточно просто запустить myisamchk
(без аргументов за исключением имени
таблицы).
myisamchk -e -i tbl_name
-i
указывает myisamchk
дополнительно отображать некоторую статистическую информацию.
В данном разделе рассматривается только использование myisamchk
на
таблицах MyISAM
(расширения `.MYI' и `.MYD'). Если же в системе применяются
таблицы ISAM
(расширения `.'ISM
и `.'ISD
), то следует пользоваться isamchk
.
Начиная с версии MySQL 3.23.14 можно ремонтировать таблицы MyISAM
при
помощи команды REPAIR TABLE
(see section 4.4.5 Синтаксис REPAIR TABLE
).
К симптомам повреждения таблицы относятся неожиданные прерывания выполнения запросов и появление следующих ошибок:
perror
###. Чаще всего о проблемах с таблицей свидетельствуют
следующие ошибки:
shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format 127 = Record-file is crashed 132 = Old database file 134 = Record was already deleted (or record file crashed) 135 = No more room in record file 136 = No more room in index file 141 = Duplicate unique key or constraint on write or update 144 = Table is crashed and last repair failed 145 = Table was marked as crashed and should be repairedЗаметим, что ошибка 135 - 'no more room in record file' ('не осталось места в файле записей'), не может быть исправлена просто выполнением ремонта. В этом случае необходимо использовать следующую команду:
ALTER TABLE table MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
В других случаях следует выполнять ремонт таблиц. myisamchk
обычно может
обнаружить и исправить большинство неполадок.
Процесс ремонтирования включает до четырех описанных здесь стадий. Перед
тем как приступить к ремонту, необходимо выполнить `cd' в каталог базы
данных и проверить права доступа к табличным файлам. Файлы должны быть
доступны для чтения Unix-пользователю, от имени которого выполняется
mysqld
, (а также выполняющему ремонт, поскольку ему приходится обращаться
к проверяемым файлам). Если появится необходимость изменять файлы, то
проверяющий также должен иметь доступ для записи.
Если используется версия MySQL 3.23.16 и выше, то для проверки и ремонта
таблиц MyISAM
можно (и нужно) использовать команды CHECK
и REPAIR
(section 4.4.4 Синтаксис CHECK TABLE
и see section 4.4.5 Синтаксис REPAIR TABLE
).
Раздел руководства, посвященный сопровождению таблиц, содержит опции к
isamchk
/myisamchk
(see section 4.4.6 Использование myisamchk
для профилактики таблиц и послеаварийного).
Случаи, когда упомянутые команды не дают результата или желательно
использовать расширенные возможности, представленные в isamchk
/myisamchk
,
рассматриваются в следующем разделе.
Если ремонт таблицы планируется выполнять из командной строки то сначала
требуется остановить сервер. Следует отметить, что при выполнении
mysqladmin shutdown
с удаленного сервера mysqld
все еще будет некоторое
время работать после завершения mysqladmin
, пока не будут остановлены все
запросы и сброшены на диск все ключи.
Стадия 1: проверка таблиц
Выполните myisamchk *.MYI
или, если вы располагаете временем, myisamchk -e
*.MYI
. Используйте опцию -s
(молчаливый режим) для подавления ненужной
информации.
Если mysqld
остановлен, то следует использовать опцию --update-state
для
указания myisamchk
отмечать таблицы как 'проверенные'(checked).
Ремонтировать следует только те таблицы, для которых myisamchk
выдала
ошибки. Для таких таблиц следует перейти к стадии 2.
Если во время проверки будут получены странные ошибки (подобные out of
memory), или myisamchk
завершится аварийно, то перейдите к стадии 3.
Стадия 2: легкий безопасный ремонт
Примечание: если есть желание ускорить ремонт, рекомендуется добавить: -O
sort_buffer=# -O key_buffer=#
(где # примерно 1/4 от имеющейся памяти) во
всех командах isamchk
/myisamchk
.
Сначала надо попробовать запустить myisamchk -r -q tbl_name
(-r -q
означает "режим быстрого восстановления"). При этом будет сделана попытка
исправить индексный файл без изменения файла данных. Если в файле данных
содержится все необходимое, а удаленные связи указывают на правильные
позиции в файле данных, то команда должна дать результат и таблица будет
исправлена. Перейдите к ремонту следующей таблицы. В противном случае
следует выполнить следующие действия:
myisamchk -r tbl_name
(-r
означает "режим
восстановления"). При этом из файла данных будут удалены некорректные
и уничтоженные записи, и будет заново создан индексный файл.
myisamchk --safe-recover tbl_name
. В режиме безопасного восстановления
используется старый метод восстановления, справляющийся с некоторыми
случаями, которые оказываются не под силу для режима обычного
исправления (но работает этот метод медленнее).
Если во время проверки будут получены странные ошибки (подобные out of
memory) или myisamchk
аварийно завершается, то перейдите к стадии 3.
Стадия 3: сложный ремонт
До этой стадии дело доходит, только если первый 16-килобайтный блок в индексном файле разрушен или содержит неверную информацию, либо когда индексный файл отсутствует. В этом случае необходимо создать новый индексный файл. Необходимо выполнить следующие действия:
shell> mysql db_name mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLE table_name; mysql> quitЕсли используемая версия SQL не располагает
TRUNCATE TABLE
, то взамен
используется DELETE FROM table_name
.
Вернитесь к стадии 2. myisamchk -r -q
теперь должна сработать (но
бесконечно повторять стадии не следует).
Что касается MySQL 4.0.2, то тут можно воспользоваться REPAIR ... USE_FRM
,
выполняющей всю эту процедуру автоматически.
Стадия 4: очень сложный ремонт
До этой стадии вы дойдете только в случае, если ко всему прочему запорчен и файл описания. Такого происходить не должно, поскольку файл описания после создания таблицы не изменяется. Выполните следующие действия:
myisamchk -r
.
Чтобы объединить фрагментированные записи и избавиться от потерь
пространства, происходящих из-за удаления и обновления записей, нужно
запустить myisamchk
в режиме восстановления:
shell> myisamchk -r tbl_name
Такую же оптимизацию таблицы можно произвести, используя команду SQL
OPTIMIZE TABLE
. OPTIMIZE TABLE
выполняет ремонт таблицы и анализ ключей, а
также сортирует дерево индексов для ускорения поиска ключей. Вдобавок
сводится на нет нежелательное взаимодействие между утилитой и сервером,
поскольку при использовании OPTIMIZE TABLE
работу выполняет сам сервер.
Обращайтесь к разделу See section 4.5.1 Синтаксис команды OPTIMIZE TABLE
.
myisamchk
также располагает рядом других опций, которые можно использовать
для повышения производительности таблицы:
-S
, --sort-index
-R index_num
, --sort-records=index_num
-a
, --analyze
Полное описание опций можно найти в разделе See section 4.4.6.1 Синтаксис запуска myisamchk
.
Начиная с версии MySQL 3.23.13 можно проверять таблицы типа MyISAM
с
помощью команды CHECK TABLE
(see section 4.4.4 Синтаксис CHECK TABLE
). Для ремонта
таблиц можно использовать команду REPAIR TABLE
(see section 4.4.5 Синтаксис REPAIR TABLE
).
Целесообразно выполнять регулярные проверки таблиц, не дожидаясь появления
проблем. В целях профилактики для проверки таблиц можно использовать
myisamchk -s
. Опция -s
(сокращение для --silent
) задает выполнение
myisamchk
в молчаливом режиме с выдачей сообщений только при возникновении
ошибок.
Не стоит сбрасывать со счетов и выполнение проверки таблиц при запуске
сервера. Например, всякий раз, когда во время обновления происходит
перезагрузка, необходима проверка всех таблиц, которые могли при этом
пострадать (назовем их "потенциально поврежденными таблицами"). В
safe_mysqld
можно добавить тест, запускающий myisamchk
для проверки всех
таблиц, измененных за последние 24 часа, в случае, если после перезагрузки
остался старый файл `.pid' (ID процесса) (mysqld
создает `.'pid
-файл во время
запуска и удаляет его при нормальном завершении; наличие `.pid'-файла во
время запуска системы свидетельствует о том, что mysqld не завершился
нормально).
Можно сделать даже более надежный тест - выполнить проверку таблиц с более поздней, чем у `.pid'-файла, датой последней модификации.
Таблицы также следует регулярно проверять в ходе нормального
функционирования системы. У себя в MySQL AB
мы запускаем задачи по cron
для проверки всех наших важных таблиц раз в неделю, используя следующую
строку в файле crontab
:
35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI
Такая команда отображает информацию о поврежденных таблицах, и мы при надобности можем их исследовать и исправить.
Поскольку за последние пару лет у нас (на самом деле) не было неожиданно поврежденных таблиц (таблиц, получивших повреждение по причинам, отличным от неисправностей оборудования), то для нас проверки один раз в неделю более чем достаточно.
Мы рекомендуем для начала выполнять myisamchk -s
еженощно на всех
таблицах, обновленных на протяжении последних 24 часов, пока вы не станете
доверять MySQL настолько, насколько доверяем мы.
Обычно в таком контроле над таблицами MySQL необходимости нет. При
изменении таблиц с динамическим размером строк (таблиц со столбцами типов
VARCHAR
, BLOB
или TEXT
) или при наличии таблиц с большим числом удаленных
строк может потребоваться время от времени (где-то раз в месяц)
дефрагментировать таблицы.
Это можно сделать, используя OPTIMIZE TABLE
на аналогичных таблицах, или,
если есть возможность приостановить mysqld
, выполняя:
isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM myisamchk -r --silent --sort-index -O sort_buffer_size=16M */*.MYI
Команды, представленные в этом разделе, используются для получения описания таблицы или статистики по таблице. Более подробное выборочное разъяснение вывода этих команд будет приведено ниже:
--skip-locking
, то
myisamchk
может сообщить об ошибке для таблицы, обновляемой во время
исполнения утилиты. Однако поскольку myisamchk
не меняет таблицы в
описательном режиме, то никакого риска разрушения данных нет.
myisamchk
, добавляется -v для указания
расширенного режима вывода сообщений.
-eis
, но с сообщением о выполняемых
действиях.
Пример вывода myisamchk -d
:
MyISAM file: company.MYI Record format: Fixed length Data records: 1403698 Deleted blocks: 0 Recordlength: 226 table description: Key Start Len Index Type 1 2 8 unique double 2 15 10 multip. text packed stripped 3 219 8 multip. double 4 63 10 multip. text packed stripped 5 167 2 multip. unsigned short 6 177 4 multip. unsigned long 7 155 4 multip. text 8 138 4 multip. unsigned long 9 177 4 multip. unsigned long 193 1 text
Пример вывода myisamchk -d -v
:
MyISAM file: company Record format: Fixed length File-version: 1 Creation time: 1999-10-30 12:12:51 Recover time: 1999-10-31 19:13:01 Status: checked Data records: 1403698 Deleted blocks: 0 Datafile parts: 1403698 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3 Max datafile length: 3791650815 Max keyfile length: 4294967294 Recordlength: 226 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 MyISAM 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 MyISAM 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: 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 [кое-что опущено для краткости] 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
Для использованной в предыдущих примерах таблицы размеры файла данных и индексного файла были следующими:
-rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.MYD -rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.MYM
Ниже приводятся пояснения по различным типам выдаваемой myisamchk
информации. ``keyfile'' означает индексный файл. ``Record'' (запись) и ``row''
(строка) являются синонимами:
Data records
.
Fixed length
. Другие
возможные значения: Compressed
и Packed
.
unique
или multip
. (multiple - повторяющийся/многократный)
Показывает, может ли одно значение встречаться в индексе многократно.
ISAM
с возможными
вариантами - packed
, stripped
и empty
.
myisamchk -a
. Если соотношение совсем не обновляется, то по
умолчанию принимается значение 30.
myisamchk
, то значения очень высоки (очень близки к теоретическому
максимуму).
CHAR
/VARCHAR
/DECIMAL
. Для длинных
строк, таких как имена, при помощи упаковки можно значительно уменьшить
занимаемое ими место. В третьем из приведенных примеров 4-й ключ состоит
из 10 символов и для него достигнуто 60%-е уменьшение в объеме.
Packed
указывает на процент достигнутой этим экономии.
myisamchk
. Обращайтесь к разделу See section 4.4.6.10 Оптимизация таблиц.
Linkdata
- общий объем памяти, занимаемый всеми такими указателями.
Если таблица была сжата при помощи myisampack
, то myisamchk -d
выдает
дополнительную информацию о каждом столбце в таблице. Обращайтесь к
разделу See section 4.7.4 myisampack
, MySQL-генератор сжатых таблиц (только для чтения), где
приведен пример такой информации и пояснение к ней.
OPTIMIZE TABLE
OPTIMIZE TABLE tbl_name[,tbl_name]...
Команда OPTIMIZE TABLE
должна использоваться после удаления большей части
таблицы или если в таблице было внесено много изменений в строки
переменной длины (таблицы, в которых есть столбцы VARCHAR
, BLOB
или TEXT
).
Удаленные записи поддерживаются при помощи связного списка, и последующие
операции INSERT
повторно используют позиции старых записей. Чтобы
перераспределить неиспользуемое пространство и дефрагментировать файл
данных, можно воспользоваться командой OPTIMIZE TABLE
.
На данный момент команда OPTIMIZE TABLE
работает только с таблицами MyISAM
и BDB
. Для таблиц BDB
команда OPTIMIZE TABLE
выполняет ANALYZE TABLE
. См.
раздел See section 4.5.2 Синтаксис команды ANALYZE TABLE
.
Можно применить OPTIMIZE TABLE
к таблицам других типов, запустив
mysqld
с параметром --skip-new
или --safe-mode
, но в этом случае
OPTIMIZE TABLE
лишь только выполняет ALTER TABLE
.
Команда OPTIMIZE TABLE
работает следующим образом:
Команда OPTIMIZE TABLE
для MyISAM
представляет собой эквивалент
выполнения myisamchk --quick --check-only-changed --sort-index --analyze
над таблицей.
Обратите внимание: во время работы OPTIMIZE TABLE
таблица заблокирована!
ANALYZE TABLE
ANALYZE TABLE tbl_name[,tbl_name...]
Анализирует и сохраняет распределение ключей для таблицы. Во время
проведения анализа таблица заблокирована для чтения. Эта функция работает
для таблиц MyISAM
и BDB
.
Данная команда является эквивалентом выполнения myisamchk -a
для таблицы.
Сохраненное распределение ключей в MySQL используется для принятия решения о том, в каком порядке следует связывать таблицы, когда для связывания используются не константы, а другая база.
Эта команда выдает таблицу со следующими столбцами:
Столбец | Значение |
Table | Имя таблицы |
Op | Всегда ``analyze'' |
Msg_type | Одно из значений status , error , info или warning .
|
Msg_text | Сообщение. |
Просмотреть сохраненное распределение ключей можно при помощи команды SHOW
INDEX
. See section 4.5.6.1 Получение информации по базам данных, таблицам, столбцам и индексам.
Если таблица не изменялась с момента предыдущего запуска команды ANALYZE
TABLE
, повторный анализ таблицы проводиться не будет.
FLUSH
FLUSH flush_option [,flush_option] ...
Команда FLUSH
применяется для очистки части кэша, используемого MySQL. Для
запуска FLUSH
необходимо обладать привилегиями RELOAD
.
Параметр flush_option
может быть одним из следующих:
Параметр | Описание |
HOSTS | Производится очистка таблиц кэша удаленных компьютеров. Сброс таблиц удаленного компьютера следует производить, если один из удаленных компьютеров изменил IP-адрес или если было получено сообщение об ошибке Host ... is blocked . Если во время соединения с сервером MySQL происходит больше ошибок подряд, чем указано в max_connect_errors для определенного удаленного компьютера, то MySQL предполагает, что что-то не в порядке, и блокирует последующие попытки установления соединения со стороны этого удаленного компьютера. Сброс таблиц удаленного компьютера позволяет снова попытаться установить соединение. See section A.2.4 Ошибка Host '...' is blocked . Чтобы это сообщение об ошибке не появлялось, запустите mysqld с параметром -O max_connection_errors=999999999 .
|
DES_KEY_FILE | Производится перезагрузка ключей DES из файла, указанного параметром --des-key-file , при запуске сервера.
|
LOGS | Закрываются и повторно открывается все файлы журналов. Если файл журнала обновлений или файл бинарного журнала был указан без расширения, номер расширения файла журнала будет увеличен на единицу относительно предыдущего файла. Если в имени файла было указано расширение, MySQL закроет и повторно откроет файл журнала обновлений. See section 4.9.3 Журнал обновлений (update). Эти действия аналогичны отправке сигнала SIGHUP на сервер mysqld .
|
PRIVILEGES | Производится перезагрузка привилегий из таблиц привилегий в базе данных mysql .
|
QUERY CACHE | Производится дефрагментация кэша запросов, чтобы эффективнее использовать его память. Эта команда не удаляет запросы из кэша, как команда RESET QUERY CACHE .
|
TABLES | Закрываются все открытые таблицы и принудительно закрываются все используемые таблицы. Также сбрасывается кэш запросов. |
[TABLE | TABLES] tbl_name [,tbl_name...] | Производится сброс только указанных таблиц. |
TABLES WITH READ LOCK | Закрываются все открытые таблицы и блокируется доступ для чтения всех таблиц для всех баз данных, пока не будет запущена команда UNLOCK TABLES . Это очень удобный способ создавать резервные копии, если у вас файловая система наподобие Veritas, которая может обеспечить моментальные снимки данных в режиме реального времени.
|
STATUS | Большинство переменных состояния сбрасываются в нуль. Эту команду необходимо использовать при отладке запроса. |
USER_RESOURCES | Все ресурсы пользователя сбрасываются в нулевое значение. Это позволяет заблокированному пользователю подсоединиться еще раз. See section 4.3.6 Ограничение ресурсов пользователя. |
Ко всем приведенным выше командам можно получить доступ при помощи утилиты
mysqladmin
, используя команды flush-hosts
, flush-logs
, reload
или
flush-tables
.
Рекомендуется также ознакомиться с командой RESET
, которая применяется с
репликацией. See section 4.5.4 Синтаксис команды RESET
.
RESET
RESET reset_option [,reset_option] ...
Команда RESET
используется для очистки. Кроме того, она также действует
как более сильная версия команды FLUSH
. See section 4.5.3 Синтаксис команды FLUSH
.
Чтобы запустить команду RESET
, необходимо обладать привилегиями RELOAD
.
Параметр | Описание |
MASTER | Удаляет все бинарные журналы, перечисленные в индексном файле, обнуляет значения индексного файла binlog . В версиях до 3.23.26 - FLUSH MASTER (Master)
|
SLAVE | Сбрасывает положение репликации подчиненного компьютера в журналах головного компьютера. В версиях до 3.23.26 эта команда называлась FLUSH SLAVE (Slave)
|
QUERY CACHE | Удаляет все результаты запросов из кэша запросов. |
KILL
KILL thread_id
Каждое соединение с mysqld
запускается в отдельном потоке. При помощи
команды SHOW PROCESSLIST
можно просмотреть список запущенных потоков, а
при помощи команды KILL thread_id
- удалить поток.
Если у вас есть привилегия PROCESS
, можно просмотреть все потоки. Обладая
привилегией SUPER
, можно удалять любые потоки. В противном случае можно
просматривать и удалять только свои собственные потоки.
Для просмотра и удаления потоков можно также применять команды mysqladmin
processlist
и mysqladmin kill
.
При использовании команды KILL
для потока устанавливается специальный флаг
kill flag
.
В большинстве случаев удаление потока занимает некоторое время, поскольку этот флаг проверяется с определенным интервалом.
SELECT
, ORDER BY
и GROUP BY
флаг проверяется только после
считывания блока строк. Если установлен флаг удаления, то выполнение
оператора будет отменено.
ALTER TABLE
флаг удаления проверяется перед
считыванием каждого блока строк из исходной таблицы. Если флаг
установлен, то выполнение команды отменяется и временная таблица
удаляется. При выполнении команд UPDATE TABLE
и DELETE TABLE
флаг
удаления проверяется после каждого считывания блока, а также после
каждого обновления или удаления строки. Если флаг удаления установлен,
то выполнение оператора отменяется. Обратите внимание: если не
используются транзакции, то отменить изменения будет невозможно!
GET_LOCK()
будет отменен при помощи NULL
.
INSERT DELAYED
быстро сбросит все строки, которые он содержит в
памяти и будет удален.
Locked
), то
блокировка таблицы будет быстро отменена.
SHOW
SHOW DATABASES [LIKE wild] или SHOW [OPEN] TABLES [FROM db_name] [LIKE wild] или SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] или SHOW INDEX FROM tbl_name [FROM db_name] или SHOW TABLE STATUS [FROM db_name] [LIKE wild] или SHOW STATUS [LIKE wild] или SHOW VARIABLES [LIKE wild] или SHOW LOGS или SHOW [FULL] PROCESSLIST или SHOW GRANTS FOR user или SHOW CREATE TABLE table_name или SHOW MASTER STATUS или SHOW MASTER LOGS или SHOW SLAVE STATUS
Команда SHOW
предоставляет информацию по базам данных, таблицам, столбцам
или о состоянии сервера. Если используется LIKE wild
, то строка wild
может
содержать в себе шаблонные символы SQL `%' и `_'.
Можно использовать два альтернативных синтаксиса - tbl_name FROM db_name
и
db_name.tbl_name
. Приведенные ниже два оператора эквивалентны:
mysql> SHOW INDEX FROM mytable FROM mydb; mysql> SHOW INDEX FROM mydb.mytable;
Команда SHOW DATABASES
выдает список баз данных на компьютере, где
установлен сервер MySQL. Этот список можно также получить,
воспользовавшись инструментом командной строки mysqlshow
. В версии 4.0.2
можно увидеть только те базы данных, для которых у вас есть какие-либо
привилегии, если вы не имеете глобальной привилегии SHOW DATABASES
.
Команда SHOW TABLES
выводит список таблиц в указанной базе данных. Этот
список также можно получить, используя команду mysqlshow db_name
.
Примечание: если у пользователя нет никаких привилегий для таблицы,
таблица не будет показана в результатах команды SHOW TABLES
или mysqlshow
db_name
.
Команда SHOW OPEN TABLES
выводит список таблиц, которые в настоящий момент
открыты в кэше таблицы. See section 5.4.7 Открытие и закрытие таблиц в MySQL. В
поле Comment
указывается, сколько раз таблица кэшировалась (cached
) и
сколько раз использовалась (in_use
).
Команда SHOW COLUMNS
выводит список столбцов в заданной таблице. Если
указать параметр FULL
, то будут показаны также ваши привилегии для каждого
столбца. Если типы столбцов отличаются от заданных в параметрах оператора
CREATE TABLE
, учтите, что MySQL иногда изменяет типы столбцов. See section 6.5.3.1 Молчаливые изменения определений столбцов.
Оператор DESCRIBE
предоставляет почти такую же информацию, что и SHOW
COLUMNS
. See section 6.6.2 Синтаксис команды DESCRIBE
(Получение информации о столбцах).
Команда SHOW FIELDS
является синонимом команды SHOW COLUMNS
, а
команда SHOW KEYS
- синонимом SHOW INDEX
. Список столбцов или
индексов таблицы можно также вывести при помощи команды mysqlshow
db_name tbl_name
или mysqlshow -k db_name tbl_name
.
Команда SHOW INDEX
выводит информацию по индексу в формате, подобном
формату вывода запроса SQLStatistics в ODBC
. Выводятся следующие столбцы:
Столбец | Значение |
Table | Имя таблицы. |
Non_unique | 0 если индекс не может содержать дублирующихся значений. |
Key_name | Имя индекса. |
Seq_in_index | Порядковый номер столбца в индексе, начиная с 1. |
Column_name | Имя столбца. |
Collation | Как столбцы отсортированы в индексе. В MySQL в данном столбце могут присутствовать значения 'A' (в порядке возрастания) или NULL (не отсортирован).
|
Cardinality | Количество уникальных значений в индексе. Обновляется путем запуска isamchk -a .
|
Sub_part Количество индексированных символов, если столбец индексируется частично. Если проиндексирован весь ключ, то будет содержаться значение NULL .
| |
Null | Содержит значение 'YES' , если столбец может содержать NULL .
|
Index_type Используемый метод индексирования.
| |
Comment | Различные примечания. На данный момент в версиях MySQL < 4.0.2 выдается, является индекс FULLTEXT или нет.
|
Обратите внимание на то, что значение Cardinality
подсчитывается по
результатам статистики, сохраняющейся в виде целых чисел, которые
недостаточно точны для небольших таблиц.
Столбцы Null
и Index_type
были добавлены начиная с версии MySQL 4.0.2.
SHOW TABLE STATUS
SHOW TABLE STATUS [FROM db_name] [LIKE wild]
Команда SHOW TABLE STATUS
(новшество версии 3.23) работает как SHOW
STATUS
, но предоставляет большое количество информации по каждой таблице.
Приведенный ниже список также можно получить, используя команду mysqlshow
--status db_name
. Выводятся следующие столбцы:
Столбец | Значение |
Name | Имя таблицы. |
Type | Тип таблицы. See section 7 Типы таблиц MySQL. |
Row_format | Формат хранения строк (Fixed, Dynamic, или Compressed). |
Rows | Количество строк. |
Avg_row_length | Средняя длина строки. |
Data_length | Размер файла данных. |
Max_data_length | Максимальная длина файла данных. |
Index_length | Длина индексного файла. |
Data_free | Количество распределенных, но не используемых байтов. |
Auto_increment | Следующее значение автоинкремента. |
Create_time | Время создания таблицы. |
Update_time | Время последнего обновления файла данных. |
Check_time | Время последней проверки таблицы. |
Create_options | Дополнительные параметры, использовавшиеся для команды CREATE TABLE .
|
Comment | Примечания, внесенные при создании таблицы (или информация о причинах, почему MySQL не может получить доступ к данным в таблицах). |
В таблицах InnoDB
информация о свободном дисковом пространстве в таблице
заносится в ячейки примечаний к таблице.
SHOW STATUS
Команда SHOW STATUS
предоставляет информацию по состоянию сервера (как
mysqladmin extended-status
). Пример выходных данных приведен ниже (формат
и числа могут иметь некоторые отличия):
+--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | Aborted_clients | 0 | | Aborted_connects | 0 | | Bytes_received | 155372598 | | Bytes_sent | 1176560426 | | Connections | 30023 | | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 8340 | | Created_tmp_files | 60 | | Delayed_insert_threads | 0 | | Delayed_writes | 0 | | Delayed_errors | 0 | | Flush_commands | 1 | | Handler_delete | 462604 | | Handler_read_first | 105881 | | Handler_read_key | 27820558 | | Handler_read_next | 390681754 | | Handler_read_prev | 6022500 | | Handler_read_rnd | 30546748 | | Handler_read_rnd_next | 246216530 | | Handler_update | 16945404 | | Handler_write | 60356676 | | Key_blocks_used | 14955 | | Key_read_requests | 96854827 | | Key_reads | 162040 | | Key_write_requests | 7589728 | | Key_writes | 3813196 | | Max_used_connections | 0 | | Not_flushed_key_blocks | 0 | | Not_flushed_delayed_rows | 0 | | Open_tables | 1 | | Open_files | 2 | | Open_streams | 0 | | Opened_tables | 44600 | | Questions | 2026873 | | Select_full_join | 0 | | Select_full_range_join | 0 | | Select_range | 99646 | | Select_range_check | 0 | | Select_scan | 30802 | | Slave_running | OFF | | Slave_open_temp_tables | 0 | | 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_created | 30022 | | Threads_connected | 1 | | Threads_running | 1 | | Uptime | 80380 | +--------------------------+------------+
Приведенные выше переменные состояния имеют следующие значения:
Переменная | Значение |
Aborted_clients | Количество соединений, отмененных по причине отключения клиента без надлежащего закрытия соединения. See section A.2.9 Коммуникационные ошибки / Оборванные соединения. |
Aborted_connects | Количество неудачных попыток подсоединения к серверу MySQL. See section A.2.9 Коммуникационные ошибки / Оборванные соединения. |
Bytes_received | Количество байтов, полученных от всех клиентов. |
Bytes_sent | Количество байтов, отправленных всем клиентам. |
Com_xxx | Количество запусков каждой команды xxx. |
Connections | Количество попыток подсоединения к серверу MySQL. |
Created_tmp_tables | Количество неявных временных таблиц на диске, созданных во время выполнения операторов. |
Created_tmp_tables | Количество неявных временных таблиц в памяти, созданных во время выполнения операторов. |
Created_tmp_files | Количество созданных временных файлов mysqld .
|
Delayed_insert_threads | Количество используемых потоков вставки данных в режиме insert delayed .
|
Delayed_writes | Количество строк, вставленных при помощи команды INSERT DELAYED .
|
Delayed_errors | Количество записанных при помощи команды INSERT DELAYED строк, в которых произошли какие-либо ошибки (возможно, duplicate key ).
|
Flush_commands | Количество запущенных команд FLUSH .
|
Handler_commit | Количество внутренних команд COMMIT .
|
Handler_delete | Количество удалений строки из таблицы. |
Handler_read_first | Количество считываний из индекса первой записи. Если это значение высокое, то, по всей вероятности, сервер осуществляет много полных индексных сканирований, например, SELECT col1 FROM foo , предполагая, что col1 проиндексирован.
|
Handler_read_key | Количество запросов на чтение строки, основанных на ключе. Высокое значение переменной говорит о том, что ваши запросы и таблицы проиндексированы надлежащим образом. |
Handler_read_next | Количество запросов на чтение следующей строки в порядке расположения ключей. Это значение будет увеличиваться, если производится запрос индексного столбца с ограничением по размеру. Значение также увеличивается во время проведения индексного сканирования. |
Handler_read_prev | Количество запросов на чтение предыдущей строки в порядке расположения ключей. В большинстве случаев используется для оптимизации ORDER BY ... DESC .
|
Handler_read_rnd | Количество запросов на чтение строки, основанных на фиксированной позиции. Значение будет высоким, если выполняется много запросов, требующих сортировки результатов. |
Handler_read_rnd_next | Количество запросов на чтение следующей строки из файла данных. Данное значение будет высоким, если производится много сканирований таблиц. Обычно это означает, что ваши таблицы не проиндексированы надлежащим образом или ваши запросы не используют преимущества индексов. |
Handler_rollback | Количество внутренних команд ROLLBACK .
|
Handler_update | Количество запросов на обновление строки в таблице. |
Handler_write | Количество запросов на вставку строки в таблицу. |
Key_blocks_used | Количество используемых блоков в кэше ключей. |
Key_read_requests | Количество запросов на чтение блока ключей из кэша. |
Key_reads | Количество физических считываний блока ключей с диска. |
Key_write_requests | Количество запросов на запись блока ключей в кэш. |
Key_writes | Количество физических записей блоков ключей на диск. |
Max_used_connections | Максимальное количество одновременно используемых соединений. |
Not_flushed_key_blocks | Блоки ключей в кэше ключей, которые были изменены, но еще не записаны на диск. |
Not_flushed_delayed_rows | Количество строк, стоящих в очереди на запись в запросах INSERT DELAY .
|
Open_tables | Количество открытых таблиц. |
Open_files | Количество открытых файлов. |
Open_streams | Количество открытых потоков (в основном используется для журналирования). |
Opened_tables | Количество открывавшихся таблиц. |
Rpl_status | Статус отказобезопасной репликации (еще не используется). |
Select_full_join | Количество соединений без ключей (если это значение равно 0, необходимо внимательно проверить индексы своих таблиц). |
Select_full_range_join | Количество соединений, где был использован поиск по диапазону в справочной таблице. |
Select_range | Количество соединений, в которых использовались диапазоны в первой таблице. (Обычно это значение не критично, даже если оно велико) |
Select_scan | Количество соединений, в которых проводилось первое сканирование первой таблицы. |
Select_range_check | Количество соединений без ключей, в которых проверка использования ключей производится после каждой строки (если это значение равно 0, необходимо внимательно проверить индексы своих таблиц). |
Questions | Количество запросов, направленных на сервер. |
Slave_open_temp_tables | Количество временных таблиц, открытых в настоящий момент потоком подчиненного компьютера. |
Slave_running | Содержит значение ON , если это подчиненный компьютер, подключенный к головному компьютеру.
|
Slow_launch_threads | Количество потоков, создание которых заняло больше, чем указано в slow_launch_time .
|
Slow_queries | Количество запросов, обработка которых заняла больше времени, чем long_query_time . See section 4.9.5 Журнал медленных запросов.
|
Sort_merge_passes | Количество объединений, осуществленных алгоритмом сортировки. Если это значение велико, следует увеличить sort_buffer .
|
Sort_range | Количество сортировок, которые осуществлялись в диапазонах. |
Sort_rows | Количество отсортированных строк. |
Sort_scan | Количество сортировок, осуществленных путем сканирования таблицы. |
ssl_xxx | Переменные, используемые SSL; еще не реализовано. |
Table_locks_immediate | Количество запросов на немедленную блокировку таблицы. Доступно начиная с версии 3.23.33. |
Table_locks_waited | Количество запросов, когда немедленная блокировка не могла быть осуществлена и требовалось время на ожидание. Если это значение велико, и у вас есть проблемы с производительностью, сначала необходимо оптимизировать свои запросы, а затем либо разделить таблицы, либо использовать репликацию. Доступно начиная с версии 3.23.33. |
Threads_cached | Количество потоков в кэше потоков. |
Threads_connected | Количество открытых в настоящий момент соединений. |
Threads_created | Количество потоков, созданных для управления соединениями. |
Threads_running | Количество не простаивающих потоков. |
Uptime | Время в секундах, в течение которого сервер находится в работе. |
Некоторые примечания к приведенной выше информации:
Opened_tables
велико, возможно, что значение переменной
table_cache
слишком мало.
Key_reads
велико, возможно, что значение переменной
key_buffer_size
слишком мало. Частоту успешных обращений к кэшу можно
вычислить при помощи Key_reads
/Key_read_requests
.
Handler_read_rnd
велико, возможно, поступает слишком
много запросов, требующих от MySQL полного сканирования таблиц или у
вас есть соединения, которые не используют ключи надлежащим образом.
Threads_created
велико, возможно, необходимо увеличить
значение переменной thread_cache_size
. Частоту успешных обращений к
кэшу можно вычислить при помощи Threads_created
/Connections
.
Created_tmp_disk_tables
велико, возможно, необходимо
увеличить значение переменной tmp_table_size
, чтобы временные таблицы
располагались в памяти, а не на жестком диске.
SHOW VARIABLES
SHOW VARIABLES [LIKE wild]
Команда SHOW VARIABLES
отображает значения некоторых системных переменных
MySQL. Такую же информацию можно получить и при помощи команды mysqladmin
variables
. Если установленные по умолчанию значения вам не подходят,
большинство из этих переменных можно задать, используя параметры командной
строки при запуске mysqld
. See section 4.1.1 Параметры командной строки mysqld
.
Ниже приведен пример выходных данных; формат и числа могут иметь некоторые отличия:
+------------------------------+---------------------------+ | Variable_name | Value | +------------------------------+---------------------------+ | ansi_mode | OFF | | back_log | 50 | | basedir | /my/monty/ | | bdb_cache_size | 16777216 | | bdb_log_buffer_size | 32768 | | bdb_home | /my/monty/data/ | | bdb_max_lock | 10000 | | bdb_logdir | | | bdb_shared_data | OFF | | bdb_tmpdir | /tmp/ | | binlog_cache_size | 32768 | | concurrent_insert | ON | | connect_timeout | 5 | | datadir | /my/monty/data/ | | delay_key_write | ON | | delayed_insert_limit | 100 | | delayed_insert_timeout | 300 | | delayed_queue_size | 1000 | | flush | OFF | | flush_time | 0 | | ft_min_word_len | 4 | | ft_max_word_len | 254 | | ft_max_word_len_for_sort | 20 | | ft_boolean_syntax | + -><()~* | | have_bdb | YES | | have_innodb | YES | | have_raid | YES | | have_openssl | NO | | init_file | | | interactive_timeout | 28800 | | join_buffer_size | 131072 | | key_buffer_size | 16776192 | | language | /my/monty/share/english/ | | large_files_support | ON | | log | OFF | | log_update | OFF | | log_bin | OFF | | log_slave_updates | OFF | | long_query_time | 10 | | low_priority_updates | OFF | | lower_case_table_names | 0 | | max_allowed_packet | 1048576 | | max_binlog_cache_size | 4294967295 | | max_connections | 100 | | max_connect_errors | 10 | | max_delayed_threads | 20 | | max_heap_table_size | 16777216 | | max_join_size | 4294967295 | | max_sort_length | 1024 | | max_tmp_tables | 32 | | max_write_lock_count | 4294967295 | | myisam_bulk_insert_tree_size | 8388608 | | myisam_recover_options | DEFAULT | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | net_read_timeout | 30 | | net_retry_count | 10 | | net_write_timeout | 60 | | open_files_limit | 0 | | pid_file | /my/monty/data/donna.pid | | port | 3306 | | protocol_version | 10 | | record_buffer | 131072 | | query_buffer_size | 0 | | query_cache_limit | 1048576 | | query_cache_size | 16768060 | | query_cache_startup_type | 1 | | safe_show_database | OFF | | server_id | 0 | | skip_locking | ON | | skip_networking | OFF | | skip_show_database | OFF | | slow_launch_time | 2 | | socket | /tmp/mysql.sock | | sort_buffer | 2097116 | | table_cache | 64 | | table_type | MYISAM | | thread_cache_size | 4 | | thread_stack | 65536 | | tmp_table_size | 1048576 | | tmpdir | /tmp/ | | version | 3.23.29a-gamma-debug | | wait_timeout | 28800 | +------------------------------+---------------------------+
Ниже описаны все параметры. Значения размеров буферов, длины и размеры
стеков приведены в байтах. Значения можно указать с суффиксом 'K'
или 'M'
,
чтобы обозначить килобайты или мегабайты. Например, 16M
означает 16
мегабайт. Регистр буквы суффикса не имеет значения, 16M
и 16m
обозначают
одно и то же:
ansi_mode
.
Имеет значение ON
, если mysqld
был запущен с параметром --ansi
. See section 1.9.2 Запуск MySQL в режиме ANSI.
back_log
Количество поддерживаемых MySQL запросов на соединение,
находящихся в очереди. Этот параметр начинает играть роль, когда
главный поток MySQL получает очень много запросов на соединение за
короткий промежуток времени. У главного потока уходит некоторое время
(хотя очень небольшое) на проверку соединения и запуск нового потока.
Значение back_log
показывает, сколько запросов может находиться в
очереди на этом коротком промежутке времени, прежде чем MySQL
прекратит отвечать на новые запросы. Данное значение необходимо
увеличить только в том случае, если ожидается большое количество
соединений на протяжении короткого промежутка времени. Иначе говоря,
это значение является размером очереди ожидания входящих соединений
TCP/IP. У вашей операционной системы есть свое собственное ограничение
на размер этой очереди. За более подробной информацией обращайтесь на
страницу руководства ОС Unix по системному вызову listen(2)
. Чтобы
узнать максимальное значение для этой переменной, обратитесь к
документации по своей операционной системе. Попытка установить
значение back_log
выше, чем допускается в вашей операционной системе,
не принесет положительного результата.
basedir
Значение параметра --basedir
.
bdb_cache_size
Буфер, выделенный для индекса кэша и строк таблиц BDB
.
Если таблицы BDB
не используются, необходимо запустить mysqld
с
параметром --skip-bdb
, чтобы не расходовать память на этот кэш.
bdb_log_buffer_size
Буфер, выделенный для индекса кэша и строк таблиц
BDB
. Если таблицы BDB
не используются, его значение необходимо
установить в 0 или запустить mysqld
с параметром --skip-bdb
, чтобы не
расходовать память на этот кэш.
bdb_home
Значение параметра --bdb-home
.
bdb_max_lock
Максимальное количество блокировок (по умолчанию 1000),
которые можно установить на таблицу BDB
. Этот параметр необходимо
увеличить, если возникают ошибки типа bdb: Lock table is out of
available locks
или Got error 12 from ...
при выполнении длинных
транзакций или когда mysqld
должен просмотреть много строк для
вычисления запроса.
bdb_logdir
Значение параметра --bdb-logdir
.
bdb_shared_data
Содержит значение ON
, если используется параметр
--bdb-shared-data
.
bdb_tmpdir
Значение параметра --bdb-tmpdir
.
binlog_cache_size
.
Размер кэша для хранения операторов бинарного
журнала SQL во время транзакции. Если часто используются большие
транзакции со значительным количеством операторов, то в целях
повышения производительности значение этого параметра можно увеличить.
See section 6.7.1 Синтаксис команд BEGIN/COMMIT/ROLLBACK
.
character_set
Принятый по умолчанию набор символов.
character_sets
Поддерживаемые наборы символов.
concurrent_inserts
Если установлено значение ON
(принятое по
умолчанию), MySQL обеспечивает возможность использовать команду INSERT
на таблицах MyISAM
одновременно с выполнением над этими же таблицами
запросов SELECT
. Этот параметр можно отключить, запустив mysqld
с
параметром --safe
или --skip-new
.
connect_timeout
Количество времени в секундах, на протяжении которого
сервер mysqld
ожидает поступления пакета соединения, после чего
генерирует Bad handshake
.
datadir
Значение параметра --datadir
.
delay_key_write
Если включен (по умолчанию - включен), MySQL будет
учитывать параметр DELAY_KEY_WRITE
для команды CREATE
TABLE. Это
означает, что ключевой буфер таблиц с данным параметром будет
сбрасываться на диск не при каждом обновлении индексов, а только при
закрытии таблицы. Такой режим работы значительно ускоряет запись
ключей, однако в случае использования данного параметра необходимо
будет также добавить автоматическую проверку всех таблиц при помощи
myisamchk --fast --force
. Обратите внимание: если запустить mysqld
с
параметром --delay-key-write-for-all-tables
, то все таблицы будут
обрабатываться таким образом, как будто они были созданы с применением
параметра delay_key_write
. Этот флаг можно снять, запустив mysqld
с
параметром --skip-new
или --safe-mode
.
delayed_insert_limit
После вставки строк delayed_insert_limit
обработчик INSERT DELAYED
проверит, остались ли незавершенные
операторы SELECT
. Если да, то перед тем, как приступить к выполнению
следующих действий, они будут выполнены.
delayed_insert_timeout
Временной промежуток, в течение которого
процесс INSERT DELAYED
должен ожидать операторов INSERT
до прекращения
выполнения задачи.
delayed_queue_size
Размер очереди (в строках), который должен быть
назначен для обработки команды INSERT DELAYED
. При переполнении
очереди все клиенты, выполняющие команду INSERT DELAYED
, будут
ожидать, пока в очереди снова появится свободное место.
flush
Значение этой переменной будет ON
, если вы запустили MySQL с
параметром --flush
.
flush_time
Если значение этой переменной отличается от нуля, то каждые
flush_time
секунд все таблицы будут закрываться (чтобы освободить
ресурсы и записать информацию на диск). Мы рекомендуем использовать
этот параметр только для Windows 9x/Me или на системах с ограниченным
количеством ресурсов.
ft_min_word_len
Минимальная длина слова, включаемого в индекс
FULLTEXT
. Примечание: индексы FULLTEXT
после изменения этой
переменной должны быть скомпонованы заново (это новый параметр в MySQL
4.0).
ft_max_word_len
Максимальная длина слова, включаемого в индекс
FULLTEXT
. Примечание: индексы FULLTEXT
после изменения этой переменной
должны быть скомпонованы заново (это новый параметр в MySQL 4.0).
ft_max_word_len_sort
Максимальная длина слова в индексе FULLTEXT
; эта
длина будет использоваться для метода быстрого восстановления индекса
в командах REPAIR
, CREATE INDEX
или ALTER
TABLE. Более длинные слова
вставляются дольше. При увеличении значения ft_max_word_len_sort
MySQL
будет создавать временные файлы большего размера (таким образом будет
замедляться работа из-за возрастания нагрузки на порт ввода/вывода
диска), а также будет помещать меньше ключей в один блок сортировки
(что, опять же, способствует снижению производительности). Если
значение переменной ft_max_word_len_sort
слишком мало, MySQL будет
вставлять большое количество слов достаточно медленно, но короткие
слова будут вставляться очень быстро.
ft_boolean_syntax
Список операторов, поддерживаемых командой MATCH ...
AGAINST(... IN BOOLEAN MODE)
. See section 6.8 Полнотекстовый поиск в MySQL.
have_innodb
Значение YES
, если mysqld
поддерживает таблицы
InnoDB
. Значение DISABLED
, если используется параметр
--skip-innodb
.
have_bdb
Значение YES
, если mysqld
поддерживает таблицы Berkeley DB
.
Значение DISABLED
, если используется параметр --skip-bdb
.
have_raid
Значение YES
, если mysqld
поддерживает параметр RAID
.
have_openssl
Значение YES
, если mysqld
поддерживает SSL (шифрование) в
протоколе клиент/сервер.
init_file
Имя файла, указанного при помощи параметра --init-file
при
запуске сервера. Это файл операторов SQL, которые сервер должен
выполнить при запуске.
interactive_timeout
Количество времени в секундах, на протяжении
которого сервер ожидает активности со стороны интерактивного
соединения, прежде чем закрыть его. Интерактивный клиент - это клиент,
который использует параметр CLIENT_INTERACTIVE
для
mysql_real_connect
(). См. также информацию по wait_timeout
.
join_buffer_size
Размер буфера, используемого для полных объединений
(объединения, в которых не применяются индексы). Буфер выделяется один
раз для каждого полного объединения двух таблиц. Если нужно ускорить
полное объединение и невозможно добавить индексы, следует увеличить
это значение (обычно добавление индексов является лучшим способом
добиться быстрых объединений).
key_buffer_size
Блоки индексов буферизированы и доступ к ним разрешен
всем потокам. key_buffer_size
- размер буфера, используемого для
блоков индексов. Чтобы улучшить обработку индексов (для всех операций
чтения и записи нескольких элементов), необходимо увеличить это
значение настолько, насколько возможно. Размер 64 Мб для компьютера с
256 Мб (именно такой компьютер в основном используется для работы с
MySQL) - довольно распространенная конфигурация. Тем не менее, если
задать слишком большое значение (например, больше 50% от общего
количества памяти), система может начать сохранять временные файлы на
диске, что значительно снизит производительность. Помните, что,
поскольку MySQL не производит кэширования считываемых данных, нужно
оставлять определенное пространство для кэша файловой системы
операционной системы. Производительность буфера ключей можно
проверить, выполнив команду show status
и проверив значения переменных
Key_read_requests
, Key_reads
, Key_write_requests
и Key_writes
.
Отношение значений Key_reads
/Key_read_request
обычно должно быть <
0,01. Отношение Key_write
/Key_write_requests
примерно равно 1, если в
основном используются обновления/удаления, но может быть и меньше,
если чаще используются обновления сразу многих элементов или если
delay_key_write
. See section 4.5.6 Синтаксис команды SHOW
. Чтобы еще больше увеличить
скорость при одновременной записи большого количества строк,
используйте команду LOCK TABLES
. See section 6.7.2 Синтаксис команд LOCK TABLES/UNLOCK TABLES
.
language
Язык, используемый для вывода сообщений об ошибках.
large_file_support
Если mysqld
был откомпилирован с параметрами для
поддержки больших файлов.
locked_in_memory
Если mysqld
был заблокирован в памяти при помощи
--memloc
k
log
Если включено занесение в журнал всех запросов.
log_update
Если включен журнал обновлений.
log_bin
Если включен бинарный журнал.
log_slave_updates
Если обновления от подчиненного компьютера должны
заноситься в журнал.
long_query_time
Если обработка запроса отнимает больше указанного
промежутка времени (в секундах), значение счетчика Slow_queries
будет
увеличено. Если используется параметр --log-slow-queries
, запрос будет
записан в журнал медленных запросов. See section 4.9.5 Журнал медленных запросов.
lower_case_table_names
Если установлено значение 1, имена таблиц будут
сохранятся на диск с использованием строчных букв, а имена таблиц не
будут чувствительны к регистру. See section 6.1.3 Чувствительность имен к регистру.
max_allowed_packet
Максимальный размер одного пакета. Изначально
размер буфера сообщений устанавливается в net_buffer_length
байтов, но
при необходимости может возрасти до max_allowed_packet
байтов. Это
значение по умолчанию не настолько велико, чтобы отсеивать большие
(возможно ошибочные) пакеты. Если используются большие столбцы BLOB
,
его необходимо увеличить. Значение должно быть не меньше самого
большого BLOB
, который будет использоваться. Ограничение протокола для
max_allowed_packet
составляет 16 Мб в MySQL 3.23 и 2Гб в MySQL 4.0.
max_binlog_cache_size
Если для транзакции с большим количеством
операторов потребуется большее количество памяти, чем указано этим
параметром, будет выдано сообщение об ошибке "Multi-statement
transaction required more than 'max_binlog_cache_size' bytes of
storage" (для транзакции с большим количеством операторов требуется
больше, чем 'max_binlog_cache_size' байтов для хранения).
max_binlog_size
Доступно после версии 3.23.33. Если запись в бинарный
журнал (репликация) превысит данное значение, производится ротация
журнала. Нельзя установить значение, меньшее, чем 1024 байта или
большее, чем 1 Гб. По умолчанию установлено значение 1 Гб.
max_connections
Разрешенное количество одновременно подсоединенных
клиентов. Увеличение этого значения увеличивает количество
дескрипторов файлов, необходимых для mysqld
. Ниже приведены примечания
по ограничениям для дескрипторов. See section A.2.5 Ошибка Too many connections
.
max_connect_errors
Если количество прерванных соединений с удаленным
компьютером превышает это число, дальнейшие попытки удаленного
компьютера установить соединение будут заблокированы. Блокировку с
удаленного компьютера можно снять при помощи команды FLUSH HOSTS
.
max_delayed_threads
Не запускайте больше потоков, чем указано здесь,
для обработки операторов INSERT DELAYED
. Если попытаться вставить
данные в новую таблицу, когда все потоки INSERT DELAYED
заняты, строка
будет вставлена таким образом, как будто атрибут DELAYED
не был
указан.
max_heap_table_size
Не позволяет создавать динамические таблицы,
размер которых превышает указанное значение.
max_join_size
Объединения, которые потенциально могут считывать более
max_join_size
записей, будут возвращать ошибку. Это значение нужно
задавать, если ваши пользователи осуществляют объединения, которым
недостает оператора WHERE
, - такие объединения занимают много
времени, а затем возвращают миллионы строк.
max_sort_length
Параметр определяет, сколько байтов следует
использовать при сортировке значений BLOB
или TEXT
(обрабатываются
только первые max_sort_length
байтов каждого значения, остальные
игнорируются).
max_user_connections
Максимальное количество активных соединений для
одного пользователя (0 = без ограничений).
max_tmp_tables
(Этот параметр пока ни на что не влияет.) Максимальное
количество временных таблиц, которые клиент может открывать
одновременно.
max_write_lock_count
После данного количества блокирования записей
разрешается выполнить между ними несколько блокировок чтения.
myisam_bulk_insert_tree_size
В MySQL используется специальный
древовидный кэш, чтобы быстрее производить групповые вставки (например
INSERT ... SELECT
, INSERT ... VALUES (...), (...), ...
и LOAD DATA
INFILE
). Данная переменная ограничивает размер дерева кэша в байтах на
поток. Если установить значение в 0, то оптимизация будет отключена.
Примечание: этот кэш используется только для добавления данных к
таблицам, которые уже содержат определенную информацию. По умолчанию
установлено значение 8 Мб.
myisam_recover_options
Значение параметра --myisam-recover
.
myisam_sort_buffer_size
Буфер, который выделяется для сортировки
индексов при выполнении команды REPAIR
или для создания индексов при
помощи команд CREATE INDEX
или ALTER TABLE
.
myisam_max_extra_sort_file_size
.
Если размер временного файла,
используемого для быстрого создания индексов, превышает на указанный
здесь объем используемый кэш ключей, то лучше отдать предпочтение
методу кэша ключей. Такой метод применяется для того, чтобы для
больших ключей символов в больших таблицах использовался более
медленный метод кэширования ключей при создании таблиц.
Обратите внимание: значение этого параметра задается в мегабайтах!
myisam_max_sort_file_size
Максимальный размер временного файла,
который в MySQL может использоваться при восстановлении индекса (во
время работы команд REPAIR
, ALTER TABLE
или LOAD DATA INFILE
). Для
файлов, размер которых превышает указанное значение, индекс будет
создаваться при помощи кэша ключей (такой алгоритм работает несколько
медленнее).
Обратите внимание: значение этого параметра задается в мегабайтах!
net_buffer_length
В данное значение устанавливается в промежутках
между запросами буфер соединения. Обычно это значение не изменяется,
но если у вас очень мало памяти, можно установить его по размеру
ожидаемого запроса (т.е. равным предполагаемой длине операторов SQL,
отправляемых клиентами; если оператор превысит указанную длину, буфер
будет автоматически увеличен как максимум до max_allowed_packet
байтов).
net_read_timeout
Количество времени в секундах, на протяжении которого
ожидаются дополнительные данные от соединения, пока не будет отменено
чтение. Обратите внимание, что мы не ожидаем поступления данных от
соединения, время ожидания определяется по write_timeout
. Также см.
slave_net_timeout
.
net_retry_count
Если чтение из порта связи было прервано, будет
предпринято указанное количество попыток повторного чтения. Это
значение должно быть достаточно высоким на FreeBSD
, так как внутренние
прерывания направляются на все потоки.
net_write_timeout
Время ожидания записи блока через соединение, пока
запись не будет прервана (в секундах).
open_files_limit
Если это значение отлично от 0, то mysqld
будет
применять его для резервных дескрипторов файлов, используемых с
setrlimit()
. Если это значение равно 0, то mysqld
будет резервировать
max_connections*5
или max_connections + table_cache*2
(в зависимости
от того, какое число больше) файлов. Если mysqld
выдает ошибку 'Too
many open files' (слишком много открытых файлов), данное значение
необходимо увеличить.
pid_file
Значение параметра --pid-file
.
port
Значение параметра --port
.
protocol_version
Версия протокола, используемого сервером MySQL.
record_buffer
Каждый поток, осуществляющий последовательное
сканирование, выделяет буфер указанного размера для каждой сканируемой
таблицы. Если проводится много последовательных сканирований, это
значение можно увеличить.
record_rnd_buffer
При считывании строк после проведения сортировки в
отсортированном порядке строки считываются через буфер, чтобы избежать
операций поиска по диску. Если этот параметр не задан, то используется
значение record_buffer
.
query_buffer_size
Изначальная величина буфера запросов. Если
большинство запросов большого размера (например, при вставке записей с
BLOB
), его необходимо увеличить!
query_cache_limit
Результаты, превышающие это значение, не кэшируются
(по умолчанию - 1Мб).
query_cache_size
Память, выделенная для хранения результатов старых
запросов. Если значение установлено в 0, кэш запросов отключен
(принято по умолчанию).
query_cache_startup_type
Могут быть заданы следующие значения (только
числовые):
Значение | Объяснение | Примечание |
0 | OFF | Не кэширует и не извлекает результаты. |
1 | ON | Кэширует все результаты, кроме запросов SELECT SQL_NO_CACHE ... .
|
2 | DEMAND | Кэширует только запросы SELECT SQL_CACHE ... .
|
safe_show_database
Не отображаются базы данных, для которых у
пользователя нет каких-либо привилегий по базам данных или таблицам.
Таким образом можно увеличить степень безопасности, если вы не хотите
предоставлять посторонним лицам возможность получать информацию о том,
какие базы данных есть у других пользователей. Также см. skip_show_database
.
server_id
Значение параметра --server-id
.
skip_locking
Установлено в значение OFF
, если mysqld
использует
внешнюю блокировку.
skip_networking
Установлено в значение ON
, если разрешаются только
локальные соединения (через сокет).
skip_show_database
Эта переменная не позволяет выполнять команду SHOW
DATABASES
, если у пользователя нет привилегии PROCESS
. Таким образом
можно увеличить степень безопасности, если вы не хотите предоставлять
посторонним лицам возможность получать информацию о том, какие базы
данных есть у других пользователей. Также см. safe_show_database
.
slave_net_timeout
Количество времени в секундах, в течение которого
ожидаются дополнительные данные от подсоединенного головного или
подчиненного компьютера прежде, чем будет отменено чтение.
slow_launch_time
Если создание потока занимает больше, чем указанное
значение (в секундах), значение счетчика Slow_launch_threads
будет
увеличено.
socket
Сокет Unix, используемый сервером.
sort_buffer
Каждый поток, которому необходимо произвести сортировку,
выделяет буфер данного размера. Увеличение данного значения позволит
ускорить выполнение операторов ORDER BY
или GROUP BY
. See section A.4.4 Где MySQL хранит временные файлы.
table_cache
Количество открытых таблиц для всех потоков. С увеличением
этого значения увеличивается количество дескрипторов файлов,
необходимых для mysqld
. Чтобы узнать, необходимо ли изменять значение
кэша таблиц, следует проверить значение переменной Opened_tables
. См.
раздел See section A.4.4 Где MySQL хранит временные файлы. Если у этой переменной
большое значение, а команда FLUSH TABLES
(которая закрывает все
таблицы, а потом открывает их повторно) используется не часто, то
необходимо увеличить ее значение. Чтобы получить дополнительную
информацию по кэшу таблиц, см. раздел See section 5.4.7 Открытие и закрытие таблиц в MySQL.
table_type
Принятый по умолчанию тип таблиц.
thread_cache_size
Определяет, сколько потоков должно сохраняться в
кэше для повторного использования. После отключения клиента потоки
клиента помещаются в кэш, если там не больше потоков, чем
thread_cache_size
. Все новые потоки сначала берутся из кэша, и только
когда кэш становится пустым, создаются новые потоки. Значение этой
переменной можно увеличить, чтобы повысить производительность, если
создается много новых соединений (если потоки у вас хорошо
организованы, обычно заметного улучшения производительности не
наблюдается). Насколько эффективен текущий кэш потоков, можно
определить по разнице между Connections
и Threads_created
.
thread_concurrency
В системе Solaris mysqld
вызывает функцию
thr_setconcurrency()
с этим значением. thr_setconcurrency()
позволяет
приложению дать системе потоков подсказку по необходимому количеству
потоков, которые должны быть запущены в одно и то же время.
thread_stack
Размер стека для каждого потока. От данного значения
зависит большое количество ограничений, обнаруживаемых при помощи
теста crash
-me. По умолчанию этот размер достаточен для нормальной
работы. See section 5.1.4 Набор тестов MySQL (The MySQL Benchmark Suite).
timezone
Часовой пояс, в котором находится сервер.
tmp_table_size
Если находящаяся в памяти временная таблица превысит
этот размер, MySQL автоматически преобразует ее в дисковую таблицу
MyISAM
. Значение tmp_table_size
следует увеличить, если выполняется
много расширенных запросов GROUP BY
и в вашей системе установлено
значительное количество оперативной памяти.
tmpdir
Каталог, используемый для временных файлов и временных таблиц.
version
Номер версии сервера.
wait_timeout
Время в секундах, на протяжении которого сервер ожидает
активности соединения прежде, чем закрыть его. См. также
interactive_timeout
.
Раздел руководства, в котором описывается настройка MySQL содержит некоторую информацию по настройке приведенных выше переменных. See section 5.5.2 Настройка параметров сервера.
SHOW LOGS
SHOW LOGS
отображает информацию по состоянию существующих файлов журналов.
На данный момент выводится информация только по файлам журналов Berkeley
DB.
File
отображает полный путь к файлу журнала
Type
отображает тип файла журнала (BDB
для файлов журналов Berkeley
DB)
Status
отображает состояние файла журнала (FREE
- если файл может быть
удален, или IN USE
, если файл необходим подсистеме транзакций).
SHOW PROCESSLIST
Команда SHOW [FULL] PROCESSLIST
показывает, какие потоки запущены в
настоящий момент. Эту информацию также можно получить при помощи команды
mysqladmin processlist
. Если у вас привилегия SUPER
, можно просматривать
все потоки, в противном случае - только свои потоки. See section 4.5.5 Синтаксис команды KILL
. Если не используется параметр FULL
, будут показаны только первые
100 символов каждого запроса.
Эта команда очень полезна, если выдается сообщение об ошибке 'too many
connections' (слишком много соединений) и необходимо выяснить, что
происходит. MySQL резервирует одно дополнительное соединение для клиента с
привилегией SUPER
, чтобы у вас всегда была возможность войти в систему и
произвести проверку (предполагается, что вы не станете раздавать эту
привилегию всем своим пользователям).
Некоторые состояния обычно можно увидеть в mysqladmin processlist
.
Checking table
Поток осуществляет [автоматическую] проверку таблицы.
Closing tables
Означает, что поток записывает измененные данные таблиц
на диск и закрывает использующиеся таблицы. Выполнение этой операции
должно произойти быстро. Если на нее уходит значительное время,
убедитесь, что диск не переполнен или что диск не используется слишком
интенсивно.
Connect Out
Подчиненный компьютер, подсоединенный к головному
компьютеру.
Copying to tmp table on disk
Набор временных результатов превысил
tmp_table_size
, и теперь поток изменяет таблицу временных данных,
расположенную в памяти, на дисковую таблицу, чтобы сохранить память.
Creating tmp table
Поток создает временную таблицу, чтобы хранить
часть результатов для запроса.
deleting from main table
При запуске первой части удаления нескольких
таблиц удаление производится только начиная с первой таблицы.
deleting from reference tables
При запуске второй части удаления
нескольких таблиц удаляются совпадающие строки из других таблиц.
Flushing tables
Поток запускает команду FLUSH TABLES
и ожидает, пока
все потоки закроют свои таблицы.
Killed
Кто-то направил команду на закрытие потока, и поток будет
закрыт при следующей проверке флага закрытия. Флаг проверяется при
каждом основном цикле в MySQL, но в некоторых случаях закрытие потока
может занять некоторое время. Если поток заблокирован другим потоком,
закрытие будет произведено сразу после того, как другой поток снимет
блокировку.
Sending data
Поток обрабатывает строки для оператора SELECT
, а также
направляет данные клиенту.
Sorting for group
Поток осуществляет сортировку в соответствии с GROUP BY
.
Sorting for order
Поток осуществляет сортировку в соответствии с ORDER BY
.
Opening tables
Это просто означает, что поток пытается открыть
таблицу. Такая процедура осуществляется довольно быстро, если что-либо
не мешает открытию. Например, команды ALTER TABLE
или LOCK TABLE
могут
помешать открытию таблицы, пока выполнение команды не будет завершено.
Removing duplicates
Запрос использовал команду SELECT DISTINCT
таким
образом, что MySQL не смог произвести оптимизацию на начальном этапе.
Поэтому MySQL перед отправкой результатов клиенту должен выполнить
дополнительное удаление всех дублирующихся строк.
Reopen table
Поток заблокировал таблицу, но обнаружил, что после
блокировки структура таблицы изменилась. Он снял блокировку, закрыл
таблицу и теперь пытается повторно ее открыть.
Repair by sorting
Код восстановления использует сортировку для
создания индексов.
Repair with keycache
Код восстановления использует создание ключей
один за другим, через кэш ключей. Это намного медленнее, чем Repair by
sorting
.
Searching rows for update
Поток осуществляет первую фазу - производит
поиск всех совпадающих строк, чтобы затем обновить их. Это действие
необходимо выполнить, если команда UPDATE
изменяет индекс, который
используется для поиска указанных строк.
Sleeping
Поток ожидает, когда клиент направит ему новую команду.
System lock
Поток ожидает получения внешней системной блокировки
таблицы. Если не используется несколько серверов mysqld
, которые
получают доступ к одним и тем же таблицам, системную блокировку можно
отключить при помощи параметра --skip-locking
.
Upgrading lock
Обработчик INSERT DELAYED
пытается заблокировать
таблицу, чтобы вставить строки.
Updating
Поток производит поиск строк, которые необходимо обновить, и
обновляет их.
User Lock
Поток ожидает GET_LOCK()
.
Waiting for tables
Поток получил уведомление, что структура таблицы
изменилась, и ему необходимо повторно открыть таблицу, чтобы получить
новую структуру. Чтобы повторно открыть таблицу, он должен подождать,
пока ее не закроют все остальные потоки. Это уведомление выдается,
если другой поток воспользовался командой FLUSH TABLES
или к таблице
была применена одна из следующих команд: FLUSH TABLES table_name
,
ALTER TABLE
, RENAME TABLE
, REPAIR TABLE
, ANALYZE TABLE
или OPTIMIZE TABLE
.
Обработчик INSERT DELAYED
завершил работу
со всеми вставками и ожидает новые.
Большинство состояний - это очень быстрые операции. Если потоки остаются в любом из этих состояний на протяжении большого количества секунд, то, возможно, возникла какая-то проблема, которую следует устранить.
Существует еще несколько состояний, не упомянутых выше, но большинство из
них полезны только для поиска ошибок в mysqld
.
SHOW GRANTS
SHOW GRANTS FOR user выводит список команд назначения привилегий, которые нужны при дублировании привилегий для пользователя.
mysql> SHOW GRANTS FOR root@localhost; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root''localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+
SHOW CREATE TABLE
Показывает оператор CREATE TABLE
, который будет создавать данную таблицу:
mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE t ( id int(11) default NULL auto_increment, s char(60) default NULL, PRIMARY KEY (id) ) TYPE=MyISAM
Команда SHOW CREATE TABLE
будет выдавать таблицу и названия столбцов
в соответствии с параметром SQL_QUOTE_SHOW_CREATE
. See section 5.5.6 Синтаксис команды SET
.
По умолчанию в MySQL используется набор символов ISO-8859-1 (Latin1) с сортировкой согласно шведским/финским правилам. Этот набор символов также подходит для использования в США и Западной Европе.
Все стандартные исполняемые файлы MySQL компилируются с настройкой
--with-extra-charsets=complex
. Таким образом в файл помещается код,
позволяющий всем стандартным программам работать с набором символов
latin1
, а также многобайтовыми наборами символов. Другие наборы символов
могут загружаться из соответствующих файлов определений по необходимости.
Набор определяет, какие символы могут использоваться в именах, а также
способ сортировки значений в операторах ORDER BY
и GROUP BY
команды
SELECT
.
При запуске сервера можно изменить набор символов при помощи параметра
--default-character-set
. Выбрать доступные наборы символов можно при
помощи параметров --with-charset=charset
и --with-extra-charset=
list-of-charset | complex | all
, и файлов наборов символов, перечисленных
в SHAREDIR/charsets/Index
. See section 2.3.3 Типичные опции configure
.
При смене набора символов во время работы MySQL (что может одновременно
изменить и порядок сортировки) необходимо запустить команду myisamchk -r
-q
для всех таблиц. В противном случае индексы могут быть созданы в
неправильном порядке.
При подключении клиента к серверу MySQL сервер отправляет ему используемый по умолчанию набор символов. На время соединения клиент переключается на использование этого набора.
Для экранирования строк в SQL-запросе необходимо пользоваться функцией
mysql_real_escape_string()
. mysql_real_escape_string()
идентична старой
функции mysql_escape_string()
- во всем, кроме одного: в качестве первого
параметра она принимает дескриптор соединения MYSQL.
Если клиент был скомпилирован с набором путей, в которых не было пути установки сервера, а настраивавший MySQL пользователь на включил в исполняемый файл системы все наборы символов, клиенту необходимо сообщить о местонахождении дополнительных наборов символов, которые нужны ему для общения с сервером.
Сделать это можно путем внесения в файл настроек MySQL следующей строки:
[client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
путь в ней указывает на каталог, в котором хранятся динамические наборы символов MySQL.
Заставить клиента использовать определенный набор символов можно следующим образом:
[client] default-character-set=character-set-name
но обычно этого не требуется.
Для задания порядка сортировки в соответствии с немецким алфавитом нужно
запустить mysqld
с параметром --default-character-set=latin_de
.
При сортировке и сравнении строк осуществляется следующая подстановка:
Д -> ae Ж -> oe Э -> ue ъ -> ss
Все символы с диакритическими знаками заменяются их аналогами из верхнего регистра и без ударения. Все буквы переводятся в верхний регистр.
При сравнении строк с помощью команды LIKE
, подстановки двух символов
вместо одного не происходит. Все буквы переводятся в верхний регистр.
Диакритические знаки снимаются со всех букв, кроме: э
, Э
, ж
, Ж
, д
и Д
.
mysqld
может выдавать сообщения об ошибках на следующих языках: чешском,
датском, голландском, английском (по умолчанию), эстонском, французском,
немецком, греческом, венгерском, итальянском, японском, корейском,
норвежском, новонорвежском, польском, португальском, румынском, русском,
словацком, испанском и шведском.
При запуске mysqld
выбрать определенный язык можно при помощи настройки
--language=язык
или -L язык
. Например:
shell> mysqld --language=swedish или: shell> mysqld --language=/usr/local/share/swedish
Обратите внимание: названия языков вводятся в нижнем регистре.
Файлы языков по умолчанию располагаются в папке `mysql_base_dir/share/LANGUAGE/'.
Для того чтобы изменить тексты сообщений об ошибках, нужно отредактировать файл `errmsg.txt' и запустить следующую команду для генерации нового файла `errmsg.sys':
shell> comp_err errmsg.txt errmsg.sys
Установив новую версию MySQL, не забудьте внести те же изменения в новый файл `errmsg.txt'.
Снабдить MySQL новым набором символов можно следующим образом.
Определите, является ли новый набор символов простым или сложным. Если для работы с этим набором никаких специальных процедур обработки строк и поддержки многобайтовых символов не требуется, он является простым. Если вышеперечисленные возможности необходимы, этот набор символов относится к сложным.
Например, наборы latin1
и danish
- простые, а big5
и czech
- сложные.
Для всех приведенных ниже примеров предполагается, что используемый набор
символов называется MYSET
.
Для создания простого набора достаточно сделать следующее:
MYSET
в конец файла `sql/share/charsets/Index' и присвойте
этому набору символов уникальный номер.
to_lower
, to_upper
и sort_order
, каждый из которых занимает 256 слов.
CHARSETS_AVAILABLE
и
COMPILED_CHARSETS
файла `configure.in'.
Для создания сложного набора необходимо выполнить следующие действия:
/* этот комментарий разбирается configure для создания ctype.c, поэтому не меняйте его, если не уверены в правильности своих действий. * .configure. number_MYSET=MYNUMBER .configure. strxfrm_multiply_MYSET=N .configure. mbmaxlen_MYSET=N */Программа configure использует этот комментарий для линкования набора символов с библиотекой MySQL. Значение строк strxfrm_multiply и mbmaxlen будет разъяснено ниже. Использовать их нужно только в том случае, если вам нужны функции для сортировки строк или работы с многобайтовыми наборами символов соответственно.
my_strncoll_MYSET()
my_strcoll_MYSET()
my_strxfrm_MYSET()
my_like_range_MYSET()
CHARSETS_AVAILABLE
и
COMPILED_CHARSETS
файла `configure.in'.
Более подробные инструкции приведены в файле `sql/share/charsets/README'.
Если вы хотите, чтобы ваш набор символов был включен в комплект поставки MySQL, вышлите патч с ним по адресу internals@lists.mysql.com.
Простые массивы to_lower[]
и to_upper[]
содержат символы верхнего и
нижнего регистров, соответствующие каждому из символов набора. Например:
to_lower['A'] should contain 'a' to_upper['a'] should contain 'A'
sort_order[]
- карта, устанавливающая правила упорядочивания символов для
сравнения и сортировки. Во многих наборах символов эта таблица совпадает с
to_upper[]
(благодаря чему при сортировке регистр символов не
учитывается). MySQL сортирует символы в соответствии со значением
sort_order[символ]
. Более сложные правила упорядочивания строк
разъясняются ниже. See section 4.6.5 Поддержка упорядочивания строк.
ctype[]
представляет собой массив битов, по одному элементу на каждый из
символов. (Массивы to_lower[]
, to_upper[]
, и sort_order[]
индексируются по
значению символа, а ctype[]
- по значению символа + 1. Это позволяет
обрабатывать символы EOF
).
В файле `m_ctype.h' приведены следующие определения битовых масок:
#define _U 01 /* верхний регистр */ #define _L 02 /* нижний регистр */ #define _N 04 /* число (цифра) */ #define _S 010 /* символ пробела */ #define _P 020 /* знак пунктуации */ #define _C 040 /* управляющий символ */ #define _B 0100 /* пустой символ */ #define _X 0200 /* шестнадцатеричная цифра */
Значение ctype[]
для каждого из символов должно представлять собой
объединение значений битовых масок, описывающих символ. Например, 'A'
представят собой символ верхнего регистра (_U
) а также шестнадцатеричную
цифру (_X
), поэтому элемент ['A'+1]
должен содержать значение:
_U + _X = 01 + 0200 = 0201
Если правила сортировки вашего естественного языка слишком сложны и не
могут быть заданы с помощью простой таблицы sort_order
[], необходимо
использовать функции упорядочивания строк.
В настоящее время лучшим справочным пособием по этому вопросу являются уже
реализованные наборы символов. Примером такой реализации могут служить
наборы big5
, czech
, gbk
, sjis
и tis160
.
В начале файла в особом комментарии необходимо указать значение
strxfrm_multiply_MYSET=N
. Значение N
представляет собой максимальный
прирост объема строк во время my_strxfrm_MYSET
(т.е. положительное целое
число).
При желании обеспечить поддержку нового набора, содержащего многобайтовые символы, нужно пользоваться специальными функциями для работы с многобайтовыми символами.
В настоящее время лучшим справочным пособием по этому вопросу являются уже
реализованные наборы символов. Примером такой реализации могут служить
наборы euc_kr
, gb2312
, gbk
, sjis
и ujis
. Они реализованы в файлах
`ctype-'charset'.c', расположенных в папке `strings'.
В начале файла в особом комментарии необходимо указать значение
strxfrm_multiply_MYSET=N
. Значение N
должно содержать объем самого
``большого'' символа набора в байтах.
При попытке воспользоваться набором символов, не включенным в исполняемый файл, можно столкнуться со следующими неприятностями:
--character-sets-dir
.
ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found (Errcode: 2)В таком случае нужно либо установить новый файл `Index' или вручную внести в него недостающие имена наборов.
Узнать имя набора символов таблиц MyISAM
можно с помощью команды myisamchk
-dvv table_name
.
Все клиенты MySQL, общающиеся с сервером при помощи библиотеки
mysqlclient
, используют следующие переменные окружения:
Имя | Описание |
MYSQL_UNIX_PORT | Заданный по умолчанию файл сокета; используется для подсоединений к localhost
|
MYSQL_TCP_PORT | Заданный по умолчанию порт TCP/IP |
MYSQL_PWD | Заданный по умолчанию пароль |
MYSQL_DEBUG | Опции пошаговой отладки - для осуществления оной |
TMPDIR | Каталог, в котором создаются временные таблицы/файлы |
Использование переменной окружения MYSQL_PWD
является небезопасным. См.
раздел See section 4.2.8 Соединение с сервером MySQL.
Клиент mysql использует файл, указанный в переменной окружения
MYSQL_HISTFILE
, чтобы сохранять историю командной строки. Заданное по
умолчанию значение для файла истории - `$HOME/.mysql_history', где $
HOME -
это значение переменной окружения HOME
. See section F Переменные окружения.
Все программы MySQL имеют множество различных опций. При этом каждая
программа MySQL поддерживает опцию --help
, которую можно использовать
для получения полного описания различных опций программы. Например,
попробуйте выполнить mysql --help
.
Заданные по умолчанию опции для всех стандартных клиентских программ можно переопределять при помощи файла опций. See section 4.1.2 Файлы параметров `my.cnf'.
В следующем списке приводятся краткие описания программ MySQL:
myisamchk
myisamchk
имеет много функций, она
описывается в отдельном разделе. See section 4 Администрирование баз данных.
make_binary_distribution
FTP
можно передать на сайт support.mysql.com
в директорию
`/pub/mysql/Incoming', чтобы ею могли воспользоваться и другие пользователи
MySQL.
msql2mysql
mysqlaccess
mysqladmin
mysqladmin
может также использоваться
для получения информации о версии запущенного сервера MySQL, процессах и
статусе. See section 4.8.3 mysqladmin
, Администрирование MySQL-сервера..
mysqlbug
mysqld
mysqldump
mysqldump
, Получение дампов данных и структуры таблицы.
mysqlimport
LOAD DATA INFILE
. See section 4.8.7 mysqlimport
, импорт данных из текстовых файлов.
mysqlshow
mysql_install_db
replace
msql2mysql
, но имеющая также множество
других применений. replace
заменяет одни строки на другие в файлах или в
стандартном вводе. Использует конечный автомат для того, чтобы первыми
сопоставлять более длинные строки. Может использоваться для перестановки
строк. Например, следующая команда меняет местами a
и b
в данных файлах:
shell> replace a b b a -- file1 file2 ...
safe_mysqld
, оболочка mysqld
safe_mysqld
- это сценарий, с помощью которого рекомендуется запускать
демон mysqld на Unix. safe_mysqld
служит для реализации неких
дополнительных функций безопасности для mysqld
, таких как возможность
перезапуска сервера при обнаружении ошибки и записи в журнал информации о
процессе работы mysqld
.
Если не указаны опции --mysqld=#
или --mysqld-version=#
, safe_mysqld
будет использовать исполняемый файл mysqld
-max, если последний существует.
Если mysqld-max
не существует, safe_mysqld
запустит mysqld
. Это позволяет
легко выяснить, что даст использование mysqld-max
вместо mysqld
: просто
скопируйте mysqld-max
поверх mysqld
, и он будет работать.
Как правило, редактировать сценарий safe_mysqld
не следует, однако можно
указать опции для safe_mysqld
, поместив их в раздел [safe_mysqld]
файла
`my.cnf'. safe_mysqld
будет считывать все опции из разделов файлов опций
[mysqld]
, [server]
и [safe_mysqld]
. See section 4.1.2 Файлы параметров `my.cnf'.
Обратите внимание: все опции, которые вводятся в командной строке для
safe_mysqld
, передаются mysqld
. Если требуется применить в safe_mysqld
какие-либо опции, которые mysqld
не поддерживает, эти опции нужно
определить в файле опций.
Большинство опций safe_mysqld
- те же, что и у mysqld
. See section 4.1.1 Параметры командной строки mysqld
.
Safe_mysqld
поддерживает следующие опции:
--basedir=path
--core-file-size=#
core
-файла который может быть создан mysqld
. Значение передается ulimit -c
--datadir=path
--defaults-extra-file=path
--defaults-file=path
--err-log=path
--ledir=path
mysqld
--log=path
--mysqld=mysqld-version
mysqld
, которую вы хотите запустить в директории `ledir'
--mysqld-version=version
--mysqld=
, но в этой опции задается только суффикс для
mysqld
. Например, если используется --mysqld-version=max
, safe_mysqld
запустит версию ledir/mysqld-max
. Если задать --mysqld-version
без
аргумента, будет использоваться ledir/mysqld
.
--no-defaults
--open-files-limit=#
mysqld
.
Значение передается ulimit -n
. Обратите внимание: чтобы эта опция работала
корректно, необходимо запустить safe_mysqld
от пользователя root!
--pid-file=path
--port=#
--socket=path
--timezone=#
TZ
) в значение, передаваемое в
этом параметре.
--user=#
Сценарий safe_mysqld
написан таким образом, чтобы можно было запустить
сервер, инсталлированный как из исходного кода, так и из бинарной поставки
MySQL, даже если компоненты сервера, в зависимости от используемой
инсталляции, будут размещены несколько по-другому. Для safe_mysqld
требуется выполнение одного из следующих условий:
safe_mysqld
. safe_mysqld
ищет в своей рабочей директории
`bin' и `data' (для бинарных дистрибутивов) или `libexec' и `var' (для
дистрибутивов с исходным кодом). Это условие должно выполняться, если
safe_mysqld
запускается из директории, в которую инсталлирован MySQL
(например `/usr/local/mysql' для бинарного дистрибутива).
safe_mysqld
пытается найти их по абсолютным путям.
Типичные местоположения - `/usr/local/libexec' и `/usr/local/var'.
Действительные местоположения определяются при создании дистрибутива,
из которого запускается safe_mysqld
. Они должны быть корректными, если
MySQL был инсталлирован в стандартное местоположение.
Поскольку safe_mysqld
будет пытаться найти сервер и базы данных
относительно собственной рабочей директории, можно инсталлировать двоичный
дистрибутив MySQL куда угодно, при условии, что safe_mysqld
будет
запускаться из директории, в которой установлен MySQL:
shell> cd mysql_installation_directory shell> bin/safe_mysqld &
Если safe_mysqld
не может запустить сервер, даже в том случае, когда он
вызывается из инсталляционной директории MySQL, сценарий safe_mysqld
можно
модифицировать так, чтобы он использовал верный путь к mysqld
и опции
путей, которые являются правильными для вашей системы. Обратите внимание:
если в будущем вы будете делать апгрейд MySQL, новая версия safe_mysqld
будет записана поверх старой, поэтому нужно сделать копию
отредактированной версии, которую вы сможете затем установить повторно.
Mysqld_multi
, программа для управления множеством серверов MySQL
Программа mysqld_multi
предназначена для управления несколькими процессами
mysqld
, работающих на различных сокетах Unix и портах TCP/IP.
Программа будет искать группу(группы) [mysqld#]
в `my.cnf' (или заданную(ые)
при помощи --config-file=...
), где # -любое положительное число, начиная с
1. Эти группы должны быть такими же, как и обычная группа [mysqld
]
(например содержать опции для mysqld
; см. в руководстве более подробную
информацию), но с такими портом, сокетом и т.д., которые требуются для
каждого отдельного процесса mysqld
. Номер в имени группы имеет другую
функцию; он может использоваться для запуска или остановки некоторых
конкретных серверов mysqld
в этой программе или для создания отчетов. В
данном разделе представлена дополнительная информация об использовании и
опциях mysqld_multi
.
Использование: mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...] или mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]
GNR здесь означает номер группы. Можно запускать, останавливать или
создавать отчеты о любом GNR, или о нескольких из них одновременно (см.
--example
) В качестве разделителей в списке GNR применяются запятые,
комбинации создаются при помощи тире. Последнее означает, что будут
задействованы все номера GNR из диапазона GNR1-GNR2. Если не задан
аргумент GNR, то все группы будут либо запущены, либо остановлены, либо
будет выведен отчет об этих группах. Обратите внимание, что в списке GNR
не должно быть никаких пропусков (пробелов, символов табуляции или пустых
строк). Любые данные после пропуска будут игнорироваться.
mysqld_multi поддерживает следующие опции:
--config-file=...
config file
). Примечание: данный файл
не влияет на собственные опции этой программы (группа [mysqld_multi]
), а
только на группы [mysqld#]
. Без этой опции поиск всех данных будет
осуществляться только в обычном файле `my.cnf'.
--example
--help
--log=...
--mysqladmin=...
mysqladmin
, используемый для завершения работы сервера.
--mysqld=...
mysqld
, который будет использоваться. Обратите внимание:
в этой опции можно также указывать safe_mysqld
. Опции передаются mysqld
.
Необходимо только удостовериться, что в переменной окружения PATH имеется
mysqld
или что установлен safe_mysqld
.
--no-log
stdout
вместо журнала. По умолчанию журналы включены.
--password=...
mysqladmin
.
--tcp-ip
--user=...
mysqladmin
.
--version
Некоторые примечания относительно mysqld_multi:
mysqld
(например, при помощи mysqladmin
), имеет один пароль и имя
пользователя для всех директорий данных, к которым производится доступ
(имеется в виду - к базе данных mysql
). Убедитесь также, что
пользователь имеет привилегию Shutdown_priv
! Если имеется несколько
директорий с данными и несколько различных баз данных mysql
с
различными паролями для пользователя root
в MySQL, можно создать
некоего общего пользователя multi_admin
для всех, с одинаковым паролем
(см. ниже). Сделать это можно так:
shell> mysql -u root -S /tmp/mysql.sock -proot_password -e "GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BYSee section 4.2.6 Как работает система привилегий. Эти действия нужно выполнять для каждого
mysqld
для каждой имеющейся
директории данных (для этого нужно выбрать другой сокет -S=...
).
mysqld
используется
сценарий safe_mysqld
(например, --mysqld=safe_mysqld
). Преимущество
использования safe_mysqld
вместо mysqld
заключается в том, что safe_mysqld
``бережет'' каждый процесс mysqld
и перезапустит его, если mysqld
-процесс
умрет по сигналу 9 или подобному (например, в случае ошибки сегментации -
хотя, конечно, уж этой ошибки MySQL в принципе совершать не должен;).
Пожалуйста, обратите внимание: может оказаться, что сценарий safe_mysqld
требуется запускать из определенного каталога. Это означает, что прежде
чем запустить mysqld_multi
, прийдется перейти в нужный каталог. Если при
запуске возникнут проблемы, пожалуйста, просмотрите сценарий safe_mysqld
.
Обратите внимание на следующие строки:
-------------------------------------------------------------------------- MY_PWD=`pwd` Check if we are starting this relative (for the binary release) if test -d /data/mysql -a -f ./share/mysql/english/errmsg.sys -a -x ./bin/mysqld -------------------------------------------------------------------------- See section 4.7.2Этот тест может пройти успешно, однако возможны и проблемы.safe_mysqld
, оболочкаmysqld
.
mysqld
с одной и тожй же директорией
данных. Используйте различные директории с данными, если Вы четко не
уверены в своих действиях!
mysqld
.
mysqld
были преднамеренно не включены в пример.
В файле конфигурации могут быть ``промежутки'' - это увеличивает
гибкость. Порядок, в котором запускаются или завершают работу демоны
mysqld
, зависит от порядка, в котором они указаны в файле
конфигурации.
[mysqld# <==
).
mysqld
можно использовать опцию --user
, но для этого сценарий
mysqld_multi
должен быть запущен от root
. Наличие опции в файле
конфигурации не имеет значения; вы получите предупреждение только в
случаях, если не являетесь суперпользователем и демон mysqlds
запущен
под вашим аккаунтом Unix. Важно: удостоверьтесь, что для pid-файла
и
директории с данными имеется доступ для чтения+записи(+выполнения -
для директории с данными) для того пользователя Unix, который
запускает определенный процесс mysqld
. Не используйте для этого
аккаунт root
в Unix, если Вы не уверены в своих действиях!
mysqld
, и что осознаете то, почему могут быть нужны
отдельные процессы mysqld
. Запуск нескольких демонов mysqld
с одной
директорией данных не увеличит производительность в многопоточной
системе!
See section 4.1.4 Запуск нескольких серверов MySQL на одном компьютере.
Пример файла конфигурации для mysqld_multi
.
# Этот файл может находиться в вашей домашней директории (~/.my.cnf) или /etc/my.cnf # Version 2.1 by Jani Tolonen [mysqld_multi] mysqld = /usr/local/bin/safe_mysqld 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
See section 4.1.2 Файлы параметров `my.cnf'.
myisampack
, MySQL-генератор сжатых таблиц (только для чтения)
Утилита myisampack
используется для сжатия таблиц MyISAM
, а утилита
pack_isam
- для сжатия таблиц ISAM
. Поскольку таблицы ISAM
являются
устаревшими, здесь будет рассматриваться только myisampack
, но все,
сказанное относительно myisampack
, справедливо также и для pack_isam
.
myisampack
сжимает каждый столбец в таблице по отдельности. Информация,
необходимая для декомпрессии столбцов, считывается в память при открытии
таблицы. В результате обеспечивается более высокая производительность при
доступе к отдельным записям, поскольку нужно распаковывать только одну
запись, а не значительно больший по размеру дисковый блок, как при
использовании программы Stacker в MS DOS. В среднем myisampack
сжимает
файл данных на 40%-70%.
(MySQL использует отображение в памяти (mmap()
) для сжатых таблиц
а если mmap()
не работает, возвращается назад к нормальному режиму
чтения/записи.
Обратите внимание на следующее:
myisampack
может также сжимать столбцы c типами BLOB
или TEXT
. В
предыдущей версии pack_isam
(для таблиц ISAM
) данной функции не было.
Утилиту myisampack
можно запустить следующим образом:
shell> myisampack [options] filename ...
Каждое имя файла (filename
) должно быть именем индексного файла (`.MYI').
Если вы не находитесь в директории базы данных, необходимо указать полный
путь к файлу. Допускается опускать расширение `.MYI'.
myisampack поддерживает следующие опции:
-b, --backup
-#, --debug=debug_options
debug_options
часто принимает значение
d:t:o,filename
-f, --force
myisampack
создает временный файл
`tbl_name.TMD'. Если вы вручную прекратите выполнение myisampack
, может
оказаться так, что файл `tbl_name.TMD' не будет удален. Обычно если
myisampack
обнаруживает существующий `tbl_name.TMD', она прекращает работу и
выдает ошибку. При указании опции --force
myisampack
сжимает таблицу в
любом случае.
-?, --help
-j big_tbl_name, --join=big_tbl_name
big_tbl_name
. Все таблицы, подлежащие объединению, должны быть идентичными
(одинаковые имена и типы столбцов, одинаковые индексы и т.д.).
-p #, --packlength=#
myisampack
хранит все строки с
указателями длины размером в 1, 2, или 3 байта. В большинстве случаев
myisampack
способна определить правильное значение длины перед началом
сжатия файла, но во время сжатия она может обнаружить, что может быть
использована более короткая длина. В этом случае myisampack
выведет
сообщение о том, что в следующий раз при сжатии данного файла можно
использовать более короткую длину записи.)
-s, --silent
-t, --test
-T dir_name, --tmp_dir=dir_name
-v, --verbose
-V, --version
-w, --wait
mysqld
был вызван с опцией --skip-locking
, то не самая лучшая идея -
вызывать myisampack
, если таблица может модифицироваться во время процесса
сжатия.
Последовательность приведенных ниже команд иллюстрирует типичный сеанс сжатия таблицы:
shell> ls -l station.* -rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-02-02 3:06:43 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 Max datafile length: 54657023 Max keyfile length: 33554431 Recordlength: 834 Record format: Fixed length table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 1024 1024 1 2 32 30 multip. text 10240 1024 1 Field Start Length Type 1 1 1 2 2 4 3 6 4 4 10 1 5 11 20 6 31 1 7 32 30 8 62 35 9 97 35 10 132 35 11 167 4 12 171 16 13 187 35 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 87.14% shell> ls -l 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 -dvv station MyISAM 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 Datafilepointer (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(1) 2 9 3 6 4 no zeros, zerofill(1) 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(1) 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(1) 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(1) 2 9 28 369 4 no zeros, zerofill(1) 2 9 29 373 4 table-lookup 11 0 30 377 1 3 9 31 378 2 no zeros, zerofill(1) 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(1) 13 9 36 400 4 no zeros, zerofill(1) 2 9 37 404 1 2 9 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(1) 2 9
Ниже приведено описание вывода myisampack:
normal
empty-space
empty-zero
empty-fill
INTEGER
может быть изменен на
MEDIUMINT
).
pre-space
end-space
table-lookup
ENUM
.
zero
Original trees
After join
После сжатия таблицы myisamchk -dvv
выводит дополнительную информацию по
каждому полю:
Type
constant
no endspace
no endspace, not_always
no endspace, no empty
table-lookup
ENUM
.
zerofill(n)
no zeros
always zero
Huff tree
Bits
После запуска pack_isam
/myisampack
нужно запустить isamchk
/myisamchk
для
повторного создания индекса. В это время можно также отсортировать
индексные блоки и создать статистику, необходимую для более эффективной
работы оптимизатора MySQL:
myisamchk -rq --analyze --sort-index table_name.MYI isamchk -rq --analyze --sort-index table_name.ISM
После установки сжатой таблицы в директорию базы данных MySQL нужно
проделать операцию mysqladmin flush-tables
, чтобы сервер mysqld
начал
использовать новую таблицу.
Для распаковки сжатой таблицы можно использовать опцию --unpack
isamchk
или myisamchk
.
mysqld-max
, расширенный сервер mysqld
mysqld-max
- это сервер MySQL (mysqld
), скомпилированный со следующими
конфигурационными опциями:
Опция | Описание |
--with-server-suffix=-max | Добавляет суффикс к версии mysqld .
|
--with-innodb | Поддержка таблиц InnoDB. |
--with-bdb | Поддержка таблиц Беркли DB (BDB) |
CFLAGS=-DUSE_SYMDIR | Символические ссылки для Windows. |
Бинарную версию MySQL-max можно найти по адресу http://www.mysql.com/downloads/mysql-max-3.23.html.
Бинарные дистрибутивы Windows MySQL включают стандартный двоичный файл
mysqld.exe
а также двоичный файл mysqld-max.exe
.
http://www.mysql.com/downloads/mysql-3.23.html. See section 2.1.2 Установка MySQL на Windows.
Обратите внимание: поскольку таблицы InnoDB и Berkeley DB доступны не для всех платформ, некоторые из двоичных дистрибутивов могут не поддерживать оба этих типа таблиц. Проверить, какие типы таблиц поддерживаются, можно при помощи следующего запроса:
mysql> SHOW VARIABLES LIKE "have_%"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_bdb | YES | | have_innodb | NO | | have_isam | YES | | have_raid | NO | | have_openssl | NO | +---------------+-------+
Значения имеют следующий смысл:
Значение | Описание |
YES | Опция активизирована. |
NO | MySQL не поддерживает эту опцию. |
DISABLED | Опция xxxx заблокирована, потому что mysqld был запущен с параметром --skip-xxxx или потому, что mysqld был запущен не со всеми опциями, необходимыми для того, чтобы использование данной опции было возможным. В этом случае файл `hostname.err' будет содержать причину, по которой опция заблокирована.
|
Примечание: чтобы получить возможность создавать таблицы InnoDB, вы должны
отредактировать опции, включив по меньшей мере опцию
innodb_data_file_path
. See section 7.5.2 Параметры запуска InnoDB.
Чтобы улучшить производительность таблиц BDB, для них нужно также добавить некоторые конфигурационные опции. See section 7.6.3 Параметры запуска BDB.
safe_mysqld
будет автоматически пытаться запустить двоичный mysqld
с
суффиксом -max
. Таким образом можно просто осуществлять тестирование
свежесобранного бинарного mysqld
в существующей инсталляции. Для этого
нужно выполнить configure
с требуемыми опциями, собрать, и затем
установить новый mysqld
как mysqld-max
в тот же самый каталог, где
находится ``старый'' бинарный mysqld
. See section 4.7.2 safe_mysqld
, оболочка mysqld
.
mysqld-max
RPM использует вышеупомянутую возможность safe_mysqld
. Он
только устанавливает исполняемый mysqld-max
, и safe_mysqld
будет
автоматически использовать его после перезапуска safe_mysqld
.
В следующей таблице показаны типы таблиц, поддерживаемые двоичным
MySQL-Max
:
System | BDB | InnoDB
|
AIX 4.3 | Нет | Да |
HP-UX 11.0 | Нет | Да |
Linux-Alpha | Нет | Да |
Linux-Intel | Да | Да |
Linux-IA64 | Нет | Да |
Solaris-Intel | Нет | Да |
Solaris-SPARC | Да | Да |
Caldera (SCO) OSR5 | Да | Да |
UnixWare | Да | Да |
Windows/NT | Да | Да |
Все клиенты MySQL, которые взаимодействуют с сервером с помощью библиотеки
mysqlclient
, используют следующие переменные окружения:
Имя | Описание |
MYSQL_UNIX_PORT | Сокет, используемый по умолчанию для локальных подсоединений |
MYSQL_TCP_PORT | Устанавливаемый по умолчанию порт TCP/IP |
MYSQL_PWD | Устанавливаемый по умолчанию пароль |
MYSQL_DEBUG | Опции пошаговой отладки программ |
TMPDIR | Каталог для создания временных таблиц/файлов |
Использование MYSQL_PWD
небезопасно. See section 4.2.8 Соединение с сервером MySQL.
Клиент mysql использует файл, указанный в переменной окружения
MYSQL_HISTFILE
, для хранения истории командной строки. Значение по
умолчанию для этого файла истории - $HOME/.mysql_history
, где $HOME
-
значение переменной окружения HOME
. See section F Переменные окружения.
Все программы MySQL принимают множество различных опций. При этом каждая
программа MySQL поддерживает опцию --help
, которую можно использовать для
получения полного описания различных опций программы. Например, попробуйте
запустить mysql --help
.
Для всех стандартных клиентских программ можно переопределить значения опций по умолчанию, используя файл опций. See section 4.1.2 Файлы параметров `my.cnf'.
В приведенном ниже списке дано краткое описание программ MySQL:
myisamchk
myisamchk
имеет много функций, она описывается
в отдельной главе. See section 4 Администрирование баз данных.
make_binary_distribution
FTP
в директорию
`/pub/mysql/Incoming' на сайте http://support.mysql.com/, чтобы им могли
воспользоваться и другие пользователи MySQL.
msql2mysql
mysqlaccess
mysqladmin
mysqladmin
может также использоваться для получения
информации с сервера о номере версии, процессах и состоянии сервера. См.
раздел See section 4.8.3 mysqladmin
, Администрирование MySQL-сервера..
mysqlbug
mysqld
mysqldump
mysqldump
, Получение дампов данных и структуры таблицы.
mysqlimport
LOAD DATA INFILE
. See section 4.8.7 mysqlimport
, импорт данных из текстовых файлов.
mysqlshow
mysql_install_db
replace
msql2mysql
, но имеющая
также более широкое применение. Утилита replace
изменяет строки,
находящиеся в файлах или в стандартных входных данных. Использует принцип
конечного автомата, чтобы в первую очередь найти соответствие длинных
строк. Может применяться для замены строк. Например, эта команда меняет
местами a
и b
в данных файлах:
shell> replace a b b a -- file1 file2 ...
mysql
, Утилита командной строки
Утилита командной строки mysql
является простой SQL-оболочкой (с
возможностями библиотеки readline
проекта GNU). Она поддерживает
интерактивный и неинтерактивный режимы. В интерактивном режиме результаты
запроса представляются в ASCII-формате. При использовании в
неинтерактивном режиме (например, в качестве фильтра) результат
представляется в текстовом формате с символом табуляции в качестве
разделителя (выходной формат можно изменить при помощи параметров
командной строки). Сценарии можно запускать, как показано ниже:
shell> mysql database < script.sql > output.tab
Если возникают проблемы из-за недостатка памяти на данном клиенте,
применяйте параметр --quick
! Это заставит mysql
использовать функцию
mysql_use_result()
вместо функции mysql_store_result()
для получения
результирующей выборки данных.
Использовать mysql
очень легко. Запустите mysql database
или mysql
--user=user_name --password=your_password databas
e. Наберите SQL-команду
прямо в командной строке, завершив ее одним из символов: `;', `\g' или
`\G', и нажмите клавишу ``Ввод''.
Утилита командной строки mysql
поддерживает следующие параметры:
-?, --help
-A, --no-auto-rehash
rehash
следует использовать для
получения хеша таблиц и полей. Это обеспечивает более быстрый старт mysql
.
--prompt=...
-b, --no-beep
-B, --batch
--character-sets-dir=...
-C, --compress
-#, --debug[=...]
-D, --database=...
--default-character-set=...
-e, --execute=...
--batch
).
-E, --vertical
\G
.
-f, --force
-g, --no-named-commands
-g
, однако, длинные команды все еще
работают с первой строки.
-G, --enable-named-commands
-i, --ignore-space
-h, --host=...
-H, --html
-L, --skip-line-numbers
--no-pager
\
h
(интерактивная помощь).
--no-tee
\h
(интерактивная помощь).
-n, --unbuffered
-N, --skip-column-names
-O, --set-variable var=option
--help
.
-o, --one-database
--pager[=...]
PAGER
. Ее возможные значения - less, more, cat [> имя файла], и т.д. См.
также команду \h (интерактивная помощь). Этот параметр не работает в
пакетном (batch) режиме. Пейджер работает только под Unix.
-p[password], --password[=...]
-p
не оставляйте пробел между параметром и
значением пароля.
-P --port=...
-q, --quick
-r, --raw
--batch
.
-s, --silent
-S --socket=...
-t --table
-T, --debug-info
--tee=...
-u, --user=#
-U, --safe-updates[=#], --i-am-a-dummy[=#]
UPDATE
и DELETE
, используя ключи.
Более полная информация об этом параметре приведена ниже. Можно сбросить
данный параметр, установив в конфигурационном файле `my.cnf' значение
аргумента --safe-updates=0
.
-v, --verbose
-v -v -v
дает формат вывода
таблицы).
-V, --version
-w, --wait
Через параметры командной строки -O
или --set-variable
можно также
установить следующие переменные:
Имя переменной | По умолчанию | Описание |
connect_timeout | 0 | Число секунд до истечения времени ожидания соединения |
max_allowed_packet | 16777216 | Максимальная величина пакета, посылаемого/принимаемого с сервера |
net_buffer_length | 16384 | Размер буфера для TCP/IP и сокетного соединения |
select_limit | 1000 | Автоматическое ограничение количества команд SELECT при использовании --i-am-a-dummy |
max_join_size | 1000000 | Автоматическое ограничение количества связанных строк при использовании --i-am-a-dummy. |
Если ввести в командной строке help
, программа mysql
выведет список
поддерживаемых ею команд:
mysql> help Команды MySQL help (\h) Выводит данный текст. ? (\h) Синоним для help. clear (\c) Команда очистки. connect (\r) Снова подключиться к серверу. Дополнительные аргументы - db и host. edit (\e) Редактировать текущую команду с помощью $EDITOR. ego (\G) Послать текущую команду MySQL серверу и вывести результат по вертикали. exit (\q) Выйти из программы. То же что и quit. go (\g) Послать текущую команду MySQL серверу. nopager (\n) Блокировать пейджер, выводить через stdout. notee (\t) Не добавлять записи в выходной файл outfile. pager (\P) Установить PAGER [to_pager]. Выводить результаты запроса через PAGER. print (\p) Вывести текущую команду. prompt (\R) Изменить формат приглашения на ввод команд mysql. quit (\q) Выйти из программы. rehash (\#) Восстановить таблицу хэшей. source (\.) Запустить на выполнение файл с SQL-сценарием. Указать имя файла в качестве аргумента. status (\s) Получить информацию о статусе сервера. tee (\T) Установить параметр outfile [to_outfile]. Присоединить что-либо к данному выходному файлу. use (\u) Использовать другую базу данных. Указать имя базы данных в качестве аргумента.
Команда pager
работает только под Unix.
Команда status
дает информацию о текущем соединении и используемом
сервере. Если вы работаете в режиме --safe-updates
, команда status
также
выведет значения переменных для mysql
, которые влияют на ваши запросы.
Для начинающих рекомендуется пользоваться программой mysql
с установленным
параметром (введен в MySQL 3.23.11) --safe-updates
(или --i-am-a-dummy
для
пользователей, выполнивших DELETE FROM table_name
, но забывших указать
аргументы в WHERE
). В этом случае mysql
при установлении соединения
посылает следующую команду MySQL-серверу:
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#, SQL_MAX_JOIN_SIZE=#max_join_size#"
где #select_limit#
и #max_join_size#
- переменные, которые можно
установить из командной строки mysql. See section 5.5.6 Синтаксис команды SET
.
Результат этого следующий:
UPDATE
или DELETE
, если не указаны
ограничения по ключам в секции WHERE
. Однако можно заставить
выполняться команды UPDATE
/DELETE
, используя оператор LIMIT
:
UPDATE table_name SET not_key_column=# WHERE not_key_column=# LIMIT 1;
#select_limit#
.
SELECT
ы, которые могут потребовать для исполнения количество
комбинаций строк более, чем #max_join_size#
, будут прерваны.
Несколько полезных советов по использованию клиента mysql
:
Некоторые данные более удобочитаемы при выводе их по вертикали вместо обычно используемого горизонтального окна вывода. Например, текст, который больше по длине, чем по ширине, и содержит в себе много новых строк, часто намного легче читать в вертикальном представлении.
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 lIMIT 300,1\G *************************** 1. row *************************** msg_nro: 3068 date: 2000-03-01 23:29:50 time_zone: +0200 mail_from: Monty reply: monty@no.spam.com mail_to: "Thimble Smith" <tim@no.spam.com> sbj: UTF-8 txt: >>>>> "Thimble" == Thimble Smith writes: Thimble> Hi. I think this is a good idea. Is anyone familiar with UTF-8 Thimble> or Unicode? Otherwise, I'll put this on my TODO list and see what Thimble> happens. Yes, please do that. Regards, Monty file: inbox-jani-1 hash: 190402944 1 row in set (0.09 sec)
--tee=...
для mysql
или
интерактивно из командной строки вводом команды tee
. Все
представляемые на экране данные будут также добавлены к заданному
файлу. Это может быть очень полезно для целей отладки программы.
Утилиту tee можно блокировать из командной строки командой notee
.
Повторный запуск команды tee
снова включит журналирование. Если при
этом параметр для команды tee
не указан, то будет использоваться
предыдущий файл. Следует учесть, что команда tee
будет записывать
результаты в файл после каждой выполненной команды, как раз перед
появлением командной строки для ввода очередной команды.
--pager[=...]
стал возможным просмотр или поиск
результатов в интерактивном режиме с помощью Unix-программ less
, more
или иных подобных. Если явно не указать аргумент в этом параметре,
клиент mysql
будет искать переменную окружения PAGER
и установит
значение pager
. Программу pager
также можно запустить из интерактивной
командной строки командой pager
и остановить командой nopager
. Команда
может принимать аргумент, который является необязательным; pager
будет
установлена в значение этого аргумента.. Команда pager
может быть
вызвана и без аргумента, но это требует использования опции --pager
или соответствующей установки по умолчанию стандартного вывода stdout
.
Команда pager работает только в Unix, поскольку использует функцию
popen()
, отсутствующую в Windows. Вместо этого в Windows можно
использовать параметр tee
, хотя в ряде ситуаций это менее удобно, чем
применение команды pager
.
pager
: Ее можно использовать для
записи в файл:
mysql> pager cat > /tmp/log.txtи результаты будут направлены только в файл. Вызываемые командой pager программы могут принимать любые допустимые опции:
mysql> pager less -n -i -SОбратите особое внимание на опцию -S в вышеприведенном примере. Она может быть очень полезна при просмотре результатов. Попробуйте применить ее с горизонтальным выводом (завершайте команды символами '\g', or ';') и с вертикальным (в конце команд - '\G'). Очень громоздкие результаты вывода иногда трудно бывает прочесть с экрана, в этом случае команда less с опцией -S позволит просмотреть результаты в интерактивном режиме слева направо, при этом при появлении строк с длиной больше, чем ширина экрана, их вывод будет продолжен вывод с новой строки. Вывод данных в таких случаях получается более удобочитаемым. При интерактивном вызове команды less с опцией '-S' можно переключать режим ее работы (включено/выключено) из командной строки. Чтобы получить дополнительную информацию относительно less, обращайтесь к описанию команды 'h'.
mysql> pager cat | tee /dr1/tmp/res.txt | \ tee /dr2/tmp/res2.txt | less -n -i -S
tee
и
установив pager
в less
, можно просматривать результаты с помощью
Unix-команды less
и при этом одновременно производить запись в файл.
Разница между служебной Unix-утилитой tee
, используемой в программе
pager
, и встроенной в клиент mysql
командой tee
заключается в том, что
встроенная команда tee
работает даже в том случае, если в Unix утилита
tee
недоступна. Встроенная команда tee
также ведет запись всего, что
выводится на экран, тогда как утилита Unix tee
, используемая с pager
,
не делает этого в достаточном объеме. Последнее, но тем не менее
важное обстоятельство состоит в том, что интерактивная команда tee
более удобна для переключения режимов работы включено/выключено, если
при записи в файл иногда возникает необходимость отключить эту
функцию.
Можно изменить формат приглашения в командной строке клиента mysql
.
Возможны следующие опции приглашения:
Опция | Описание |
\v | версия mysqld |
\d | имя используемой базы данных |
\h | имя хоста, к которому производится подсоединение |
\p | номер порта, через который производится подсоединение |
\u | имя пользователя |
\U | полный адрес username@host |
\\ | обратный слэш `\' |
\n | символ новой строки |
\t | табуляция |
\ | пробел |
\_ | пробел с подчеркиванием |
\R | время по военному часовому поясу (0-23) |
\r | время по стандартному часовому поясу (1-12) |
\m | минуты |
\y | два разряда года |
\Y | четыре разряда года |
\D | полный формат даты |
\s | секунды |
\w | день недели в трехбуквенном формате (Mon, Tue, ...) |
\P | Время до полудня/после полудня (am/pm) |
\o | месяц в числовом формате |
\O | месяц в трехбуквенном формате (Jan, Feb, ...) |
\c | Счетчик, подсчитывающий количество вводимых команд |
Символ `\' за которым следует любая другая буква, просто дополняет эту букву.
Установить параметры приглашения можно следующими способами:
MYSQL_PS1
для строки приглашения.
Например:
shell> export MYSQL_PS1="(\u@\h) [\d]> "
mysql
. Например:
[mysql] prompt=(\u@\h) [\d]>\_
--prompt
из командной строки утилиты mysql
.
Например:
shell> mysql --prompt="(\u@\h) [\d]> " (user@host) [database]