Программное обеспечение 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 reload
и все сообщения об ошибках, которые выдаются при попытке соединения!
Во время проверки своих привилегий сначала необходимо выполнить
команду 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 TRANSACTION).
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 TABLE.
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 может создавать