Справочное руководство по MySQL версии 4.1.1-alpha

         

B.1 Интерфейсы (API)


Модули Perl

http://www.mysql.com/Downloads/Contrib/KAMXbase1.2.tar.gz

Преобразование между файлами `.dbf' и таблицами MySQL. Модуль Perl, написанный Пратапом Перейра (Pratap Pereira pereira@ee.eng.ohio-state.edu), расширен Кэвином А. МакГрэйлом (Kevin A. McGrail kmcgrail@digital1.peregrinehw.com). Этот преобразователь может обрабатывать поля MEMO.

http://www.mysql.com/Downloads/Contrib/HandySQL-1.1.tar.gz

HandySQL представляет собой модуль доступа к MySQL. Он предлагает интерфейс C, включенный в Perl, который приблизительно на 20% быстрее, чем обычный интерфейс DBI.

OLEDB

http://www.mysql.com/Downloads/Win32/MyOLEDB3.exe

Установочный пакет MyOLEDB 3.0 от SWSoft.

http://www.mysql.com/Downloads/Win32/mysql-oledb-3.0.0.zip

Исходный код для MyOLEDB 3.0.

http://www.mysql.com/Downloads/Win32/MySamples.zip

Примеры и документация для MyOLEDB.

http://www.mysql.com/Downloads/Win32/MyOLEDB.chm

Файлы помощи для MyOLEDB.

http://www.mysql.com/Downloads/Win32/libmyodbc.zip

Статическая библиотека MyODBC, используемая для создания MyOLEDB. Базируется на коде MyODBC.

C++



http://www.mysql.com/Downloads/Contrib/mysql-c++-0.02.tar.gz

Библиотека оболочки C++ для MySQL. Автор Роланд Хейнел (Roland Haenel, rh@ginster.net.)

http://www.mysql.com/Downloads/Contrib/MyDAO.tar.gz

C++ API для MySQL. Автор Сатих (Satish spitfire@pn3.vsnl.net.in.) Под влиянием C++ API Роланда Хейнела (Roland Haenel) и библиотеки MyC Эда Карпа (Ed Carp).

http://www.mysql.com/products/mysql++/

C++ API для MySQL (больше, чем просто библиотека оболочки). Первоначально автор kevina@clark.net. В настоящее время поддерживает Синиша (Sinisa) из MySQL AB.

http://nelsonjr.homepage.com/NJrAPI/

Независимая библиотека базы данных C++, поддерживающая MySQL.

Delphi

http://www.mysql.com/Downloads/Contrib/DelphiMySQL2.zip

Интерфейс Delphi к `libmysql.dll', автор bsilva@umesd.k12.or.us.

http://www.mysql.com/Downloads/Contrib/Udmysql.pas

Оболочка для `libmysql.dll' для использования в Delphi. Автор Рейнер Сомбровски (Reiner Sombrowsky).


http://www.fichtner.net/delphi/mysql.delphi.phtml

Интерфейс Delphi к MySQL с исходным кодом. Автор Матиас Фихтнер (Matthias Fichtner).

http://www.productivity.org/projects/tmysql/

TmySQL, библиотека для использования MySQL с Delphi.

https://sourceforge.net/projects/zeoslib/

Библиотека Zeos представляет собой совокупность исходных наборов данных и компонентов баз данных Delphi для MySql, PostgreSql, Interbase, MS SQL, Oracle, DB/2. А также включает средства разработки, такие, как Проводник базы данных (Database Explorer) и Конструктор базы данных (Database Designer).

http://www.mysql.com/Downloads/Contrib/Win32/SBMySQL50Share.exe

Испытательная версия Компонентов наборов данных MySQL для Delphi 5.

http://www.mysql.com/Downloads/Contrib/mysql-ruby-2.2.0.tar.gz

Модуль MySQL Ruby. Автор Томита Масахиро (TOMITA Masahiro tommy@tmtm.org) Ruby представляет собой объектно-ориентированный язык интерпретатора (http://www.netlab.co.jp/ruby/).

http://www.mysql.com/Downloads/Contrib/JdmMysqlDriver-0.1.0.tar.gz

Драйвер VisualWorks 3.0 Smalltalk для MySQL. Автор joshmiller@earthlink.net.

http://www.mysql.com/Downloads/Contrib/Db.py

Модуль Python с кэшированием. Автор gandalf@rosmail.com.

http://www.mysql.com/Downloads/Contrib/MySQLmodule-1.4.tar.gz

Интерфейс Python для MySQL. Автор Джозеф Скиннер (Joseph Skinner joe@earthlight.co.nz). Модифицировал Жорж Сенекович (Joerg Senekowitsch senekow@ibm.net).

http://www.mysql.com/Downloads/Contrib/MySQL-python-0.3.0.tar.gz

MySQLdb Python представляет собой совместимый с DB-API v2.0 интерфейс к MySQL. Транзакции поддерживаются, если сервер и таблицы поддерживают их. Он поддерживает потоки и содержит модуль совместимости с более старым кодом, написанным для более не поддерживаемого интерфейса MySQLmodule.

http://www.mysql.com/Downloads/Contrib/mysql_mex_12.tar.gz

Интерфейс для программы Matlab разработки MathWorks. Авторы этого интерфейса - Киммо Уутела (Kimmo Uutela) и Джон Фишер (John Fisher) (не Mathworks). Ознакомьтесь с http://boojum.hut.fi/~kuutela/mysqlmex.html для более полной информации.



http://www.mysql.com/Downloads/Contrib/mysqltcl-1.53.tar.gz

Интерфейс Tcl для MySQL. Базируется на `msqltcl-1.50.tar.gz'. Обновлен Тобиашем Ритцау (Tobias Ritzau, tobri@ida.liu.se). Для версии 2.0 и большее подробной информации см. http://www.xdobry.de/mysqltcl/

http://www.mysql.com/Downloads/Contrib/MyC-0.1.tar.gz

Интерфейс, подобный Visual Basic, автор Эд Карп (Ed Carp).

http://www.mysql.com/Downloads/Contrib/Vdb-dflts-2.1.tar.gz

Является новой версией набора библиотеки инструментальных программ, предназначенного для предоставления общего интерфейса для процессоров баз данных SQL, так что ваше приложение становится трех-уровневым. Преимуществом этого является то, что вы легко сможете переключаться и переходить к другим процессорам баз данных, реализуя только один файл для новой базы данных без выполнения каких-либо изменений в самом приложении. Автор damian@cablenet.net.

http://www.mysql.com/Downloads/Contrib/DbFramework-1.10.tar.gz

DbFramework представляет собой коллекцию классов для работы с базами данных MySQL. Эти классы в некоторой степени базируются на CDIF Data Model Subject Area. Автор Пол Шарп (Paul Sharpe paul@miraclefish.com).

http://www.mysql.com/Downloads/Contrib/pike-mysql-1.4.tar.gz

Модуль MySQL для pike. Для использования с веб-сервером Roxen.

http://www.mysql.com/Downloads/Contrib/squile.tar.gz

Модуль для guile, позволяющий guile взаимодействовать с базами данных SQL. Автор Хол Робертс (Hal Roberts).

http://www.mysql.com/Downloads/Contrib/stk-mysql.tar.gz

Интерфейс для Stk. Stk представляет собой элементы Tk со схемой внизу (Scheme underneath) вместо Tcl. Автор Терри Джоунс (Terry Jones).

http://www.mysql.com/Downloads/Contrib/eiffel-wrapper-1.0.tar.gz

Оболочка Eiffel Майкла Рэвитса (Michael Ravits).

http://www.mysql.com/Downloads/Contrib/SQLmy0.06.tgz

Главный сменный драйвер баз данных (FlagShip RDD) для MySQL. Автор Алехандро Фернандез Херреро (Alejandro Fernandez Herrero). Домашняя страница Flagship RDD находится на http://www.fship.com/rdds.html.



http://www.mysql.com/Downloads/Contrib/mydsn-1.0.zip

Двоичный и исходный коды для `mydsn.dll'. mydsn необходимо использовать для создания и удаления реестрового файла DSN для драйвера MyODBC в приложениях Coldfusion. Автор Мигуэл Ангел Солорцано (Miguel Angel SolСrzano).

http://www.mysql.com/Downloads/Contrib/MySQL-ADA95_API.zip

Интерфейс ADA95 к MySQL API. Автор Франсуа Фабиен (Francois Fabien).

http://www.mysql.com/Downloads/Contrib/MyTool-DLL_for_VB_and_MySQL.zip

DLL для Visual Basic и MySQL C API. Автор Кен Мензел (Ken Menzel kenm@icarz.com).

http://www.mysql.com/Downloads/Contrib/MYSQLX.EXE

Объект ActiveX для MySQL для прямого доступа к серверам MySQL из IIS/ASP, VB, VC++ в обход более медленных методов ODBC. Полностью обновляемый, многопоточный с полной поддержкой для всех типов полей MySQL (версия 2001.1.1). Разработка SciBit http://www.scibit.com/.

http://www.fastflow.it/mylua/

Домашняя страница MyLUA; как использовать язык LUA для написания MySQL PROCEDURE, которые могут загружаться во время выполнения.



http://www.mysql.com/Downloads/Contrib/lua-4.0.tar.gz

LUA 4.0 http://www.mysql.com/Downloads/Contrib/mylua-3.23.32.1.tar.gz

Патч для MySQL 3.23.32 для использования LUA 4.0. Автор Кристиан Гуиссани (Cristian Giussani).

http://www.mysql.com/Downloads/Contrib/patched_myodbc.zip

Патч (для поддержки Omniform 4.0) к драйверу MyODBC. Автор Томас Тейил (Thomas Thaele tthaele@papenmeier.de)


B.2 Конверторы


http://www.mysql.com/Downloads/Contrib/mssql2mysql.txt

Преобразователь из MS-SQL в MySQL. Автор Майкл Кофлер (Michael Kofler). Программа mssql2mysql находится на веб-странице http://www.kofler.cc/mysql/mssql2mysql.html.

http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.14.tar.gz

Преобразователь между файлами `.dbf' и таблицами MySQL. Авторы Маартен Боукхолд (Maarten Boekhold boekhold@cindy.et.tudelft.nl), Вильям Волкман (William Volkman), и Майкл Видениус (Michael Widenius). Этот преобразователь включает в себя элементарную поддержку для полей MEMO (только чтение).

http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.13.tgz

Преобразователь между файлами `.dbf' и таблицами MySQL. Авторы Маартен Боукхолд (Maarten Boekhold, boekhold@cindy.et.tudelft.nl), и Майкл Видениус (Michael Widenius). Этот преобразователь не может обрабатывать поля MEMO.

http://www.mysql.com/Downloads/Contrib/dbf2mysql.zip

Преобразователь между файлами FoxPro `.dbf' и таблицами MySQL под Windows. Автор Александр Ельцин (Alexander Eltsyn, ae@nica.ru или ae@usa.net).

http://www.mysql.com/Downloads/Contrib/dbf2sql.zip

Краткая и простая программа, которая может помочь перенести данные из таблицы FoxPro в таблицу MySQL. Автор Данко Джосик (Danko Josic).

http://www.mysql.com/Downloads/Contrib/dump2h-1.20.gz

Преобразует данные из вывода mysqldump в заголовочный файл C. Автор Гарри Брукнер (Harry Brueckner, brueckner@mail.respublica.de).

http://www.mysql.com/Downloads/Contrib/exportsql.txt

Скрипт, похожий на `access_to_mysql.txt', за исключением того, что предлагаемый скрипт является полностью конфигурируемым, имеет лучший тип преобразования (включая определение полей TIMESTAMP), снабжает предупреждениями и предложениями при преобразовании, заключает в кавычки все специальные символы в тексте и двоичные данные и так далее. Скрипт будет также преобразовывать данные для mSQL v1 и v2 и является бесплатным для всех. Самые последние версии смотрите на http://www.cynergi.net/exportsql/. Автор Педро Фрейре (By Pedro Freire, support@cynergi.net). Замечание: Не работает с Access2!


http://www.mysql.com/Downloads/Contrib/access_to_mysql.txt

Вставьте эту функцию в модуль Access базы данных, имеющей таблицы, которые вы хотите экспортировать. Смотрите также exportsql. Автор Брайен Эндрюс (Brian Andrews). Замечание: Не работает с Access2!

http://www.mysql.com/Downloads/Contrib/importsql.txt

Скрипт, точно выполняющий в обратном порядке действия скрипта exportsql.txt. То есть, скрипт импортирует данные из MySQL в базу данных Access через ODBC. Это очень удобно в комбинации с exportsql, так как позволяет использовать Access для всего проектирования и администрирования баз данных и синхронизировать с вашим реальным сервером MySQL любым способом. Скрипт бесплатный. Обновления смотрите на http://www.netdive.com/freebies/importsql/. Создан Лораном Босавитом (Laurent Bossavit) из NetDIVE. Замечание: Не работает с Access2!

http://www.mysql.com/Downloads/Contrib/mdb2sql.bas

Преобразователь из Access97 в MySQL, автор Моше Гурвич (Moshe Gurvich).

http://www.mysql.com/Downloads/Contrib/msql2mysqlWrapper-1.0.tgz

Оболочка C из mSQL в MySQL. Автор alfred@sb.net

http://www.mysql.com/Downloads/Contrib/sqlconv.pl

Простой скрипт, который можно использовать для копирования полей из одной таблицы MySQL в другую без упорядочивания. По существу, вы можете запустить mysqldump и подать его выход к скрипту sqlconv.pl. Данный скрипт будет анализировать вывод mysqldump и переделывать поля таким образом, чтобы они могли быть вставлены в новую таблицу. Примером является случай, когда вы хотите создать новую таблицу в другом месте, где вы сейчас работаете, но эта таблица просто немного другая (то есть - поля в другом порядке и так далее). Автор Стив Шрив (Steve Shreeve).

http://www.mysql.com/Downloads/Contrib/oracledump

Программа на Perl для преобразования баз данных Oracle в MySQL. Имеет тот же формат вывода, что и mysqldump. Автор Джохан Андерссон (Johan Andersson).

http://www.mysql.com/Downloads/Contrib/excel2mysql

Программа на Perl для импорта динамических электронных таблиц Excel в базу данных MySQL. Автор Стивен Хард (Stephen Hurd shurd@sk.sympatico.ca)

http://www.mysql.com/Downloads/Contrib/T2S_100.ZIP.

Программа для Windows для преобразования текстовых файлов в базы данных MySQL. Автор Асаф Азулай (Asaf Azulay).


B.3 Утилиты


http://worldcommunity.com/opensource/utilities/mysql_backup.html

MySQL Backup представляет собой создающий резервную копию скрипт для MySQL. Автор Питер Браун (Peter F. Brown).

http://www.mysql.com/Downloads/Contrib/mysql_watchdog.pl

Контроль демона MySQL при возможных зависаниях. Автор Йермо Леймерс (Yermo Lamers, yml@yml.com).

http://www.mysql.com/Downloads/Contrib/mysql_structure_dumper.tar.gz

http://www.mysql.com/Downloads/Contrib/mysql_structure_dumper.tgz

Распечатывает структуру каждой таблицы в базе данных. Автор Томас Вэйна (Thomas Wana).

http://www.mysql.com/Downloads/Contrib/mysqlsync.

Скрипт на Perl для поддержания удаленных копий базы данных MySQL в синхронном состоянии с главной ведущей копией. Автор Марк Джефтовик (Mark Jeftovic. markjr@easydns.com).

http://www.mysql.com/Downloads/Contrib/MySQLTutor-0.2.tar.gz.

MySQLTutor. Учебное пособие по MySQL для начинающих.

http://www.mysql.com/Downloads/Contrib/MySQLDB.zip

http://www.mysql.com/Downloads/Contrib/MySQLDB-readme.html.

Библиотека COM для MySQL. Автор Эйлок Сингх (Alok Singh).

http://www.mysql.com/Downloads/Contrib/mysql_replicate.pl

Программа на Perl, управляющая копированием. Разработка elble@icculus.nsg.nwu.edu

http://www.mysql.com/Downloads/Contrib/DBIx-TextIndex-0.02.tar.gz

Скрипт на Perl, использующий обратную индексацию для обработки текстового поиска. Автор Дэниэл Кох (Daniel Koch).

http://www.mysql.com/Downloads/Contrib/dbcheck

Скрипт на Perl, создающий резервную копию таблиц перед запуском на них isamchk. Автор Элизабет (Elizabeth).

http://www.mysql.com/Downloads/Contrib/mybackup.

http://www.mswanson.com/mybackup (домашняя страница mybackup)

Оболочка для mysqldump для создания резервных копий всех баз данных. Автор Марк Свенсон (Marc Swanson).

http://www.mysql.com/Downloads/Contrib/mdu.pl.gz

Распечатывает использование памяти базой данных MySQL.



C.1 Разработчики MySQL AB


Здесь представлен список разработчиков, занимающихся в настоящее разработкой программного обеспечения сервера баз данных MySQL в компании MySQL AB или занимавшихся этой разработкой ранее, приблизительно в том порядке, в котором они начинали работать с нами. После личных данных каждого разработчика следует небольшой список задач, за которые он отвечал, или выполненных им работ. Все разработчеки вовлечены в техническую поддержку.

Майкл (Монти) Видениус (Michael (Monty) Widenius)

Главный программист и главный автор MySQL сервера (mysqld).

Новые функции для строковой библиотеки.

Большая часть библиотеки mysys.

Библиотеки ISAM и MyISAM (обработчики индексного файла B-tree с уплотнением индексов и различными форматами записи).

Библиотека HEAP. Система таблиц памяти с разработанным нами превосходным полностью динамическим хешированием. В эксплуатации находится с 1981 года; опубликована приблизительно в 1984 году.

Программа replace (гляньте на нее, это КРУТО!).

MyODBC, драйвер ODBC для Windows95.

Устранение ошибок в потоках MIT-pthreads для обеспечения их работы в сервере MySQL. А также Unireg, прикладная среда с интерфейсом Curses со многими полезными утилитами.

Осуществил перенос из mSQL таких средств, как msqlperl, DBD/DBI и DB2mysql.

Большинство тестов crash-me и организация эталонных тестов для MySQL.

Дэвид Эксмарк (David Axmark)

Первый основной автор справочного руководства, включая модернизацию texi2html.

Автоматический веб-сайт, обновляющийся из данного руководства.

Первоначальная поддержка Autoconf, Automake и Libtool.

Лицензирование.

Участие в написании всех текстовых файлов (из них в настоящее время остался только файл `README': остальные вошли в состав руководства).

Большой объем работы по тестированию новых возможностей.

Наш домашний юрист по программному обеспечению с открытым кодом (Free Software).

Ответственный за поддержку списка рассылки (у которого никогда нет времени делать это как следует...).

Автор нашего оригинального кода, обеспечивающего переносимость (которому сейчас более 10 лет). В настоящее время от mysys остались только некоторые части.


А также человек, которому Монти всегда может позвонить среди ночи, когда только что заработало новое программное средство.

Старший специалист по открытому коду (связь с общественностью MySQL).

Яни Толонен (Jani Tolonen)





mysqlimport



Большое количество расширений для клиентов командной строки.

PROCEDURE ANALYSE()

Синиша Миливоевич (Sinisa Milivojevic)





Компрессия (с помощью zlib) в протоколе клиент-сервер.

Превосходное хеширование для фазы лексического анализатора.

Многострочная команда INSERT



Опция mysqldump -e

LOAD DATA LOCAL INFILE

Опция SQL_CALC_FOUND_ROWS для SELECT



Опция --max-user-connections=...

net_read и net_write_timeout



GRANT/REVOKE и SHOW GRANTS FOR

Новый клиент-серверный протокол для версии 4.0

UNION в 4.0.

Многотабличные команды DELETE/UPDATE



Вторичные таблицы в 4.1.

Управление пользовательскими ресурсами.

Первый автор MySQL++ C API и клиента MySQLGUI.

Тону Сэмюэл (Tonu Samuel) (разработчик в прошлом)





Интерфейс VIO (основы клиент-серверного протокола с шифрованием).

MySQL Filesystem (технология использования баз данных MySQL как файловой системы).

Выражение CASE.

Функции MD5() и COALESCE().

Поддержка RAID для таблиц MyISAM.

Саша Пачев (Sasha Pachev)





Начальная реализация репликации (до версии 4.0).

SHOW CREATE TABLE.

mysql-bench

Мэт Вагнер (Matt Wagner)





Набор тестов для MySQL

Веб-мастер (до 2002).

Координатор разработки.

Мигуэл Солорцано (Miguel Solorzano)





Разработка Win32 и выпуск бинарных версий.

Код сервера под Windows NT.

WinMySQLAdmin.

Тимоти Смит (Timothy Smith) (разработчик в прошлом)





Поддержка динамических символов (dynamic character).

configure, пакеты RPM и другие части сборочной системы.

Начальный разработчик libmysqld, встраиваемого сервера.

Сергей Голубчик (Sergei Golubchik)





Полнотекстовый поиск.

Добавление ключей к библиотеке MERGE.

Джереми Коул (Jeremy Cole)





Чтение корректуры и редактирование этого замечательного руководства на английском языке.

ALTER TABLE ... ORDER BY ....



UPDATE ... ORDER BY ....

DELETE ... ORDER BY ....

Индрек Сиитан (Indrek Siitan)





Разработка/программирование веб-интерфейса.

Автор нашей системы управления списком рассылки.

Джордж дел Конде (Jorge del Conde)





Центр Управления MySQL MyCC (MySQL Control Center).

Разработка Win32

Начальная реализация веб-портала.

Вену Аннуганти (Venu Anuganti)





MyODBC 3.51

Новый клиент/серверный протокол для 4.1 (для подготовленных выражений).

Арйен Ленц (Arjen Lentz)





Поддерживает справочное руководство по MySQL.

Подготовка печатного издания справочного руководства в издательстве O'Reilly.

Александр Барков (Alexander (Bar) Barkov), Алексей Бочков (Alexey (Holyfoot)

Botchkov), и Рамиль Калимуллин (Ramil Kalimullin)





Пространственные данные (GIS) и реализация R-Деревьев в 4.1

Unicode и набор символов в 4.1

Александр Белкин (Oleksandr (Sanja) Byelkin)





Кэш запросов в 4.0

Реализация вложенных запросов (4.1).

Алексей Кишкин (Aleksey (Walrus) Kishkin) и Алексей Строганов (Alexey (Ranger) Stroganov)





Разработка тестов скорости работы и анализ.

Поддержка набора тестов для MySQL.

Зэк Гринт (Zak Greant)





Адвокат по открытому коду, связь MySQL с общественностью.

Карстен Педерсен (Carsten Pedersen)





Сертификационная программа MySQL.

Ленц Гриммер (Lenz Grimmer)





Технология производства (сборка и выпуск).

Петр Зайцев (Peter Zaitsev)





SHA1(), AES_ENCRYPT() и AES_DECRYPT() функции.

Отладка, чистка различных возможностей.

Александр Керемидарский (Alexander (Salle) Keremidarski)





Документирование существующего кода и алгоритмов в MySQL.

Отладка.

Пер-Эрик Мартин (Per-Erik Martin)





Главный разработчик хранимых процедур и триггеров.

Джим Уинстед (Jim Winstead)





Главный веб-разработчик.

Марк Мэтьюз (Mark Matthews)





Драйвер Connector/J (Java).


C.2 Наши помощники, которые сделали вклад в развитие MySQL


В то время как MySQL AB обладает всеми авторскими правами на сервер MySQL и документацию по MySQL, мы хотим отдать дань уважения тем, кто в той или иной степени лично способствовал разработке MySQL. Ниже в произвольном порядке перечислены наши помощники, которые сделали вклад в развитие в MySQL:

Пол Дюбуа (Paul DuBois)

В настоящее время помощь в приведении данного справочного руководства (Reference Manual) к корректному и понятному виду. Другими словами, перевод текстов Монти и Дэвида с их собственного английского на английский, понятный другим людям.

Джанмассимо Вигаццола (Gianmassimo Vigazzola) qwerg@mbox.vol.it или

qwerg@tin.it Первоначальный перенос на Win32/NT.

Ким Олдэйл (Kim Aldale)

Помог переписать самые первые тексты Монти и Дэвида с их собственного английского на нормальный английский.

Пер Эрик Олссон (Per Eric Olsson)

Благодарность за более или менее конструктивную критику и первоклассное тестирование формата динамической записи.

Ирэна Панциров (Irena Pancirov) irena@mail.yacc.it

Перенос Win32 с помощью компилятора Borland. mysqlshutdown.exe и mysqlwatch.exe

Дэвид Дж. Хьюз (David J. Hughes)

Благодарность за вклад в создание SQL-базы данных, распространяемой по принципу shareware. Начав свою работу в компании TcX (предшественник MySQL AB) с mSQL, мы, однако, пришли к выводу, что эта база данных не удовлетворяет нашим требованиям. Поэтому вместо нее был написан интерфейс SQL к нашему компоновщику приложений Unireg. На программу mysqladmin и клиент mysql оказали значительное влияние их двойники в mSQL. Мы приложили много усилий, чтобы сделать синтаксис MySQL расширенным вариантом mSQL. Многие идеи API были заимствованы из mSQL, чтобы упростить перенос свободно распространяемых программ mSQL в MySQL API. Программное обеспечение MySQL не содержит никакого кода из mSQL. Два файла в дистрибутиве (`client/insert_test.c' и `client/select_test.c') базируются на соответствующих (не защищенных авторскими правами) файлах дистрибутива mSQL, но они модифицированы в примеры, показывающие, какие изменения необходимы для преобразования кода из mSQL в сервер MySQL. (авторское право на mSQL принадлежит Дэвиду Дж. Хьюзу (David J. Hughes.))


Фред Фиш (Fred Fish)

Благодарность за его великолепную отладку C и библиотеку трассировки. Монти сделал ряд небольших улучшений к этой библиотеке (скорость и другие возможности).

Ричард А. О'Кифи (Richard A. O'Keefe)

Благодарность за его общедоступную строковую библиотеку.

Генри Спенсер (Henry Spencer)

Благодарность за его библиотеку регулярных выражений, использованную в WHERE column REGEXP regexp.

Ассоциация Свободного ПО (Free Software Foundation)

От этой ассоциации мы получили прекрасный компилятор (gcc), библиотеку libc (из которой заимствовали `strto.c' для того, чтобы получить код, работающий под Linux) и библиотеку readline (для клиента mysql).

Ассоциация Свободного ПО (Free Software Foundation) и команда

разработчиков Xemacs (The XEmacs development team) Благодарность за действительно великолепный редактор/среду, который использовали практически все в MySQL AB/TcX/detron.

Патрик Линч (Patrick Lynch)

Благодарность за помощь в получении http://www.mysql.com/.

Фред Линдберг (Fred Lindberg)

Благодарность за установку qmail для управления списком рассылки MySQL и за неоценимую помощь, которую мы получили в управлении списком рассылки MySQL.

Игорь Романенко (Igor Romanenko) igor@frog.kiev.ua

mysqldump (ранее msqldump, Монти осуществил перенос этой утилиты и усовершенствовал ее).

Юрий Дарио (Yuri Dario)

Благодарность за поддержку и расширение переноса MySQL на OS/2.

Тим Банке (Tim Bunce, Alligator Descartes)

Благодарность за интерфейс DBD (Perl).

Тим Банке (Tim Bunce)

Автор mysqlhotcopy.

Эндриас Коуниг (Andreas Koenig) a.koenig@mind.de

Благодарность за интерфейс Perl для сервера MySQL.

Юджин Чан (Eugene Chan) eugene@acenet.com.sg

Благодарность за перенос PHP для сервера MySQL.

Майкл Дж. Миллер мл. (Michael J. Miller Jr.) mke@terrapin.turbolift.com

Благодарность за первое руководство по MySQL. И за большое количество орфографических и грамматических правок в разделе FAQ (который уже давно превратился в руководство по MySQL).

Ян Кайлин (Yan Cailin)



Первый перевод справочного руководства по MySQL на упрощенный китайский язык в начале 2000 года; на этом руководстве базировались версии, кодированные на Big5 и HK (http://mysql.hitstar.com/). Персональная домашняя страничка на linuxdb.yeah.net.

Джованни Маруцелли (Giovanni Maruzzelli) maruzz@matrice.it

Благодарность за перенос iODBC (Unix ODBC).

Крис Провензано (Chris Provenzano)

Переносимые потоки pthreads пользовательского уровня. Выдержка из документа по авторским правам на MySQL: "Этот продукт включает в себя программное обеспечение, разработанное Крисом Провензано, Калифорнийский университет, Беркли (Chris Provenzano, the University of California, Berkeley) и его помощниками". В настоящее время мы используем версию 1_60_beta6 с патчами Монти (см. `mit-pthreads/Changes-mysql').

Ксавьер Лерой (Xavier Leroy) Xavier.Leroy@inria.fr

Автор LinuxThreads (используемых сервером MySQL под Linux).

Зарко Мокник (Zarko Mocnik) zarko.mocnik@dem.si

Упорядочение для словенского языка и разработка модуля `cset.tar.gz', который облегчает добавление других кодировок.

"ТАМИТО" ("TAMITO") tommy@valley.ne.jp

Макрос кодировки _MB и наборы символов ujis и sjis.

Джошуа Чамас (Joshua Chamas) joshua@chamas.com

Основы для параллельной вставки, расширенный синтаксис даты, отладка под NT и ответы по списку рассылки MySQL.

Ив Карлиер (Yves Carlier) Yves.Carlier@rug.ac.be

mysqlaccess, программа, показывающая права доступа для пользователя.

Рис Джонс (Rhys Jones) rhys@wales.com (И GWE Technologies Limited)

Благодарность за JDBC, модуль для извлечения данных из базы данных MySQL при помощи помощью Java-клиента.

Др. Ксайэокун Келвин ZHU (Dr Xiaokun Kelvin ZHU) X.Zhu@brad.ac.uk

Дальнейшая разработка JDBC-драйвера и других относящихся к MySQL Java-программ.

Джеймс Купер (James Cooper) pixel@organic.com

Благодарность за установку архива списка рассылки с возможностью поиска на его сайте.

Рик Мехелик (Rick Mehalick) Rick_Mehalick@i-o.com

Благодарность за xmysql, графический X-клиент для сервера MySQL.



Дуг Сиск (Doug Sisk) sisk@wix.com

Благодарность за разработку пакетов RPM для MySQL под RedHat Linux.

Дайменд Александер В. (Diemand Alexander V.) axeld@vial.ethz.ch

Благодарность за разработку пакетов RPM для MySQL под RedHat Linux-Alpha.

Энтони Пеймес Олив (Antoni Pamies Olive) toni@readysoft.es

Благодарность за разработку пакетов RPM многих клиентов MySQL для Intel и SPARC.

Джей Бладвортс (Jay Bloodworth) jay@pathways.sde.state.sc.us

Благодарность за разработку пакетов RPM для версии MySQL 3.21.

Джошен Видманн (Jochen Wiedmann) wiedmann@neckar-alb.de

Благодарность за поддержку модуля Perl DBD::mysql.

Терьен Джилберт (Therrien Gilbert) gilbert@ican.net, Джин - Марк Поуйот

(Jean-Marc Pouyot) jmp@scalaire.fr Сообщения об ошибках на французском языке.

Петр Снайдр (Petr snajdr), snajdr@pvt.net

Сообщения об ошибках на чешском языке.

Ярослав Левандовски (Jaroslaw Lewandowski) jotel@itnet.com.pl

Сообщения об ошибках на польском языке.

Мигель Эйнджел Фернандес Роиз (Miguel Angel Fernandez Roiz)

Сообщения об ошибках на испанском языке.

Рой - Магн Моу (Roy-Magne Mo) rmo@www.hivolda.no

Сообщения об ошибках на норвежском языке и тестирование версии 3.21.#.

Тимур И. Бакеев (Timur I. Bakeyev) root@timur.tatarstan.ru

Сообщения об ошибках на русском языке.

brenno@dewinter.com и Филиппо Грасилли (& Filippo Grassilli)

phil@hyppo.com Сообщения об ошибках на итальянском языке.

Дирк Мюнцингер (Dirk Munzinger) dirk@trinity.saar.de

Сообщения об ошибках на немецком языке.

Биллик Стефан (Billik Stefan) billik@sun.uniag.sk

Сообщения об ошибках на словацком языке.

Стефан Сарою (Stefan Saroiu) tzoompy@cs.washington.edu

Сообщения об ошибках на румынском языке.

Петер Фехер (Peter Feher)

Сообщения об ошибках на венгерском языке.

Роберто М. Серкуейра (Roberto M. Serqueira)

Сообщения об ошибках на португальском языке.

Карстен Х. Педерсен (Carsten H. Pedersen)

Сообщения об ошибках на датском языке.

Арйен Дж. Ленц (Arjen G. Lentz)

Сооббщения об ошибках на немецком языке, завершение ранее начатого перевода.



Дэвид Сеседоут (David Sacerdote) davids@secnet.com

Идеи по проверке безопасности DNS-имен хостов.

Вэй-Джу Чен (Wei-Jou Chen) jou@nematic.ieo.nctu.edu.tw

Поддержка китайских символов (BIG5).

Вэй Хи (Wei He) hewei@mail.ied.ac.cn

Большое количество функциональных возможностей для китайской (GBK) кодировки.

Зеев Зураски (Zeev Suraski) bourbon@netvision.net.il

Форматирование значений времени в FROM_UNIXTIME(), функции ENCRYPT(); кроме того, он является консультантом по bison. Активный член списка рассылки.

Лук де Боуер (Luuk de Boer) luuk@wxs.nl

Перенос (и расширение) набора тестов производительности для DBI/DBD. Оказал большую помощь по тестам crash-me и тестам производительности. Некоторые новые функции даты. Скрипт mysql_setpermissions.

Джей Флагерти (Jay Flaherty) fty@mediapulse.com

Большая часть раздела DBI/DBD в этом руководстве.

Пол Саузвортс (Paul Southworth) pauls@etext.org, Рэй Лоуйзага (Ray

Loyzaga) yar@cs.su.oz.au Корректура данного справочного руководства на английском языке.

Алексей Михайлов (Alexis Mikhailov) root@medinf.chuvashia.su

Определяемые пользователем функции (UDF); функции CREATE и DROP.

Андреас Бобак (Andreas F. Bobak) bobak@relog.ch

Расширение AGGREGATE к функциям UDF.

Росс Уэйклин (Ross Wakelin) R.Wakelin@march.co.uk

Помощь в установке InstallShield для MySQL-Win32.

Джетро Райт III (Jethro Wright III) jetman@li.net

Библиотека `libmysql.dll'.

Джеймс Перейра (James Pereria) jpereira@iafrica.com

Mysqlmanager, Win32 GUI-программа для администрирования сервера MySQL.

Курт Сэмпсон (Curt Sampson) cjs@portal.ca

Перенос потоков MIT-pthreads на NetBSD/Alpha и NetBSD 1.3/i386.

Энтони Т. Куртис (Antony T. Curtis) antony.curtis@olcs.net

Перенос программного обеспечения базы данных MySQL на OS/2.

Мартин Рамш (Martin Ramsch) m.ramsch@computer.org

Примеры в учебнике MySQL.

Стив Харвей (Steve Harvey)

Благодарность за более безопасное выполнение mysqlaccess.

Конарк IA-64, Центр устойчивых систем, частная компания с ограниченной



ответственностью (Konark IA- 64 Centre of Persistent Systems Private Limited) http://www.pspl.co.in/konark/. Помощь в переносе сервера MySQL на Win64.

Алберт Чин-Эй-Янг (Albert Chin-A-Young).

Конфигурирование обновлений для Tru64, поддержка больших файлов и улучшенная поддержка оболочек TCP.

Джон Бирел (John Birrell)

Эмуляция pthread_mutex() для OS/2.

Бенджамин Пфлюгманн (Benjamin Pflugmann)

Расширение таблиц MERGE для обработки запросов INSERT. Активный член списков рассылки MySQL.

Гильем Бишо (Guilhem Bichot)

Исправление трактовки показателя степени для DECIMAL. Автор mysql_tableinfo.

Джоселин Фурнье (Jocelyn Fournier)

Отличное исследование и описание бесчисленного количества ошибок (особенно в коде вложенных запросов в MySQL 4.1)

Джордж Ричтер (Georg Richter)

Тестирование и выявление ошибок в MySQL 4.1 Новое PHP 5.0 расширение mysqli (API) для использования с MySQL 4.1 и выше.

Марк Лиянаж (Marc Liyanage)

Поддерживает пакеты для Mac OS X и дает бесценную информацию о том, как создавать PKG для Mac OS X.

Другие помощники, те, кто нашел ошибки, и тестировщики: Джеймс Х. Томпсон (James H. Thompson), Морицио Менгини (Maurizio Menghini), Войцех Трик (Wojciech Tryc), Лука Берра (Luca Berra), Зарко Мокник (Zarko Mocnik), Уим Бонис (Wim Bonis), Элмар Хейнке (Elmar Haneke), jehamby@lightside, psmith@BayNetworks.com, duane@connect.com.au, Тед Депнер (Ted Deppner) ted@psyber.com, Майк Саймонс (Mike Simons), Джакко Хайватти (Jaakko Hyvatti).

Наша благодарность - за множество сообщений об ошибках и их исправлениях от участников списка рассылки.

Огромное уважение - тем, кто помогает нам отвечать на вопросы списка рассылки mysql@lists.mysql.com:

Дэниэл Кох (Daniel Koch) dkoch@amcity.com

Установка Irix.

Лук де Боуер (Luuk de Boer) luuk@wxs.nl

Вопросы по тестам производительности.

Тим Сэйлер (Tim Sailer) tps@users.buoy.com

Вопросы по DBD-mysql.

Бойд Лин Гербер (Boyd Lynn Gerber) gerberb@zenez.com

Вопросы, относящиеся к SCO.

Ричард Мехелик (Richard Mehalick) RM186061@shellus.com



Вопросы, относящиеся к xmysql, и вопросы базовой инсталляции.

Зеев Зураски (Zeev Suraski) bourbon@netvision.net.il

Вопросы по конфигурации модулей Apache (log & auth), вопросы, относящиеся к PHP, синтаксису SQL и другие общие вопросы.

Франциск Гуаш (Francesc Guasch) frankie@citel.upc.es

Общие вопросы.

Джонатан Дж Смит (Jonathan J Smith) jsmith@wtp.net

Вопросы, относящиеся к специфике операционных систем Linux, синтаксису SQL и другим вещам, которые могут понадобиться в работе.

Дэвид Склар (David Sklar) sklar@student.net

Использование MySQL совместно с PHP и Perl.

Элистер МакДоналд (Alistair MacDonald) A.MacDonald@uel.ac.uk

Пока не определился, легко переходит к новым темам, может справиться с Linux и, возможно, с HP-UX. Пытается заставить пользователей применять mysqlbug.

Джон Лайен (John Lyon) jlyon@imag.net

Вопросы по инсталляции MySQL на системах Linux с использованием либо файлов `.rpm', либо компиляции из исходного кода.

Лорвид Лтд. (Lorvid Ltd.) lorvid@WOLFENET.com

Простые вопросы выписки счетов, лицензии, поддержки, авторских прав.

Патрик Шерил (Patrick Sherrill) patrick@coconet.com

Вопросы по ODBC и интерфейсу VisualC++.

Рэнди Хармон (Randy Harmon) rjharmon@uptimecomputers.com

Вопросы по DBD, Linux, некоторые вопросы по синтаксису SQL.


C.3 Спонсоры MySQL


В то время как MySQL AB обладает всеми авторскими правами на сервер MySQL и документацию по MySQL, мы хотим отдать дань уважения следующим компаниям, оказывавшим нам финансовую помощь в разработке MySQL, такую как оплата разработки новых возможностей или снабжение техническими средствами.

VA Linux / Andover.net

Финансирование репликации. NuSphere

Редактирование руководства по MySQL. Студия Stork Design (Stork Design studio)

Веб-сайт MySQL, использовавшийся в 1998-2000гг. Intel

Эта компания внесла вклад в разработку для платформ Windows и Linux. Compaq

Эта компания внесла вклад в разработку для Linux/Alpha. SWSoft

Разработка встроенной версии mysqld. FutureQuest

--skip-show-databasea



E.1.1 Компиляция MySQL для отладки


Иногда в случае каких-либо очень специфических проблем помогает отладка MySQL. Для этого необходимо сконфигурировать сборку MySQL с параметрами --with-debug или --with-debug=full. Чтобы проверить, был ли код MySQL скомпилирован с возможностью отладки, нужно запустить команду: mysqld --help. Если среди опций присутствует флаг --debug, то отладка доступна. Кроме того, если задана возможность отладки, команда mysqladmin ver

выводит версию mysqld как mysql ... --debug.

При использовании компиляторов gcc или egcs рекомендуется следующая конфигурационная строка:

CC=gcc CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors \ -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \ --with-debug --with-extra-charsets=complex

Такая запись позволит избежать проблем с библиотекой libstdc++ и исключениями C++ (многие компиляторы имеют проблемы с исключениями C++ в кодах потоков) и скомпилировать версию MySQL с поддержкой всех кодировок.

Если есть подозрение, что может возникнуть ошибка переполнения памяти, то можно сконфигурировать MySQL с параметром --with-debug=full, чтобы установить программу контроля выделения памяти (SAFEMALLOC). Однако SAFEMALLOC замедляет работу системы, поэтому при возникновении проблем с производительностью необходимо запустить mysqld с опцией --skip-safemalloc. Эта опция заблокирует проверки переполнения памяти для каждого вызова malloc и free.

Если mysqld перестает падать в аварийном режиме при компиляции ее с параметром --with-debug, то, возможно, вы нашли ошибку в компиляторе или произошла ошибка синхронизации внутри MySQL. В этом случае можно попытаться добавить к переменным CFLAGS и CXXFLAGS в приведенной выше конфигурационной строке -g и не использовать параметр --with-debug. Если mysqld и после этого будет падать, то можно по меньшей мере подключить к ней отладчик gdb или использовать gdb для core-файла, чтобы выяснить, что происходит.

Если MySQL сконфигурирован для отладки, то автоматически становятся доступными множество дополнительных функций контроля надежности, которые отслеживают состояние mysqld. Если они обнаруживают что-либо "неожиданное", то информация об этом будет записана в поток вывода stderr, который safe_mysqld направит в журнал ошибок! Таким образом, если возникают какие-либо неожиданные проблемы с MySQL и при этом доступен исходный код дистрибутива, то первое, что необходимо сделать, - сконфигурировать MySQL для отладки! (А второе необходимое действие - это, конечно, послать письмо на mysql@lists.mysql.com и попросить помощи). Пожалуйста, для всех сообщений о сбоях или вопросов относительно используемой версии MySQL используйте скрипт mysqlbug!

В поставке MySQL для Windows файл mysqld.exe по умолчанию скомпилирован с поддержкой трассировочных файлов.



E.1.2 Создание трассировочных файлов


Если сервер mysqld не запускается или если вы можете вызвать его скорую аварийную остановку, то для выяснения причин неполадок можно попытаться создать трассировочный файл.

Для этого необходимо иметь mysqld, скомпилированный для отладки. Проверить, скомпилирован ли mysqld для отладки можно, выполнив mysqld -V. Если номер данной версии заканчивается на -debug, то она скомпилирована с поддержкой трассировочных файлов.

Запустите сервер mysqld с журналом трассировки в каталоге `/tmp/mysqld.trace' (или `C:\mysqld.trace' под Windows):

mysqld --debug

Под Windows необходимо также использовать флаг --standalone, чтобы mysqld

не стартовал как сервис:

В окне DOS введите следующее:

mysqld --debug --standalone

После этого можно использовать клиента командной строки mysql.exe во втором окне DOS, чтобы воспроизвести проблему. Для остановки описанного выше сервера mysqld следует воспользоваться командой mysqladmin shutdown.

Следует учесть, что трассировочный файл получится очень большим! Чтобы получить трассировочный файл меньшего размера, можно использовать что-нибудь вроде:

mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace

при этом в каталог `/tmp/mysqld.trace' будет выводиться только информация с наиболее интересными для вас признаками.

Если вы создаете отчет о подобных ошибках, то, пожалуйста, присылайте в соответствующий список рассылки только те строки из трассировочного файла, которые, по вашему мнению, имеют непосредственное отношение к ошибке! Те же, кто затрудняются определить место ошибки, могут загрузить на ftp трассировочный файл вместе с отчетом об ошибках по адресу ftp://support.mysql.com/pub/mysql/secret/, чтобы разработчики MySQL могли взглянуть на него.

Трассировочный файл создается с помощью пакета DBUG, автором которого является Фред Фиш (Fred Fish). See section E.3 Пакет DBUG.



E.1.3 Отладка mysqld при помощи gdb


В большинстве операционных систем можно запускать mysqld под отладчиком gdb - это позволяет получить больше информации при аварийных остановках mysqld,

С некоторыми более старыми версиями gdb под Linux, чтобы обеспечить возможность отладки потоков mysqld, необходимо использовать run --one-thread. В этом случае в каждый момент времени доступен для отладки только один поток. Нам остается только рекомендовать вам как можно быстрее заменить старые версии отладчика на версию gdb 5.1, поскольку отладка потоков в этой версии работает намного лучше!

При работе mysqld под отладчиком gdb необходимо заблокировать трассировку стеков при помощи --skip-stack-trace, что обеспечит возможность выявить ошибки сегмантацию внутри gdb.

Если постоянно подсоединяются новые пользователи, то отладка MySQL под gdb

может оказаться достаточно сложным делом, поскольку gdb не освобождает память, занимаемую старыми потоками. Эту проблему можно устранить, запустив mysqld с параметрами -O thread_cache_size='max_connections+1'. В большинстве случаев даже простое использование -O thread_cache_size=5

может очень помочь!

Для получения дампа оперативной памяти под Linux, если mysqld падает по сигналу SIGSEGV, можно запустить mysqld с опцией --core-file. Этот файл оперативной памяти (core) можно использовать для обратной трассировки при выявлении причин останова mysqld:

shell> gdb mysqld core gdb> backtrace full gdb> exit

See section A.4.1 Что делать, если работа MySQL сопровождается постоянными сбоями.

При использовании версии gdb 4.17.x или выше под Linux необходимо установить в текущем каталоге файл `.gdb' со следующей информацией:

set print sevenbit off handle SIGUSR1 nostop noprint handle SIGUSR2 nostop noprint handle SIGWAITING nostop noprint handle SIGLWP nostop noprint handle SIGPIPE nostop handle SIGALRM nostop handle SIGHUP nostop handle SIGTERM nostop noprint

Если при отладке потоков с помощью gdb возникают проблемы, необходимо загрузить версию gdb 5.x и попробовать использовать ее вместо прежней. Новая версия отладчика gdb обеспечивает значительно улучшенную обработку потоков!

Ниже приводится пример отладки mysqld:

shell> gdb /usr/local/libexec/mysqld gdb> run ... backtrace full # Делайте это при аварийной остановке mysqld

Включите полученный вывод в письмо, сгенерированное с помощью mysqlbug, и пошлите это письмо по адресу mysql@lists.mysql.com.

Если mysqld зависает, можно попробовать использовать некоторые системные средства наподобие strace или /usr/proc/bin/pstack для выяснения, где именно произошло зависание mysqld.

strace /tmp/log libexec/mysqld

Если используется интерфейс Perl DBI, то можно получить отладочную информацию, используя метод trace или установив переменную окружения DBI_TRACE. See section 8.2.2 Интерфейс DBI.



E.1.4 Использование трассировки стека


В некоторых операционных системах журнал ошибок в случае смерти mysqld будет содержать трассировку стека. Эти данные можно использовать для выяснения, где (и, может быть, почему) умер mysqld (see section 4.9.1 Журнал ошибок). Для получения трассировки стека не следует компилировать mysqld с опцией -fomit-frame-pointer для gcc (see section E.1.1 Компиляция MySQL для отладки).

Если файл ошибок содержит что-нибудь похожее на следующее:

mysqld got signal 11; The manual section 'Debugging a MySQL server' tells you how to use a stack trace and/or the core file to produce a readable backtrace that may help in finding out why mysqld died Attemping backtrace. You can use the following information to find out where mysqld died. If you see no messages after this, something went terribly wrong stack range sanity check, ok, backtrace follows 0x40077552 0x81281a0 0x8128f47 0x8127be0 0x8127995 0x8104947 0x80ff28f 0x810131b 0x80ee4bc 0x80c3c91 0x80c6b43 0x80c1fd9 0x80c1686

то можно определить, где произошла остановка mysqld. Для этого нужно выполнить следующие действия:

Скопируйте приведенные выше числовые значения в файл, например mysqld.stack.

Создайте файл символов для сервера mysqld:

nm -n libexec/mysqld > /tmp/mysqld.sym

Следует учесть, что во многих бинарных поставках MySQL приведенный выше файл с именем `mysqld.sym.gz' уже имеется. В этом случае необходимо распаковать его следующим образом:

gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym

Выполните resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack, чтобы вывести место остановки mysqld. Если и это не поможет определить причину останова mysqld, то следует сделать отчет об ошибке и включить в него данный вывод с комментарием. Следует учитывать, однако, что в большинстве случаев наличие лишь только трассировки стеков не поможет нам определить причину данной проблемы. Чтобы иметь возможность локализовать данный сбой или рекомендовать обходной путь, нам, как правило, необходимо знать, какой именно запрос привел к остановке mysqld и, желательно, иметь контрольный пример, чтобы мы могли воспроизвести данную проблему! See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах.



E.1.5 Использование журналов для определения причин ошибок в mysqld


Обратите внимание: перед запуском mysqld с --log необходимо проверить все используемые таблицы с помощью myisamchk (see section 4 Администрирование баз данных).

Если демон mysqld умрет или зависнет, следует запустить mysqld с опцией --log. Если аварийное завершение mysqld снова повторится, то можно исследовать часть журнала, относящуюся к запросу, убившему mysqld.

При использовании опции --log без имени файла данный журнал хранится в каталоге базе данных как ``hostname`.log'. В большинстве случаев именно последний запрос в системном журнале приводит к смерти mysqld, но при возможности лучше в этом убедиться: перезапустите mysqld и выполните найденный запрос из командной строки mysql. Если запрос выполняется, то следует протестировать все сложные запросы, которые не завершились.

Можно также попробовать выполнить команду EXPLAIN для всех выражений SELECT, которые занимают длительное время, чтобы убедиться, что mysqld

правильно использует индексы. See section 5.2.1 Синтаксис оператора EXPLAIN (получение информации о SELECT).

Запросы, требующие слишком длительного времени для выполнения, можно выявить, запустив mysqld с параметром --log-slow-queries. See section 4.9.5 Журнал медленных запросов.

Если в журнале ошибок (обычно он имеет имя ``hostname`.err') присутствует запись "mysqld restarted", то у вас есть шанс найти запрос, вызывающий смерть mysqld. В этом случае необходимо проверить все таблицы с помощью команды myisamchk (see section 4 Администрирование баз данных) и проанализировать запросы в журналах MySQL, чтобы определить, какой из них не работает. Если такой запрос найден, прежде всего необходимо попытаться сделать апгрейд MySQL до новейшей версии. Если же это не помогает и нет ничего похожего в архиве списка рассылки mysql, пришлите отчет о данном сбое по адресу mysql@lists.mysql.com. Ссылки на архивы списка рассылки доступны по адресу http://lists.mysql.com/.

Если демон mysqld был запущен с параметром myisam-recover, то MySQL автоматически проверяет и пытается восстановить таблицы MyISAM (если они отмечены как "таблица не закрыта правильно" или "таблица повреждена"). В этом случае MySQL запишет в файл `hostname.err' предупреждение: "Warning: Checking table ...", за которым следует "Warning: Repairing table", если данную таблицу следует исправить. Если таких ошибок в журнале много, а mysqld перед этим не умирал со сбоем, то что-то работает неправильно и необходимы дальнейшие исследования. See section 4.1.1 Параметры командной строки mysqld.

Конечно, неожиданная смерть mysqld - событие малоприятное, но в этом случае следует не изучать сообщения "Checking table...", а попытаться найти причины остановки mysqld.



E.1.6 Создание контрольного примера при повреждении таблиц


Когда таблицы оказываются поврежденными или mysqld всегда дает сбой после некоторых команд, то можно провести испытания (если данный сбой воспроизводим). Для этого нужно выполнить следующие действия:

Остановите демон MySQL (с помощью команды mysqladmin shutdown).

Сделайте резервную копию таблиц (в качестве меры предосторожности на случай, если процесс исправления таблиц пройдет некорректно, хотя это и маловероятно).

Проверьте все таблицы с помощью команды myisamchk -s database/*.MYI. Исправьте некорректные таблицы с помощью команды myisamchk -r database/table.MYI.

Создайте еще раз резервные копии этих таблиц.

Переместите (или удалите совсем) все старые журнальные файлы из каталога данных MySQL, если нужно освободить больше места.

Запустите mysqld с --log-bin (see section 4.9.4 Бинарный журнал обновлений). Если вы хотите найти запрос, который приводит к сбою mysqld, то следует использовать --log --log-bin.

Когда таблица с искажениями будет получена, остановите сервер mysqld.

Восстановите систему из резервной копии.

Перезапустите сервер mysqld без --log-bin.

Выполните заново команды mysqlbinlog update-log-file | mysql. Обновленная запись в журнале сохраняется в каталоге баз данных MySQL с именем `hostname-bin.#'.

Если в результате вышеприведенной команды таблицы опять окажутся поврежденными или вы можете получить сбой в работе mysqld, то, значит, вы нашли повторяющуюся ошибку, которую можно исправить! Загрузите эти таблицы и запись из двоичного журнала по адресу ftp://support.mysql.com/pub/mysql/secret/ и пошлите письмо с описанием данной проблемы на bugs@lists.mysql.com или (если вы являетесь коммерческим пользователем) на support@mysql.com - и команда разработчиков MySQL устранит ошибку настолько быстро, насколько это возможно.

Для локализации проблемы можно также использовать скрипт mysql_find_rows, чтобы просто выполнить ряд обновляющих команд.



E.1 Отладка сервера MySQL


Если вы используете в MySQL совершенно новую функциональную возможность, то можно попробовать запустить mysqld с параметром --skip-new (при этом все новые, потенциально ненадежные функции будут заблокированы) или с параметром --safe-mode - он отключает ряд оптимизаций, которые могут вызвать проблемы. See section A.4.1 Что делать, если работа MySQL сопровождается постоянными сбоями.

Если mysqld не хочет стартовать, то необходимо посмотреть, не влияют ли на ваши настройки какие-либо конфигурационные файлы! Вы можете проверить аргументы файла `my.cnf' с помощью mysqld --print-defaults и, чтобы запретить их использование, стартовать mysqld с параметром --no-defaults ....

Если для запуска mysqld требуется большое количество ресурсов центрального процессора или памяти, а также в случае зависания программы можно использовать команду mysqladmin processlist status. Эта команда позволит определить, какой именно запрос требует столь длительного времени выполнения. При изучении проблем, связанных с производительностью или трудностями при подсоединении новых клиентов, иногда полезно запустить команду mysqladmin -i10 processlist status в другом окне.

Команда mysqladmin debug выводит в журнальный файл информацию о применяемых блокировках, используемой памяти и работе с запросами запросов - возможно, это поможет вам решить некоторые проблемы. Данная команда снабдит вас полезной информацией даже в том случае, если код MySQL не был скомпилирован для отладки!

Если проблема заключается в том, что некоторые таблицы справляются с работой все медленнее и медленнее, то такие таблицы необходимо попробовать оптимизировать с помощью команды OPTIMIZE TABLE или myisamchk. See section 4 Администрирование баз данных. Для проверки медленных запросов можно также использовать EXPLAIN.

Кроме того, чтобы решить уникальные для конкретных условий эксплуатации проблемы, необходимо изучить раздел данного руководства, в котором описывается специфика определенной операционной системы. See section 2.6 Заметки по операционным системам.



E.2 Отладка клиента MySQL


Чтобы иметь возможность отладки клиента MySQL с помощью встроенного отладчика, необходимо сконфигурировать сборку MySQL с --with-debug или --with-debug=full. See section 2.3.3 Типичные опции configure.

Перед запуском клиента следует установить переменную окружения MYSQL_DEBUG:

shell> MYSQL_DEBUG=d:t:O,/tmp/client.trace shell> export MYSQL_DEBUG

Это заставит клиента генерировать трассировочный файл в `/tmp/client.trace'.

Если существуют проблемы с кодом конкретного клиента, необходимо попытаться соединиться с сервером и послать запрос, используя другой заведомо работоспособный клиент. Это следует делать при работе mysql в режиме отладки (предполагается, что данный экземпляр MySQL скомпилирован с возможностью отладки):

shell> mysql --debug=d:t:O,/tmp/client.trace

приведенный выше вызов снабдит вас полезной информацией для отчета об ошибках. See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах.

Если ваш клиент, имея "правильный" на первый взгляд код, отказывается устойчиво работать, необходимо проверить, соответствует ли включаемый файл `mysql.h' файлу вашей библиотеки mysql. Очень распространенная ошибка заключается в том, что используется старый файл `mysql.h' из MySQL старой установки с новой библиотекой MySQL.



E.3 Пакет DBUG


Сервер MySQL и большинство клиентов MySQL компилируются с пакетом DBUG, автором первой версии которого является Фред Фиш (Fred Fish). При конфигурации MySQL в отладочном режиме этот пакет дает возможность получить трассировочный файл для отладки программы. See section E.1.2 Создание трассировочных файлов.

Чтобы воспользоваться пакетом отладки, следует в вызове программы задать опцию --debug="..." или -#...

Большинство программ MySQL по умолчанию имеют отладочную строку, которая будет использована, если не задана опция --debug. По умолчанию трассировочный файл обычно находится в `/tmp/имя_программы.trace' под Unix и в `\имя_программы.trace' под Windows.

Строка управления отладкой представляет собой последовательность разделенных двоеточиями полей, как в следующем примере:

::...:

Каждое поле состоит из обязательного флагового символа, за которым следует необязательный символ "," и разделенный запятыми список модификаторов:

flag[,modifier,modifier,...,modifier]

В настоящее время распознаются следующие символы флагов:

Флаг Описание d Разрешает вывод из макроса DBUG_ для текущего состояния. За этим флагом может следовать список ключевых слов. Если задан такой список, то из вывода макроса DBUG будет выбираться вывод только с данными ключевыми словами. Если задан пустой список ключевых слов, выбирается вывод всего макроса. D Задает задержку вывода после каждой строки отладчика. Аргумент представляет собой количество десятых долей секунд задержки в соответствии с возможностями машины. Т.е. D,20 означает задержку в две секунды. f Ограничивает отладку и/или трассировку и профайлинг только перечисленными в списке функциями. Обратите внимание: если задан нулевой список, то будут заблокированы все функции. Соответствующие флаги "d" или "t" должны также задаваться, данный флаг только ограничивает их действия, если они разрешены. F Идентифицирует имя исходного файла для каждой строки вывода отладки или трассировки.
i Идентифицирует процесс указанием pid или идентификатором потока (thread id) в каждой строке вывода отладки или трассировки.
g Разрешает профайлинг. Создает файл с именем `dbugmon.out', содержащий информацию, которую можно использовать для профайлинга программы. За этим флагом может следовать список ключевых слов; если такой список задан, то профайлинг будет применяться только для функций из этого списка. Если задан нулевой список ключевых слов, то профайлинг применяется ко всем функциям.
L Идентифицирует номер строки исходного файла для каждой строки вывода отладки или трассировки.
n Задает вывод глубины вложенности текущей функции для каждой строки вывода отладки или трассировки.
N Задает нумерацию каждой строки в выводе dbug.
o Переадресует выходной поток отладчика в указанный файл. По умолчанию вывод осуществляется в stderr.
O То же, что и o, но указанный файл сбрасывается на диск каждый раз между операциями записи. При необходимости этот файл закрывается и снова открывается каждый раз между операциями записи.
p Ограничивает действия отладчика указанным процессом. Процесс должен быть идентифицирован макросом DBUG_PROCESS и совпадать с указанным в списке для действий отладчика.
P Выводит имя текущего процесса для каждой строки вывода отладки или трассировки.
r Не наследовать уровень вложенности функции в предыдущем состоянии при переходе в новое состояние. Полезно, если вывод должен начинаться с левого поля.
S Выполнять функцию _sanity(_file_,_line_) для каждой отлаженной функции, пока _sanity() не возвратит значение, отличное от 0. (Главным образом используется совместно с safemalloc для определения утечек памяти).
t Разрешает трассировку вызовов функций/выход из функций. За этим параметром может следовать список (содержащий только один модификатор). Данный модификатор задает число - максимальный уровень вложения функций, ниже которого не производится вывод ни для отладочного, ни для трассировочного макросов. Параметр по умолчанию задается во время компиляции.


Ниже представлены некоторые примеры строк управления отладкой, которые можно применять в командной строке оболочки (символ "-#" обычно используется для внедрения управляющей строки в программу):

-#d:t -#d:f,main,subr1:F:L:t,20 -#d,input,output,files:n -#d:t:i:O,\\mysqld.trace

В MySQL обычно применяются следующие дескрипторы для вывода (совместно с опцией d): enter,exit,error,warning,info и loop.


E.4 Методы блокировки


В настоящее время MySQL поддерживает только табличную блокировку для таблиц типов ISAM/MyISAM и HEAP, страничную блокировку для таблиц BDB и строковую блокировку для таблиц InnoDB (see section 5.3.1 Как MySQL блокирует таблицы). Для таблиц MyISAM можно произвольным образом сочетать команды INSERT и SELECT без блокировок, поскольку поддерживается управление версиями (Versioning).

Начиная с версии 3.23.33 имеется возможность анализировать конфликты и конкуренцию блокировок таблиц в системе. Это делается путем проверки переменных Table_locks_waited и Table_locks_immediate.

Если вы хотите использовать тип таблиц с блокировкой уровня записи, то прежде, чем принимать такое решение, следует посмотреть, что делает данное приложение и какая принята модель выборки/обновления данных.

Аргументы в пользу строковой блокировки:

Меньше конфликтов блокировок при обращении к различным строкам из множества потоков.

Меньше изменений при откатах.

Возможна блокировка одной строки на длительное время.

Аргументы против строковой блокировки

Требуется больше памяти, чем при страничной или табличной блокировке.

При использовании большой части таблицы строковая блокировка работает медленнее в сравнении с блокировкой на уровне страниц или таблиц, поскольку требуется производить намного больше блокировок.

Определенно хуже других блокировок, если часто выполняется операция GROUP BY на значительной части данных или если приходится сканировать всю таблицу.

Для блокировок более высокого уровня также проще осуществить поддержку различных типов блокировок для настройки приложения, поскольку для них затраты на блокировку менее заметны, чем для строкового уровня блокировки.

Блокировки на уровне таблиц лучше, чем блокировки страничного/строкового уровня в следующих случаях:

Когда производится главным образом чтение.

При чтении и обновлении для строго заданных ключей; при обновлении или удалении строки, которая может быть извлечена чтением одного ключа:

UPDATE table_name SET column=value WHERE unique_key# DELETE FROM table_name WHERE unique_key=#




SELECT с INSERT ( и очень мало операций UPDATE и DELETE).



Выполняется много операций просмотра и группировки GROUP BY на всей таблице без записи.

Другие возможности, кроме строчного/страничного уровня блокирования:

Управление версиями (Versioning), подобно тому, как это делается в MySQL для параллельных вставок. При этом один из пользователей может выполнять операцию записи в то же время, когда несколько пользователей производят чтение. Это означает, что данная база данных/таблица поддерживает различные представления для данных в зависимости от того, когда произошло обращение к ним. Существуют и другие названия этой возможности - перемещение по времени (time travel), метод копирования в момент записи (copy on write) или метод копирования по запросу (copy on demand).

Копирование по запросу во многих случаях значительно лучше, чем страничный или строковый уровень блокировки; однако в наиболее неблагоприятном варианте этот метод требует намного больше памяти, чем при использовании обычных блокировок.

Вместо использования блокировок строкового уровня можно применять блокировки уровня приложения (подобно get_lock/release_lock в MySQL). Конечно, такие блокировки годятся только для корректно работающих приложений.

Если речь идет о конкретном приложении, то обычно можно с уверенностью сказать, какой тип блокировки лучше всего в нем использовать, однако для общего случая такой вывод сделать практически невозможно: все зависит от конкретного приложения, причем для различных частей приложения могут требоваться различные типы блокировок.

Ниже приводится несколько советов по блокировкам в MySQL:

Большинство веб-приложений выполняют большое количество выборок, очень мало удалений, обновления главным образом по ключам и вставки в некоторые специальные таблицы. Базовая установка MySQL очень хорошо настроена для этого.

Одновременный доступ пользователей не представляет проблем, если не происходит смешивания обновлений и выборок, требующих проверки нескольких строк в одной и той же таблице.

В случае сочетания вставок и удалений в одной и той же таблице очень полезно применять INSERT DELAYED.

Для повышения скорости можно также использовать LOCK TABLES (несколько обновлений в рамках одной блокировки выполняются намного быстрее, чем обновления без блокировок). Целесообразно также распределять данные по различным таблицам.

Иногда проблемы со скоростью при блокировках таблиц в MySQL удается решить преобразованием ряда таблиц в таблицы типа InnoDB или BDB. See section 7.5 Таблицы InnoDB. See section 7.6 Таблицы BDB или BerkeleyDB.

Большое количество различных аспектов настройки приложения рассмотрено в разделе данного руководства, посвященном оптимизации (see section 5.2.12 Другие советы по оптимизации).


E.5 Замечания по потокам RTS


При попытке применить пакеты потоков RTS с MySQL автору пришлось столкнуться со следующими проблемами:

В этих пакетах используются старые версии большинства вызовов POSIX, поэтому очень утомительно создавать оболочки (wrapper) для всех функций. На мой взгляд, было бы легче изменить библиотеки этих потоков в соответствии с современной спецификацией POSIX.

Некоторые оболочки уже написаны (чтобы получить более подробную информацию, обращайтесь к `mysys/my_pthread.c').

Следует изменить, по меньшей мере, следующие аспекты:

В pthread_get_specific должен использоваться один аргумент, а в sigwait - два аргумента. Многие функции (по крайней мере, pthread_cond_wait, pthread_cond_timedwait) должны возвращать код ошибки или ошибку. Сейчас они возвращают -1 и устанавливают errno.

Еще одна проблема заключается в том, что потоки пользовательского уровня используют сигнал ALRM, преждевременно прекращающий работу многих функций (read, write, open...). MySQL должен повторять попытку выполнить такие вызовы в случае прерывания, но это не так легко проверить.

Наиболее значительная из нерешенных проблем заключается в следующем:

Чтобы получать alarm на уровне потока, я изменил mysys/thr_alarm.c - чтобы ожидать alarm с помощью функции pthread_cond_timedwait(). Однако оказалось, что это приводит к преждевременному прекращению работы с ошибкой EINTR. Чтобы понять, почему так получается, я пытался отладить библиотеку потока, но не смог найти никакого простого решения.

Для тех, кто хочет попробовать использовать MySQL с потоками RTS, я предлагаю следующее:

Измените функции, используемые MySQL из библиотеки потоков для POSIX. Это не должно занять много времени.

Скомпилируйте все библиотеки с -DHAVE_rts_threads.

Скомпилируйте thr_alarm.

Если существуют некоторые небольшие отличия в реализации, то они могут быть устранены изменением `my_pthread.h' и `my_pthread.c'.

Запустите thr_alarm. Если программа выполняется без каких-либо предупреждений, сообщений об ошибках или об аварийном выходе, значит, вы на правильном пути. Ниже приводится успешный прогон программы под Solaris:

Main thread: 1 Thread 0 (5) started Thread: 5 Waiting process_alarm Thread 1 (6) started Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 1 (1) sec Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 2 (2) sec Thread: 6 Simulation of no alarm needed Thread: 6 Slept for 0 (3) sec Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 4 (4) sec Thread: 6 Waiting process_alarm thread_alarm Thread: 5 Slept for 10 (10) sec Thread: 5 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 5 (5) sec Thread: 6 Waiting process_alarm process_alarm

... thread_alarm Thread: 5 Slept for 0 (1) sec end



E.6 Различия между разными потоковыми пакетами


Работа MySQL в значительной степени зависит от используемого потокового пакета. Таким образом, при выборе хорошей платформы для MySQL потоковый пакет играет очень важную роль.

Существуют по меньшей мере три типа потоковых пакетов:

Пользовательские потоки в одном процессе. Переключение потоков осуществляется сигналами (alarm) и библиотека потоков управляет всеми функциями, не поддерживающими потоки, с помощью блокировок. Операции чтения, записи и выборки обычно управляются программой выбора потоков, которая переключает их на другой поток, если текущий должен ожидать данные (речь идет о вызове select). Пакеты пользовательских потоков могут быть интегрированы в стандартные библиотеки (FreeBSD- и BSDI-потоки). Такие интегрированные пакеты требуют меньше затрат в сравнении с потоковыми пакетами, которые должны обрабатывать все ненадежные вызовы (MIT-pthreads, FSU Pthreads и потоки RTS). В некоторых средах (например SCO) все системные вызовы поддерживают потоки, так что обработка может быть выполнена очень просто (FSU Pthreads под SCO). Недостатки такого метода: поскольку все вызовы, для которых установлены соответствия, занимают мало времени, очень сложно контролировать обработку всех ситуаций. Обычно существуют также системные вызовы, не обрабатываемые потоковым пакетом (такие как MIT-pthreads и сокеты). Диспетчеризация потоков не всегда является оптимальной.

Пользовательские потоки в раздельных процессах. Переключение потоков производится ядром и все данные используются совместно всеми потоками. Потоковый пакет управляет стандартными вызовами потоков, чтобы обеспечить совместное использование данных этими потоками. Такой метод используется в LinuxThreads. Недостатки этого метода: масса процессов; медленное создание потока. Если один поток умирает, то остальные обычно зависают и необходимо их уничтожать перед перезапуском. Переключение потоков отчасти затратно.

Потоки ядра. Переключение потоков управляется потоковой библиотекой или ядром и происходит очень быстро. Все делается в одном процессе, но для некоторых систем ps может показывать разные потоки. Если один из потоков неожиданно умрет, то происходит аварийное прерывание всего процесса. Большинство системных вызовов поддерживают потоки и должны требовать очень небольших затрат. С потоками ядра работают Solaris, HP-UX, AIX и OSF/1.

В некоторых системах управление потоками ядра осуществляется путем интеграции потоков пользовательского уровня в системные библиотеки. В подобных случаях переключение потоков может осуществляться только данной потоковой библиотекой, и ядро фактически "не в курсе событий".