Портал для веб-мастера
Вход пользователей
Поиск статей
WoWeb.ru » Статьи » Базы данных » MySQL

MySQL: установка, настройка, описание

SQL СУБД (реляционная) без излишеств (правда, в последней версии появились транзакции с помощью Berkley DB и INNOBASE), зато быстрая (для поиска и добавления, если предстоят частые изменения, то лучше поискать другую СУБД). Стандарты: entry level SQL92, ODBC levels 0-2.

Лицензия - GPL/LGPL (но в случае извлечения прибыли от MySQL фирма - MySQL AB, Швеция - мягко намекает на оплату поддержки). Для хостинга лицензия не нужна, но клиенты должны иметь возможность убедиться, что все установлено правильно (предлагается давать доступ на чтение к установленным исходникам).

Написана на C и C++. Базовая платформа: Solaris 2.7-2.8, SuSE Linux 7.1 (ядро 2.4, ReiserFS), но работает также в AIX, BSDI, DEC Unix, FreeBSD, HP-UX, Linux 2.0, Mac OS X, NetBSD, OpenBSD, OS/2, SGI Irix, SunOS, SCO OpenServer, SCO UnixWare, Tru64, Win9x, NT, Win2000.

Многопотоковая. Первоначально мимикрировала под mSQL. API для C, C++, Java, Eiffel, Perl, PHP, Python, Tcl. ODBC. Парольная защита (пароли шифруются перед пересылке, это, однако, не увеличивает безопасность).

Таблицы в виде B-tree со сжатием индекса. До 32 индексов на таблицу. До 16 колонок на индекс. Длина индекса до 500 байт. Таблицы в памяти. Записи переменной длины. Есть примеры использования MySQL с 60000 таблиц и 5 миллиардами строк. Отсутствует memory leak (проверено Purify). Поддержка koi8-r и cp1251 (сортировка, сравнение и т.д.). Клиенты могут соединяться по TCP/IP (можно использовать только, если никто не подслушивает) или Unix socket. Можно встраивать в свои программы.

Стабильность подсистем: ISAM - стабильная, MyISAM - gamma, C API - стабильная (буфер до 16МБ), mysql(admin,show,dump,import) - стабильные, Basic SQL - стабильная, оптимизатор - стабильная, блокировка (одновременный доступ нескольких процессов, не клиентов) - gamma (проблемы в Linux, рекомендуется --skip-locking), нити в Linux - рекомендуется --skip-locking и использовать не более 1000 одновременных соединений, DBD - стабильная, MyODBC - gamma, репликация - бета/gamma, BDB - бета (транзакции), автоматическое восстановление MyISAM - бета, слияние таблиц - бета/gamma, INNODB - альфа (транзакции с блокировкой на уровне строк), полнотекстовый поиск - бета.

Расширения к ANSI SQL92:

  • типы полей MEDIUMINT, SET, ENUM и различные модификации BLOB и TEXT
  • атрибуты полей: AUTO_INCREMENT, BINARY, NULL, UNSIGNED и ZEROFILL
  • по умолчанию строки сравниваются независимо от регистра
  • ключевые слова TEMPORARY и IF NOT EXISTS при создании/удалении таблиц
  • ключ DELAYED при создании/замене строк
  • ключ LOW_PRIORITY при манипуляции со строками
  • SHOW
  • строки можно заключать не только в апострофы, но и в кавычки
  • SET OPTION
  • синонимы операторов OR (||) и AND (&&) и MOD (%)
  • LAST_INSERT_ID()
  • REGEXP
  • IT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(), or WEEKDAY()
  • REPLACE вместо DELETE + INSERT
  • присвоение значений переменным в выражениях
  • комментарии в стиле C и sh
  • множество других мелких улучшений и несовместимостей, которые не позволят Вам "соскочить" с MySQL на другую СУБД

 

Отсутствующие возможности ANSI SQL92:

  • sub-select (в руководстве приводятся примеры как обойтись без него)
  • хранимые процедуры и тригеры (тригеры не планируются совсем)
  • FOREIGN KEY
  • views

 

Установка и настройка (Linux)
Опции ./configure
mysql.server (запуск MySQL при загрузке копьютера)
safe_mysqld (надстройка над mysqld)
mysqld (сервер БД)
Разбор параметров и конфигурационных файлов
Типы таблиц (методы доступа)
Права доступа и привилегии
Базовый синтаксис
Типы данных (в колонках)
Операторы SQL
Функции для SELECT и WHERE
Отличия версий

Установка и настройка (MySQL 3.23.37 на Linux RedHat 6.2) из исходных текстов

 

  • иметь gcc лучше, чем 2.8.1 (egcc 1.0.2), рекомендуется 2.95.2
  • создать директорию для сборки, распаковать в нее mysql-3.23.37.tar.gz (взять на http://www.mysql.ru/download)
  • для версии ранее 3.23.34 распаковать туда db-3.2.3h.tar.gz (это специальная версия bdb для MySQL)
  • создать группу mysql
  • создать пользователя mysql (в группе mysql) (зачем ему bash?)
  • ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --with-unix-socket-path=путь --with-mysqld-user=mysql --disable-large-files --with-libwrap --without-debug --with-charset=cp1251 --with-extra-charsets=all --with-berkeley-db
  • make (70MB/91MB)
  • если upgrade, то остановить mysql, сохранить базы данных и my.cfg (не забыть потом удалить!)
  • make install (как root)(16 MB, из них 5МБ - тест)
    • /usr/local/mysql/include/mysql
    • /usr/local/mysql/info
    • /usr/local/mysql/man
    • /usr/local/mysql/lib/mysql (libdbug, libheap, libmerge, libmyisam, libmyisammrg, libmysqlclient, libmystrings, libmysys, libnisam); эту директорию указывать для libtool, либо занести в /etc/ld.so.conf
    • /usr/local/mysql/bin (comp_err, isamchk, isamlog, my_print_defaults, myisamchk, myisamlog, myisampack, mysql, mysqladmin, mysqlbinlog, mysqlshow, mysqldump, mysqlimport, mysqltest, pack_isam, perror, replace, resolve_stack_dump, resolveip, скрипты )
    • /usr/local/mysql/share/mysql (сообщения об ошибках - koi8-r, таблицы кодировок - cp1251, koi8-r; mi_test_all; mi_test_all.res)
    • /usr/local/mysql/libexec (mysqld)
    • /usr/local/mysql/sql-bench
    • /usr/local/mysql/mysql-test
    • /usr/local/mysql/data (базы данных, конфигурация, журналы, pid-файл)
  • при первой установке: scripts/mysql_install_db (как root - создание таблиц с правами доступа, дает все права пользователю root без пароля и позволяет делать все с базами test и test_*, кроме раздачи привилегий)
  • chown -R root:mysql /usr/local/mysql (как root)
  • chown -R mysql /usr/local/mysql/data (и отдельную директорию для mysql.sockets с правами чтения для всех; mysql не нужны права на запись для my.cnf)
  • support-files/mysql.server в /etc/rc.d/init.d для автоматического запуска и дать ему права на исполнение и сделать линк K00mysql из rc0.d и rc6.d на него, S99mysql из rc2.d, rc3.d и rc5.d на него
  • скопировать my-medium.cnf в /usr/local/mysql/data/my.cnf и слегка отредактировать [mysqld]
    • socket=имя-файла под Unix-socket (и в раздел [client] тоже)
    • skip-locking (не блокировать доступ к данным от ДРУГИХ процессов)
    • log-bin #журнал изменений для репликации
    • log-slow-queries
    • log-update #журнал изменений
    • #secure - говорит, что нет такой опции
    • skip-networking #если не нужен доступ по TCP/IP (а еще лучше использовать ssh + port forward)
    • safe-show-database
    • skip-show-database
    • server-id=1 # что это?
    • куча set-variable из исходного файла
    • set-variable = max_connections=500
  • тестовый запуск: /usr/local/mysql/bin/safe_mysqld --user=mysql (как root)(или сразу /etc/rc.d/rc3.d/S99mysql start)
  • /usr/local/mysql/bin/mysqladmin -u root -p password 'пароль' (при запросе пароля нажать Enter)
  • /usr/local/mysql/bin/mysqladmin -u root -h localhost.localdomain -p password 'пароль' (надо ли?)
  • установка интерфейса с Perl
    • взять модули Data-Dumper, DBI и Msql-Mysql-modules
    • каждый распаковать в отдельную директорию (Msql-Mysql-modules последним)
    • зайти в нее
    • perl Makefile.PL (опционально хочет RPC::PlServer, RPC::PlClient, Storable, Net::Daemon).
    • make
    • make test (mysqld должен работать)
    • make install (как root)
  • тестирование
    • зайти в sql-bench
    • ./run-all-tests --user=test (нужны права для записи в директорию output, час времени и 200 МБ на диске)(connect/disconnect временами грохает mysqld!)
    • можно удалить sql-bench и mysql-test
  • настроить права доступа (как минимум, убрать анонимный доступ)
Опции ./configure
  • --prefix=куда-устанавливать (множество мелочных опций по установке)
  • --enable-maintainer-mode [no]
  • --enable-shared (делать разделяемые библиотеки)[yes]
  • --enable-static (10% быстрее)[yes]
  • --with-mit-threads (для linux 2.2 не надо)
  • --with-pthread (для linx 2.2 не надо)
  • --with-named-thread-libs=где
  • --with-named-curses-libs=где
  • --with-named-z-libs=где
  • --enable-thread-safe-client (если клиентская программа использует потоки)
  • --enable-assembler
  • --with-raid
  • --with-unix-socket-path=куда-класть-unix-socket
  • --with-tcp-port=порт [3306]
  • --with-mysqld-user=имя-пользователя-для-mysqld
  • --disable-large-files
  • --with-libwrap
  • --without-debug (15% быстрее)
  • --without-server
  • --without-docs
  • --without-bench
  • --without-readline (использовать системный readline вместо встроенного)
  • --with-charset=кодировка-по-умолчанию (cp1251, koi8_ru, latin1, ...)
  • --with-extra-charsets=список-дополнительных-кодировок (включая - none, complex, all)
  • --with-berkeley-db
  • --with-innodb
  • --with-gemini (Gemini DB)
mysql.server (запуск MySQL при загрузке копьютера)

Скрипт предназначен для /etc/rc.d/init.d (и линки в 0,2,3,5,6 не забыть). Соответственно первый параметр start или stop (посылается сигнал процессу, вместо выполнения "mysqladmin shutdown"). Далее обработка опций из конфигурационного файла (группы [mysqld] и [mysql_server]) и командной строки (какая командная строка в скрипте из rc.d?!). Ищет и запускает safe_mysqld. Если нужны какие-либо специфические опции safe_mysqld, то их можно указать здесь. Секция [mysql.server] в конфигурационном файле /etc/my.cnf может содержать установку переменных:

  • user
  • datadir
  • basedir
  • bindir
  • pid-file

 

safe_mysqld (надстройка над mysqld)

Скрипт запускает mysqld и перезапускает его ежели тот помрет. Проверяет, что не был запущен ранее. Грохает зависшие процессы. Запускать под root. Пытается определить где что лежит (понимает только стандартные конфигурации, иначе надо запускать из BASEDIR). Собирает опции из секций mysqld, server и safe_mysqld конфигурацинных файлов и командной строки (м.б. модифицированных опциями --no-defaults, --defaults-file=имя и --defaults-extra-file=имя). Передает их ("улучшив" некоторые из них) mysqld. Свои опции:

  • --err-log=имя
  • --open-files=для-установки-ulimit-на-открытые-файлы
  • --open-files-limit=
  • --core-file-size=для-установки-ulimit-на-coresize
  • --timezone=установить-TZ
Есть закоментированные проверки всех таблиц. Пользователь по умолчанию - mysql. Пытается запустить mysqld под "nice nohup".

 

mysqld (сервер БД)

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

  • --ansi (бОльшая совместимость с ANSI SQL)
  • --basedir=путь
  • --bdb-lock-detect=[DEFAULT | OLDEST | RANDOM | YOUNGEST | число-секунд]
  • --bdb-logdir=директория
  • --bdb-no-sync
  • --bdb-no-recover
  • --bdb-shared-data (запускать Berkeley DB в режиме разделения с другими процессами)
  • --bdb-tmpdir=директория
  • --bind-address=IP-адрес (для хостов с несколькими адресами)
  • --chroot=путь (умеет?!)
  • --core-file
  • --datadir=путь
  • --default-character-set=кодировка (сменил кодировку - перестрой индексы)
  • --default-table-type=метод-хранения [MyISAM]
  • --defaults-extra-file=дополнительно-к-my.cnf
  • --defaults-file=имя-файла-параметров (вместо my.cnf)
  • --enable-locking (внешняя блокировка - если нужна блокировка нескольких серверов или myisamchk к одной базе данных; работает неустойчиво и медленно)
  • --flush (сбрасывать буфера на диск после каждой SQL-команды
  • --help (выдает список команд; настройки, выбранные при сборке с учетом текущих параметров и значения переменных)
  • --init-file=имя-файла (при запуске читать команды из файла)
  • --language (язык сообщений об ошибках)
  • --log[=имя-файла] (записывать все соединения и команды в журнал)
  • --log-bin[=имя-файла] (записывать журнал в новом двоичном формате для репликации)
  • --log-bin-index=имя-файла (хранит имена последних бинарных журналов)
  • --log-slow-queries[=имя-файла] (записывать все слишком медленные - занимающие более long_query_time секунд - команды в журнал)
  • --log-update[=имя-файла] (записывать изменения в журнал)
  • --log-long-format (дополнительную информацию в журнал изменений)
  • --low-priority-updates (INSERT/DELETE/UPDATE будут иметь меньший приоритет, чем SELECT)
  • --memlock (не свопировать mysqld)
  • --myisam-recover[=опция...] (проверка корректности myisam таблиц и способ восстановления):
    • DEFAULT
    • BACKUP (делать резервную копию при исправлениях - .BAK)
    • FORCE (исправлять даже если это приведет к потере многих данных)
    • QUICK
  • --new (использовать новые, т.е. недоотлаженные возможности)
  • --no-defaults
  • --port=TCP-порт
  • -O имя=значение (установить переменную, список по --help)
  • --safe-mode (уменьшить уровень оптимизации)
  • --safe-show-database (не показывать имена БД пользователям, которые не имеют к ним никаких прав)(или нет такой опции? в списке ее нет, но не ругается)
  • --secure (двойная проверка IP-адресов - есть ли такая опция? если ее указать, то не стартует. Или она теперь по умолчанию? Если нет, то именами хостов вообще нельзя пользоваться!)
  • --skip-bdb
  • --skip-delay-key-write (отключить буферизацию записи ключей)
  • --skip-grant-tables (отключить проверку прав доступа)
  • --skip-locking (не использовать внешнюю блокировку; safe_mysqld использует этот ключ; ключ применяется, если не нужна блокировка нескольких серверов или myisamchk к одной базе данных; все равно внешняя блокировка работает неустойчиво и медленно; команда LOCK работает даже с этим ключом)
  • --skip-name-resolve (в таблицах прав доступа д.б. только IP)
  • --skip-networking (не слушать TCP/IP, только через unix socket)
  • --skip-new (не использовать новые, т.е. не доотлаженные возможности)
  • --skip-show-database (не позволять команду SHOW DATABASE, если пользователь не имеет привилегии работы с процессами. В другом месте говорится, что вообще ничего не показывать - но это неправда)
  • --skip-thread-priority (ускоряет ответ)
  • --socket=путь
  • --tmpdir=путь (вместо /tmp)
  • --user=имя-пользователя (обязательно, если запускается из под root)
Разбор параметров и конфигурационных файлов

Опции берутся в следующем порядке (последующие затирают предыдущие):

  • переменные окружения
  • /etc/my.cnf
  • /usr/local/mysql/data/my.cnf (нельзя поменять с помощью --datadir)
  • из файла, указанного ключом --defaults-extra-file
  • ~/.my.cnf
  • опции в командной строке

 

Действуют на mysql, mysqld, mysqladmin, mysqlimport, mysqldump, myisamchk, myisampack, mysql.server. Файл делится на секции. Секция начинается со строки, в которой указано имя секции в квадратных скобках. Имя секции соответствует имени программы на которую она действует. Любая длинная опция программы (начинающаяся с двух минусов, запустите программу с ключом --help) может быть использована здесь (минусы надо отбросить). Секция с именем client позволяет задать опции (например, пароль ;), общие для всех клиентских программ. Переменные устанавливаются строкой:
set-variable = имя=значение.

Типы таблиц (методы доступа)

MySQL позволяет использовать для хранения данных различные типы таблиц (методы доступа). Меняется командой ALTER TABLE, описание хранится в файле .frm.

  • MyISAM (по умолчанию, см. --default-table-type). Индекс - .MYI, данные - .MYD. Восстановление - myisamchk. Бывают таблицы с записями фиксированной длины, переменной длины (BLOB, VARCHAR, TEXT) и сжатые (myisampack - только чтение). Машинонезависимый формат хранения (хотя формат плавающей точки должен совпадать на этих архитектурах).
  • MERGE - виртуальное слияние таблиц одинакового формата (SELECT, UPDATE и DELETE). Список в файле .MRG.
  • ISAM. Предлагается больше не использовать. Индекс - .ISI, данные - .ISD. Индексирование - B-tree. Восстановление - isamchk. Зависит не только от архитектуры, но и от ОС.
  • HEAP - таблицы в памяти с хешированием. Записи только фиксированной длины.
  • BDB (с поддержкой транзакций). Надежнее (автоматическое восстановление). Транзакции (BEGIN/COMMIT/ROLLBACK). Дольше, больше места на диске и в памяти.
  • InnoDB - в состоянии alfa

 

Права доступа

Аутентификация пользователя производится по имени (до 16 символов), паролю (м.б. пустым) и хосту или его IP. Большинство клиентских программ по умолчанию используют mysql-имя, совпадающее с unix-именем, но это можно изменить с помощью ключа --user=. Пароль можно задать:

  • прямо в командной строке после ключа -p (без пробела, очень опасно)
  • указав ключ -p без пароля (программа запросит пароль с клавиатуры, наиболее безопасно)
  • в файле .my.cnf (права к этому файлу должны быть только у собственника), секция [client], поля host, user и password
  • с помощью переменной окружения MYSQL_PWD (очень опасно) и MYSQL_HOST

 

Вся информация о правах хранится в БД с именем mysql. Никто не должен иметь к ней доступа на чтение (см. про пароли).

Используются таблицы:

  • user (используется чтобы понять - пускать/не пускать; данные здесь права действуют на все БД; административные привилегии и операции с файлами определяются только здесь)
    • Host: CHAR(60),PRI, нечувствителен к регистру. Может содержать имя хоста, IP адрес или localhost. Можно использовать шаблоны с символами '%' (любое количество любых символов) и '_' (любой символ). Пустое поле означает, что производится логическое "И" привилегий в данной строке и привилегий в соответствующей строке таблицы host. При использовании IP-адреса можно задавать сетевую маску (в виде - /255.255.255.0 или /24).
    • User: CHAR(16),PRI. Пустое поле соответствует любому имени, в данном случае пользователь рассматривается как анонимный и предоставленное им имя заменяется на пустое для дальнейших проверок прав доступа.
    • Password: CHAR(16), зашифрован, но не так как в Unix, знание даже зашифрованного пароля позволяет выдать себя за данного пользователя - пароль шифруется на стороне клиента! Может быть пустым - пользователь также должен предъявить пустой пароль.
    • привилегии: enum('N','Y'), по умолчанию - 'N'
      • select - выборка из строк таблицы
      • insert - вставка строки в таблицу
      • update - изменение строки таблицы
      • delete - удаление строки таблицы
      • create - создавать БД/таблицу
      • drop - удалять БД/таблицу
      • reload - позволяет выполнять административные команды (reload, refresh, flush-*)
      • shutdown - позволяет остановить mysqld
      • process - позволяет выполнить processlist (можно смотреть текст команд, выполняемых другими пользователями (в т.ч. SET PASSWORD)), kill
      • file - читать файлы (LOAD DATA INFILE) и писать файлы (SELECT ... INTO OUTFILE), с точки зрения Unix используются права, с которыми запущен mysqld (в частности, он может прочитать /etc/passwd, любую БД и т.п., записать файл в /tmp и т.п., но не может переписать уже существующий файл)
      • grant - передавать свои привилегии другим, два пользователя с различными привилегиями могут объединить их ;)
      • references - не реализовано
      • index - создавать/удалять индексы таблицы
      • alter - изменять формат таблицы, в том числе переименовать ее, что позволяет обмануть систему прав доступа
  • host
    • Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
    • DB: CHAR(64),PRI. '%' или пустое поле означает - любая БД.
    • привилегии: enum('N','Y'), по умолчанию - 'N'
      • select
      • insert
      • update
      • delete
      • create
      • drop
      • grant
      • references
      • index
      • alter
  • db
    • Host: CHAR(60),PRI. Строка '%' означает - при доступе с любого хоста. Пустое поле означает необходимость посмотреть в таблицу host.
    • DB: CHAR(64),PRI. '%' или пустое поле означает - любая БД.
    • User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
    • привилегии: enum('N','Y'), по умолчанию - 'N'
      • select
      • insert
      • update
      • delete
      • create
      • drop
      • grant
      • references
      • index
      • alter
  • tables_priv
    • Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
    • DB: CHAR(60),PRI. Не м.б. пустым или содержать шаблоны.
    • User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
    • Table_name: CHAR(60)(или 64?),PRI. Не м.б. пустым или содержать шаблоны.
    • Grantor: CHAR(77)
    • Timestamp: timestamp(14)
    • Table_priv: set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter')
    • Column_priv: set('Select','Insert','Update','References')
  • culumns_priv
    • Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
    • DB: CHAR(60),PRI. Не м.б. пустым или содержать шаблоны.
    • User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
    • Table_name: CHAR(64)(или 60?),PRI. Не м.б. пустым или содержать шаблоны.
    • Column_name: CHAR(64)(или 60?),PRI. Не м.б. пустым или содержать шаблоны.
    • Timestamp: timestamp(14)
    • Column_priv: set('Select','Insert','Update','References')

 

Проверка права на подсоединение к серверу: mysql-клиент предъявляет имя пользователя, сервер определяет имя (или IP) хоста клиента (или localhost для обращения через unix-socket). По данной паре (адрес/имя) ищется строка в таблице user. Предварительно таблица сортируется по полям (Host/User) так, что наиболее специфичные строки оказываются первыми, наименее специфичные - последними. Если строка не найдена, то соединение отвергается. Если - найдена, то сверяется пароль.

Проверка прав при исполнении каждого запроса: таблица db сортируется по полям Host, Db и User, таблица host по полям Host и Db, таблицы tables_priv и columns_priv по полям Host, Db и User от наиболее специфичного к наименее. Для административных запросов и доступа к файлам проверяется только таблица user. Для прочих запросов в начале проверяется таблица user - а нет ли у данного пользователя прав доступа на "глобальном" уровне. Если есть - операция разрешается. Если нет, то проверяются права доступа к конкретной БД с конкретного хоста (по пересечению таблиц Db и Host с учетом шаблонов и пустых полей). Если их достаточно, то доступ дается. Если недостаточно, то к объединению "глобальных" прав и прав БД/хост добавляются права, извлеченные из таблиц tables_priv и columns_priv. Если и этого не хватает, то увы...

Права доступа читаются mysqld (и не читаются при "ручном" изменении БД mysql):

  • при запуске
  • при выполнении команд GRANT, REVOKE и SET PASSWORD
  • при выполнении команды FLUSH PRIVILEGES
  • при выполнении mysqladmin flush-privileges/reload

 

"Глобальные" привилегии и изменения пароля вступают в силу только при следующем соединении. Изменения в доступе к БД - при следующей команде use. Изменения в доступе к таблицам и колонкам - при следующем запросе.

Все команды, введенные в клиенте mysql (а в других?) попадают в .mysql_history (того unix-пользователя, который запускал mysql). А также в различные журналы сервера и в выдачу команды SHOW PROCESSLIST.

Изменение пароля: set password for имя=password('новый пароль').

GRANT тип-привилегии [(список-столбцов)] [, тип-привилегии [(список-столбцов)] ...] ON { имя-таблицы | * | *.* | имя-БД.* } TO имя-пользователя [ IDENTIFIED BY 'пароль' ] [, имя-пользователя [ IDENTIFIED BY 'пароль ] ... ] WITH GRANT OPTION

REVOKE тип-привилегии [(список-столбцов)] [, тип-привилегии [(список-столбцов)] ...] ON { имя-таблицы | * | *.* | имя-БД.* } FROM имя-пользователя [, имя-пользователя ... ]

Типы привилегий:

  • ALL PRIVILEGES (aka ALL)
  • ALTER
  • CREATE
  • DELETE
  • DROP
  • FILE
  • GRANT OPTION (только для REVOKE)
  • INDEX
  • INSERT
  • PROCESS
  • REFERENCES (не реализовано)
  • RELOAD
  • SELECT
  • SHUTDOWN
  • UPDATE
  • USAGE (никаких - просто место застолбить)

 

Для столбцов можно задавать только INSERT, SELECT и UPDATE. Для таблиц - INSERT, SELECT, UPDATE, CREATE, DROP, DELETE, GRANT, INDEX, ALTER. Использование "*.*" означает задание глобальных привилегий. Использование "*" означает задание привилегий для текущей БД (если текущей БД нет, то глобальные).

SHOW GRANTS FOR имя@хост;

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

Для упрощения жизни можно использовать утилиты mysqladmin и mysqlaccess, xmysqladmin, mysql_webadmin из директории Contrib.

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

Не храните пароли и тому подобную информацию в БД в открытом виде.

Базовый синтаксис

Константы

  • строка (в апострофах или кавычках, обратная косая черта как escape-символ)
  • целое число (64 бита)
  • вещественное число
  • шестнадцатеричное число: в численном контексте как целое (64-бит), в строковом контексте пара 16-ричных цифр преобрацуется в символ
  • NULL (N при экспорте/импорте)

Имена

  • БД (имя файла до 64 символов, кроме '/' и точки, в некоторых случаях до 60 символов)
  • таблица (имя файла до 64 символов, кроме '/' и '.')
  • колонка (до 64 любых символов). Можно ссылаться:
    • col_name
    • tbl_name.col_name
    • db_name.tbl_name.col_name
  • алиас (до 255 любых символов)

Если в имени есть спецсимволы или оно совпадает с зарегистрированным словом, то его надо заключать в апострофы. Нельзя использовать символы 0x00 или 0xFF (привет маленькому "я" в cp1251!), апостроф и кавычку. Имена БД и таблиц чувствительны к регистру в Unix и нечувствительны в MS Windows. Имена колонок нечувствительны везде. Алиасы на таблицы чувствительны везде, алиасы на колонки нечувствительны везде.

Переменные

Имя переменной начинается с '@', может содержать буквы, цифры, '_', '$', '.'. Первоначальное значение - NULL. Может содержать целое (64 бита), вещественное или строку. Можно использовать в тех местах, где разрешается использование выражений (не числовых констант как во фразе LIMIT!). Действует на текущую нить (thread). Установка:

  • SET @имя=выражение
  • @имя:=выражение внутри выражения

 

Комментарии

  • как в C (начиная с '/*' до '*/'); если после '/*' стоит восклицательный знак и номер версии, то содержимое комментария исполняется, если номер версии равен или больше указанного
  • как в sh (начиная с '#' до конца строки)
  • как в SQL :) (начиная с '-- ' до конца строки, не забудьте про пробел!)
Типы данных (в колонках)

M - ширина поля при отображении (максимально - 255). D - число знаков в дробной части (не более M-2 и 30).

  • Числовые (если число занимает меньше M позиций, то оно дополняется слева пробелами или нулями для ZEROFILL. Если число занимает более M колонок, то выводятся все цифры. Если используется ZEROFILL для целых, то автоматически добавляется UNSIGNED). Все вычисления проводятся с точностью 63 бита или переводом в DOUBLE (кроме нескольких функций).
    • TINYINT[(M)] [UNSIGNED[ [ZEROFILL] (1 байт)
    • SMALLINT[(M)] [UNSIGNED[ [ZEROFILL] (2 байта)
    • MEDIUMINT[(M)] [UNSIGNED[ [ZEROFILL] (3 байта)
    • INT[(M)] [UNSIGNED[ [ZEROFILL] (4 байта)
    • INTEGER[(M)] [UNSIGNED] [ZEROFILL] (4 байта)
    • BIGINT[(M)] [UNSIGNED] [ZEROFILL] (8 байт)
    • FLOAT[(M,D)] [ZEROFILL] (4 байта)
    • DOUBLE [PRECISION][(M,D)] [ZEROFILL]
    • REAL[(M,D)] [ZEROFILL] (синоним DOUBLE)
    • DECIMAL[(M[,D])] [ZEROFILL] (неупакованное десятичное вещественное число)
    • DEC - синоним DECIMAL
    • NUMERIC[(M[,D])] [ZEROFILL] (синоним DECIMAL)
  • Дата и время (проверка значений не очень тщательная, например, дата 1999-11-31 будет воспринята нормально; допусимы номер дня, равный нулю, и номера месяца И дня равные нулю; неверное значение преобразуется в "нулевое" - 0000-00-00 и т.д.; заносить можно как строки с разделителями полей - любыми -, так и без разделителей или числа)
    • DATE (дата от '1000-01-01' до '9999-12-31'; 3 байта)
    • DATETIME (время от '1000-01-01 00:00:00' до '9999-12-31 23:59:59'; 8 байт)
    • TIMESTAMP[(M)] (время от 19700101000000 до 2037 года; 4 байта; если при INSERT или UPDATE (должны быть реальные изменения) значение опущено (только первая колонка этого типа) или равно NULL или NOW(), то заносится текущее время; формат выдачи зависит от M (хранится всегда все; задавать надо тоже все):
      • 14 (по умолчанию) - YYYYMMDDHHMMSS
      • 12 - YYMMDDHHMMSS
      • 8 - YYYYMMDD
      • 6 - YYMMDD
    • TIME (время от -838:59:59 до 838:59:59; выводится как HH:MM:SS; 3 байта; можно вводить как 'D HH:MM:SS.fraction', хотя доли пока не хранятся)
    • YEAR[(2|_4_)] (от 1901 до 2155 или от 1970 до 2069; 1 байт)
  • Строки (в MySQL CHAR всегда NATIONAL; надо учитывать, что максимальная длина строки таблицы и пакета протокола клиент/сервер - 16 МБ - и надо увеличить размер каких-то буферов как сервера, так и клиента; VARCHAR, BLOB и TEXT - строки переменной длины; BINARY - навязчивый атрибут, т.е. если операнд выражения - BINARY, то все выражение - BINARY; TEXT - это BLOB, который сортируется и сравнивается в нечувствительной к регистру манере; TEXT можно рассматривать как VARCHAR нужного размера, а BLOB можно рассматривать как VARCHAR BINARY нужного размера, но хвостовые пробелы не удаляются и не м.б. значения по умолчанию; для CHAR и VARCHAR можно индексировать префикс колонки; для BLOB и TEXT обязательно индексировать префикс фиксированной длины; для VARCHAR и TEXT можно создавать индекс специального вида FULLTEXT для индексирования всей колонки; ORDER BY и GROUP BY работают только с объектами фиксированной длины или первыми max_sort_length байтами)
    • [NATIONAL] CHAR(M) [BINARY] (фиксированной длины от 1 до 255; дополняется справа пробелами; при извлечении правые пробелы удаляются; сортируются и сравниваются нечувствительно к регистру относительно набора символов по умолчанию, если не указано BINARY; CHAR(0) занимает 1 бит и может принимать два значения - NULL и "")
    • NCHAR - синоним NATIONAL CHAR
    • CHARACTER - синоним CHAR
    • [NATIONAL] VARCHAR(M) [BINARY] (строка переменной длины от 1 до 255; правые пробелы удаляются при сохранении; сортируются и сравниваются нечувствительно к регистру относительно набора символов по умолчанию, если не указано BINARY)
    • CHARACTER VARYING - синоним VARCHAR
    • TINYBLOB (BLOB макс. длины 255)
    • TINYTEXT (TEXT макс. длины 255)
    • BLOB (BLOB макс. длины 65535)
    • TEXT (TEXT макс. длины 65535)
    • MEDIUMBLOB (BLOB макс. длины 2^24-1)
    • MEDIUMTEXT (TEXT макс. длины 2^24-1)
    • LONGBLOB (BLOB макс. длины 2^32-1, в действительности строка таблицы ограничена 16МБ)
    • LONGTEXT (TEXT макс. длины 2^32-1)
  • ENUM('строка1','строка2',...) (может принимать значение из списка, NULL или "" - как признак ошибки при вставке; не более 65535 различных значений; 1 или 2 байта; если описан как NULL, то по умолчанию вставляется NULL; если описан как NOT NULL, то по умолчанию вставляется первая строка из списка; каждая строка имеет индекс, начиная с 1; индекс "" равен 0; индекс NULL равен NULL; в числовом контексте извлекается индекс, а не строка (как при вставке, так и при извлечении); сортировка производится по индексу; регистр букв не влияет при вставке, но извлекается в том виде, в каком колонка описывалась)
  • SET('строка1','строка2',...) (может одновременно принимать от 0 до 64 значений из списка; элемент списка не может содержать запятую; 1, 2, 3, 4 или 8 байт;если значение SET извлекается/устанавливается в числовом контексте, то в числе каждому установленому биту соответствует элемент множества (первый элемент в описании множества соответствует младшему биту); сортируются как числа)
Операторы SQL
  • операции над базами данных
    • CREATE DATABASE [IF NOT EXISTS] db_name
    • DROP DATABASE [IF EXISTS] db_name
  • операции над таблицами
    • CREATE [TEMPORARY] TABLE [IF NOT EXISTS] имя-таблицы [(описание-колонки,...)] [опции] [[IGNORE | REPLACE] SELECT ...]
      • описание-колонки
        • имя-колонки тип [NOT NULL | NULL] [DEFAULT значение-по-умолчанию] [AUTO_INCREMENT] [PRIMARY KEY] [описание-ссылки]
          NULL: по умолчанию
          AUTO_INCREMENT: для колонки типа целое число, при вставке NULL или 0 в такую колонку ищется максимальное значение колонки и увеличивается на единицу; отсчет начинается с 1; при удалении строки с наибольшим значением бывает всякое ;); такая колонка м.б. только одна и она д.б. проиндексирована; не надо записывать в такую колонку отрицательных чисел; получить наибольшее число можно с помощью оператора: SELECT * FROM имя-таблицы WHERE имя-колонки IS NULL
          DEFAULT: назначается системой (NULL, 0, пустая строка и т.д.), если Вы не установили явно
          SELECT позволяет создать новую таблицу на основе уже существующей
        • PRIMARY KEY (имя-колонки[(длина)],...)
          уникальный ключ; все ключевые колонки д.б. NOT NULL; только один на таблицу (присваивается имя PRIMARY)
        • {KEY | INDEX} [имя-индекса] (имя-колонки[(длина)],...)
        • UNIQUE [INDEX] [имя-индекса] (имя-колонки[(длина)],...)
        • FULLTEXT [INDEX] [имя-индекса] (имя-колонки[(длина)],...)
        • [CONSTRAINT символ] FOREIGN KEY имя-индекса (имя-колонки[(длина)],...) [описание-ссылки]
          не реализовано
        • CHECK (выражение)
          не реализовано
      • описание-ссылки ::= REFERENCES имя-таблицы [(имя-колонки[(длина)],...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
        не реализовано
      • опции
        • TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MYISAM } (см, типы таблиц)
        • AUTO_INCREMENT = начальное-значение
        • AVG_ROW_LENGTH = число
        • CHECKSUM = {0 | 1}
        • COMMENT = "строка-до-60-символов"
        • MAX_ROWS = число
        • MIN_ROWS = число
        • PACK_KEYS = {0 | 1}
          чтение происходит быстрее, а изменение - медленнее
        • PASSWORD = "пароль"
          шифруется описание таблицы (в бесплатной версии не работает)
        • DELAY_KEY_WRITE = {0 | 1}
        • ROW_FORMAT= { default | dynamic | fixed | compressed }
          не реализовано
        • RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=число-расслоений RAID_CHUNKSIZE=числоKB
          требуется ключ --with-raid при сборке; пока реализован только тип STRIPED (1 и RAID0 - это синонимы для STRIPED); позволяет создавать таблицы с данными более 2GB (или распараллелить ввод/вывод, если разнести директории на разные диски)
        • UNION = (имя-таблицы,[имя-таблицы...])
          только для таблиц типа MERGE
    • ALTER [IGNORE] TABLE имя-таблицы как-менять [,как-менять ...]
      • ADD [COLUMN] описание-колонки [FIRST | AFTER имя-колонки ]
        без FIRST или AFTER колонка вставляется в конец
      • ADD [COLUMN] (описание-колонки, описание-колонки, ...)
      • ADD INDEX [имя-индекса] (имя-колонки[(длина)],...)
      • ADD PRIMARY KEY (имя-колонки[(длина)],...)
      • ADD UNIQUE [имя-индекса] (имя-колонки[(длина)],...)
      • ADD FULLTEXT [имя-индекса] (имя-колонки[(длина)],...)
      • ALTER [COLUMN] имя-колонки {SET DEFAULT константа | DROP DEFAULT}
      • CHANGE [COLUMN] имя-существующей-колонки описание-колонки
      • MODIFY [COLUMN] описание-колонки
      • DROP [COLUMN] имя-колонки
      • DROP PRIMARY KEY
      • DROP INDEX имя-индекса
      • RENAME [TO] новое-имя-таблицы
      • ORDER BY имя-колонки
      • опции таблицы
      делается временная копия таблицы, изменяется, затем старая таблица удаляется (соответственно, нужны привилегии: select, insert, delete, update, create и drop)
      IGNORE: если в преобразованной таблице образуются одинаковые значения UNIQUE индексов, то берется только одна строка (без IGNORE операция откатывается)
      нельзя сделать размер колонки короче, чем используется в каком-либо индексе
    • RENAME TABLE tbl_name TO new_table_name[, tbl_name2 TO new_table_name2,...]
      оператор выполняется как единое целое, что позволяет подменить таблицу пустой:
      CREATE TABLE new_table (...); RENAME TABLE old_table TO backup_table, new_table TO old_table; 
    • DROP TABLE [IF EXISTS] имя-таблицы [, имя-таблицы,...] [RESTRICT | CASCADE]
      RESTRICT и CASCADE не реализованы
  • обслуживание таблиц
    • OPTIMIZE TABLE имя-таблицы [, имя-таблицы,...]
      полезно после больших удалений или изменений таблиц с переменной длиной строки: сортировка индексов и дефрагментация
    • CHECK TABLE имя-таблицы [, имя-таблицы,...] {QUICK | FAST | MEDIUM | EXTEND | CHANGED}
    • BACKUP TABLE имя-таблицы [, имя-таблицы,...] TO 'имя-директории'
    • RESTORE TABLE имя-таблицы [, имя-таблицы,...] FROM 'имя-директории'
    • ANALYZE TABLE имя-таблицы [, имя-таблицы,...]
      пересчет распределения ключей
    • REPAIR TABLE имя-таблицы [, имя-таблицы,...] [QUICK] [EXTENDED]
  • операции над строками
    • DELETE [LOW_PRIORITY] FROM имя-таблицы [WHERE выражение] [LIMIT макс-число-строк]
      место не освобождается - используйте OPTIMIZE
    • TRUNCATE TABLE имя-таблицы
      удаляет таблицу и тут же создает заново
    • SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [HIGH_PRIORITY] [DISTINCT | DISTINCTROW | ALL]
         выражение [AS имя-алиаса],...
         [INTO {OUTFILE | DUMPFILE} 'имя-файла' опции-экспорта
         [FROM из-каких-таблиц
         [WHERE выражение]
         [GROUP BY {номер-колонки | имя-колонки | формула} [ASC | DESC], ...]
         [HAVING выражение]
         [ORDER BY {номер-колонки | имя-колонки | формула} [ASC | DESC], ...]
         [LIMIT [смещение-от-0,] макс-число-строк]
         [PROCEDURE имя-процедуры]
         [FOR UPDATE | LOCK IN SHARE MODE]]
      FROM - простейший случай синтаксиса - имя-таблицы, если таблиц несколько, то смотри синтаксис JOIN (в простейшем случае имена перечисляются через запятую); также можно задавать алиас таблицы с помощью слова AS
      HAVING применяется последним (в частности, после GROUP BY) непосредственно перед посылкой результата клиенту (т.е. без оптимизации!)
      DUMPFILE: в файл записывается одна строка безо всяких разделителей полей и строк и escape (позволяет, например, сбросить картинку из BLOB)
      OUTFILE и DUMPFILE: необходимо иметь привилегии file, если файл с указанным именем существовал, то он не затирается; права к файлу устанавливаются на чтение для всех
      FOR UPDATE: если тип таблицы позволяет блокировку страницы/строки (InnoDB, GEMINI), то задействованные строки блокируются на запись
    • синтаксис JOIN (только не надо вопросов ко мне, задавайте их этим фантазерам :)
      • таблица::= имя-таблицы [[AS] алиас] [USE INDEX (список-ключей)] [IGNORE INDEX (список-ключей)]
      • таблица, таблица
        это синоним INNER JOIN
      • таблица [CROSS] JOIN таблица
      • таблица INNER JOIN таблица {ON условное-выражение | USING (список-колонок)}
      • таблица STRAIGHT_JOIN таблица
      • таблица LEFT [OUTER] JOIN [ON условное-выражение | USING (список-колонок)]
      • таблица NATURAL [LEFT [OUTER]] JOIN таблица
      • таблица LEFT OUTER JOIN таблица ON условное-выражение
      • таблица RIGHT [OUTER] JOIN [ON условное-выражение | USING (список-колонок)]
      • таблица NATURAL [RIGHT [OUTER]] JOIN таблица
    • INSERT
    • LOAD FILE
Функции для SELECT и WHERE

Между именем функции и скобкой не должно быть пробела. Операндами могут быть константы, имена колонок и переменные.

  • группировка функций с помощью круглых скобок
  • арифметические операции: +, -, *, /
  • битовые функции: |, &, <<, >>, ~, BIT_COUNT()
  • логические функции: !, ||, && (возвращают 1, 0, или NULL)
  • сравнение:
    • =, <>, !=, <=, <, >=, >
    • <=> (сравнение, позволяющее сравнивать NULL)
    • expr IS NULL, expr IS NOT NULL
    • expr BETWEEN min AND max
    • expr IN (значение1,...)
    • expr NOT IN (значение1,...)
    • ISNULL()
    • COALESCE(список) - возвращает первый ненулевой элемент списка
    • INTERVAL(N,N1,N2,N3,...) - возвращает номер интервала, т.е. 1, если N < N1; 2 если N < N2 и т.д.
  • сравнение строк (если выражение чувствительно к регистру, то и сравнение будет чувствительным к регистру)
    • expr LIKE шаблон [ESCAPE 'escape-символ'] (соответствие простому регулярному выражению SQL; "%" - любое количество любых символов; "_" - ровно один символ; escape-символ по умолчанию - ""; чтобы найти ' ' надо задать в шаблоне ' '; чтобы найти '' - '\')
    • expr NOT LIKE шаблон [ESCA
Автор: C.Богомолов · Добавлена: 2002-08-10
Источник статьи · Просмотров: 10229 · Рейтинг: 3.8

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела
Flash
Apache
WWW
PhotoShop
Веб-дизайн
Раскрутка и реклама
Базы данных
3D графика
Хостинг
Истории веб-мастеров
Web-технологии
Сетевая безопасность
Программирование для Web
Операционные системы

Новые статьи
Лучшие статьи
Популярные статьи
Комментируемые статьи
Разделы сайта
Скрипты
Статьи
Шрифты
Флэш исходники
HTML шаблоны
Партнерки
Клипарты
Смайлы
Фоны
Гифы
Иконки
Опрос сайта
Есть ли у вас свой сайт?
Всего ответов: 141131
Наша кнопка
WoWeb.ru - портал для веб-мастера