Mysqld
Серверная часть пакета MySQL (mysqld).
СИНТАКСИС:
mysqld [OPTIONS]
ОПИСАНИЕ:
Программа mysqld является ядром СУБД MySQL. Она запускается как демон в системе и принимает подключения из клиентских программ, выполняя запросы и возвращая результаты. Она многопоточная, то есть обработает больше чем один запрос одновременно.
Может наблюдаться спад производительности при использовании опции --log-isam, поскольку при этом очень многое пишется в файл протокола. Непериодические изменения, обновления и удаления могут уменьшить производительность на 5-10%. Производительность может сильно понизиться на обновлениях, требующих большого числа одновременных изменений.
Опция --log-isam может использоваться, для копирования базы данных. Обратите внимание, что ISAM журналы могут стать ОЧЕНЬ большими.
Каждая операция UPDATE, DELETE и INSERT имеет заголовок в 13 байтов дополнительно к команде.
Каждая открытая таблица требует девять байтов плюс длина имени файла таблицы. Это необходимо только для таблиц, которые еще не в кэше таблиц.
Кроме того будут иметься одиннадцать байтов дополнительно для любых команд, которые кэшируют/блокируют таблицы. Эти события обычно вызваны внутренними командами mysql. Наиболее часто, когда используется SELECT.
В большинстве случаев нужно выполнять mysqld из скрипта safe_mysqld .
Программа mysqld поддерживает следующие опции командной строки:
-\?, --help | Справка |
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о . |
-b, --basedir=[path] | Полное имя каталога в который установлен пакет. |
-h, --datadir [homedir] | Полное имя каталога в котором хранятся базы данных. |
-l, --log=[filename] | Имя файла протокола запросов к базам данных и подключений. |
--log-isam=[filename] | Имя файла протокола изменений isam. |
-O, --set-variable var=option | Установить переменную. См. ниже. |
-L, --language=[language] | Значение по умолчанию 'english/'. Может быть так же 'swedish/', 'germany/','french/' или 'czech/'. Текущий список можно посмотреть в подкаталог share/mysql каталога, в который установлен MySQL. |
-P, --port=[port] | Порт для соединения. |
-T, --debug-info | Вывести отладочную информацию. |
--skip-new-routines | Не использовать новые (возможно, глючные) возможности этой версии. |
--skip-grant-tables | Игнорировать таблицы предоставления доступа. Это дает любому ПОЛНЫЙ доступ ко всем таблицам. |
--skip-locking | Не использовать блокировку системы. Может дать лучшую эффективность, но не должен использоваться вместе с isamchk. ТО ЕСТЬ, сначала остановите сервер. |
--skip-name-resolve | Эта опция заставит mysqld принимать адреса IP только тех серверов, которые явно указаны в базе данных привилегий mysql. DNS можно более или менее просто хакнуть, а эта опция позволяет избежать ряда проблем, если прикладная программа требует высокого уровня защиты. |
--skip-networking | Использовать подключения только через интерфейс localhost. Эта опция не будет работать с MIT потоками. Если подключения к базе данных будут только локальные, то использование этой опции защитит от создания удаленных подключений. |
--skip-unsafe-select | Пропустить возможно опасные оптимизации. |
--socket=[socket] | Имя сокет-файла для MySQL. Недоступно при использовании версии MySQL, скомпилированной с MIT потоками. |
ПРИМЕР:
mysqld --socket=/tmp/mysql.sock -V, --version Вывести информацию о версии.
Если опция - h не определена, mysql будет считать, что основной каталог = "/my/data/sql/mysql".
Все базы данных размещены в каталоге [homedir]/[имя базы данных] .
Опция -l должна использоваться осторожно. Когда используется сервер, с большим объемом транзакций, этот файл может стать большим очень быстро. Если Вы не определяете имя logfile, при использовании опции -l mysqld будет писать протокол в файл [homedir]/[hostname].log.
Опция -O позволяет Вам определять значения для следующих параметров:
Имя | Значение по умолчанию |
back_log | 5 |
keybuffer | 1048568 |
max_allowed_packet | 65536 |
net_buffer_length | 8192 |
max_connections | 90 |
table_cache | 64 |
recordbuffer | 131072 |
sortbuffer | 2097144 |
max_sort_length | 1024 |
Mysqldump
Дамп содержания базы данных.
СИНТАКСИС:
mysqldump [OPTIONS] [database [table [field]]]
ОПИСАНИЕ:
Программа mysqldump используется для создания дампа содержания базы данных MySQL. Она пишет инструкции SQL в стандартный вывод. Эти инструкции SQL могут быть переназначены в файл. Можно резервировать базу данных MySQL, используя mysqldump, но при этом Вы должны убедиться, что в этот момент с базой данных не выполняется никаких других действий. А то mysqldump Вам такого нарезервирует...
Программа mysqldump поддерживает следующие параметры (Вы можете использовать короткую или подробную версию):
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о . |
-?, --help | Справка. |
-c, --compleat-insert | Генерируйте полные инструкции insert (не исключая значений, которые соответствуют значениям столбца по умолчанию). |
-h, --host=[hostname] | Соединиться с сервером hostname. |
-d, --no-data | Экспорт только схемы информации (исключая данные). |
-t, --no-create-info | Экспорт только данных, исключая информацию для создания таблицы. Противоположность -d. |
-p, --password=[password] | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем. |
-q, --quick | Не буферизовать результаты запроса, дамп выдать непосредственно к STDOUT. |
-u, --user=[username] | Имя пользователя. Если не задано, используется текущий логин. |
-v, --verbose | Вывести подробную информацию относительно различных стадий выполнения mysqldump. |
-P, --port=[port] | Порт для связи. |
-V, --version | Информация о версии. |
Вы можете направить вывод mysqldump в клиентскую программу MySQL, чтобы копировать базу данных. ПРИМЕЧАНИЕ: Вы должны убедиться, что база данных не изменяется в это время, иначе Вы получите противоречивую копию!
ПРИМЕР:
mysqladmin create foo mysqldump mysql | mysql foo
Mysqlshow
Показать информацию о сервере, базе данных или таблице.
СИНТАКСИС:
mysqlshow [OPTIONS] [database [table [field]]]
ОПИСАНИЕ:
Программа mysqlshow может использоваться, чтобы показать, с какими базами данных MySQL работает, какие таблицы данная база данных содержит, и какие поля есть в таблице в данной базе данных.
Программа mysqlshow поддерживает следующие параметры (Вы можете использовать короткую или подробную версию):
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о . Как мне надоела эта опция... |
-?, --help | Справка. |
-h, --host=[hostname] | Связаться с сервером hostname. |
-k, --key | Вывести ключ(и) для таблиц(ы). |
-p, --password=[password] П | ароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем. |
-u, --user=[username] | Имя пользователя. Если не задано, используется текущий логин. |
-P, --port=[port] | Порт для связи. |
-V, --version | Информация о версии. |
mysqlshow без аргументов покажет все базы данных. mysqlshow с именем базы данных покажет все таблицы в ней. mysqlshow с именем базы данных и именем таблицы покажет схему этой таблицы.
Если последний параметр содержит '?' или '*', то они используются как подстановочные знаки.
ПРИМЕР:
mysqlshow test 'a*'
показать список всех таблиц в базе данных test, начиная с 'a'.
mysqlshow по существу идентичен программе mSQL msqlshow. СУБД MySQL обеспечивает, подобные функциональные возможности посредством команд языка SQL и .
Настройка mysqld
Когда Вы указываете опцию -O, отдельно (без дополнительных параметров) Вы получите список всех переменных и их текущих значений. Это может выглядеть примерно так:
$ mysqld -O
Возможные переменные в опции -O:
Имя | Значение по умолчанию |
back_log | Определите размер очереди для входящих tcp/ip подключений. Убедитесь, что установили его побольше, когда Вы ожидаете большое количество подключений в коротком периоде времени. Некоторые ОС могут иметь максимальное значение этой переменной 128 или 256. Подробности об этой очереди можно посмотреть на man-странице listen(2). |
keybuffer | Размер кэш-буфера, для хранения всех недавно использованных ключей. Большой буфер дает самую лучшую эффективность. С переключателем -Sl распределен только один буфер. |
max_allowed_packet | Буфер подключений сервера может быть изменен до этого значения, если пользователь дает длинную команду. Начальный буфер = 'net_buffer_length'. На каждое подключение выделяется один буфер. |
net_buffer_length | Начальный размер буфера подключений. На каждое подключение выделяется один буфер. |
max_connections | Максимальное число подключений, которые mysqld может иметь открытыми в одно и то же время. |
table_cache | Максимальное число таблиц сохраняемых открытыми на сервере. Таблицы хранятся открытыми, для ускорения запроса к часто используемым таблицам. Однако, каждая открытая таблица требует много памяти. |
recordbuffer | Размер кэш-буфера для хранения прочитанных записей. На каждое подключение выделяется один буфер. |
sortbuffer | Размер буфера, используемого при сортировке. На каждое подключение выделяется один буфер. |
max_sort_length | Максимальное время для сортировки? |
Полезные замечания
Все потоки совместно используют ту же самую основную память. MySQL в настоящее время не использует memmap. Это может изменяться. Вы можете определять размер буфера для ключей при старте mysqld. Буфер ключей будет кэшировать все ключи во всех таблицах В ПОРЯДКЕ ПОСТУПЛЕНИЯ запросов (переменная keybuffer) Каждое подключение использует некоторую часть потока, стек и буфер подключений (переменная net_buffer_length). Каждый запрос, делающий последовательный просмотр записей в таблице, распределяет буфер чтений (переменная recordbuffer). Каждый запрос, выполняющий сортировку, распределяет sortbuffer и один или два временных файла. Максимально необходимое дисковое пространство = (sort_key_length + sizeof(long))*2. Все объединения выполняются за один проход, и результат сохраняется во временной таблице в памяти. Выполнение полного объединения и сортировки на двух больших таблицах может потребовать очень большого объема памяти. Индексные файлы открываются один раз. Файлы данных открываются один раз для каждого параллельного потока. Каждый параллельный поток имеет полную таблицу struct и поле struct плюс память для трех полных строк столбцов. BLOB требует еще 5-8 байт. Если таблица имеет BLOB, буфер будет распределен, чтобы читать данные BLOB. Этот буфер будет расти по мере необходимости, до размеров самого большого BLOB в таблице. Когда таблица используется, она сохраняется в кэше. Этот кэш будет загружен и опорожнен В ПОРЯДКЕ ПОСТУПЛЕНИЯ запросов (FIFO). По умолчанию mysqld будет кэшировать 64 таблицы. Если много потоков обращаются к одной и той же таблице одновременно, будет иметься одна запись на поток. ТО ЕСТЬ, если два потока одновременно обращаются к той же самой таблице, будет две записи в кэше. Команда mysqladmin reload закрывает все таблицы, которые не используются, и отмечает все используемые таблицы, которые будут закрыты, когда работающие потоки завершатся. Это позволяет эффективно использовать память, своевременно ее освобождая.
Если Вы имеете прикладную программу, которая требует большого количества потоков, это является хорошим способом уменьшить значения recordbuffer и sortbuffer примерно до 32K. Вы можете даже уменьшить recordbuffer до 8КБ без особых проблем. Кроме того можно рассматривать уменьшение значения переменной keybuffer до размера в 512КБ. Это сохранит большой объем памяти, и повысит эффективность работы.
Маленькие хитрости по улучшению производительности
После того, как Вы загрузили данные в вашу базу данных, Вы можете выполнить команду 'isamchk -a' над вашими таблицами. Программа isamchk соберет статистику по вашим таблицам, которую сможет использовать оптимизатор. Вообще, надо выполнить isamchk только однажды на таблице. При этом предполагается, что что данные в таблице во время isamchk выполнены в типичном представлении для вашей таблицы.
Несоответствия типов в INSERT
В настоящее время инструкция INSERT дает ошибку только при вставке пустого указателя (NULL) в не пустой столбец.
При использовании INSERT или команды, которая может воздействовать на много записей, выполняется следующее:
Значения преобразуются в правый тип (от integer/real/string до integer/real/string) перед сохранением. Слишком длинные строки усекаются, и увеличивается значение переменной 'warnings'. Если значение ниже минимального значения для столбца, минимальное значение вставляется, и увеличивается значение переменной 'warnings'. Если значение выше максимального значения для столбца, максимальное значение вставляется, и увеличивается значение переменной 'warnings'. При преобразовании строки в целое число, значение усекается при первой не-цифре. Если в строке есть какой-либо символ, не являющийся цифрой, то увеличивается значение переменной 'warnings'. При преобразовании строки в число с плавающей точкой увеличивается значение переменной 'warnings', если после целого числа есть какие-либо символы, кроме точки.
Во время связи клиента с сервером 'warnings information' возвращается только при использовании 'ALTER TABLE' или 'LOAD DATA FROM...'.
О чем говорит номер версии MySQL
Версии MySQL нумеруются по следующей схеме:
111.222.333
111 | Если первая цифра изменяется, это означает, что были сделаны серьезные изменения. Они могут включать поддержку новых форматов файлов, новые протоколы, и т.д. Будьте готовы сделать некоторые модификации ваших прикладных программ перед выполнением после обновления. По крайней мере Вам придется выполнить дамп и перезагрузить Ваши таблицы. |
222 | Значительный новый код/функциональные возможности. Может включать мелочь в поддержке синтаксиса SQL или интерфейса пользователя. Вам не придется делать сильных изменений в Ваших прикладных программах, но тщательно проверьте их перед выполнением. |
333 | Маленькие безопасные изменения, которые не должны разорвать что-нибудь у сисопа на части. Самая большая проблема здесь - добавление ключевых слов SQL, которые находятся в противоречии с существующими именами таблицы. Если Вы избегаете использовать ключевые слова стандарта SQL-92 для ваших имен таблиц (так вообще-то и надо...), все должно быть ХОРОШО. |
Хорошая идея - всегда проверять файл NEWS, когда Вы загружаете новую версию. Это должно дать Вам, представление о том, что именно изменилось, начиная с вашей последней модификации.
О чем это?
В этом описании рассматривается СУБД MySQL. Руководство рассчитано на пользователей среднего уровня подготовки. Оно может быть использовано как в качестве справочного руководства по данной СУБД, так и в качестве учебника. В целях его использования в качестве справочника, в самом начале документа предусмотрено полное оглавление.
ЭТО НЕ ПЕРЕВОД ОРИГИНАЛЬНОЙ ДОКУМЕНТАЦИИ! Этот документ написан после прочтения фирменной документации, работы с пакетом и даже попыток его повалить, правда, не слишком удачных. Таким образом, в документе нашлось место и для личного мнения автора по ряду вопросов. Этот абзац мне пришлось включить на основании опыта подготовки подобной документации. Увы, описания, выстраданные кропотливым изучением программ, посчитали примитивным переводом, что говорит о том, что с ними просто не ознакомились должным образом. Я не отрицаю изучения мной оригинальной документации на пакет, но этот документ переводом не является.
С другой стороны, мне понравилась структура оригинальной документации, и я ее по, возможности, придерживался. Однако, структура-это еще не документация.
Данное описание пакета MySQL подготовлено Паутовым Алексеем Валентиновичем в качестве курсовой работы. По вопросам использования данного документа прошу обращаться по .
Я заранее приношу извинения за ошибки и неточности (если таковые здесь есть), и прошу Вас . Я постараюсь их исправить. Я не несу какой-либо ответственности за какие бы то ни было последствия применения данного документа или сведений, изложенных в нем (в частности, упоминания возможных дыр в защите СУБД). Так что, если кто-то, прочитав этот документ возьмет, да и сотрет базу данных записей этак тысяч на сто, то я тут ни при чем!
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, . Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Ну а теперь к делу...
О числах
Целые числа состоят из последовательности цифр. Плавающие числа состоят из последовательности цифр с факультативным десятичным разделителем представляемым точкой ".". В версии 3.20.X все вычисления выполняются с числами типа doubles, что приводит к тому, что большие значения типа ulonglong усекаются. В версии 3.21.X это исправлено.
О строках
Строка может иметь ' или " в качестве ограничителей.
\ является управляющим символом. Распознаются следующие управляющие последовательности:
\0 | ASCII 0. Примечание: это - 5C 30, а не 5C 00! |
\n | Новая строка. |
\t | Табуляция. |
\r | Возврат каретки. |
\b | backspace |
\' | ' |
\" | " |
\\ | \ |
\% | % (используется в строках с символами подстановки для поиска '%') |
\_ | _ (используется в строках с символами подстановки для поиска '_') |
Примеры правильных строк:
'hello' "hello" '""hello""' "'ello" "'e"l"lo" '\'hello' "This\nIs\nFour\nlines"
' в строке записывается как ''.
" в строке записывается как "".
Пример, чтобы прояснить ситуацию:
mysql> select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo"; 1 rows in set (0.01 sec) +-------+---------+-----------+-------------+--------+ | hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo | +-------+---------+-----------+-------------+--------+ | hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo | +-------+---------+-----------+-------------+--------+
Об авторе интерфейса
MySQL perl API основан на mSQL perl API версии 1.17, разработанной Андреасом Коенигом (Andreas Koenig's ).
Msqlperl разработан (C)1997 Alligator Descartes. Модифицирован Msqlperl by Michael 'Monty' Widenius. Все изменения доступны на условиях public domain. Pod-документация, на которой основана данная глава, и _InsertID
Обработка двоичных строк
Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.
СИНТАКСИС:
$scaler = $dbh->quote($binary_string)
ОПИСАНИЕ:
Конвертирует строку: пропускает все символы ' и \, а также конвертирует \0 и \n.
Обзор
СУБД MySQL предоставляет в Ваше распоряжение подмножество языка SQL, соответствующее спецификации ANSI SQL 92.
Основные цели MySQL - быстродействие и ошибкоустойчивость. Добавление транзакций принесет значительное быстродействие и повышение сложности. В настоящее время имеется проект, который должен дать подобные функциональные Это, вероятно, будет выполнено, с помощью введения атомарной модификации нескольких таблиц сразу.
Ядро, на котором сформирован MySQL - набор подпрограмм, которые использовались в высокотребовательном окружении много лет. В то время, как MySQL все еще находится в разработке, это уже предоставляет богатый и полезный функциональный набор.
Очень большие числа
Из-за ограничений perl по обработке числовых значений, Вы будете иметь проблемы при использовании чисел больше чем signed LONG (2147483647). Это может происходить при использовании в MySQL типов данных unsigned LONG (DOUBLE) или LONGLONG (BIGINT). Perl хранит возвращаемые значения как строки, но автоматически преобразуют их в числа, когда Вы используете значения в числовом контексте. Это их усечет до 2147483647, так как perl использует тип signed LONG, чтобы хранить такие числа.
Вы можете использовать один способ это обойти. Прежде всего всегда обрабатывайте значения, которые могут быть ОЧЕНЬ большими, как строки, а не как числа. Пока Вы делаете это, они могут отображаться и заново вставляться в базу данных без инцидентов. То же самое можно посоветовать для вставки новых значений в таблицы. Если Вы устанавливаете переменную, названную $tmpvar, равную "4147483647" и затем выполняете INSERT, чтобы вставить ее в базу данных, все будет нормально. Обратите внимание, что кавычки здесь очень важны, так как они заставляют perl обрабатывать значение как строку.
Если Вы должны делать вычисления, включающие большие числа, то их нужно выполнять через начальный SELECT.
Опции, задаваемые при компиляции пакета
Как и большая часть программ для unix, MySQL поставляется в виде исходного текста, который надо откомпилировать. Перед компиляцией можно произвести некоторую настройку пакета на уровне исходного текста.
Выключение альтернативных пользовательских логинов
Если вы не хотите, чтобы пользователи могли применять опцию -u для входа в mysql под другим логином, можно закомментировать в файле global.h строку:
#define SAFE_USER 1 /* Comment this if you are paranoid */
Выключение автоматического присваивания значений по умолчанию
По умолчанию MySQL автоматически назначит значение по умолчанию полям, которые явно не объявлены. MySQL будет делать это исходя из типа конкретного поля. Если Вы предпочли бы, чтобы поля с необъявленными значениями имели значение NULL, то добавьте в файл global.h строку:
#define DONT_USE_DEFAULT_FIELDS
Изменение используемой длины ключа
По умолчанию MySQL рассматривает только 1120 байтов ключа. Вы можете увеличивать это значение, редактируя файл nisam.h и изменяя значение N_MAX_KEY_LENGTH. Обратите внимание, что это может вести к снижению производительности. Нет причины делать это значение меньше, поскольку можно определить ключ, длина которого меньше указанного поля. Более подробно это рассмотрено в разделе .
Изменение порядка сортировки
По умолчанию MySQL сортирует строки согласно ISO8859-1 (latin1). Вы можете изменить это во время конфигурации, определяя следующую опцию.
--with-charset=[charset]
Где [charset] может быть один из: latin1, latin2, koi8_ru, dec8, dos, hp8, swe7, usa7.
Чтобы узнать о том, как добавлять новые наборы символов, посмотрите каталог строк в исходниках.
Обратите внимание: Если Вы меняете наборы символов уже создав базу данных, Вы будете должны выполнить isamchk с параметрами -e, и -q для всех таблиц, иначе MySQL не будет работать правильно.
OpenFile
Открывает новый поток вывода для вывода отладчика.
СИНТАКСИС:
static VOID OpenFile (name) char *name;
ОПИСАНИЕ:
Параметр name является именем нового файла (или "-" для stdout). Файл открывается, и в него назначается вывод отладчика.
OpenProfile
Открывает новый поток вывода для вывода профайлера.
СИНТАКСИС:
static FILE *OpenProfile (name) char *name;
ОПИСАНИЕ:
Параметр name задает имя файла, который открывается и назначается в качестве вывода для профайлера.
В настоящее время неясно, должно ли открытие файла усечь любой существующий файл, или просто добавлять записи в него. Последний вариант был бы желателен для сбора хронологии во время выполнения в ходе нескольких разных запусков программы. Это потребует некоторых изменений в программе анализатора.
Оптимизация запросов
Какая оптимизация выполняется для условия WHERE?
Удаление скобок (все ненужные скобки удаляются)
((a AND b) AND c OR (((a AND b) AND (c AND d)) -> (a AND b) OR (a AND b AND c AND d) Выполняется свертывание констант
(a < b AND b=c) AND a=5 -> b > 5 AND b=5 Удаление проверки условий в выражении с константами (необходимо из-за свертывания констант).
(b>=5 AND b=5) OR (b = 6 and 5 = 5) or (B=7 and 5 = 6) -> = B=5 or B=6 Если выбор невозможен, возвращаются пустые строки. Поиск всех ключей, которые могут использоваться. Используется тот ключ, который находит меньше записей. Этот ключ используется в следующих выражениях:
=, >, >= <, <=, BETWEEN и LIKE с префиксом символа 'something%' Удаляются ключи, которые не охватывают все уровни 'AND' и key_parts для которых не полностью определены требования key_parts.
key = 1 or A = 10 -> NULL (Нельзя использовать ключ) key = 1 or A = 10 and key=2 -> key = 1 OR key = 2 key_part_1 = const and key_part_3 = const -> key_part_1 = const
Читаются все константы в таблице
Постоянные таблицы:
Таблица всего с одной записью. Таблица, которая использует только другие константы из таблиц и константы на полном уникальном ключе.
const_table.key = constant
const_table.key_part_1 = const_table2.field and const_table.key_part_2 = constant
Находится лучшая комбинация присоединений для соединения таблиц (увы, методом перебора :-( ) Для каждой таблицы используется, если возможно, линейный ключ для чтения записей. Каждый индекс таблицы опрашивается на предмет существования там ключа, который охватывает < 30% записей. Если такой ключ там найдется, то он используется, иначе используется быстрое сканирование таблицы. Перед выводом каждой записи, пропускаются те, которые соответствуют предложению HAVING.
Оптимизация памяти, используемой таблицами
Есть несколько вещей, которые Вы можете сделать, чтобы минимизировать количество места, которое используют ваши таблицы. Прежде всего используйте НЕ ПУСТОЙ указатель всякий раз, когда возможно. Это ускорит запросы, и сохранит 1 бит на поле.
Вы можете сохранить много места, используя меньшие целочисленные переменные. Например, MEDIUMINT часто вполне достаточен.
Вообще Вы должны выбрать самый маленький тип данных, в котором Вы будете нуждаться, если есть проблемы с памятью.
Имейте в виду, что поля фиксированной длины в mysql обрабатываются значительно быстрее. Избегая полей переменной длины (VARCHAR, BLOBs), можно повысить эффективность на 10-200%.
Отличия между msql 2.0b7 и MySQL
CREATE TABLE:
MySQL: имеет опции для поля: UNSIGNED, ZEROFILL, имеет значение по умолчанию для не пустых полей.
mSQL: опций не имеет.
Создание индексов:
MySQL:Все индексы должны быть заданы в CREATE TABLE.
mSQL:Индексы должны быть созданы отдельным оператором CREATE INDEX. (msql использует новый файл ключа для каждого индекса?) Индексы могут быть удалены оператором DROP INDEX
Для получения уникального идентификатора при вставке:
MySQL: Используйте 'auto_increment' как определение типа столбца. Используемый индекс может быть получен после обновления функцией API mysql_insert_id().
mSQL: Создает структуру SEQUENCE для таблицы и использует функцию __seq для получения уникального индекса.
Групповые функции:
MySQL: count(), avg(), min(), max() и sum(). min() и max() могут принимать строковые аргументы. count(*) оптимизирована для возвращения значения в случае одного столбца.
mSQL: Нет.
Независимый от регистра поиск:
MySQL: LIKE обязательно не зависит от регистра. Если возможно, MySQL использует индексы при условии, что подобный параметр не начинается с подстановочных знаков.
mSQL: Использует CLIKE.
Поиск с регулярными выражениями.
MySQL: Использует REGEXP or RLIKE
mSQL: Использует RLIKE.
Какие различия в операторе WHERE:
MySQL имеет скобки, Скоро он будет иметь полную функциональную поддержку оператора WHERE (это планируется для версии 3.21.X).
Имена столбцов:
MySQL: Если имя столбца уникально, Вы не должны использовать полное имя.
mSQL: При использовании более чем одной таблицы в SELECT, Вы должны использовать полное имя таблицы.
Псевдонимы:
MySQL: Псевдонимы для таблиц и столбцов.
mSQL: Псевдонимы для таблиц.
Insert/update с вычислениями:
MySQL: Полная поддержка вычислений. В insert можно использовать значения предшествующих полей.
mSQL: Только константы в insert и update.
Какие формулы могут использоваться в инструкции select:
MySQL: См. руководство.
mSQL: Никакие.
HAVING:
MySQL: Поддерживается, но может использовать вычисление только на выбранных полях. Для select на расчетном значении, нужно использовать псевдоним столбца.
ПРИМЕР:
SELECT COUNT(*) AS id_count, id FROM groups GROUP BY id HAVING id_count > 10
mSQL: Не поддерживается вовсе.
Импорт и экспорт данных:
MySQL: MySQL имеет соответствующие функциональные возможности, включая сервис для импорта данных посредством оператора LOAD DATA INFILE, что весьма ускоряет загрузку данных.
mSQL: Внешние программы.
Perror
Выводит короткое текстовое объяснение числового кода ошибки.
СИНТАКСИС:
$ perror [-?vIV] [errorcodes]
ОПИСАНИЕ:
Программа perror предоставляет короткие текстовые объяснения числовых кодов ошибок, возвращаемых системой или СУБД MySQL.
Программа perror поддерживает опции:
-? or -I | Справка. |
-v | Подробная информация. |
-V | Информация о версии. |
Моделирование perror для систем, которые его не имеют.
СИНТАКСИС:
static VOID perror (s) char *s;
ОПИСАНИЕ:
Perror выдает сообщение в стандартный поток ошибки, которое обеспечивает большее количество информации относительно библиотеки или ошибки системы. Выводится сообщение, заданное строкой s, затем ': ', сообщение об ошибке и перевод строки (\n).
Недокументированная возможность Unix perror сводится к тому, что если 's' является пустой строкой (но не NULL!), то не выводится ': '.
Эта версия выдает сообщение только о "неизвестной ошибке системы".
Подготовка
Вы должны подключить файл mysql.h в начале Вашей программы на C:
#include "mysql.h"
Вы также должны компоновать программу с математической (для шифрования) и mysqlclient библиотеками:
$ cc -I/usr/include/mysql -L/usr/lib/mysql myapp.c -o myapp -lm -lmysqlclient
Включаемые файлы обычно размещены в /usr/include/mysql, а библиотеки могут быть найдены в /usr/lib/mysql.
Если Вы имеете утечку памяти в вашей программе-клиенте, Вы можете компилировать с опцией --with-debug=yes. Это заставит код клиента использовать пакет 'safe_malloc' в библиотеке клиентов MySQL. Вызовите TERMINATE(stdout) или my_end(1) в вашей прикладной программе-клиенте перед выходом, чтобы получить список всех утечек памяти. Детали - в файле mysys/safemalloc.c из дистрибутива MySQL.
Рассмотрим простой пример MySQL-клиента, который только выполнит SELECT и выведет все возвращенные строки в STDOUT. В нем использованы далеко не все функции С API, он должен только дать Вам представление о типичном виде программы-клиента.
#include <stdio.h> #include <stdlib.h> #include "mysql.h" MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; void exiterr(int exitcode) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(exitcode); } int main() { uint i = 0; if (!(mysql_connect(&mysql,"host","username","password"))) exiterr(1); if (mysql_select_db(&mysql,"payroll")) exiterr(2); if (mysql_query(&mysql,"SELECT name,rate FROM emp_master")) exiterr(3); if (!(res = mysql_store_result(&mysql))) exiterr(4); while((row = mysql_fetch_row(res))) { for (i=0 ; i < mysql_num_fields(res); i++) printf("%s\n",row[i]); } if (!mysql_eof(res)) exiterr(5); mysql_free_result(res); mysql_close(&mysql); }
Подробно о таблицах
Для получения описания таблицы используйте команду (Вы должны перейти в каталог, который содержит таблицу, информацию о которой Вы желаете получить. Вообще это будет $DATADIR/[dbname], где dbname - имя базы данных, которая содержит таблицу.):
prompt> isamchk -d table_name ISAM file: table_name Data records: 215 Deleted blocks: 0 Recordlength: 85 Record format: Packed table description: Key Start Len Index Type 1 37 14 unique text packed stripped 2 1 30 multip. text packed stripped 3 51 4 multip. long 4 31 2 multip. short 33 2 short 35 2 short
Для более подробных сведений о таблице попробуйте: prompt> isamchk -d -v table_name
ISAM file: Customer Isam-version: 2 Creation time: 1996-12-17 21:40:04 Data records: 0 Deleted blocks: 0 Datafile: Parts: 0 Deleted data: 0 Datafilepointer (bytes): 4 Keyfile pointer (bytes): 3 Recordlength: 374 Record format: Packed table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 2 unique short -1 1024 1 2 4 80 multip. text packed stripped -1 1024 1 3 2 2 multip. short -1 1024 1
Объяснение полученного результата:
ISAM file | Имя ISAM-файла. |
Isam-version | Версия ISAM формата. Сейчас всегда 2. |
Creation time | Когда файл данных был создан? |
Recover time | Когда в последний раз был восстановлен файл индекса/данных? |
Data records | Сколько записей/строк. |
Deleted blocks | Сколько удаленных блоков все еще занимают место? См. примеры в разделе по isamchk для информации относительно избавления от неиспользуемого места. |
Datafile: Parts | Для динамической записи это показывает, сколько блоков данных в ней. Для оптимизированной таблицы без дырок это будет то же, что и Data records. |
Deleted data | Сколько всего байт занимают удаленные данные. |
Datafilepointer | Сколько байтов занимает указатель файла данных? Это 2, 3 или 4 байта. Большинство таблиц обходится 2 байтами, но это не может управляться из MySQL. Для фиксированных таблиц это адрес записи. Для динамических таблиц это адрес байта. |
Keyfile pointer | Сколько байтов занимает указатель файла данных? Это обычно 1, 2 или 3 байта. Большинство таблиц обходится 2 байтами, но это вычисляется mysql автоматически. Это всегда адрес блока. |
Max datafile length | Сколько байт может использовать для этой таблицы файл данных (.ISD). |
Max keyfile length | Сколько байт может использовать для этой таблицы файл ключей. |
Recordlength | Сколько пробела занимает каждая запись/строка? |
Record format | Какой формат имеет каждая запись/строка? |
table description | Список всех ключей в таблице. Для каждого ключа выводится краткая информация низкого уровня (большее количество информации в следующей таблице). |
Краткая информация низкого уровня для каждого ключа:
Key | Номер ключа. |
Start | Где в записи/строке начинается индексная часть. |
Len | Какой длины индексная часть? Для упакованных чисел это всегда полная длина поля. Для строк она может быть короче полной длины (хотя MySQL все же не поддерживает такой вариант). |
Index | unique или multip. |
Type | Какой тип данных имеет эта индексная часть? Это - C тип данных (опционально packed или short). |
Root | Адрес корня индексного блока. |
Blocksize | Размер каждого индексного блока. По умолчанию 1024, но это может быть изменено во время компиляции. |
Rec/key | Статистическое значение, используемое оптимизатором. Оно сообщает, сколько записей приходится на этот ключа. Уникальный ключ всегда имеет значение 1. Это может измениться после того, как таблица загружена и стабилизирована, используя isamchk -a . По умолчанию 30. |
Портирование кода из mSQL в MySQL
Перенос прикладных программ mSQL в MySQL относительно прост.
Сначала выполните скрипт msql2mysql (поставляется вместе с MySQL) над вашим источником. Он оттранслирует имена функций mSQL в имена функций MySQL. Но он не будет корректировать типы параметров или изменять число параметров в функциях MySQL, которые нуждаются в дополнительных параметрах.
Замечания:
MySQL использует структуру данных MYSQL как тип для соединения с базой данных (mSQL использует int). mysql_connect получает указатель на структуру MYSQL как параметр. Вы можете определять его глобально или использовать malloc, чтобы его получить. mysql_connect получает 2 дополнительных параметра (логин и пароль пользователя). По умолчанию, они установлены в NULL. mysql_error получает параметр типа MYSQL.
MySQL поставляется с портированными версиями тестовых программ mSQL insert_test.c и select_test.c. Хорошая идея сравнить их с их mSQL эквивалентами. Это должно дать Вам хорошее начало для понимания, что Вы будете должны сделать для портирования mSQL программы в MySQL. Это также даст Вам некоторые мысли о том, что Вы должны делать, чтобы написать свою MySQL программу.
Потерянные значения
Всякий раз, когда обработчик, который обеспечивает доступ к базе данных, обрабатывает потерянное значение, Mysql выбирает соответствующее действие (освобождает результат или закрывает подключение к базе данных). Так, если Вы хотите освободить результат или закрыть подключение, Вы можете делать одно из следующих действий:
Разопределить дескриптор Использовать дескриптор для другой цели Использовать дескриптор внутри блока и объявите его с my() Выйдите из программы
Потоки в Linux
Когда MySQL запущен на Linux системе и использует потоки Linux, Вы будете видеть минимум три процесса. Фактически, это потоки. Будет иметься один поток для Linux Threads manager, один, чтобы обрабатывать подключения и один, чтобы обработать сигналы.
Предоставление доступа к базам данных
СУБД MySQL использует специальную базу данных для предоставления прав доступа к своим базам данных. Эти права могут базироваться на именах серверов и/или пользователей и предоставляться для одной или нескольких баз данных
Пользовательские аккаунты могут быть снабжены паролями. При обращении к базе данных, пароль шифруется. Поэтому он не может быть перехвачен и использован посторонним (это мнение автора СУБД...).
СУБД MySQL имеет три таблицы, а именно:
База данных: mysql Таблица: db
Хост | char(60) | PRI | |||
Db | char(32) | PRI | |||
Пользователь | char(16) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Хост | char(60) | PRI | |||
Db | char(32) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
База данных: mysql Таблица: user
Хост | char(60) | PRI | |||
Пользователь | char(16) | PRI | |||
Пароль | char(8) | ||||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N | |||
Reload_priv | char(1) | N | |||
Shutdown_priv | char(1) | N | |||
Process_priv | char(1) | N | |||
File_priv | char(1) | N |
Пример добавления новых пользователей:
$ mysql mysql mysql> INSERT INTO user VALUES ('%','monty',password('something'), -> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user (host,user,password) values('localhost','dummy',''); mysql> INSERT INTO user VALUES ('%','admin','','N','N','N','N','N','N','Y','N','Y','N'); mysql> quit $ mysqladmin reload
Добавлено три новых пользователя (юзверя):
monty: Суперпользователь (администратор), должен использовать пароль, для работы с mysql.
dummy: Должен быть допущен к индивидуальной базе данных по таблице 'db '.
admin: Не нуждается в пароле, но разрешено выполнение только команд 'mysqladmin reload' and 'mysqladmin processlist'. Может быть допущен к индивидуальной базе данных через таблицу 'db'.
ВНИМАНИЕ! Вы ДОЛЖНЫ использовать функцию password() при создании пользователя, имеющего пароль. СУБД MySQL ожидает получить зашифрованный пароль.
Атрибуты, установленные в таблице пользователей перекрывают атрибуты, установленные в таблице DB. Если сервер поддерживает много баз данных, лучше создавать пользователей без прав доступа в таблице пользователей и назначать им права доступа к базе данных по таблице db.
Если Вы используете MIT threads package, обратите внимание, что имя localhost не будет работать, так как MIT threads package не поддерживает socket-подключения. Это означает, что Вы должны всегда определять ваш hostname (имя сервера) при подключении, даже если Вы работаете с одним и тем же сервером.
Следует помнить следующие правила при настройке прав доступа:
Имя сервера и поля в таблице db могут содержать регулярные выражения языка SQL: символы % и _. В других полях использовать их нельзя. Имя сервера может быть доменным именем, именем localhost, IP адресом или SQL выражением. Пустое поле "имя сервера" означает любой сервер. Поле db является именем базы данных или SQL выражением. Пустое имя пользователя эквивалентно любому пользователю. Пустой пароль эквивалентен любому паролю. Вы можете создать суперпользователя (super-user) установив все права для него в 'Y' в таблице пользователей при создании этого аккаунта. Этот пользователь сможет делать что угодно, не считаясь со значениями, установленными в таблице DB! Таблица серверов проверяется только когда в таблице db поле "имя сервера" пустое. Все таблицы, по возможности, сортируются в порядке host-user-db.
Пользователь | Сортируется по именам серверов и пользователей. |
db | Сортируется по именам серверов, пользователей и баз данных. |
Сервер | Сортируется по именам серверов и баз данных. |
Проверка таблицы баз данных будет выполнена для пользователя '' (пустое имя), а не для пользователя Джо, даже если пользователь, Джо имеет запись в таблице доступа к базам данных (db таблице).
Создание пользовательских аккаунтов - вероятно, наиболее путающий аспект СУБД MySQL, (особенно, если никогда не имел с ней дела), так что не удивляйтесь, если потребуется некоторое время, чтобы во всем разобраться и получить парочку несколько неприятных сюрпризов. Использование программы делает управление доступом несколько более ясным.
Вообще лучше избегать использования регулярных выражений SQL в полях имени сервера. Это упрощает отладку.
Конкретно, установите все поля "имя сервера" в '%' и очистите таблицу серверов. Как только все начнет нормально функционировать, можно начинать эксперименты с добавлением имен серверов в таблицу серверов в случае такой необходимости.
Если получено сообщение об ошибке 'Access denied', то скорее всего вы нормально связались с демоном mysqld, но имеете неправильную информацию в вашей таблице пользователей.
Эта библиотека обязательно должна быть
MySQL использует библиотеку libmysql.a, написанную Михаэлем Видениусом (Michael Widenius). Эта библиотека обязательно должна быть установлена до использования этого интерфейса с perl.
базы данных
Это простой пример того, как может выглядеть вполне типичная база данных.
В проектировании базы данных первое дело, которое Вы должны сделать, это вычислить последовательность действий, необходимых Вам для решения поставленной задачи. В SQL это может выглядеть так:
Присоединения
Свойство объединения SQL дает способность определить связи между таблицами и отыскивать) информацию, основанную на этих связях.
Связи перечисляются в предложении FROM запроса SELECT. Каждая связь отделяется запятой.
ПРИМЕР:
$ mysql mysql Welcome to the mysql monitor. Commands ends with ; or \g. Type 'help' for help. mysql> SELECT db.user, db.delete_priv, user.user, user.delete_priv -> FROM db,user WHERE db.user = user.user;
Этот запрос соединит таблицы db и user посредством поля user. Это распечатает что-то вроде следующего:
+------+-------------+------+-------------+ | user | delete_priv | user | delete_priv | +------+-------------+------+-------------+ |mke | N | mke | N | +------+-------------+------+-------------+
Первые два поля фактические db.user и db.delete_priv , последние два user.user и user.delete_priv.
Обратите внимание, что мы используем имена таблицы в нашем запросе, чтобы определить точно, с какими полями мы работаем.
Вы можете объединить до пятнадцати таблиц в одном объединении.
MySQL не будет использовать ключи, чтобы соединить таблицы посредством полей, которые не имеют идентичный тип. Это означает, что Вы должны всегда использовать те же самые типы для полей, которые предназначены, для использования в объединениях.
Псевдонимы могут также использоваться для имен столбца. См. детали в следующем разделе.
Простой интерфейс с perl СУБД MySQL
Этот интерфейс представляет собой первый способ обратиться к базе данных MySQL из программы на perl.
Коротко о главном:
use Mysql;
$dbh = Mysql->Connect; $dbh = Mysql->Connect($host); $dbh = Mysql->Connect($host,$database); $dbh = Mysql->Connect($host,$database,$password); $dbh = Mysql->Connect($host,$database,$password,$user); $dbh->SelectDB($database);
$sth = $dbh->ListFields($table); @arr = @{$sth->name}; @arr = @{$sth->length}; $value = $sth->numfields; @arr = @{$sth->type}; @arr = @{$sth->is_num}; @arr = @{$sth->is_blob}; @arr = @{$sth->is_not_null};
$sth = $dbh->Query($sql_statement); @arr = $dbh->ListDBs; @arr = $dbh->ListTables; @arr = $sth->FetchRow; %hash = FetchHash $sth; $sth->DataSeek($row_number); $scalar = $dbh->sock; $scalar = $dbh->host; $scalar = $dbh->database; $scalar = $dbh->quote($binary_string);
Ну что, всем все ясно? Кому еще не ясно, объясняю.
При разработке этого пакета, его старались сделать как можно более похожим на C API.
Вы будете иметь дело с двумя классами: Mysql::Statement работаете с ним через операторный дескриптор, возвращенный командами Query или ListFields. Единственный класс, который Вы называете явно - Mysql. Это предоставляет Вам команду Connect.
Протокол клиент/сервер
На всякий случай приведу подробное описание протокола "клиент-сервер", используемого пакетом MySQL для связи между клиентом и сервером базы данных.
Обозначения
< = клиент > = сервер [] 1 байт [2: ] 2 байта (нижний байт первый) [3: ] 3 байта (нижний байт первый) [4: ] 4 байта (нижний байт первый) [string: ] строка, кончающаяся нулем. [length: ] длина целого числа. Проверьте Net_store_length() для этого! Идея в том, чтобы наиболее часто получать данные длиной в 1 байт, но допускать и более длинные данные (и NULL).
Детальное описание
Каждый передаваемый пакет имеет следующий префикс:
[3: длина пакета] [номер пакета] данные
При приеме пакета добавляется [0] после каждого принятого пакета, чтобы получить простую обработку строк ошибки.
Номера пакетов начинаются с 0 и увеличиваются для каждого посланного/полученного пакета.
Типы пакетов
:connect
> [protocol version] [string: password crypt seed] < [2: 0] [3: max_allowed_client_packet_length] [string: user name] [string: scrambled password] > ok packet
Посмотрите в файле password.c из исходников MySQL какой метод используется для шифрования паролей. Пароль должен быть пустым, если пользователь не имеет никакого пароля.
:ok
[0] [length: affected_rows] [length: unique id]
:error
Может приходить в любое время.
> [255] [string: error message]
:command
< [command number]
enum enum_server_command{SLEEP,QUIT,INIT_DB,QUERY,FIELD_LIST, CREATE_DB,DROP_DB,RELOAD,SHUTDOWN,STATISTICS, PROCESS_INFO,CONNECT}
:query
< [QUERY command] [string: query string] (The end null is not sent) > [0] [length: affected rows] [length: insert id] (Insert, delete...)
или:
> [length: column_count] (a query result) > column field data packets > row data packets
:data
: Данные передаются пока не придет пакет, который состоит только из одиночного символа [254]. Остерегайтесь: могут иметься пакеты, которые начинаются с символа 254! Каждый пакет типа 'data' имеет поле 'column count'.
Формат каждого поля:
[:length] == NULL_LENGTH -> NULL field
или:
[:length] [length data] (Строка не оканчивается на \0!)
Пакет данных столбца состоит из 5 столбцов со следующими данными:
[:string table name] [:string column name] [:3 create length of column (may be larger in a few cases)] [:1 type (as of enum_field_types)] [:1 flag] [:1 decimals] (2 байта!)
При использовании команды list_fields имеется шестой столбец:
[:string default]
Посмотрите в файлах libmysql.c, net.c и password.c более подробную информацию о форматах пакетов.
Псевдонимы
СУБД MySQL поддерживает концепцию псевдонимов для таблиц и полей.
Псевдонимы для таблиц являются стандартной частью языка SQL.
ПРИМЕР:
SELECT A.user,A.select_priv,A.insert_priv,A.update_priv FROM user A
В этом примере использован псевдоним таблицы, чтобы сократить ваш запрос, объявляя псевдоним, который короче имени таблицы. Вы используете псевдоним в первой части выбора, и определяете это в FROM, определяя реальное имя таблицы, пробел и псевдоним. Если Вы имеете больше чем одну таблицу, для которой Вы желаете создать псевдоним, просто добавьте запятую после каждой пары имя/псевдоним таблицы.
Если Вы используете псевдонимы с запросом, который будет иметь предложение WHERE, Вы должны использовать псевдоним в предложении WHERE вместо реального имени таблицы.
Псевдонимы для полей таблицы - специфическое для MySQL расширение.
ПРИМЕР:
SELECT user.user AS "User Name", user.delete_priv AS "Delete" FROM user;
Одно хорошее дело, которое делают псевдонимы поля - это то, что они позволяют Вам определять более дружественные метки для вашего вывода. Результат вышеупомянутого запроса мог бы окончательно выглядеть примерно так:
+-----------+--------+ | User Name | Delete | +-----------+--------+ | root | Y | | mke | N | | dummy | N | | admin | N | +-----------+--------+
Хороший совет - брать псевдонимы в кавычки, в данном примере "Delete" вызвало бы ошибку синтаксического анализа при применение без кавычек. (Это потому, что DELETE является ключевым словом SQL.
PushState
Сохраняет текущее состояние в стеке и устанавливает новое.
СИНТАКСИС:
static VOID PushState()
ОПИСАНИЕ:
Сохраняет текущее состояние в стеке и устанавливает новое. Единственным параметром, унаследованным из предыдущего состояния является уровень вложения функции. Это можно отменить флажком "r".
Стек состояния это связанный список состояний, с новым состоянием, добавленным в начало. Это позволяет стеку расти до самых границ памяти в случае необходимости.
Query
Выполнить запрос.
СИНТАКСИС:
sth = $dbh->Query($sql_statement);
ОПИСАНИЕ:
Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.
ПРИМЕР:
$sth = $dbh->Query("SELECT * FROM Widget_Table WHERE widget_id = 1") or die $Mysql::db_errstr; $foo = $record[0]; $bar = $record[1]; }
Хорошая идея - всегда проверить ошибки. В этом примере такой проверкой занимается блок "or die..." оператора Query.
Replace
СИНТАКСИС:
replace [-?svIV] from to from to ... -- [files]
ОПИСАНИЕ:
Программа program используется скриптом msql2mysql. Replace может быть использована для замены строки на месте в файле или получать строку через канал (пайп), производить замену и выводить результат в STDOUT.
Допустимы следующие опции:
-? | Справка. |
-s | Работать молча (никаких статусных сообщений). |
-v | Подробная информация о ходе работы (выводить дополнительные сообщения). |
ПРИМЕРЫ:
replace Apple Orange somefile
Заменит все вхождения Apple на Orange в файле somefile.
cat INFILE | replace Apple Orange Blimp Train > OUTFILE
Все вхождения Apple в файле INFILE будут заменены на Orange и результат выведен в файл OUTFILE. В то же время, все вхождения Blimp в файле INFILE будут заменены на Train и тоже выведены в файл OUTFILE. Таким образом, можно заменять более чем одно выражение за один проход.
Вы можете использовать специальные символы во входных строках:
\^ | Соответствует началу строки. |
\$ | Соответствует концу строки. |
\b | Соответствует пробелу. Может появляться или отдельно, или в начале, или в конце лексемы. Если \b используется в конце лексемы, следующие замены начнутся после пробела. \b соответствует только пробелу. |
Replace простая и очень полезная утилита с большими потенциальными возможностями использования в MySQL.
ROP INDEX
СИНТАКСИС:
DROP INDEX index_name
ОПИСАНИЕ:
Эта команда ничего не делает. Чтобы удалить индекс, Вы должны использовать команду .
DROP INDEX предусмотрен по причине совместимости. Это вводит в заблуждение некоторые клиенты, которые думают, что получили то, что они просили. Прежде всего это касается тупых ODBC драйверов.
Safe_mysqld
Скрипт для запуска демона mysqld.
СИНТАКСИС:
safe_mysqld [options to mysqld]
ОПИСАНИЕ:
Этот скрипт обычно выполняется при начальной загрузке, чтобы запустить mysqld. Если Вы не хотите, чтобы ваш DATADIR был помещен в иерархии каталога MySQL, что и mysqld, Вы должны подправить DATADIR в этом скрипте.
SELECT
СИНТАКСИС:
SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,... [FROM tables... [WHERE where_definition] [GROUP BY column,...] [ORDER BY column [ASC | DESC], ...] HAVING full_where_definition [LIMIT [offset,] rows] [PROCEDURE procedure_name]] [INTO OUTFILE 'file_name'... ]
Здесь where_definition:
where_definition: where_expr or where_expr [AND | OR] where_expr
where_expr имеет формат:
where_expr: column_name [> | >= | = | <> | <= | <] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition)
ОПИСАНИЕ:
Оператор SELECT является краеугольным камнем всего языка SQL. Он используется, чтобы выполнить запросы к базе данных. Это действительно основа языка SQL. Для хорошего общего учебника о том, как работает SELECT, посмотрите of the SELECT Statement.
В MySQL версии меньше 3.21.x предложение WHERE очень ограничено. HAVING будет работать там, где предложение WHERE ничего не делает. Некоторые примеры, которые не работают в предложении WHERE - REGEXP и операторе !. В основном, Вы не можете использовать функции с WHERE, но Вы можете использовать функции с HAVING.
HAVING по существу, WHERE применительно к результатам. Он используется главным образом для узкой области данных, возвращенных запросом.
Вы должны иметь права select для использования SELECT.
SelectDB
Выбор базы данных для использования.
СИНТАКСИС:
$dbh->SelectDB($database);
ОПИСАНИЕ:
Если база данных не выбрана в команде Connect, или если нужно связаться с другой базой данных, то используется дескриптор базы данных из предыдущего вызова команды Connect. Он используется командой SelectDB.
SET OPTION
СИНТАКСИС:
SET OPTION SQL_VALUE_OPTON=value, ...
ОПИСАНИЕ:
Меняет или устанавливает опции MySQL. Опции действуют только в пределах текущего сеанса.
MySQL поддерживает следующие опции (в этой версии пока одну):
SQL_SELECT_LIMIT=value | Максимальное число записей, которое возвращает SELECT. Если SELECT имеет параметр LIMIT, то используется значение из этой опции. |
SHOW
СИНТАКСИС:
SHOW DATABASES [LIKE wild] SHOW KEYS FROM table_name SHOW TABLES [FROM database] [LIKE wild] SHOW [COLUMNS|FIELDS] FROM table [FROM database] [LIKE wild]
ОПИСАНИЕ:
Отображает информацию о базе данных MySQL. "wild" эквивалент регулярному выражению для SQL LIKE.
ПРИМЕР:
$ mysql WidgetDB Welcome to the mysql monitor. Commands ends with ; or \g. Type 'help' for help. mysql> SHOW fields FROM Widget_Table from WidgetDB; 6 rows in set (0.34 sec) +--------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-----+---------+----------------+ | widget_id | mediumint(8) | | PRI | 0 | auto_increment | | widget_name | char(60) | | MUL | | | | widget_color_id | mediumint(8) | | MUL | 0 | | | widget_size_id | mediumint(8) | | | 0 | | | widgets_on_hand | smallint(5) | | | 0 | | | widget_price | float(8,2) | | | 0.00 | | | commission_percent | float(4,2) | | | 0.00 | | +--------------------+--------------+------+-----+---------+----------------+ mysql>
Первые два поля довольно очевидны. Null будет содержать YES, если это поле может быть равным NULL, Key сообщает имеет ли это поле индекс, Default сообщает Вам значение по умолчанию, которое будет назначено этому полю, если там ничего не окажется после выполнения команды INSERT, Extra указывает другие атрибуты поля, такие как AUTO_INCREMENT, например.
Символы флажка отладки:
d | Разрешает вывод из макроса DBUG_ для текущего состояния. Может сопровождаться списком ключевых слов, который разрешает вывод только для DBUG макрокоманд с соответствующим ключевым словом. Пустой список ключевых слов подразумевает вывод для всех макрокоманд. |
D | Ждать после каждой выведенной отладчиком строки. Аргумент задает число десятых долей секунды, которое нужно ждать. Например, -#D,20 задает паузу в 2 секунды. |
f | Ограничивает отладку и/или трассировку списком имен функций. Обратите внимание, что пустой список отключит все функции. Соответствующий флажок "d" или "t" должен все же быть дан, поскольку этот флажок только ограничивает их действие, если они включены. |
F | Идентифицируют имя исходного файла для каждой строки отладки или трассирует вывод. |
i | Идентифицируют процесс с pid для каждой строки отладки или трассирует вывод. |
g | Включить профилирование. Создайте файл 'dbugmon.out', содержащий информацию, которая может использоваться, чтобы профилировать программу. Может сопровождаться списком ключевых слов, которые выбирают профилирование только для функций в этом списке. Пустой список подразумевает, что все функции подлежат профилированию. |
L | Идентифицирует номер строки исходного файла для каждой строки отладки или трассирует вывод. |
n | Выводит текущую глубину вложенности функции для каждой строки отладки или трассирует вывод. |
N | Номер каждой строки вывода отладки. |
o | Переназначает выходной поток отладчика в файл. По умолчанию задан stderr. |
O | То же, что и o, но файл сбрасывается между записями. То есть, после каждой записи файл закрывается, и снова открывается только перед следующей записью. Тормозит, конечно, кошмарно, но зато гарантирует сохранность данных в этом файле на случай слета системы. Что при отладке не бесполезно... |
p | Ограничивает действия отладчика определенными процессами. Процесс должен быть указан в макросе DBUG_PROCESS и совпадать с одной из записей в списке действий отладчика. |
P | Выводит имя текущего процесса для каждой строки отладки или трассирует вывод. |
r | При установке нового состояния отладки не наследует предыдущее состояние вложенности функции. Полезно, когда вывод должен начаться в левом поле. |
S | Функция _sanity(_file_, _line_) для каждой отлаживаемой функции до _sanity() возвращает отличное от 0 значение. Обычно используется с safemalloc. Как задается это значение, и что оно вообще значит в документации не сказано (!!!), а опытным путем это установить не удалось. |
t | Включить функцию трассировки строк вызова и выхода (call/exit). Может сопровождаться списком, содержащим число номер максимального уровня трассировки, вне которого никакого вывода не произойдет для отладочных или трассировочных макрокоманд. Умолчание задается при компиляции. |
Некоторые примеры строк управления отладкой:
-#d:t -#d:f,main,subr1:F:L:t,20 -#d,input,output,files:n
Смена порта
Сменить порт, к которому присоединился MysqlPerl можно так:
$ENV{"MYSQL_TCP_PORT"}=3334; $ENV{"MYSQL_UNIX_PORT"}="/tmp/mysql_new.sock"; use Mysql; $dbh = Mysql->Connect($host);
Static_strtok
СИНТАКСИС:
static char *static_strtok (s1, separator)
ОПИСАНИЕ:
Аналог strtok, но 2 разделителя в строке заменены на 1 для совместимости с именами каталогов, принятыми в DOS.
StrDup
Создает копию строки в новой области памяти.
СИНТАКСИС:
static char *StrDup (string) char *string;
ОПИСАНИЕ:
Параметр string задает строку, копия которой нужна. Функция распределяет количество памяти, достаточное для создания копии строки и копирует строку в эту область памяти. Сбой при распределении памяти фатален.
Таблицы
# The Widget table. # # Detailed information on a widget. Linked to by Purchase_Order_Item # by way of the widget_id field. Linked to Widget_Color by way of # the widget_color field, and to the Widget_Size table by way of the # widget_size field. CREATE TABLE Widget_Table ( widget_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT, widget_name CHAR(60) NOT NULL, widget_color_id MEDIUMINT(8) NOT NULL, widget_size_id MEDIUMINT(8) NOT NULL, widgets_on_hand SMALLINT NOT NULL, widget_price FLOAT(8,2) NOT NULL, commission_percent FLOAT(2,2) NOT NULL, PRIMARY KEY (widget_id), KEY (widget_name), KEY (widget_color_id,widget_size_id) );
Первая строка сообщает СУБД MySQL, что мы определяем таблицу по имени Widget_Table. Следующие шесть строк определяют поля, которые таблица содержит, тип данных, которые входят в них, и какие атрибуты эти поля имеют.
Прежде, чем Вы сможете создать эту таблицу, Вы должны создать пустую базу данных. В MySQL это выполнено посредством программы .
prompt> mysqladmin create Widget-DB
Одна из множества основных концепций в хорошем проекте реляционной базы данных это то, что Вы никогда не должны хранить избыточные данные. В случае Widget_Table это отражено в полях Widget_color_id и widget_size_id. Эти два поля могли бы быть строками. Взамен мы делаем их указателями на другие таблицы, которые будут содержать одну запись для каждого возможного значения, которое может содержать такое поле.
Это сделано по двум причинам:
Непротиворечивость Централизация сложности
Первая причина - фактически подслучай второй. Гораздо проще поддержать непротиворечивость в базе данных, если Вы используете таблицы, чтобы искать значения. Это будет предохранять людей от создания прикладных программ, которые используют все от "L" до "HUGE", чтобы обозначить, что размер рассматриваемого объекта большой.
Widget_id поле - среда (3 байт) установленное по размеру целое число. Это имеет специальные атрибуты NOT NULL и AUTO_INCREMENT. NOT NULL является ANSI SQL стандартом и определяет что, когда кто-то вводит widget информацию в эту таблицу, они должны дать некоторое значение для этого поля. Если не дали, MySQL назначит полю значение по умолчанию. Конечно, если значение по умолчанию было определено, то будет использоваться оно, когда не задано никакого значения. Если же оно не определено, то поле получит значение, исходя из его типа.
AUTO_INCREMENT специфический атрибут MySQL. Если Вы вставляете ноль в это поле MySQL, автоматически назначит значение, которое на единицу выше, чем самое высокое предыдущее значение, назначенное к этому полю в этой таблице. Это простой метод для производства уникальных идентификаторов для нового widgets, поскольку они введены в таблицу.
Мы также определяем несколько ключей. Когда Вы назначаете полю атрибут AUTO_INCREMENT, Вы должны также определить это поле как первичный ключ. Вы можете иметь только один первичный ключ на таблицу. Только одно поле на таблицу может иметь AUTO_INCREMENT атрибут.
Мы также создаем вторичные индексы использованием слова KEY. Индексирование значительно увеличивает быстродействие запросов и объединений. Индексы могут включать больше чем одно поле. Если Вы имеете индекс, который включает больше чем одно поле, Вы не нуждаетесь в создании другого индекса с первым полем в составном индексе.
Мы определили Widget_Table. Теперь надо определить путь слежения за заказами. Для этой цели мы определяем таблицу Purchase_Order.
# The Purchase Order table. # # customer_id links us to the Customer_Table # Where we can get more information about the customer. # # To allow for N items on a Purchase order we have to # have another table called Purchase_Order_Item that # we link to be way of purchase_order. CREATE TABLE Purchase_Order ( purchase_order MEDIUMINT(8) NOT NULL AUTO_INCREMENT, customer_id SMALLINT NOT NULL, order_date DATE NOT NULL, due_date DATE NOT NULL, close_date DATE NOT NULL, status_code TINYINT(2) UNSIGNED NOT NULL, last_action_date TIMESTAMP, PRIMARY KEY (purchase_order), KEY (customer_id,order_date,status_code) );
Мы считаем, что заказчик собирается заказывать у нас товар более чем однажды. По этой причине вместо записей об адресе и имени заказчика, мы назначаем каждому заказчику уникальный номер идентификации, который связывает нас со входом в таблице, которая содержит эту информацию. Мы назовем эту таблицу Customer. О ней поговорим немного позже. Также обратите внимание, что мы не имеем никакого упоминания о widgets в этой таблице. Это потому, что порядок приобретения может быть разным. Мы могли бы только определить некоторое фиксированное число способов покупки, но это не будет очень гибко. Взамен этого мы определяем поле, названное purchase_order, которое будет содержать уникальный номер для каждого способа приобретения. Затем мы определяем другую таблицу, которая будет содержать один вход для каждого значения порядка покупки.
Еще одно интересное поле last_action_date. Это поле имеет тип TIMESTAMP. Поля этого типа автоматически модифицируются всякий раз, когда на них выполняется команда INSERT или UPDATE. Это показывает, когда запись была в последний раз изменена.
Таблица для Purchase_Order_Item:
# The Purchase_Order_Item table. # # Since there can be more than one item on a purchase order # we need a table that contains a single item. We link back to # The main Purchase_Order table by use of the purchase_order field. # # We can also link back to the Widget_Table table by use of the # widget_id field. # # Last of all we link to the Status table by way of the status_code field. CREATE TABLE Purchase_Order_Item ( purchase_order SMALLINT NOT NULL, order_sequence SMALLINT NOT NULL, widget_id MEDIUMINT(8) NOT NULL, quantity SMALLINT(4) UNSIGNED NOT NULL, status_code TINYINT(2) UNSIGNED NOT NULL, order_date DATE NOT NULL, item_due_date DATE NOT NULL, deliver_date DATE NOT NULL, last_action_date TIMESTAMP, PRIMARY KEY (purchase_order,order_sequence), KEY (widget_id), KEY (status_code,order_date) );
В таблице Purchase_Order_Item хранится информация о всех элементах поля способа покупки. Здесь хранится информация о том кто, когда, что и сколько заказывал.
Таблица Customer:
# The Customer table. # # We need to know where to send those widgets. # # Links back to Purchase_Order by way of customer_id. CREATE TABLE Customer ( customer_id SMALLINT NOT NULL AUTO_INCREMENT, customer_name VARCHAR(80) NOT NULL, customer_contact VARCHAR(80) NOT NULL, customer_address VARCHAR(80), customer_city VARCHAR(80), customer_zip VARCHAR(10), customer_phone VARCHAR(20), customer_fax VARCHAR(20), PRIMARY KEY (customer_id), KEY (customer_name) );
Это и совсем просто. Здесь хранится информация о каждом заказчике: его имя, с кем связаться в случае проблем, адрес, телефон и факс.
Теперь давайте подумаем. Среди заказчиков наверняка найдутся свободные торговцы, которые рады продавать Ваш товар по своим ценам. Неплохо бы их привлечь к себе, например, небольшой скидочкой. Но для этого надо хотя бы примерно представлять, кто купил товар для себя, а кто на продажу. Отлично, накроем их колпаком.
# The Sales_droid table. # # Keep track of the people who sell the widgets. # CREATE TABLE Sales_Droid ( sales_droid_id SMALLINT NOT NULL AUTO_INCREMENT, sales_droid_first_name VARCHAR(80) NOT NULL, sales_droid_last_name VARCHAR(80) NOT NULL, sales_droid_phone VARCHAR(20) NOT NULL, PRIMARY KEY (sales_droid_id) );
Нужны еще три простые таблицы для служебной информации:
# The Status table. # # Table to contain all valid status codes. # # Links to to Purchase_Order_Item and Purchase_Item by way of status_code. CREATE TABLE Status ( status_code TINYINT NOT NULL AUTO_INCREMENT, status_text VARCHAR(80) NOT NULL, PRIMARY KEY(status_code) );
Таблица Status очень простая. Нам нужен уникальный числовой ID, который связан с коротким текстовым полем, которое содержит текст кода состояния.
# The Widget_Color table. # # Table to contain all valid color codes. CREATE TABLE Widget_Color ( widget_color_id TINYINT NOT NULL AUTO_INCREMENT, color_text VARCHAR(80) NOT NULL, PRIMARY KEY(widget_color_id) ); # The Widget_Size table. # # Table to contain all valid color codes. CREATE TABLE Widget_Size ( widget_size_id TINYINT NOT NULL AUTO_INCREMENT, size_text VARCHAR(80) NOT NULL, PRIMARY KEY(widget_size_id) );
Таблицы Widget_Color и Widget_Size почти идентичен таблице Status. Только имена изменены.
Все! Можно вводить данные.
Типы данных
Поля должны иметь один из следующих типов данных:
BIGINT [(length)] [UNSIGNED] [ZEROFILL] | 8 байт целое (если компилятор поддерживает такой тип) |
BLOB | Двоичный объект (максимальная длина 65535 байт) |
CHAR(NUM) С | трока фиксированной длины (1 <= NUM <= 255) |
DATE | Сохраняет информацию о дате. Использует формат "YYYY-MM-DD". Может модифицироваться как строка или число, хотя Вы, вероятно, используете контекст строки для времени и даты. |
MySQL тип DATEпонимает по крайней мере следующие синтаксис. YYYY-MM-DD (Обратите внимание что '- ' может фактически быть ЛЮБОЙ не цифрой) YY-MM-DD (Обратите внимание что '- ' может фактически быть ЛЮБОЙ не цифрой) YYMMDD YYMM
Диапазон для этого типа данных от 0000-00-00 до 9999-12-31. Так что "проблема 2000" здесь не стоит. В отличие от TIMESTAMP, DATE принимает годы и в виде двух цифр от 0000 до 0099. Это не очень полезно в большинстве случаев. Используйте задание лет четырьмя цифрами в полях типа DATE. Тип DATE имеет длину 4 байта.
[UNSIGNED]
[ZEROFILL]
[UNSIGNED]
[ZEROFILL]
MEDIUMBLOB | Двоичный объект с максимальной длиной 16777216 байт. |
MEDIUMINT [(length)] [UNSIGNED] [ZEROFILL] | Целое (3 байта). |
REAL [(length,dec)] | Идентично DOUBLE (8 байт). |
SMALLINT [(length)] [UNSIGNED] [ZEROFILL] | Целое (2 байта). |
TINYBLOB | Двоичный объект с максимальной длиной 255 байт. |
TINYINT[(length)] [UNSIGNED] [ZEROFILL] | Целое число (1 байт). |
VARCHAR(NUM) | Строка переменной длины (1 <= NUM <= 255) |
TIME | Хранит информацию о времени. Использует формат "HH:MM:SS". Может использоваться как строка или число. MySQL тип TIME понимает следующий синтаксис. HH:MM:DDHHMMDDHHMMHH |
TIMESTAMP(NUM) | Автоматически изменяется при вставке/обновлении. Имеет формат YYMMDDHHMMSS или YYYYMMDDHHMMSS. Вы можете модифицировать поле TIMESTAMP при выполнении INSERT. Это полезно, когда Вы хотите установить произвольную дату/время для записи. В течение модификаций Вы не должны определять значение для вашего поля TIMESTAMP, или определять NULL как значение, для вставки. Иначе вы получите недопустимое значение для этого поля. |
Когда используете mysql с ODBC и Access Вы должны использовать значение 14 для NUM, поскольку это заставляет MySQL всегда использовать в годах четыре цифры. Значение 12 заставит MySQL использовать в году две цифры. Значение по умолчанию - 14.
Обратите внимание, что в случае таблиц с несколькими полями TIMESTAMP только первое такое поле будет модифицироваться автоматически.
Длина поля определяет, сколько всего цифр может иметь число, в то время как поле dec определяет, сколько из этих цифр будет после десятичной точки. Эти значения используются только для форматирования и вычисления максимальной ширины столбца.
UPDATE
СИНТАКСИС:
UPDATE table SET column=expression,... WHERE where_definition
Здесь where_definition:
where_definition: where_expr or where_expr [AND | OR] where_expr
Здесь where where_expr имеет формат:
where_expr: column_name [> | >= | = | <> | <= | < ] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition)
ОПИСАНИЕ:
Обновляет одно или несколько полей в таблице MySQL.
Все обновления выполняются слева направо. Внутри UPDATE на одной таблице все операции атомарные. Напримерe, Вы можете увеличивать счетчик внутри таблицы, просто прибавляя 1 к соответствующей переменной.
ПРИМЕРЫ:
UPDATE Widget_Table SET widgets_on_hand=widgets_on_hand - 300 where widget_id=3;
Этот запрос вычтет 300 из значения widgets_on_hand для widget = 3.
DELETE FROM Purchase_Order_Item WHERE purchase_order = 456
Этот запрос удалит все записи из Purchase_Order_Item, которые имеют значение 456 для purchase_order. Обратите внимание, что вообще Вы НИКОГДА не должны бы удалять данные из этого сорта базы данных. Вы создаете базы данных, чтобы следить за информацией, и даже плохая информация могла бы стать полезной в некотором случае. Гораздо лучше иметь некоторый тип кода состояния, который Вы используете, когда данные стали недопустимыми по каким-либо причинам.
Вы также хотели бы удалять запись в Purchase_Order для purchase_order 456. Важно убедиться, что, когда Вы удаляете информацию, Вы избавляетесь от всех ссылок к этой информации. Иначе Вы закончите с разрушенной базой данных.
Вы должны иметь права доступа update для использования этой команды.
Web-утилиты
mod_auth MySQL:
Модуль расширения для web-сервера Apache. Обеспечивает аутенфикацию пользователей, соединяющихся с Вашим web-сайтом.
PTS: Проект трассировочной системы для отладчика.
Найти команду.
СИНТАКСИС:
which1 [cmd]
ОПИСАНИЕ:
Эта команда, вероятно, полезна только на системах, которые не имеют, команды which, встроенной в оболочку, или доступной как команда. Выводит только первую найденную команду.
Writable
Проверяет возможность записи/создания файла.
СИНТАКСИС:
static BOOLEAN Writable (pathname) char *pathname;
ОПИСАНИЕ:
Поскольку отладчик может быть связан и с программой, которая выполняется с битом uid прав доступа (suid), мы должны быть внимательными относительно открытия заданного пользователем файла для вывода отладчика. Это состоит из проверки доступа к файлу на запись с реальным идентификатором пользователя, или проверкой каталога, где файл будет создан.
Вернет TRUE, если все в порядке и FALSE в противном случае.
Zap
Послать сигнал процессу, который соответствует образцу.
СИНТАКСИС:
zap [-signal] [-?Ift] pattern
ОПИСАНИЕ:
По умолчанию zap запросит подтверждение для каждого подходящего процесса.
ПРИМЕР:
prompt> zap -t "my" UID PID PPID C STIME TTY TIME CMD root 1217 1 1 15:21:30 pts/4 0:00 /bin/sh /usr/local/pkg/mysql-3.20.15/bin/safe_mysqld root 1224 1217 3 15:21:32 pts/4 0:01 /usr/local/pkg/mysql-3.20.15/libexec/mysqld -b /usr/local/pkg/mysql-3.20.15 -h
Программа zap поддерживает опции:
-I or -? | Справка. |
-f | Послать сигнал без запроса подтверждения. |
-t | Вывести список процессов, соответствующих образцу, но не сигнал им не посылать. |
В качестве сигнала допускается любой сигнал системы unix. По умолчанию сигнал = 9 (завершить процесс).