Версия для печати

Архив документации на OpenNet.ru / Раздел "Базы данных, SQL" (Многостраничная версия)
Документация на MySQL

Перевод: Alexey V. Pautov

Оглавление

Версия пакета MySQL : 3.20.29

  • Интерфейс с perl (MySQL perl API)
  • Библиотека отладчика MySQL
  • Функции библиотеки отладчика:
  • Портирование кода из mSQL в MySQL
  • Утилиты для MySQL
  • Пример базы данных
  • Лицензия на использование MySQL

  • О чем это?

    В этом описании рассматривается СУБД MySQL. Руководство рассчитано на пользователей среднего уровня подготовки. Оно может быть использовано как в качестве справочного руководства по данной СУБД, так и в качестве учебника. В целях его использования в качестве справочника, в самом начале документа предусмотрено полное оглавление.

    ЭТО НЕ ПЕРЕВОД ОРИГИНАЛЬНОЙ ДОКУМЕНТАЦИИ! Этот документ написан после прочтения фирменной документации, работы с пакетом и даже попыток его повалить, правда, не слишком удачных. Таким образом, в документе нашлось место и для личного мнения автора по ряду вопросов. Этот абзац мне пришлось включить на основании опыта подготовки подобной документации. Увы, описания, выстраданные кропотливым изучением программ, посчитали примитивным переводом, что говорит о том, что с ними просто не ознакомились должным образом. Я не отрицаю изучения мной оригинальной документации на пакет, но этот документ переводом не является.

    С другой стороны, мне понравилась структура оригинальной документации, и я ее по, возможности, придерживался. Однако, структура-это еще не документация.

    Данное описание пакета MySQL подготовлено Паутовым Алексеем Валентиновичем в качестве курсовой работы. По вопросам использования данного документа прошу обращаться по e-mail.

    Я заранее приношу извинения за ошибки и неточности (если таковые здесь есть), и прошу Вас сообщить мне о них. Я постараюсь их исправить. Я не несу какой-либо ответственности за какие бы то ни было последствия применения данного документа или сведений, изложенных в нем (в частности, упоминания возможных дыр в защите СУБД). Так что, если кто-то, прочитав этот документ возьмет, да и сотрет базу данных записей этак тысяч на сто, то я тут ни при чем!

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

    Ну а теперь к делу...

    Что такое MySQL?

    MySQL разработал Михаэль Видениус (Michael Widenius, monty@analytikerna.se). MySQL является относительно небольшой и быстрой реляционной СУБД основанной на традициях Hughes Technologies Mini SQL (mSQL).

    Последнюю версию MySQL можно скачать с www.tcx.se.

    Чем хорош MySQL?

    Перечислю основные приятные стороны пакета MySQL.

    Что такое SQL?

    SQL - это сокращение от Structured Query Language (структурированный язык запросов). SQL создан для работы с реляционными базами данных. Он позволяет пользователям взаимодействовать с базами данных (просматривать, искать, добавлять и управлять данными). MySQL соответствует спецификации ANSI 92 SQL. Подробности.

    Интерфейс с языками программирования

    Наиболее простой способ работы с MySQL сводится к использованию программы MySQL. Это клиентская часть СУБД MySQL. Можно выполнять команды SQL непосредственно из командной строки системы unix или из интерактивного режима MySQL. Подробнее о клиентских программах.

    СУБД MySQL имеет библиотеку C API. Ее можно использовать для запросов к базе данных, вставки данных, создания таблиц и т.п. C API поддерживает все функции MySQL. Подробности в главе "Интерфейс для С (C API)".

    Язык perl поддерживается сразу двумя способами:

    Подробнее этот вопрос рассмотрен в главе "Интерфейс с perl (MySQL perl API)".

    Также доступен 32-битный ODBC драйвер для MySQL. Он позволяет запрашивать и получать данные из других источников с поддержкой ODBC. С подробностями можно ознакомиться на домашней страничке MySQL (увы, только на английском языке).

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

    Перейти к оглавлению.


    Пример базы данных

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

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

    Таблицы

    # 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 это выполнено посредством программы mysqladmin.

    
    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. Только имена изменены.

    Все! Можно вводить данные.

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

    На главную страничку.


    Портирование кода из mSQL в MySQL


    Перенос прикладных программ mSQL в MySQL относительно прост.

    Сначала выполните скрипт msql2mysql (поставляется вместе с MySQL) над вашим источником. Он оттранслирует имена функций mSQL в имена функций MySQL. Но он не будет корректировать типы параметров или изменять число параметров в функциях MySQL, которые нуждаются в дополнительных параметрах.

    Замечания:

    MySQL поставляется с портированными версиями тестовых программ mSQL insert_test.c и select_test.c. Хорошая идея сравнить их с их mSQL эквивалентами. Это должно дать Вам хорошее начало для понимания, что Вы будете должны сделать для портирования mSQL программы в MySQL. Это также даст Вам некоторые мысли о том, что Вы должны делать, чтобы написать свою MySQL программу.

    Чем отличается реализация протокола клиент/сервер в MySQL от своего аналога в mSQL?

    Имеются значительные различия. Среди них:

    Отличия между 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:  Внешние программы.
    

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

    Локальное оглавление.

    На главную страничку.


    Утилиты для MySQL

    Web-утилиты

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

    На главную страничку.


    Лицензия на использование MySQL

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

                            MYSQL FREE PUBLIC LICENSE
                           (Version 4, March 5, 1995)
    
               Copyright (C) 1995, 1996 TcX AB & Monty Program KB & Detron HB
                    Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN,
                            All rights reserved.
    
            NOTE: This license is not the same as any of the GNU Licenses
            published by the Free Software Foundation.  Its terms are
            substantially different from those of the GNU Licenses.
            If you are familiar with the GNU Licenses, please read this
            license with extra care.
    
    This License applies to the computer program known as "mysql".  The
    "Program", below, refers to such program, and a "work based on the
    Program" means either the Program or any derivative work of the Program,
    as defined in the United States Copyright Act of 1976, such as a
    translation or a modification.  The Program is a copyrighted work whose
    copyright is held by TcX Datakonsult AB and Monty Program KB and Detron HB.
    
    BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE
    PROGRAM), YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL
    ITS TERMS AND CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE
    PROGRAM OR WORKS BASED ON IT.  NOTHING OTHER THAN THIS LICENSE GRANTS YOU
    PERMISSION TO MODIFY OR DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE WORKS.
    THESE ACTIONS ARE PROHIBITED BY LAW.  IF YOU DO NOT ACCEPT THESE TERMS
    AND CONDITIONS, DO NOT MODIFY OR DISTRIBUTE THE PROGRAM.
    
    1.  Licenses.
    
    Licensor hereby grants you the following rights, provided that you comply
    with all of the restrictions set forth in this License and provided,
    further, that you distribute an unmodified copy of this License with the
    Program:
    
    (a) You may copy and distribute literal (i.e., verbatim) copies of the
    Program's source code as you receive it throughout the world, in any
    medium.
    
    (b) You may modify the Program, create works based on the Program and
    distribute copies of such throughout the world, in any medium.
    
    2.  Restrictions.
    
    This license is subject to the following restrictions:
    
    (a) Distribution of the Program or any work based on the Program by a
    commercial organization to any third party is prohibited if any payment is
    made in connection with such distribution, whether directly (as in payment
    for a copy of the Program) or indirectly (as in payment for some service
    related to the Program, or payment for some product or service that
    includes a copy of the Program "without charge"; these are only examples,
    and not an exhaustive enumeration of prohibited activities).  However, the
    following methods of distribution involving payment shall not in and of
    themselves be a violation of this restriction:
    
            (i) Posting the Program on a public access information storage
    and retrieval service for which a fee is received for retrieving
    information (such as an on-line service), provided that the fee is not
    content-dependent (i.e., the fee would be the same for retrieving the
    same volume of information consisting of random data).
    
            (ii) Distributing the Program on a CD-ROM, provided that the
    files containing the Program are reproduced entirely and verbatim on such
    CD-ROM, and provided further that all information on such CD-ROM be
    redistributed for non-commercial purposes without charge.
    
    (b) Activities other than copying, distribution and modification of the
    Program are not subject to this License and they are outside its scope.
    Functional use (running) of the Program is not restricted, and any output
    produced through the use of the Program is subject to this license only
    if its contents constitute a work based on the Program (independent of
    having been made by running the Program).
    
    (c) You must meet all of the following conditions with respect to the
    distribution of any work based on the Program:
    
            (i) If you have modified the Program, you must cause your work to
    carry prominent notices stating that you have modified the Program's files
    and the date of any change;
    
            (ii) You must cause any work that you distribute or publish, that
    in whole or in part contains or is derived from the Program or any part
    thereof, to be licensed as a whole and at no charge to all third parties
    under the terms of this License;
    
            (iii) If the modified program normally reads commands
    interactively when run, you must cause it, at each time the modified
    program commences operation, to print or display an announcement including
    an appropriate copyright notice and a notice that there is no warranty (or
    else, saying that you provide a warranty).  Such notice must also state
    that users may redistribute the Program only under the conditions of this
    License and tell the user how to view the copy of this License included
    with the Program.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on the
    Program is not required to print an announcement.);
    
            (iv) You must accompany any such work based on the Program with
    the complete corresponding machine-readable source code, delivered on a
    medium customarily used for software interchange.  The source code for a
    work means the preferred form of the work for making modifications to it.
    For an executable work, complete source code means all the source code for
    all modules it contains, plus any associated interface definition files,
    plus the scripts used to control compilation and installation of the
    executable code.  However, the source code distributed need not include
    anything that is normally distributed (in either source or binary form)
    with the major components (compiler, kernel, and so on) of the operating
    system on which the executable runs, unless that component itself
    accompanies the executable code;
    
            (v) If you distribute any written or printed material at all with
    the Program or any work based on the Program, such material must include
    either a written copy of this License, or a prominent written indication
    that the Program or the work based on the Program is covered by this
    License and written instructions for printing and/or displaying the copy of
    the License on the distribution medium;
    
            (vi) You may not impose any further restrictions on the recipient's
    exercise of the rights granted herein.
    
    If distribution of executable or object code is made by offering the
    equivalent ability to copy from a designated place, then offering
    equivalent ability to copy the source code from the same place counts as
    distribution of the source code, even though third parties are not
    compelled to copy the source code along with the object code.
    
    3.      Reservation of Rights.
    
    No rights are granted to the Program except as expressly set forth
    herein.  You may not copy, modify, sub-license, or distribute the Program
    except as expressly provided under this License.  Any attempt otherwise
    to copy, modify, sub-license or distribute the Program is void, and will
    automatically terminate your rights under this License.  However, parties
    who have received copies, or rights, from you under this License will not
    have their licenses terminated so long as such parties remain in full
    compliance.
    
    4.      Other Restrictions.
    
    If the distribution and/or use of the Program is restricted in certain
    countries for any reason, Licensor may add an explicit geographical
    distribution limitation excluding those countries, so that distribution
    is permitted only in or among countries not thus excluded.  In such case,
    this License incorporates the limitation as if written in the body of
    this License.
    
    5.      Limitations.
    
    THE PROGRAM IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY.  THERE IS NO
    WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    PARTICULAR PURPOSE AND NON INFRINGEMENT OF THIRD PARTY RIGHTS.  THE ENTIRE
    RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
    SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
    SERVICING, REPAIR OR CORRECTION.
    
    IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    WILL LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
    PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
    GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
    USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
    DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
    THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.
    

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

    На главную страничку.


    Интерфейс для С (C API)

    Коротко о главном

    API поддерживает богатый ассортимент функций, которые обеспечивают доступ к СУБД MySQL из программы пользователя, независимо от того, запущена ли она в локальной или на удаленной системе.

    Подготовка

    Вы должны подключить файл mysql.h в начале Вашей программы на C:

    Вы также должны компоновать программу с математической (для шифрования) и mysqlclient библиотеками:

    Включаемые файлы обычно размещены в /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);
    }
    

    Клиентские функции

    MySQL API использует структуры данных MYSQL (определены в mysql.h) чтобы установить связь с СУБД. Вы можете устанавливать много соединений из одной программы-клиента, однако, каждое соединений должно быть связано с собственной отдельной структурой MYSQL.

    После успешного запроса, если данные должны быть возвращены пользователю, набор результатов должен быть передан через функции mysql_use_result или через функцию mysql_store_result. Обе эти функции сохраняют набор результатов в структуре MYSQL_RES. Разница в том, что mysql_store_result передает весь набор результатов в память клиента, а mysql_use_result инструктирует клиента, чтобы он мог получить строку динамически с сервера с каждым обращением к mysql_fetch_row. Имейте в виду, что mysql_use_result занимает ресурсы сервера, и не должен использоваться для интерактивных прикладных программ, где действия пользователя часто непредсказуемы и могут привести к большим задержкам. Обратите внимание также, что Вы можете держать только одно соединение, которое использует mysql_user_result, открытым, и это должно быть последнее созданное соединение. По умолчанию процесс mysqld закроет соединение после тридцати секунд неактивности.

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


    mysql_affected_rows

    СИНТАКСИС:

    ОПИСАНИЕ:

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

    ПРИМЕР:

    mysql_query(&mysql,"INSERT INTO gl_transact(acctnbr, amount) VALUES(12345,
                651.30)");
    if (mysql_affected_rows(&mysql) < 0)
       fprintf(stderr, "Attempted to add duplicate primary key\n");
    

    MySQL оптимизирован для случая удаления всех записей в таблице. Побочный эффект этой оптимизации - то, что MySQL возвратится, ноль для числа строк, на которые воздействовал в этой ситуации. Выполнение 'select count(*) from the_table' перед удалением всех записей даст Вам значение = на сколько строк воздействовала система, хотя это значение может изменяться между SELECT и DELETE. MySQL 3.20.X не поддерживает блокировку таблицы. Это исправлено в версии 3.21.X


    mysql_close

    СИНТАКСИС:

    ОПИСАНИЕ:

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:


    mysql_connect

    СИНТАКСИС:

    ОПИСАНИЕ:

    Пытается установить соединение с сервером MySQL, работающем на компьютере host. Значение host может быть сетевым именем или IP адресом. Параметр user задает логин пользователя MySQL, параметр passwd задает пароль для user. ОБРАТИТЕ ВНИМАНИЕ: Не пытайтесь шифровать passwd перед вызовом mysql_connect. Шифрование выполняется автоматически клиентским API.

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

    Вы можете опционально задать первый аргумент mysql_connect как (MYSQL*) 0. Это вынудит C API к автоматическому распределению памяти для структуры подключения и освобождению ее при завершении. Расплатой за это служит то, что Вы не сможете получать сообщения об ошибках из mysql_connect, когда используете эту опцию.

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

    ПРИМЕР:

    
    MYSQL *mysql;
    
    if ((mysql = malloc(sizeof(MYSQL))) != NULL)
    {
       if (!(mysql_connect(mysql, "pr_server", "jqpublic", "mypasswd")))
       {
          free(mysql);
          exit(1);
       }
    }
    free(mysql);
    


    mysql_create_db

    СИНТАКСИС:

    ОПИСАНИЕ:

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:


    mysql_data_seek

    СИНТАКСИС:

    ОПИСАНИЕ:

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:


    mysql_drop_db

    СИНТАКСИС:

    ОПИСАНИЕ:

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:


    mysql_eof

    СИНТАКСИС:

    ОПИСАНИЕ:

    Возвращает значение != 0, если последний вызов mysql_fetch_row не вернул ничего потому, что достигнут конец набора результатов.


    mysql_error

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_fetch_field

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_fetch_lengths

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_fetch_row

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_field_seek

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_free_result

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_get_client_info

    СИНТАКСИС:

    ОПИСАНИЕ:

    Эта функция просто возвращает строку с информацией о версии используемой в настоящее время клиентской библиотеки. Иногда полезно.


    mysql_get_host_info

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_get_proto_info

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_get_server_info

    СИНТАКСИС:

    ОПИСАНИЕ:

    Возвращает версию сервера.


    mysql_insert_id

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_list_dbs

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_list_fields

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_list_processes

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_list_tables

    СИНТАКСИС:

    ОПИСАНИЕ:



    mysql_num_fields

    СИНТАКСИС:

    ОПИСАНИЕ:

    ПРИМЕР:

    
    MYSQL mysql;
    MYSQL_RES *result;
    int fields;
    
    if (mysql_query(&mysql, "SELECT * FROM emp_master") == 0)
    {
       result = mysql_store_result( &mysql );
       if (result != NULL )
       {
          fields = mysql_num_fields( result );
          printf( "Retrieved %u fields\n", fields );
       }
       else printf( "Query failed\n" );
    }
    else abort();
    

    См. также:


    mysql_num_rows

    СИНТАКСИС:

    ОПИСАНИЕ:

    ПРИМЕР:

    
    MYSQL mysql;
    MYSQL_RES *result;
    int rows;
    
    if (mysql_query(&mysql, "SELECT * FROM emp_master") == 0)
    {
       result = mysql_store_result(&mysql );
       if (result != NULL)
       {
          rows = mysql_num_rows(result);
          printf("Retrieved %u rows\n", rows);
       }
       else printf("Query failed\n");
    }
    else abort();
    

    См. также:


    mysql_query

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_real_query

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_reload

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_select_db

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_shutdown

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_stat

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_store_result

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysql_use_result

    СИНТАКСИС:

    ОПИСАНИЕ:

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

    Локальное оглавление.

    На главную страничку.


    Интерфейс с perl (MySQL perl API)


    Коротко о главном

    Есть два способа обращения из программы на perl к базе данных MySQL. Дело в том, что два разных человека написали в общем-то одинаково хорошие, хотя и разные библиотеки для такого доступа. Решено включить в поставку оба варианта perl API.

    Наличие perl API дает огромные возможности по доступу к базам данных MySQL из скриптов на этом языке. Учитывая, что perl очень часто используется в интернете (для написания CGI-скриптов), этот интерфейс позволяет создавать web-ориентированные базы данных.

    Простой интерфейс с 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.

    Очень большие числа

    Из-за ограничений perl по обработке числовых значений, Вы будете иметь проблемы при использовании чисел больше чем signed LONG (2147483647). Это может происходить при использовании в MySQL типов данных unsigned LONG (DOUBLE) или LONGLONG (BIGINT). Perl хранит возвращаемые значения как строки, но автоматически преобразуют их в числа, когда Вы используете значения в числовом контексте. Это их усечет до 2147483647, так как perl использует тип signed LONG, чтобы хранить такие числа.

    Вы можете использовать один способ это обойти. Прежде всего всегда обрабатывайте значения, которые могут быть ОЧЕНЬ большими, как строки, а не как числа. Пока Вы делаете это, они могут отображаться и заново вставляться в базу данных без инцидентов. То же самое можно посоветовать для вставки новых значений в таблицы. Если Вы устанавливаете переменную, названную $tmpvar, равную "4147483647" и затем выполняете INSERT, чтобы вставить ее в базу данных, все будет нормально. Обратите внимание, что кавычки здесь очень важны, так как они заставляют perl обрабатывать значение как строку.

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


    Connect

    $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);

    Эта команда устанавливает соединение с сервером и базой данных. Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность. Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться. Возвращается дескриптор базы данных, если команда Connect выполнена успешно. В противном случае возвращаемое значение не определено. Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host. А вообще библиотека потоков MIT такое глюкало...

    Можно указать имя пользователя и пароль. Если имя пользователя не указано, используется текущий логин. Если не указан пароль, а пользователь его имеет, связь установить не получится.

    Возвращаемый дескриптор нужен для обращения к базе данных. Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, ...)

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

    $scalar = $dbh->sock;
    $scalar = $dbh->host;
    $scalar = $dbh->database;

    Имя базы данных не определено, если при вызове команды Connect было указано только имя сервера.

    Смена порта

    Сменить порт, к которому присоединился MysqlPerl можно так:

    $ENV{"MYSQL_TCP_PORT"}=3334;
    $ENV{"MYSQL_UNIX_PORT"}="/tmp/mysql_new.sock";
    use Mysql;
    $dbh = Mysql->Connect($host);


    SelectDB

    Выбор базы данных для использования.

    СИНТАКСИС:

    $dbh->SelectDB($database);

    ОПИСАНИЕ:

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


    ListFields

    Список полей в таблице.

    СИНТАКСИС:

    $sth = ListFields $dbh $table;

    ОПИСАНИЕ:

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

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

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

    @arr = @{$sth->name}; Возвращает массив имен столбцов
    @arr = @{$sth->length}; Возвращает массив длин столбцов
    $value = $sth->numfields; Возвращает количество столбцов в таблице
    @arr = @{$sth->type}; Массив MySQL типов
    @arr = @{$sth->is_num}; Массив 0 и 1, где 1 указывает что столбец числовой
    @arr = @{$sth->is_blob}; Массив 0 и 1, где 1 указывает что столбец - blob
    @arr = @{$sth->is_not_null}; Массив 0 и 1, где 1 указывает что столбец - не NULL


    Query

    Выполнить запрос.

    СИНТАКСИС:

    ОПИСАНИЕ:

    Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать 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.


    ListDBs

    Список доступных баз данных.

    СИНТАКСИС:

    ОПИСАНИЕ:

    ListDBs возвращает массив, который содержит один элемент для имени каждой базы данных, управляемой MySQL.

    ПРИМЕР:

      @dbs = $dbh->ListDBs; # Возвращает массив имен баз данных.
      $count = $#dbs;          # Вычисляет сколько элементов.
      for ($i=0;$i<=$count;$i++) {
        print("   ".$dbs[$i]."\n");
      }
    


    ListTables

    Список таблиц, доступных в базе данных.

    СИНТАКСИС:

    @arr = $dbh->ListTables;

    ОПИСАНИЕ:

    Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.

    ПРИМЕР:

      @tables = $dbh->ListTables;    # Assumes that $dbh points
                                        # to a valid database
      $count = $#tables;                # Figure out how many elements.
      for ($i=0;$i<=$count;$i++) {   # Print out the table names.
        print("   ".$tables[$i]."\n");
      }
    

    FetchCol

    Возвращает массив, содержащий один столбец, состоящий из значений.

    СИНТАКСИС:

    @arr = $sth->FetchCol($col);

    ОПИСАНИЕ:

    Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.

    Обратите внимание, что эта функция сбросит текущий указатель строки на конец таблицы; вы должны использовать DataSeek(0), чтобы переустановить его.


    FetchHash

    Возвращает результат запроса.

    СИНТАКСИС:

    ОПИСАНИЕ:

    Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.


    FetchRow

    Возвращает строку результатов.

    СИНТАКСИС:

    @arr = $sth->FetchRow;

    ОПИСАНИЕ:

    Возвращает массив значений следующей строки, полученной с сервера.


    DataSeek

    Позиционируется на произвольную позицию в данных.

    СИНТАКСИС:

    DataSeek $sth $row_number;

    ОПИСАНИЕ:

    Дает возможность Вам определить смещение в данных, связанное с операторным дескриптором. Следующий вызов FetchRow возвратит соответствующую строку (первая строка имеет смещение = 0).


    Обработка двоичных строк

    Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.

    СИНТАКСИС:

    $scaler = $dbh->quote($binary_string)

    ОПИСАНИЕ:

    Конвертирует строку: пропускает все символы ' и \, а также конвертирует \0 и \n.


    Потерянные значения

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


    Метаданные

    Теперь пересмотрим вышеупомянутые методы в отношении метаданных.

    Дескриптор базы данных

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

    $dbh = Connect Mysql $host, $database;

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

    $scalar = $dbh->sock;
    $scalar = $dbh->host;
    $scalar = $dbh->database;

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


    Операторный дескриптор

    Два конструктора возвращают операторный дескриптор:

    $sth = ListFields $dbh $table;
    $sth = Query $dbh $sql_statement;

    $sth хранит все метаданные, предоставляемые API:

    $scalar = $sth->affected_rows; Сколько записей вставлено или изменено.
    $scalar = $sth->info; Статистика о предыдущих запросах ALTER TABLE или LOAD DATA FROM INFILE.
    $arrref = $sth->is_blob; Массив битов, специфицирующих является ли данное поле BLOB.
    $arrref = $sth->is_not_null; Массив битов, специфицирующих является ли данное поле NULL.
    $arrref = $sth->is_pri_key; Массив битов, специфицирующих является ли данное поле первичным ключом.
    $arrref = $sth->is_num; Массив битов, специфицирующих является ли данное поле числом.
    $scalar = $sth->insert_id; Значение, присвоенное столбцу с помощью AUTO_INCREMENT последним INSERT.
    $arrref = $sth->length; Массив длин всех полей в байтах.
    $arrref = $sth->name; Имена всех столбцов.
    $scalar = $sth->numrows; Количество возвращаемых записей.
    $scalar = $sth->numfields; Количество возвращаемых полей.
    $arrref = $sth->table; Имена каждого столбца в таблице.
    $arrref = $sth->type; Тип каждого столбца, определен в mysql.h. Доступен с помощью &Mysql::CHAR_TYPE, &Mysql::INT_TYPE, &Mysql::REAL_TYPE


    Опция -w

    Опция -w может быть очень полезной в случае проблем с отладкой. Если Вы вызываете программу на perl с опцией -w, то предупреждения, обычно хранимые в $Mysql::db_errstr будут выводиться в STDERR (стандартный поток ошибок). Таким образом, Вы получите сообщения об ошибках сервера MySQL без обработки их в Вашей программе.

    Если надо использовать опцию -w, но не надо, чтобы сообщения об ошибках увидел демон MySQL, можно установить переменную $Mysql::QUIET в любое ненулевое значение.

    Предупреждение

    MySQL использует библиотеку libmysql.a, написанную Михаэлем Видениусом (Michael Widenius). Эта библиотека обязательно должна быть установлена до использования этого интерфейса с perl.

    Об авторе интерфейса

    MySQL perl API основан на mSQL perl API версии 1.17, разработанной Андреасом Коенигом (Andreas Koenig's koenig@franz.ww.TU-Berlin.DE).


    Драйвер MySQL DBD Perl

    Этот драйвер представляет собой второй способ обратиться к базе данных MySQL из программы на perl.

    В настоящее время эта часть описания интерфейса с perl только немного переработана, относительно версии стандартной pod-документации. Данная часть описания изготовлена с помощью команды pod2html -mke.

    Обзор:

    
      use DBI;
    
      $dbh = DBI->connect( $host, $database, $user, 'mysql' [, $password] );
      # or
      $dbh = DBI->connect('', '', '', 'mysql', {hostname => "localhost",
                          port => 3333, database => "test",
                          username => "myname", password => "mypassword",});
    

    ПРИМЕР:

    
    #!/usr/bin/perl
    
    use DBI;
    
    $drh = DBI->install_driver('mysql');
    $dbh = $drh->connect('','test','','') or die "Error connecting to database";
    $dbh->do("DROP TABLE foo");
    $dbh->do("CREATE TABLE foo ( Field_1 VARCHAR(60) )");
    $count = 1;
    
    while ($count < 500) {
      $sth = $dbh->prepare("INSERT INTO foo VALUES('XXXYYYZZZ')");
      $sth->execute;
      $sth->finish; # Очень важно вызвать finish, иначе не освободится память.
      print "$count\n" unless $count % 10;
      $count = $count + 1;
    }
    

    Коротко о главном

    DBD::mysql является драйвером для работы с базой данных, управляемой СУБД MySQL. Он портирован Michael 'Monty' Widenius of Alligator Descartes' DBD::msql. Вы должны установить DBI-модуль перед использованием DBD::mysql.

    $host может быть просто именем сервера (``up.botik.ru'') или именем сервера с указанием порта (``up.botik.ru:3333'').

    $database задает имя базы данных с которой надо связаться.

    $user задает имя пользователя для доступа к базе данных. (если не указано, используется идентификатор пользователя текущего процесса).

    $password является опциональным и нужно только для аккаунтов, которые имеют не пустые пароли.

    Системные переменные, которые использует DBD::mysql:

    Значения в системных переменных отменяют значения, переданные раньше. TCP номер порта, отменяет TCP номер порта, переданный в hostname.

    Можно разрешить отладку, установив переменную MYSQL_DEBUG 'd:t:O,filename' (где filename является именем файла для записи протокола). Протокол будет записан в файл только если libmysql откомпилирована с поддержкой отладки (опция DBUG).

    Поддерживаются следующие тэги:

    Для получения значения поля AUTO_INCREMENT INSERT, надо:

      $id = $dbh->func("_InsertID");
    

    Очень большие числа

    Ограничения на работу с ОЧЕНЬ БОЛЬШИМИ числами специфичны для языка perl вообще, а не для какого-либо API в частности. Так что все, что об этом сказано выше, справедливо и в данном случае.

    Вставка двоичных строк

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

      $mystring = $dbh->quote($rawstring);
    

    Об авторе интерфейса

    Msqlperl разработан (C)1997 Alligator Descartes. Модифицирован Msqlperl by Michael 'Monty' Widenius. Все изменения доступны на условиях public domain. Pod-документация, на которой основана данная глава, и _InsertID

    Что можно почитать

    DBI(3) для информации об использовании DBD/DBI.
    http://www.hermetica.com/technologia/perl/DBI домашняя страничка DBI,
    http://www.tcx.se домашняя страничка mysql,
    www.hughes.com.au домашняя страничка msql.

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

    Локальное оглавление.

    На главную страничку.


    Реализация языка SQL в СУБД MySQL


    Студент нанимается на лето подработать в
    университете, его спрашивают:
    - Языком владеешь?
    - Я в совершенстве владею языком!
    - Отлично, будешь наклеивать марки на конверты.

    Функции

    select_expression может содержать следующие функции и операторы:

    + - * / Арифметические действия.
    % Остаток от деления (как в C)
    | & Битовые функции (используется 48 бит).
    - Смена знака числа.
    ( ) Скобки.
    BETWEEN(A,B,C) (A >= B) AND (A <= C).
    BIT_COUNT() Количество бит.
    ELT(N,a,b,c,d) Возвращает a, если N == 1, b, если N == 2 и т. д. a,b,c,d строки.

    ПРИМЕР:

    ELT(3,"First","Second","Third","Fourth")
    вернет "Third".

    FIELD(Z,a,b,c) Возвращает a, если Z == a, b, если Z == b и т. д. a,b,c,d строки.

    ПРИМЕР:

    FIELD("Second","First","Second","Third","Fourth")
    вернет "Second".

    IF(A,B,C) Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C.
    IFNULL(A,B) Если A не null, вернет A, иначе вернет B.
    ISNULL(A) Вернет 1, если A == NULL, иначе вернет 0. Эквивалент ('A == NULL').
    NOT ! NOT, вернет TRUE (1) или FALSE (0).
    OR, AND Вернет TRUE (1) или FALSE (0).
    SIGN() Вернет -1, 0 или 1 (знак аргумента).
    SUM() Сумма столбца.
    = <> <= < >= > Вернет TRUE (1) или FALSE (0).
    expr LIKE expr Вернет TRUE (1) или FALSE (0).
    expr NOT LIKE expr Вернет TRUE (1) или FALSE (0).
    expr REGEXP expr Проверяет строку на соответствие регулярному выражению expr.
    expr NOT REGEXP expr Проверяет строку на соответствие регулярному выражению expr.

    select_expression может также содержать один или большее количество следующих математических функций.

    ABS() Абсолютное значение (модуль числа).
    CEILING() ()
    EXP() Экспонента.
    FORMAT(nr,NUM) Форматирует число в формат '#,###,###.##' с NUM десятичных цифр.
    LOG() Логарифм.
    LOG10() Логарифм по основанию 10.
    MIN(),MAX() Минимум или максимум соответственно. Должна иметь при вызове два или более аргументов, иначе рассматривается как групповая функция.
    MOD() Остаток от деления (аналог %).
    POW() Степень.
    ROUND() Округление до ближайшего целого числа.
    RAND([integer_expr]) Случайное число типа float, 0 <= x <= 1.0, используется integer_expr как значение для запуска генератора.
    SQRT() Квадратный корень.

    select_expression может также содержать одну или больше следующих строковых функций.

    CONCAT() Объединение строк.
    INTERVAL(A,a,b,c,d) Возвращает 1, если A == a, 2, если A == b... Если совпадений нет, вернет 0. A,a,b,c,d... строки.
    INSERT(org,strt,len,new) Заменяет подстроку org[strt...len(gth)] на new. Первая позиция строки=1.
    LCASE(A) Приводит A к нижнему регистру.
    LEFT() Возвращает строку символов, отсчитывая слева.
    LENGTH() Длина строки.
    LOCATE(A,B) Позиция подстроки B в строке A.
    LOCATE(A,B,C) Позиция подстроки B в строке A, начиная с позиции C.
    LTRIM(str) Удаляет все начальные пробелы из строки str.
    REPLACE(A,B,C) Заменяет все подстроки B в строке A на подстроку C.
    RIGHT() Get string counting from right.
    RTRIM(str) Удаляет хвостовые пробелы из строки str.
    STRCMP() Возвращает 0, если строки одинаковые.
    SUBSTRING(A,B,C) Возвращает подстроку из A, с позиции B до позиции C.
    UCASE(A) Переводит A в верхний регистр.

    И наконец несколько просто полезных функций, которые тоже можно применить в select_expression.

    CURDATE() Текущая дата.
    DATABASE() Имя текущей базы данных из которой выполняется выбор.
    FROM_DAYS() Меняет день на DATE.
    NOW() Текущее время в форматах YYYYMMDDHHMMSS или "YYYY-MM-DD HH:MM:SS". Формат зависит от того в каком контексте используется NOW(): числовом или строковом.
    PASSWORD() Шифрует строку.
    PERIOD_ADD(P:N) Добавить N месяцев к периоду P (в формате YYMM).
    PERIOD_DIFF(A,B) Возвращает месяцы между A и B. Обратите внимание, что PERIOD_DIFF работает только с датами в форме YYMM или YYYMM.
    TO_DAYS() Меняет DATE (YYMMDD) на номер дня.
    UNIX_TIMESTAMP([date]) Возвращает метку времени unix, если вызвана без date (секунды, начиная с GMT 1970.01.01 00:00:00). При вызове со столбцом TIMESTAMP вернет TIMESTAMP.

    date может быть также строкой DATE, DATETIME или числом в формате YYMMDD (или YYYMMDD).

    USER() Возвращает логин текущего пользователя.
    WEEKDAY() Возвращает день недели (0 = понедельник, 1 = вторник, ...).

    Групповые функции в операторе select:

    Следующие функции могут быть использованы в предложении GROUP:

    AVG() Среднее для группы GROUP.
    SUM() Сумма элементов GROUP.
    COUNT() Число элементов в GROUP.
    MIN() Минимальный элемент в GROUP.
    MAX() Максимальный элемент в GROUP.

    Здесь MIN() и MAX() могут принимать строку или число в качестве аргумента. Эти функции не могут использоваться в выражении, хотя их параметр может быть выражением:

    ПРИМЕР: "SUM(value/10)" нормально, но вот "SUM(value)/10" уже нет!


    Присоединения

    Свойство объединения 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 не будет использовать ключи, чтобы соединить таблицы посредством полей, которые не имеют идентичный тип. Это означает, что Вы должны всегда использовать те же самые типы для полей, которые предназначены, для использования в объединениях.

    Псевдонимы могут также использоваться для имен столбца. См. детали в следующем разделе.


    Псевдонимы

    СУБД 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.


    INSERT INTO

    СИНТАКСИС:

    INSERT INTO table [(column_name, ...)] VALUES (expression,...) ||
    INSERT INTO table [(column_name, ...)] SELECT ...

    ОПИСАНИЕ:

    Вставляет данные в таблицу.

    ПРИМЕР:

    INSERT INTO Customer(customer_name,customer_contact) VALUES("Joes Wholesale","Joe Smith")

    Этот запрос создаст новую запись в таблице Customer, которая будет содержать автоматически сгенерированный customer_id, и значения, определенные в запросе. Все другие поля будут пустыми (NULL).

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

    Вы должны иметь права доступа insert для использования этой команды.


    LOAD DATA INFILE

    СИНТАКСИС:

    LOAD DATA INFILE syntax

    ОПИСАНИЕ:

    Команды, для чтения данных из текстового файла.

    ПРИМЕР:

    LOAD DATA INFILE 'customer.tab' [REPLACE | IGNORE] INTO TABLE Customer [fields [terminated by ',' [optionally] enclosed by '"' escaped by '\\' ]] [lines terminated by '\n'] [(field list)]

    Для записи в текстовый файл используйте:
    SELECT ... INTO OUTFILE 'customer.tab' fields terminated by ',' enclosed by '"' escaped by '\\' lines terminated by '\n' .

    "fields terminated by" Имеет значение по умолчанию \t.
    "fields [optionally] enclosed by" Имеет значение по умолчанию ".
    "fields escaped by" Имеет значение по умолчанию '\\'.
    "lines terminated by" Имеет значение по умолчанию '\n'.

    "fields terminated by" и "lines terminated by" могут быть больше, чем 1 символом.

    Если "fields terminated by" и "fields enclosed by" являются пустыми строками, то размер строки будет фиксированным. То есть, будет производиться чтение полей одной длины.

    С фиксированными значениями NULL для размера строки будут выводиться пустые строки.

    Если указаны "optionally" в "enclosed by" и Вы не используете фиксированный размер строк, только строки с этим символом будут включены в команду SELECT ... INTO.

    Если "escaped by" не пусто, то следующие символы будут снабжены префиксом: "escaped by", ASCII 0, и первый символ из "fields terminated by", "fields enclosed by" и "lines terminated by".

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

    Некоторые ситуации, которые не поддерживаются LOAD DATA INFILE:

    Все строки читаются в таблицу. Если строка имеет слишком мало полей, остальная часть полей в таблице устанавливается в значения по умолчанию.

    По соображениям безопасности textfile должен находиться в каталоге баз данных или быть читаемым всеми.

    Если "FIELDS ENCLOSED BY" не пустое, то NULL читается как значение NULL. Если "FIELDS ESCAPED" не пустое, то \N тоже читается как значение NULL. Note Обратите внимание, что это БОЛЬШАЯ N, верхний регистр!

    Когда запрос LOAD DATA выполнен, Вы можете получить следующую строку информации, используя функцию C API mysql_info().

    @result{Records: 1 Deleted: 0 Skiped: 0 Warnings: 0}

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

    Вы должны иметь права доступа select и insert таблице user для использования этой команды.


    SET OPTION

    СИНТАКСИС:

    SET OPTION SQL_VALUE_OPTON=value, ...

    ОПИСАНИЕ:

    Меняет или устанавливает опции MySQL. Опции действуют только в пределах текущего сеанса.

    MySQL поддерживает следующие опции (в этой версии пока одну):

    SQL_SELECT_LIMIT=value Максимальное число записей, которое возвращает SELECT. Если SELECT имеет параметр LIMIT, то используется значение из этой опции.


    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 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 для использования этой команды.


    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, например.


    О строках

    Примеры правильных строк:

    ' в строке записывается как ''.

    " в строке записывается как "".

    Пример, чтобы прояснить ситуацию:

    
    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 |
    +-------+---------+-----------+-------------+--------+
    


    О числах


    Имена таблиц и столбцов

    Вы можете использовать только набор символов ISO8859-2 (или набор символов который Вы определили при компиляции начальном выборе конфигурации и компиляции пакета), символ подчеркивания, и 0-9 в именах столбцов.

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

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

    Локальное оглавление.

    На главную страничку.


    Администрирование пакета


    Предоставление доступа к базам данных

    СУБД MySQL использует специальную базу данных для предоставления прав доступа к своим базам данных. Эти права могут базироваться на именах серверов и/или пользователей и предоставляться для одной или нескольких баз данных

    Пользовательские аккаунты могут быть снабжены паролями. При обращении к базе данных, пароль шифруется. Поэтому он не может быть перехвачен и использован посторонним (это мнение автора СУБД...).

    СУБД MySQL имеет три таблицы, а именно:

    База данных: mysql Таблица: db
    ПолеТипNullКлючУмолчаниеExtra
    Хостchar(60) PRI
    Dbchar(32)PRI
    Пользовательchar(16) PRI
    Select_privchar(1) N
    Insert_privchar(1) N
    Update_privchar(1) N
    Delete_privchar(1) N
    Create_privchar(1) N
    Drop_privchar(1) N
    База данных: mysql Таблица: host
    ПолеТипNullКлючУмолчаниеExtra
    Хостchar(60) PRI
    Dbchar(32)PRI
    Select_privchar(1) N
    Insert_privchar(1) N
    Update_privchar(1) N
    Delete_privchar(1) N
    Create_privchar(1) N
    Drop_privchar(1) N
    База данных: mysql Таблица: user
    ПолеТипNullKeyУмолчаниеExtra
    Хостchar(60) PRI
    Пользовательchar(16) PRI
    Парольchar(8)
    Select_privchar(1) N
    Insert_privchar(1) N
    Update_privchar(1) N
    Delete_privchar(1) N
    Create_privchar(1) N
    Drop_privchar(1) N
    Reload_privchar(1) N
    Shutdown_privchar(1) N
    Process_privchar(1) N
    File_privchar(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 Сортируется по именам серверов, пользователей и баз данных.
    Сервер Сортируется по именам серверов и баз данных.

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

    INSERT INTO user VALUES('%.external.domain.com','','','N','N','N', 'N','N','N','N','N','N','N');

    Проверка таблицы баз данных будет выполнена для пользователя '' (пустое имя), а не для пользователя Джо, даже если пользователь, Джо имеет запись в таблице доступа к базам данных (db таблице).

    Создание пользовательских аккаунтов - вероятно, наиболее путающий аспект СУБД MySQL, (особенно, если никогда не имел с ней дела), так что не удивляйтесь, если потребуется некоторое время, чтобы во всем разобраться и получить парочку несколько неприятных сюрпризов. Использование программы mysqlaccess делает управление доступом несколько более ясным.

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

    Конкретно, установите все поля "имя сервера" в '%' и очистите таблицу серверов. Как только все начнет нормально функционировать, можно начинать эксперименты с добавлением имен серверов в таблицу серверов в случае такой необходимости.

    Если получено сообщение об ошибке 'Access denied', то скорее всего вы нормально связались с демоном mysqld, но имеете неправильную информацию в вашей таблице пользователей.

    Как работают пароли

    Зашифрованный пароль сохраняется в таблице пользователей ('user ').

    Запуск mysqld (при загрузке системы)

    Solaris

    Скопируйте скрипт mysql.server из каталога mysql bin в /etc/init.d .

    Проверьте все пути в скрипте mysql.server. Проверьте и установите safe_mysqld в /etc/init.d/mysql.server и в /etc/rc2.d/S99mysql.server .

    Linux

    В Caldera Open Linux надо добавить в файл /etc/rc.d/rc.local следующее:

    /usr/local/bin/safe_mysql &

    Конечно, здесь надо задать правильный путь в каталог с MySQL.

    Запуск mysqld (при запущенной системе)

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

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

    safe_mysql &


    Опции, задаваемые при компиляции пакета

    Как и большая часть программ для 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 не будет работать правильно.

    Добавление функций в MySQL

    Если Вы понимаете C++, и Yacc, то относительно просто добавить функцию к СУБД MySQL. Если не понимаете, то дело хуже.

    Сначала добавьте строку в файл sql_lex.cc с именем функции в массив sql_functions.

    Затем добавьте две строки в файл sql_yacc.y. Первая определяет символ препроцессора yacc. Вы должны добавить это к началу файла. Затем определите параметры функции, и создайте 'item' с этими параметрами.

    В файле item_func.h объявляют класс, который наследуется из Item_num_func или Item_str_func, в зависимости от того, возвращает ли ваша функция число или строку.

    В intem_func.cc добавьте:

    double *Item_func_newname::val()

    если Вы определяете числовую функцию, или

    String *Item_func_newname::Str(String *str)

    если Вы определяете строковую функцию.

    Для строковой функции вы должны также определить следующую функцию:

    void Item_func_newname::fix_length_and_dec()

    Она должна по крайней мере вычислить 'max_length' основанный на полученных параметрах. max_length - максимальное число символов, которое функция может вернуть (максимальная длина возвращаемого значения).

    Если функция не может возвращать null, Вы должны также установить 'maybe_null=0'.

    Для строковых функций параметр 'String *str', предоставляет буфер для хранения результата. Строковая функция должна вернуть строку, которая хранит результат.

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


    Быстрая загрузка данных

    Самый быстрый способ загружать данные в MySQL - команда LOAD DATA INFILE. Это в 3-20 раз быстрее, чем использование инструкций INSERT. Для еще большего количества быстродействия Вы можете использовать следующую процедуру, чтобы отключить формирование ключа на вашей таблице, в то время как данные загружаются. Для этого надо находиться в вашем MySQL каталоге баз данных, или обеспечивать полные пути к вашей базе данных.

    isamchk -rq -k0 [имя_базы_данных]/[имя_таблицы] Удаление ключей
    LOAD DATA INFILE ... Чтение Ваших данных
    isamchk -rq [имя_базы_данных]/[имя_таблицы] Создание ключей таблицы заново
    mysqladmin reload. Сообщите, чтобы mysql использовал новую таблицу


    Настройка 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 Максимальное время для сортировки?

    Полезные замечания

    Если Вы имеете прикладную программу, которая требует большого количества потоков, это является хорошим способом уменьшить значения recordbuffer и sortbuffer примерно до 32K. Вы можете даже уменьшить recordbuffer до 8КБ без особых проблем. Кроме того можно рассматривать уменьшение значения переменной keybuffer до размера в 512КБ. Это сохранит большой объем памяти, и повысит эффективность работы.


    Маленькие хитрости по улучшению производительности

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


    Оптимизация запросов

    Какая оптимизация выполняется для условия WHERE?


    Оптимизация памяти, используемой таблицами

    Есть несколько вещей, которые Вы можете сделать, чтобы минимизировать количество места, которое используют ваши таблицы. Прежде всего используйте НЕ ПУСТОЙ указатель всякий раз, когда возможно. Это ускорит запросы, и сохранит 1 бит на поле.

    Вы можете сохранить много места, используя меньшие целочисленные переменные. Например, MEDIUMINT часто вполне достаточен.

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

    Имейте в виду, что поля фиксированной длины в mysql обрабатываются значительно быстрее. Избегая полей переменной длины (VARCHAR, BLOBs), можно повысить эффективность на 10-200%.


    Несоответствия типов в INSERT

    В настоящее время инструкция INSERT дает ошибку только при вставке пустого указателя (NULL) в не пустой столбец.

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

    Во время связи клиента с сервером 'warnings information' возвращается только при использовании 'ALTER TABLE' или 'LOAD DATA FROM...'.


    О чем говорит номер версии MySQL

    Версии MySQL нумеруются по следующей схеме:

    111.222.333

    111 Если первая цифра изменяется, это означает, что были сделаны серьезные изменения. Они могут включать поддержку новых форматов файлов, новые протоколы, и т.д. Будьте готовы сделать некоторые модификации ваших прикладных программ перед выполнением после обновления. По крайней мере Вам придется выполнить дамп и перезагрузить Ваши таблицы.
    222 Значительный новый код/функциональные возможности. Может включать мелочь в поддержке синтаксиса SQL или интерфейса пользователя. Вам не придется делать сильных изменений в Ваших прикладных программах, но тщательно проверьте их перед выполнением.
    333 Маленькие безопасные изменения, которые не должны разорвать что-нибудь у сисопа на части. Самая большая проблема здесь - добавление ключевых слов SQL, которые находятся в противоречии с существующими именами таблицы. Если Вы избегаете использовать ключевые слова стандарта SQL-92 для ваших имен таблиц (так вообще-то и надо...), все должно быть ХОРОШО.

    Хорошая идея - всегда проверять файл NEWS, когда Вы загружаете новую версию. Это должно дать Вам, представление о том, что именно изменилось, начиная с вашей последней модификации.


    Протокол клиент/сервер

    На всякий случай приведу подробное описание протокола "клиент-сервер", используемого пакетом 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 более подробную информацию о форматах пакетов.


    Подробно о таблицах

    Для получения описания таблицы используйте команду (Вы должны перейти в каталог, который содержит таблицу, информацию о которой Вы желаете получить. Вообще это будет $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.

    MySQL FAQ имеет обширную информацию по этой теме.


    Ключи и все о них.

    Ниже дается некоторая информацию низкого уровня относительно того, как ключи хранятся и используются в MySQL.

    Текущий размер блока для B-tree равен 1024 и и всех блоков (за исключением root) - по крайней мере 2/3 от полного. Для типичного идентификатора (id = 4 байта) это означает 1024/(4+4)*2/3=85 ключей в соответствии с записью, и таким образом можно находить позицию реальной записи в 5 позиционированиях.

    Если Вы желаете, чтобы ваши индексы B-tree были 100% полными, выполните isamchk с опцией -rq над вашими файлами таблицы.

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

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

    Все блоки ключей читаются/пишутся через key_buffer (по умолчанию 1M) так что блок root буферизуется всегда.

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


    MySQL: планы на будущее

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

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

    Такие свойства как views, rollback и triggers будут добавлены на каком-то этапе опционально. Они требуют основательной переработки пакета.

    Внутренние и внешние объединения, возможно, будут добавлены в версии 3.21.0


    Потоки в Linux

    Когда MySQL запущен на Linux системе и использует потоки Linux, Вы будете видеть минимум три процесса. Фактически, это потоки. Будет иметься один поток для Linux Threads manager, один, чтобы обрабатывать подключения и один, чтобы обработать сигналы.

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

    Локальное оглавление.

    На главную страничку.


    Библиотека отладчика MySQL


    Библиотека отладчика, используемая MySQL была первоначально написана Фредом Фишом (Fred Fish). Она будет очень полезна, если Вы планируете отлаживать и/или добавлять функциональные возможности к СУБД MySQL.

    Автор зачем-то приводит заголовок файла dbug.c из исходников пакета (вместе со всеми комментариями к нему). Приведу его и я, поскольку это может быть продиктовано какими-либо юридическими проблемами с копирайтом. Поскольку я не юрист, привожу этот заголовок без какого-либо перевода (во избежание ошибок или искажения смысла юридического документа при переводе).

    /*************************************************************************
     *                              N O T I C E                              *
     *                                                                       *
     *                 Copyright Abandoned, 1987, Fred Fish                  *
     *                                                                       *
     *   This previously copyrighted work has been placed into the  public   *
     *   domain  by  the  author  and  may be freely used for any purpose,   *
     *   private or commercial.                                              *
     *                                                                       *
     *   Because of the number of inquiries I was receiving about the  use   *
     *   of this product in commercially developed works I have decided to   *
     *   simply make it public domain to further its unrestricted use.   I   *
     *   specifically  would  be  most happy to see this material become a   *
     *   part of the standard Unix distributions by AT&T and the  Berkeley   *
     *   Computer  Science  Research Group, and a standard part of the GNU   *
     *   system from the Free Software Foundation.                           *
     *                                                                       *
     *   I would appreciate it, as a courtesy, if this notice is  left  in   *
     *   all copies and derivative works.  Thank you.                        *
     *                                                                       *
     *   The author makes no warranty of any kind  with  respect  to  this   *
     *   product  and  explicitly disclaims any implied warranties of mer-   *
     *   chantability or fitness for any particular purpose.                 *
     *************************************************************************
    */
    
    /*
     *  FILE
     *      dbug.c   runtime support routines for dbug package
     *
     *  SCCS
     *      @(#)dbug.c      1.25    7/25/89
     *
     *  DESCRIPTION
     *      These are the runtime support routines for the dbug package.
     *      The dbug package has two main components; the user include
     *      file containing various macro definitions, and the runtime
     *      support routines which are called from the macro expansions.
     *
     *      Externally visible functions in the runtime support module
     *      use the naming convention pattern "_db_xx...xx_", thus
     *      they are unlikely to collide with user defined function names.
     *
     *  AUTHOR(S)
     *      Fred Fish               (base code)
     *      Enhanced Software Technologies, Tempe, AZ
     *      asuvax!mcdphx!estinc!fnf
     *
     *      Binayak Banerjee        (profiling enhancements)
     *      seismo!bpa!sjuvax!bbanerje
     *
     *      Michael Widenius:
     *      DBUG_DUMP       - To dump a piece of memory.
     *      PUSH_FLAG "O"   - To be used instead of "o" if we don't
     *                        want flushing (for slow systems)
     *      Check of malloc on entry/exit (option "S")
    */
    

    Функции библиотеки отладчика

    _db_push_

    Поместить в стек текущее состояние отладчика, и установить новое.

    СИНТАКСИС:

      VOID _db_push_ (control)
      char *control;
    

    ОПИСАНИЕ:

    По указателю в параметре "control" на строку управления отладкой помещает в стек текущее состояние отладки, анализирует строку управления и устанавливает новое состояние отладки.

    Единственный атрибут нового состояния, унаследованного из предыдущего состояния, это текущая функция вложенного уровня. Это может быть отменено, используя флажок "r" в строке управления.

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

    <field_1><field_2><field_N>

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

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

    Символы флажка отладки:

    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
    

    _db_pop_

    ОПИСАНИЕ:

    Извлекает из стека отладки последнее записанное туда состояние отладки и устанавливает в него состояние отладки. Обратите внимание, что извлечение будет терпеть неудачу, если оно удалит последнее имеющее силу состояние из стека. Это предотвращает ошибки пользователя в последовательности действий со стеком из отладчика.

    _db_enter_

    СИНТАКСИС:

      VOID _db_enter_ (_func_, _file_, _line_, _sfunc_, _sfile_, _slevel_,
                       _sframep_)
      char *_func_;           points to current function name
      char *_file_;           points to current file name
      int _line_;             called from source line number
      char **_sfunc_;         save previous _func_
      char **_sfile_;         save previous _file_
      int *_slevel_;          save previous nesting level
      char ***_sframep_;      save previous frame pointer
    

    ОПИСАНИЕ:

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

    Также печатает строку трассировки, если трассировка включена и увеличивает текущее значение глубины вложения функций.

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

    _db_return_

    СИНТАКСИС:

      VOID _db_return_ (_line_, _sfunc_, _sfile_, _slevel_)
      int _line_;             current source line number
      char **_sfunc_;         where previous _func_ is to be retrieved
      char **_sfile_;         where previous _file_ is to be retrieved
      int *_slevel_;          where previous level was stashed
    

    ОПИСАНИЕ:

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

    _db_pargs_

    Параметры файла протокола для последующего использования _db_doprnt_().

    СИНТАКСИС:

      VOID _db_pargs_ (_line_, keyword)
      int _line_;
      char *keyword;
    

    ОПИСАНИЕ:

    Новая универсальная макрокоманда печати DBUG_PRINT, которая заменяет все формы макрокоманд DBUG_N, нуждается в двух обращениях к подпрограммам поддержки во время выполнения. Первая, это функция, которая запоминает параметры, которые используются последующим обращением для _db_doprnt_().

    _db_doprnt_

    Печать дескриптора строк отладки.

    СИНТАКСИС:

      VOID _db_doprnt_ (format, va_alist)
      char *format;
      va_dcl;
    

    ОПИСАНИЕ:

    Когда вызывается через одну из DBUG макрокоманд, проверяет текущий набор ключевых слов, вызывая _db_pargs_() чтобы узнать, была ли эта макрокоманда выбрана для обработки через строку управления отладчика, и если так, печатает аргументы с помощью форматированной строки. Номер строки DBUG макрокоманды в источнике найден в u_line.

    Обратите внимание, что строка формата (format) НЕ ДОЛЖНА включить завершение строки (\n), это делается автоматически.

    _db_dump_

    Выполняет дамп строки, пока не найдет '\0'.

    СИНТАКСИС:

      void _db_dump_ (_line_,keyword,memory,length)
      int _line_;               current source line number
      char *keyword;
      char *memory;             Memory to print
      int length;               Bytes to print
    

    ОПИСАНИЕ:

    Выполняет дамп N символов в двоичный массив. Используется, чтобы исследовать разрушенную память или массивы.

    ListParse

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

    СИНТАКСИС:

      static struct link *ListParse (ctlp)
      char *ctlp;
    

    ОПИСАНИЕ:

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

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

    InList

    Проверите данную строку на членство в данном списке.

    СИНТАКСИС:

      static BOOLEAN InList (linkp, cp)
      struct link *linkp;
      char *cp;
    

    ОПИСАНИЕ:

    Проверяет строку, на которую указывает "cp" чтобы определить, находится ли эта строка в списке, на который указывает "linkp". Linkp указывает на первую строку в списке. Если linkp == NULL, то строка обрабатывается, как будто она находится в списке (все строки находятся в пустом списке). Это может казаться довольно странным сначала, но ведет к желательной операции, если никакой список не задан. Результатом является то, что все строки будут приняты, когда не имеется никакого списка, но когда имеется список, будут приняты только те строки, которые есть в списке.

    PushState

    Сохраняет текущее состояние в стеке и устанавливает новое.

    СИНТАКСИС:

      static VOID PushState()
    

    ОПИСАНИЕ:

    Сохраняет текущее состояние в стеке и устанавливает новое. Единственным параметром, унаследованным из предыдущего состояния является уровень вложения функции. Это можно отменить флажком "r".

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

    DoTrace

    Проверка разрешения на трассировку.

    СИНТАКСИС:

      static BOOLEAN DoTrace (stack)
    

    ОПИСАНИЕ:

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

    DoProfile

    Проверяет разрешено ли профилирование.

    СИНТАКСИС:

      static BOOLEAN DoProfile()
    

    ОПИСАНИЕ:

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

    _db_keyword

    Проверяет ключевое слово на членство в списке ключевых слов.

    СИНТАКСИС:

      BOOLEAN _db_keyword_ (keyword)
      char *keyword;
    

    ОПИСАНИЕ:

    Проверяет ключевое слово на членство в списке ключевых слов. Как и в случае со строками, все ключевые слова принадлежат пустому списку. Когда отладка не включена, никакие ключевые слова не принимаются. После того, как максимальный уровень трассировки превышен, никакие ключевые слова тоже не принимаются. Дополнительно, текущая функция и текущий процесс должны входить в соответствующие списки.

    Возвращает TRUE, если ключевое слово входит в список, и FALSE в противном случае.

    Indent

    СИНТАКСИС:

      static VOID Indent (indent)
      int indent;
    

    ОПИСАНИЕ:

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

    FreeList

    Освободить всю память, занятую элементами списка.

    СИНТАКСИС:

      static VOID FreeList (linkp)
      struct link *linkp;
    

    ОПИСАНИЕ:

    Параметр linkp указывает на первый элемент связанного списка. Освобождается вся память, занятая элементами списка и самим списком.

    StrDup

    Создает копию строки в новой области памяти.

    СИНТАКСИС:

      static char *StrDup (string)
      char *string;
    

    ОПИСАНИЕ:

    Параметр string задает строку, копия которой нужна. Функция распределяет количество памяти, достаточное для создания копии строки и копирует строку в эту область памяти. Сбой при распределении памяти фатален.

    DoPrefix

    Вывести префикс строки отладки.

    СИНТАКСИС:

      static VOID DoPrefix (_line_)
      int _line_;
    

    ОПИСАНИЕ:

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

    OpenFile

    Открывает новый поток вывода для вывода отладчика.

    СИНТАКСИС:

      static VOID OpenFile (name)
      char *name;
    

    ОПИСАНИЕ:

    Параметр name является именем нового файла (или "-" для stdout). Файл открывается, и в него назначается вывод отладчика.

    OpenProfile

    Открывает новый поток вывода для вывода профайлера.

    СИНТАКСИС:

      static FILE *OpenProfile (name)
      char *name;
    

    ОПИСАНИЕ:

    Параметр name задает имя файла, который открывается и назначается в качестве вывода для профайлера.

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

    CloseFile

    Закрывает поток вывода отладчика.

    СИНТАКСИС:

      static VOID CloseFile (fp)
      FILE *fp;
    

    ОПИСАНИЕ:

    Закрывает поток вывода отладчика, если это не stdout или stderr.

    DbugExit

    Выводит сообщение об ошибке и завершает работу.

    СИНТАКСИС:

      static VOID DbugExit (why)
      char *why;
    

    ОПИСАНИЕ:

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

    DbugMalloc

    Выделяет память для библиотек поддержки отладчика.

    СИНТАКСИС:

      static long *DbugMalloc (size)
      int size;
    

    ОПИСАНИЕ:

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

    static_strtok

    СИНТАКСИС:

      static char *static_strtok (s1, separator)
    

    ОПИСАНИЕ:

    Аналог strtok, но 2 разделителя в строке заменены на 1 для совместимости с именами каталогов, принятыми в DOS.

    BaseName

    Удаляет путь из полного имени файла.

    СИНТАКСИС:

      static char *BaseName (pathname)
      char *pathname;
    

    ОПИСАНИЕ:

    Параметр pathname является указателем на полное имя файла. Функция размещает в памяти короткое имя файла и возвращает указатель на него.

    Writable

    Проверяет возможность записи/создания файла.

    СИНТАКСИС:

      static BOOLEAN Writable (pathname)
      char *pathname;
    

    ОПИСАНИЕ

    Поскольку отладчик может быть связан и с программой, которая выполняется с битом uid прав доступа (suid), мы должны быть внимательными относительно открытия заданного пользователем файла для вывода отладчика. Это состоит из проверки доступа к файлу на запись с реальным идентификатором пользователя, или проверкой каталога, где файл будет создан.

    Вернет TRUE, если все в порядке и FALSE в противном случае.

    ChangeOwner

    Меняет владельца на реального пользователя для suid программ.

    СИНТАКСИС:

      static VOID ChangeOwner (pathname)
    

    ОПИСАНИЕ:

    Для Unix-систем, меняет владельца недавно созданного файла отладки на реального владельца. Это нужно в случаях выполнения программ, запущенных с правом доступа set-user-id.

    Обратите внимание, что владелец файла уже установлен на момент выдачи этой команды. Так что, если она выполняется без права доступа set-user-id, то эта команда смысла не имеет (но безобидна).

    _db_setjmp_

    Сохранить окружение отладчика.

    СИНТАКСИС:

      VOID _db_setjmp_ ()
    

    ОПИСАНИЕ:

    Вызывается как часть макрокоманды пользователя DBUG_SETJMP, чтобы сохранить среду отладчика параллельно с сохранением среды пользователя.

    _db_longjmp_

    Восстановить предварительно сохраненное окружение отладчика.

    СИНТАКСИС

      VOID _db_longjmp_ ()
    

    ОПИСАНИЕ:

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

    DelayArg

    Преобразует параметр флажка D к системному стандарту.

    СИНТАКСИС:

      static int DelayArg (value)
      int value;
    

    ОПИСАНИЕ:

    Преобразует время задержки, задаваемое в десятых долях секунды, к системному стандарту. Например, на Amiga, имеется системный вызов "Delay()" который получает параметр в импульсах таймера (50 в секунду). На Unix команда sleep работает с числом секунд. Таким образом, значение "10", для задержки в течение одной секунды, преобразуется в 50 на Amiga, и 1 на Unix. Другие системы будут должны использовать цикл синхронизации.

    perror

    Моделирование perror для систем, которые его не имеют.

    СИНТАКСИС:

      static VOID perror (s)
      char *s;
    

    ОПИСАНИЕ:

    Perror выдает сообщение в стандартный поток ошибки, которое обеспечивает большее количество информации относительно библиотеки или ошибки системы. Выводится сообщение, заданное строкой s, затем ': ', сообщение об ошибке и перевод строки (\n).

    Недокументированная возможность Unix perror сводится к тому, что если 's' является пустой строкой (но не NULL!), то не выводится ': '.

    Эта версия выдает сообщение только о "неизвестной ошибке системы".

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

    Локальное оглавление.

    На главную страничку.


    Команды пакета MySQL


    Коротко о главном

    СУБД MySQL поставляется приходит со следующими основными программами и скриптами.

    Еще есть несколько утилит. Они не жизненно важны для MySQL, но обеспечивают полезные дополнительные функциональные возможности.


    Основные команды

    MySQL

    Клиентская программа MySQL.

    Запуск:

    ОПИСАНИЕ:

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

    -\?, --help Справка.
    -d, --debug=[options] Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки.
    -d, --debug-info Вывести отладочную информацию при выходе из программы.
    -e, --exec Выполнить команду и выйти, неявная форма опции --batch.
    -f, --force Продолжить, даже если мы сталкиваемся с SQL ошибкой.
    -h, --hostname=[hostname] Задает имя сервера, с которым Вы желаете соединиться.
    -P, --port=[port] Порт, для соединения с сервером MySQL.
    -p, --password=[password] Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем.
    -q, --quick Быстрый (небуферизованный вывод), может замедлить сервер, если вывод приостановлен.
    -s, --silent Работать молча (подавить вывод).
    -u, --user=[user] Имя пользователя для соединения с сервером MySQL. Необязательно, если имя пользователя такое же, как ваш логин. По умолчанию именно ваш логин используется в качестве имени пользователя, что облегчает настройку.
    -v, --verbose Подробный вывод. -v опция может быть удвоена или утроена для более подробного вывода. В программах русских авторов обычно именуется "уровнем болтливости программы".
    -w, --wait Если подключение терпит неудачу, то подождать и повторить попытку.
    -B, --batch Выполнить в пакетном режиме. Никаких запросов и никаких ошибок в STDOUT. Устанавливается автоматически при чтении из/записи в канал (пайп). Результаты будут выведены в формате с разделением табуляцией. Одна строка результата соответствует одной строке вывода.
    -I, --help Справка, эквивалент -\?.
    -V, --version Вывести информацию о версии пакета.

    В интерактивном режиме mysql будет печатать результаты в таблице подобно примеру, приведенному ниже. Если не задан пароль или имя пользователя mysql попробует зайти в систему на сервере базы данных с использованием вашего логина и НУЛЕВОГО (ПУСТОГО) пароля. Если ваш mysql логин отличается от вашего логина в unix, или если вы имеете пароль, то это провалится.

    ПРИМЕР:

    $ mysql mysql
    
    Welcome to the mysql monitor.  Commands ends with ; or \g.
    Type 'help' for help.
    
    mysql> select * from host;
    1 rows in set (0.25 sec)
    
      +-----------+----+--------+--------+--------+--------+--------+------+
      | host      | db | select | insert | update | delete | create | drop |
      +-----------+----+--------+--------+--------+--------+--------+------+
      | localhost | %  | Y      | Y      | Y      | Y      | Y      | Y    |
      +-----------+----+--------+--------+--------+--------+--------+------+
    
    mysql>
    

    Переведу этот пример на русский:

    $ mysql mysql
    
    Добро пожаловать в монитор mysql. Команды кончаются на ; или \g.
    Наберите 'help' для получения справки.
    
    mysql> select * from host;
    1 строка в наборе (0.25 секунды)
    
      +-----------+----+--------+--------+--------+--------+--------+------+
      | host      | db | select | insert | update | delete | create | drop |
      +-----------+----+--------+--------+--------+--------+--------+------+
      | localhost | %  | Y      | Y      | Y      | Y      | Y      | Y    |
      +-----------+----+--------+--------+--------+--------+--------+------+
    
    mysql>
    

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

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

    ПРИМЕР:

    Создайте файл /tmp/test, который содержит следующую строку:

    
    select * from host
    
    
    В командной строке введите:
    
    $ mysql mysql </tmp/test
    
    
    Вы получите что-то вроде:
    
    
    host            db      select  insert  update  delete  create  drop
    localhost       %       Y       Y       Y       Y       Y       Y
    
    Вы можете писать довольно сложные SQL программы, используя этот метод.

    mysqlaccess

    Проверка прав доступа пользователя.

    СИНТАКСИС:

    ОПИСАНИЕ:

    Скрипт mysqlaccess поддерживает следующие параметры (Вы можете использовать "короткий" одиночный символ или более подробную версию):

    -?, --help Справка.
    -v, --version Информация о версии
    -u, --user=... Имя пользователя для доступа к базе данных.
    -p, --password=... Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем.
    -h, --host=... Имя сервера, используется для проверки прав доступа.
    -d, --db=... Имя базы данных, используется для проверки прав доступа.
    -U, --superuser=... Логин администратора.
    -P, --spassword=... Пароль администратора.
    -b, --brief Вывести краткие сведения о таблице.
    --relnotes Вывести заметки по реализации.
    --plan Вывести идеи для будущих реализаций.
    --howto Вывести примеры использования `mysqlaccess'
    --debug=N Уровень отладки N (0..3)

    Вы должны указать по крайней мере имя пользователя и имя базы данных, которые Вы желаете проверить. Если имя сервера не задано, то подразумевается имя 'localhost'.

    "Групповые символы" (*,?, %, _) могут применяться при указании сервера, пользователя и db (базы данных). Убедитесь, что они не будут перехвачены вашей командной оболочкой unix.


    mysqladmin

    Выполняет административные функции.

    СИНТАКСИС:

    ОПИСАНИЕ:

    -\?, --help Справка.
    -d, --debug=[options] Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки.
    -f, --force Не спрашивать подтверждения при пропуске таблицы.
    -h, --host=[hostname] Имя сервера, если не localhost.
    -i, --sleep=[seconds] Выполнить команды несколько раз с паузой в [секунд] между ними.
    -p, --password[password] Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем.
    -u, --user=[user] Имя пользователя. Если не указано, используется текущий логин.
    -P, --port=[port] Порт, для соединения с сервером MySQL.
    -V, --version Вывести информацию о версии.

    Кроме этого программа mysqladmin поддерживает следующие команды:

    create [имя базы данных] Создать базу данных.
    drop [имя базы данных] Удалить базу данных (вместе со всеми таблицами).
    processlist Вывести сведения о работающих потоках MySQL.
    reload Перечитать настройки и очистить все кэши.
    shutdown Завершить работу СУБД MySQL. Все запущенные MySQL-сессии помечаются как 'killed'. Это означает, что все потоки, которые простаивают в настоящее время, будут закрыты немедленно, а управление потоками будет закрыто, когда они достигнут точек завершения, определенных сервером. Клиенты получат сообщение об ошибке 'mysql server has gone away'.
    status Вывести короткое сообщение о статусе сервера.
    version Вывести информацию о версии.

    Обратите внимание: mysqladmin понимает сокращения. Например, Вы могли бы написать следующее:

    
    $ mysqladmin v p
    
    
    Это вывело бы версию mysqld и список всех активных в настоящее время потоков.

    Вы можете использовать опцию -i=[секунд] для повтора команды каждые [секунд]. Это наиболее полезно с командой processlist.

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


    mysqld

    Серверная часть пакета MySQL (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_log5
    keybuffer1048568
    max_allowed_packet65536
    net_buffer_length8192
    max_connections90
    table_cache64
    recordbuffer131072
    sortbuffer2097144
    max_sort_length1024

    Информация относительно того, что эти значения делают, и как поднять эффективность mysqld, находится здесь.


    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 поддерживает следующие параметры (Вы можете использовать короткую или подробную версию):

    -#, --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 SHOW и DESCRIBE .


    isamchk

    Проверка, восстановление, управление и сбор статистики по таблицам MySQL.

    СИНТАКСИС:

    isamchk [-?adeiqrsvwzIV] [-k #] [-O xxxx=size] [-Si] [-Sr #]
            [-O keybuffer=#] [-O readbuffer=#] [-O writebuffer=#]
            [-O sortbuffer=#] [-O sort_key_blocks=#] files
    

    ОПИСАНИЕ:

    Опции программы isamchk:

    -# Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки.
    -? Справка.
    -a Анализ. Используется для для оптимизации размещения таблиц.
    -d Информация о таблице.
    -e Расширенная проверка. При запуске с этой опцией надо остановить демон mysqld.
    -f Принудительно создать временный файл. Эта опция вызовет 'isamchk -r', если таблица разрушена.
    -k# Используемые ключи.
    -i Дополнительная информация.
    -q Быстрая проверка.
    -r[o] Восстановление, Эта опция также уплотнит внутренние индексы B-Tree, используемые MySQL. Используйте эту опцию, чтобы уменьшить место, занимаемое таблицей, за счет удаления неиспользуемых индексов.
    -s Работать молча.
    -u Распаковать упакованный файл.
    -v Подробный вывод. Используется вместе с другими параметрами, чтобы получить большее количество информации. Можно задать большее количество символов v для повышения объема выдаваемой информации (например, vv).
    -w Ждать, если таблица заблокирована.
    -I Справка.
    -S[ir]# Сортировать индекс/записи по ключу #. Эта опция оптимизирует размещение данных в таблице.
    -V Информация о версии.
    -O var=# Опция оптимизации var=#[k][m]

    Можно использовать вторую опцию '-q', чтобы использовать старый файл данных. -ro использует старый метод восстановления: медленнее, но надежнее -r. -r может исправить почти все ошибки, кроме уникальных ключей, которые оказались все же не уникальными. УБЕДИТЕСЬ, ЧТО ДЕМОН MYSQLD НЕ ЗАПУЩЕН, ЕСЛИ ИСПОЛЬЗУЕТЕ ЭТУ ОПЦИЮ! Если -f задан при проверке таблицы, то таблицы с ошибками будут автоматически исправлены.

    Имеется несколько примеров. См. Подробно о таблицах.

    ПРИМЕРЫ:

    isamchk -r [table_name] Убрать все дырки, которые сформировались из-за использования BLOBS или VARCHARS. Также установить какие еще есть проблемы.
    isamchk -ei [table_name] Проверить таблицу и отобразить статистику.
    isamchk [table_name] Найти большинство ошибок.
    isamchk -rq [table_name] Обновить только индексный файл. Быстро, но не исправляет ошибки в файле данных.
    isamchk -d -v [table_name] Описание таблицы.
    isamchk -rq -Si [table_name] Полная оптимизация таблицы [table_name]. Надолго...


    isamlog

    Получение статистики, и использование isam-журналов.

    СИНТАКСИС:

    isamlog [-?iruvIV] [-c #] [-f #] [-p #] [-F filepath/] [-o #]
            [-R file recordpos] [-w write_file] [log-filename]
    
    ОПИСАНИЕ:

    -? or -I Справка.
    -V Информация о версии.
    -c # Выполнить только # команд.
    -f # Максимальное число открытых файлов. Если откроется больше чем # файлов, то лишние будут автоматически закрыты и вновь открыты по мере необходимости.
    -F [path] Файл протокола ISAM содержит полный путь к таблицам. Вы можете использовать эту опцию, чтобы отменить сохраненный путь.

    ПРИМЕР:

    -F '/var/mirror/' заставит isamlog работать с файлами в /var/mirror, а не с теми, которые указаны в сохраненном пути.

    -i Вывести более детальную информацию.
    -o # Начать со смещения #.
    -p # Удалить # компонент из пути.
    -r Игнорировать все ошибки, с которыми сталкиваемся в течение модификаций.
    -R Указать позицию в файле ISAM, о которой надо выдать сведения.

    ПРИМЕР:

    isamlog -R /usr/local/data/mysql/user.ISM 1234

    Выведет все изменения в таблице /usr/local/data/mysql/user, которые найдены в позиции 1234. Это полезно для ситуаций, в которых Вы имеете разрушенную запись в известной позиции. Вы, возможно, получили эту информацию посредством isamlog -vvv или из isamchk.

    Если Вы укажете позицию -1, будут обработаны все записи.

    -u Пытаться модифицировать все таблицы. Остановиться, если встречена ошибка.
    -v Подробный вывод. Можно задать большее количество символов v для повышения объема выдаваемой информации (например, vv).
    -w [filename] Записать все записи вставленные или измененные опцией -R в [filename]. Эта опция может использоваться, чтобы получить двоичный файл всех вставок и модификаций конкретной таблицы для использования в отладке.


    safe_mysqld

    Скрипт для запуска демона mysqld.

    СИНТАКСИС:

    ОПИСАНИЕ:


    Дополнительные команды

    comp_err

    Генерирует файлы сообщений об ошибках на национальном языке.

    СИНТАКСИС:

    comp_err [-?] [-I] [-V] fromfile[s] tofile

    ОПИСАНИЕ:

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

    ПРИМЕР:

    comp_err share/english/errmsg.txt share/english/errmsg.sys


    msql2mysql

    Выполняет начальное преобразование mSQL скрипта в MySQL.

    СИНТАКСИС:

    ОПИСАНИЕ:


    mysqlbug

    Генерирует отчет об ошибках.

    СИНТАКСИС:

    ОПИСАНИЕ:

    perror

    Выводит короткое текстовое объяснение числового кода ошибки.

    СИНТАКСИС:

    
    $ perror [-?vIV] [errorcodes]
    
    

    ОПИСАНИЕ:

    Программа perror поддерживает опции:

    -? or -I Справка.
    -v Подробная информация.
    -V Информация о версии.


    replace

    СИНТАКСИС:

    ОПИСАНИЕ:

    Программа 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.


    which1

    Найти команду.

    СИНТАКСИС:

    ОПИСАНИЕ:


    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 (завершить процесс).

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

    Локальное оглавление.

    На главную страничку.