|
Bog BOS: MySQL: установка, настройка, описание
|
Последнее изменение файла: 2024.07.02
Скопировано с www.bog.pp.ru: 2024.11.23
Bog BOS: MySQL: установка, настройка, описание
MySQL - это реляционная (SQL) СУБД без излишеств, зато быстрая.
MySQL - это реляционная (SQL) СУБД, которая поначалу позиционировалась
как СУБД для интернет-сайтов, то есть простая и быстрая при извлечении данных.
Постепенно появились транзакции (методы хранения Berkley DB
и InnoDB (ACID)), внешние ключи и хранимые процедуры.
Стандарты: подмножество ANSI/ISO SQL:2003 с расширениями, ODBC levels 0-3.51.
Предусматриваются различные режимы совместимости (начиная с версии 4.1
можно изменять динамически).
Лицензия - GPL/LGPL (документация не под GPL!).
Но в случае извлечения прибыли от MySQL фирма - MySQL AB, Швеция - мягко
намекает на оплату поддержки).
Для хостинга лицензия не нужна, но клиенты
должны иметь возможность убедиться, что все установлено правильно
(предлагается давать доступ на чтение к установленным исходникам?).
Можно купить коммерческую лицензию для использования в своих продуктах.
Со временем лицензия ужесточается, а стоимость поддержки увеличивается.
По состоянию на июнь 2007 имеется 2 версии СУБД: Enterprise Server (от $600 в год)
и Community Server (бесплатен, но заплатки с задержкой и с неудобствами).
MySQL AB была продана Sun Microsystems, Sun Microsystems был продан Oracle, основатель сделал форк и назвал его MariaDB.
Написана на C и C++. Базовая платформа: Solaris 2.7-2.9 (SPARC),
FreeBSD, Linux (SuSE, Red Hat, ReiserFS, ядро 2.4, x86),
но работает также в AIX, BSDI, DEC Unix,
FreeBSD (4.x, native threads, Linux threads),
HP-UX, Linux (glibc 2.0.7+), Mac OS X, NetBSD, Novell NetWare 6.0,
OpenBSD, OS/2, SGI Irix, Solaris (2.5, native threads),
SunOS (4.x, MIT-pthreads), SCO OpenServer, SCO UnixWare,
Tru64, Windows 9x, Windows NT, Netware 6.0.
Состоит из многопотокового сервера (mysqld),
клиентской библиотеки (в версии 4.0 появилась возможность встраивать сервер
в приложение) и множества утилит. Одна из утилит - mysql - представляет
собой клиентское приложение для полного доступа к возможностям сервера
(отправляет SQL-запросы и выдаёт ответ на терминал).
Для запуска mysqld можно использовать программы
mysql.server и mysqld_safe
(mysqld_multi для запуска нескольких серверов).
Первоначально мимикрировала под mSQL (включая интерфейс утилит и API).
Имеются API для C, C++, Java (JDBC),
Eiffel, Perl, PHP, Python, Ruby, Tcl. Поддержка ODBC 2.5 с расширениями.
Варианты скомпилированных пакетов -
MySQL Standard (MySQL Pro - коммерческая лицензия), MySQL Max (дополнительные,
не до конца отлаженные функции, слит в основную ветвь с 5.0.37), MySQL Classic (коммерческая лицензия,
без InnoDB). Вариант, скомпилированный с помощью icc, работает на 20% быстрее.
Методы хранения: ISAM (устарел и удален в версии
5.0), MyISAM (по умолчанию; в 3-5 раз быстрее, чем методы с поддержкой транзакций;
LOCK TABLE; myisamchk), Berkley DB (BDB, есть поддержка транзакций),
InnoDB (есть поддержка транзакций, foreign keys), HEAP (временные таблицы в памяти,
записи только фиксированной длины).
Таблицы MyISAM в виде B-tree со сжатием индекса (myisampack, только чтение).
До 32 (64 в версии 4.1.2) индексов на таблицу. До 64KB на запись (LONGBLOB, LONGTEXT?).
До 16 колонок на индекс. Длина индекса до 500 (1000 в версии 4.1.2) байт. Записи
переменной длины. Есть примеры использования MySQL с 60000 таблиц и 5
миллиардами строк. Размер таблицы ограничивается максимальным размером
файла в файловой системе (при создании таблицы размером более 4 ГБ
необходимо специально это указать). MERGE позволяет работать с несколькими
однотипными таблицами как с одной.
Поддержка кодировок и правил сравнения koi8-r и cp1251.
В версии 4.1 появилась поддержка Unicode (UTF8, UCS2) на уровне БД,
таблицы или поля. UTF8 в соответствии с RFC 3629, но число байт в символе
не более 3 (RFC 2279 - до 6, RFC 3629 - до 4).
Клиент может иметь свою кодировку (кроме UCS2) и правила сортировки.
Имеется полнотекстовый поиск слов и фраз с использованием булевых операций
и ранжированием результата. Метаданные (например, имена таблиц) хранятся
начиная с версии 4.1 в UTF-8.
Клиенты могут соединяться по TCP/IP
(можно использовать только, если никто не подслушивает) или Unix socket.
В версии 4.0 появилась поддержка SSL (хотя и раньше можно было организовать
защищенный канал с помощью OpenSSH)
и возможность ограничить использование ресурсов.
Парольная защита (пароли шифруются перед пересылке, однако, это не увеличивает
безопасность). Система паролей и привилегий носит следы исторического развития,
что сильно уменьшает доверие к ней. Реализована репликация БД.
Отсутствует memory leak (проверено Purify и Valgrind),
если не считать системных библиотек.
Схема БД (INFORMATION_SCHEMA) в версии 5.0.
Каждая БД хранится в отдельном каталоге файловой системы
в каталоге данных (/usr/local/mysql/data/),
таблица занимает один или несколько файлов, кроме таблиц типа InnoDB,
которые размещаются в общем табличном пространстве.
Имена каталогов соответствуют именам БД.
Таблице MyISAM соответствуют 3 файла: имя-таблицы.frm (описание
формата таблицы), имя-таблицы.MYD (содержимое таблицы),
имя-таблицы.MYI (индексы таблицы). Кстати, число открытых
дескрипторов в программе ограниченно (1024).
Машинонезависимый формат хранения (хотя формат плавающей точки должен
совпадать на этих архитектурах).
Таблице MERGE соответствуют 2 файла: имя-таблицы.frm
(описание формата таблицы), имя-таблицы.MRG (список имён MyISAM таблиц).
Таблице BDB соответствуют 2 файла: имя-таблицы.frm
(описание формата таблицы), имя-таблицы.db (содержимое таблицы и индексы).
Таблицы типа HEAP хранятся в оперативной памяти.
Таблицы InnoDB могут храниться
в одном файле или нескольких файлах (обычно в каталоге данных)
или разделах диска без использования файловой сиситемы.
В каталоге БД для таблиц InnoDB хранятся только описания формата
(имя-таблицы.frm) таблиц.
Каталог данных содержит также конфигурационный файл (my.cfg),
файл с номером процесса (имя-хоста.pid), файл с сообщениями об
ошибках (имя-хоста.err), журналы (запись всех SQL-команд: .log, -slow.log,
-bin.index, -bin.номер),
сертификаты и ключи SSL.
Если несколько серверов имеют доступ к одному каталогу данных
одновременно (или сервер и утилиты типа myisamchk), то необходимо обеспечить
блокировку файлов.
Стабильность подсистем (по состоянию версии 4.1.10):
ISAM - стабильная (намечена к удалению),
MyISAM - стабильная,
C API - стабильная (буфер до 16МБ),
mysql(,admin,show,dump,import) - стабильные,
Basic SQL - стабильная,
оптимизатор - стабильная,
блокировка (одновременный доступ нескольких процессов, не клиентов)
- gamma (проблемы в некоторых версиях Linux, рекомендуется --skip-locking),
нити в Linux - рекомендуется --skip-locking и использовать не более 1000
одновременных соединений,
DBD - стабильная,
MyODBC - стабильная,
репликация - стабильная (4.1),
BDB - стабильная (4.1),
автоматическое восстановление MyISAM - gamma,
массовая вставка в MyISAM - альфа,
InnoDB - стабильная (3.23.49),
полнотекстовый поиск - стабильная (4.1).
Активный жизненный цикл каждой версии (развитие и исправление всех ошибок)
ограничивается 2 годами с момента зрелости версии (General Availability).
В течении следующих 3 лет исправляются проблемы с безопасностью и самые гадкие ошибки.
Версия 3.23 больше не поддерживается (3.23.32 в январе 2001).
Дополнительное время для 4.0 заканчивается 2008-12-31 (4.0.12 в марте 2003),
для версии 4.1 - 2009-12-31 (4.1.7 в октябре 2004).
Версия 5.0 достигла зрелости 2005-12-13 (5.0.15), разделение на Community Server и Enterprise.
Версия 5.1 достигла зрелости 2008-11-14 (5.1.30).
Версия 5.5 достигла зрелости 2008-11-14 (5.5.8).
Расширения и несоответствия относительно ANSI SQL
(сервер может работать в различных режимах, в т.ч. в режиме совместимости
с ANSI):
- исполняемые комментарии (/*!40108 ... */) позволяют выполнять
имеющие расширения программы на других SQL серверах или на старых
версиях MySQL
- строки можно заключать не только в апострофы, но и в кавычки;
можно использовать '\'
- можно использовать таблицы из разных БД в одном выражении
- операции ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, REPAIR TABLE
- операции CREATE DATABASE, DROP DATABASE, FLUSH, RESET
- операции SHOW, EXPLAIN, SET
- операции DO
- LOAD DATA INFILE
- RENAME TABLE
- REPLACE вместо DELETE + INSERT
- многочисленные расширения ALTER TABLE
- ключевые слова TEMPORARY и IF NOT EXISTS при создании/удалении таблиц
- типы полей MEDIUMINT, SET, ENUM и различные модификации BLOB и TEXT
- в полях типа VARCHAR не хранятся завершающие пробелы (исправлено в 5.0.3)
- атрибуты полей: AUTO_INCREMENT, BINARY, NULL, UNSIGNED и ZEROFILL
- по умолчанию строки сравниваются независимо от регистра с учётом текущего
набора символов (иначе надо использовать BINARY)
- ключ DELAYED при создании/замене строк
- ключ LOW_PRIORITY при манипуляции со строками
- SELECT .. INTO OUTFILE ...
- ... GROUP BY [ ASC | DESC ] ...
- HANDLER
- синонимы операторов OR (||) и AND (&&) и MOD (%),
вместо SQL-оператора || необходимо использовать функцию CONCAT()
- SELECT col1=1 FROM ...
- LAST_INSERT_ID()
- оператор REGEXP
- функции IT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(),
ENCRYPT(), MD5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(),
WEEKDAY()
- присвоение значений переменным в выражениях (:=)
- функции STD(), BIT_OR(), BIT_AND(), BIT_XOR(), GROUP_CONCAT() для GROUP BY
- комментарии в стиле C и sh
- множество других мелких улучшений и несовместимостей, которые не позволят
Вам "соскочить" с MySQL на другую СУБД
Отсутствующие возможности ANSI SQL:
- тригеры (начальная поддержка в 5.0, полноценная ожидается в версии 5.1)
- Foreign keys для MyISAM (ожидаются в версии 5.1)
- Full outer join (ожидаются в версии 5.1)
- Constraints (ожидаются в версии 5.1)
В RHEL 8 (Rocky Linux) модуль mariadb имеет потоки 10.3 и 10.5, но некоторые пакеты имеют зависимость
от потока по умолчанию, т.е. 10.3.
Установка сервера:
- yum module install mariadb:10.3/server # mariadb-server, mariadb, mariadb-common, mariadb-connector-c (mariadb-libs?),
mariadb-connector-c-config (mariadb-config?), mariadb-errmsg
perl-DBD-MySQL, perl-DBI, perl-Math-BigInt, perl-Math-Complex, mariadb-backup, mariadb-gssapi-server, mariadb-server-utils
- yum install mariadb-devel # mariadb-connector-c-devel
- yum remove mariadb-gssapi-server
- создание раздела по БД (INTEL D7-P5620 - SSDPF2KE064T1, U.2, PCIe 4 x4, 3D TLC, 3DWPD - 35PBW,
конденсаторы для защиты от пропадания питания на месте)
mdadm --create /dev/md/SSD --verbose --raid-devices=2 --level=raid1 --name=mysql /dev/nvme0n1 /dev/nvme1n1
pvcreate /dev/md/SSD
vgcreate SSD /dev/md/SSD
lvcreate -n mysql -L 500G SSD
- mkfs.ext4 -j -L mysql -O 64bit,extents,huge_file,metadata_csum,sparse_super2 -t largefile -v /dev/mapper/SSD-mysql
- в /etc/fstab:
LABEL=mysql /var/lib/mysql ext4 data=ordered,nodiratime,relatime,journal_checksum,delalloc,rw,nosuid,nodev,noexec,auto,nouser 1 2
- systemctl daemon-reload
- mount /var/lib/mysql
- mysql_install_db --user=mysql
- systemctl start mariadb # LimitNOFILE=10000 отсутствует; сервис mariadb, процесс mysqld, пользователь mysql
- mysql_secure_installation # установить пароль root, удалить анонимный доступ, удалить удалённый доступ root, удалить БД test
- /etc/my.cnf и /etc/my.cnf.d/mysql-clients.cnf и /etc/my.cnf.d/mariadb-server.cnf по образцу предыдущего сервера
- systemctl restart mariadb
- исправить ошибки (/var/log/mariadb/mariadb.log) и перезапустить
- "Failed to lock memory" - забил молотком ("/usr/sbin/setcap 'cap_ipc_lock=+ep' /usr/libexec/mysqld")
- слушает только локальный IPv6 - добавил bind-address=имя-сервера в /etc/my.cnf.d/mariadb-server.cnf
- systemctl enable mariadb
В CentOS 7 поставляется довольно старая версия MariaDB 5.5, но имеется возможность почти безболезненно поставить MariaDB 10.5 из SCL.
Предварительно подключить репозитории SCL, если не было сделано ранее: "yum install centos-release-scl";
отредактировать /etc/yum.repos.d/CentOS-SCLo-scl[-rh].repo.
Обновление через удаление:
- systemctl stop mariadb
- сохранить /etc/my.cnf и /etc/my.cnf.d/client.cnf и /etc/my.cnf.d/mysql-clients.cnf
- umount /var/lib/mysql # на всякий случай, в данном случае не понадобилось
- yum remove mariadb.x86_64 mariadb-devel.x86_64 mariadb-server.x86_64 # mariadb-libs.x86_64 тянет за собой много всякого,
/var/log/mariadb/mariadb.log.rpmsave и /etc/my.cnf.d/server.cnf.rpmsave
- yum install rh-mariadb105-mariadb-server-syspaths rh-mariadb105-mariadb-syspaths rh-mariadb105-mariadb-libs.x86_64
rh-mariadb105-mariadb-devel.x86_64 rh-mariadb105-syspaths rh-mariadb105-mariadb-config-syspaths # подтягиваются
rh-mariadb105-mariadb, rh-mariadb105-mariadb-common, rh-mariadb105-mariadb-config, rh-mariadb105-mariadb-errmsg,
rh-mariadb105-mariadb-server, rh-mariadb105-runtime, rh-mariadb105-mariadb-server-utils, rh-mariadb105-mariadb-server-utils-syspaths
- mount /var/lib/mysql
- /etc/my.cnf не изменился, при этом имеется /etc/rh-mariadb105-my.cnf - ссылка на /etc/opt/rh/rh-mariadb105/my.cnf;
подменил его на ссылку на старый /etc/my.cfg
- /etc/my.cnf.d/mysql-clients.cnf не изменился
- /etc/my.cnf.d/client.cnf отсутствует (был пуст)
- восстановить /etc/my.cnf.d/server.cnf
- при этом имеется /etc/rh-mariadb105-my.cnf.d - ссылка на /etc/opt/rh/rh-mariadb105/my.cnf.d, в котором
- client.cnf (пустой) - заменил на ссылку /etc/my.cnf.d/client.cnf (тоже пустой)
- enable_encryption.preset - заготовка, не трогал
- spider.cnf - пуст, не трогал
- mysql-clients.cnf (пустой) - заменил на ссылку /etc/my.cnf.d/mysql-clients.cnf
- server.cnf - заменил на ссылку /etc/my.cnf.d/server.cnf, в который внёс изменения
(в секцию mysql перенёс правильные datadir, socket, log-error, pid-file);
секция mysqld_safe перестала существовать?
- запустить службу; служба называется rh-mariadb105-mariadb, алиас mysql и mysqld, ссылка на mariadb;
/etc/systemd/system/mariadb.service.d/limits.conf (LimitNOFILE=10000) уже имеется
- убрать старые опции в /etc/my.cnf.d/server.cnf, запустить службу ещё раз
- mysql_upgrade -p # пытается обновить БД lost+found, создаёт БД lost@002bfound, удалить?
- остановить службу
- запустить службу, если всё хорошо, то enable её
- проблема статуса: Active: inactive (dead), хотя сервер работает
- /opt/rh/rh-mariadb105/root/usr/lib64 в /etc/ld.so.conf.d/mariadb105-x86_64.conf; ldconfig
В CentOS 7.1 вместо MySQL поставляется MariaDB 5.5.Y,
который разбит на следующие пакеты: mariadb (клиент и общие программы),
mariadb-libs (/etc/my.cnf, /etc/my.cnf.d/, /usr/lib64/mysql/libmysqlclient*, /usr/share/mysql/charsets),
mariadb-bench (каталог /usr/share/sql-bench),
mariadb-test (каталог /usr/share/mysql-test),
mariadb-server (/etc/my.cnf.d/server.cnf, /etc/logrotate.d/mariadb, /usr/bin/innochecksum, /usr/bin/myisam*, /usr/bin/mysql*,
/usr/bin/perror, /usr/bin/replace, /usr/bin/resolve_stack_dump, /usr/bin/resolveip, /usr/lib/systemd/system/mariadb.service,
/usr/lib64/mysql/ (здесь есть auth_pam, auth_socket, ha_innodb, ha_sphinx, server_audit)),
mariadb-devel (/usr/bin/mysql_config, /usr/include/mysql/, /usr/lib64/mysql/libmysqlclient.so),
mariadb-embedded, mariadb-embedded-devel,
mysql++, mysql++-devel, mysql++-manuals,
mysql-proxy, mysql-proxy-devel,
mysql-utilities,
mysqlreport,
mysqltuner,
mysql-connector-odbc-5.2.5,
MySQL-python,
perl-DBD-MySQL.
А где клиенты для старых версий?
Сервер:
memlock срабатывает только под root. Требуется доработка (а может молотком "/usr/sbin/setcap 'cap_ipc_lock=+ep' /usr/libexec/mysqld"?):
- в /etc/my.cnf.d/server.cnf
[mysqld]
user=mysql
- создать /etc/systemd/system/mariadb.service.d/user.conf
[Service]
User=root
- systemctl --system daemon-reload
- systemctl restart mariadb
- "show variables;" должен показывать "locked_in_memory ON"
В CentOS 6.X MySQL 5.1.Y разбит на следующие пакеты: mysql (клиент и общие программы),
mysql-libs (/etc/my.cnf, /usr/lib64/mysql/libmysqlclient*, /usr/share/mysql/charsets),
mysql-bench (каталог /usr/share/sql-bench),
mysql-test (каталог /usr/share/mysql-test),
mysql-server,
mysql-devel (/usr/include/mysql/, /usr/lib64/mysql/*.a),
mysql++, mysql++-devel,
mysql-embedded, mysql-embedded-devel,
mysql-mmm, mysql-mmm-agent, mysql-mmm-monitor, mysql-mmm-tools,
mysql-proxy, mysql-proxy-devel,
mysql-utilities,
mysqlreport,
mysqltuner,
mysql-connector-odbc-3.51 (/usr/lib64/libmyodbc3),
MySQL-python,
perl-DBD-MySQL.
А где клиенты для старых версий?
Сервер:
В CentOS 5.X MySQL 5.0.Y разбит на следующие пакеты: mysql (клиент и
общие программы), mysql-bench (каталог /usr/share/sql-bench),
mysql-test (каталог /usr/share/mysql-test),
mysql-server,
mysql-devel (/usr/include/mysql/, /usr/lib64/mysql/*.a),
mysql-connector-odbc-3.51 (/usr/lib64/libmyodbc3),
perl-DBD-MySQL. А где клиенты для старых версий?
Сервер:
В RHEL 4.7 MySQL 4.1.22 разбит на следующие пакеты: mysql (клиент и
общие программы), mysql-bench (каталог /usr/share/sql-bench),
mysql-sersver (утилиты собраны статически; сервер с ключами --with-readline,
--with-vio, --with-openssl, --without-debug, --enable-shared,
--localstatedir=/var/lib/mysql (данные),
--with-unix-socket-path=/var/lib/mysql/mysql.sock,
--with-mysqld-user="mysql", --with-extra-charsets, --with-innodb,
--with-isam, --with-berkeley-db, --enable-local-infile,
--enable-large-files=yes, --enable-largefile=yes, --enable-thread-safe-client),
mysql-devel (/usr/include/mysql/, /usr/lib/mysql/*.a), mysqlclient10 (3.23.58),
perl-DBD-MySQL.
Сервер:
В CentOS 4.4 MySQL 4.1.20 разбит на следующие пакеты: mysql (клиент и
общие программы), mysql-bench (каталог /usr/share/sql-bench),
mysql-sersver (утилиты собраны статически; сервер с ключами --with-readline,
--with-vio, --with-openssl, --without-debug, --enable-shared,
--localstatedir=/var/lib/mysql (данные),
--with-unix-socket-path=/var/lib/mysql/mysql.sock,
--with-mysqld-user="mysql", --with-extra-charsets, --with-innodb,
--with-isam, --with-berkeley-db, --enable-local-infile,
--enable-large-files=yes, --enable-largefile=yes, --enable-thread-safe-client),
mysql-devel (/usr/include/mysql/, /usr/lib/mysql/*.a), mysqlclient10 (3.23.58),
perl-DBD-MySQL.
Сервер:
Сервер
- создать директорию для сборки, распаковать в нее mysql-4.1.10a.tar.gz (взять на зеркалах и проверить md5, GnuPG)
- впечатлиться размерами configure и INSTALL-SOURCE
- иметь gcc лучше, чем 2.95.2 (gcc 3.2, gcc 3.4.3)
- иметь /usr/local/lib и /usr/local/mysql/lib/mysql в /etc/ld.so.conf
- создать группу mysql (27?)
- создать пользователя mysql (27?, в группе mysql)
(зачем ему bash?)
- ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --enable-thread-safe-client --enable-assembler --with-mysqld-user=mysql --with-libwrap --without-debug --with-embedded-server --with-embedded-privilege-control --with-openssl --with-charset=latin1 --with-extra-charsets=all --with-collation=latin1_general_ci CFLAGS="-mcpu=pentium4" CXXFLAGS="-mcpu=pentium4 -felide-constructors -fno-exceptions -fno-rtti" (-m64 вместо -mpentium4 для архитектуры x86_64)
- если upgrade, то остановить mysql, сохранить базы данных и my.cfg
(не забыть потом удалить!), прочитать главу в руководстве про upgrade
- make (200 MB)
- make install (как root)(58/99 MB, из них 15 МБ - тест)
- /usr/local/mysql/include/mysql/
- /usr/local/mysql/info/mysql.info
- /usr/local/mysql/man/
- /usr/local/mysql/lib/mysql (libdbug, libheap, libmerge, libmyisam,
libmyisammrg, libmysqlclient, libmisqlclient_r (.a и .so.14.0.0),
libmysqld, libmystrings, libmysys, libnisam, libvio);
эту директорию указывать для libtool, либо занести в /etc/ld.so.conf
- /usr/local/mysql/bin (comp_err, isamchk, isamlog, my_print_defaults,
myisamchk, myisamlog, myisampack, myisam_ftdump, mysql, mysqladmin,
mysqlbinlog, mysqlcheck, mysqlshow, mysqldump, mysqlimport, mysqltest,
mysqlmanager, mysqlmanagerc, mysqlmanager-pwgen, mysql_waitpid, mysqlbug,
pack_isam, perror, replace, resolve_stack_dump, resolveip,
mysql_client_test, mysqltest_embedded, mysql_client_test_embedded,
msql2mysql, mysqlaccess, mysql_config, mysql_convert_table_format,
mysql_create_system_tables, mysqld_multi, mysqld_safe, mysqldumpslow,
mysql_explain_log, mysql_find_rows, mysql_fix_extensions,
mysql_fix_privilege_tables, mysqlhotcopy, mysql_install_db,
mysql_secure_installation, mysql_setpermission, mysql_tableinfo,
mysql_tzinfo_to_sql, mysql_zap, make_win_src_distribution,
make_win_binary_distribution)
- /usr/local/mysql/share/mysql/ (сообщения об ошибках, таблицы кодировок;
mi_test_all; mi_test_all.res; fill_help_tables.sql;
mysql_fix_privilege_tables.sql; мусор для MacOS (Info.plist,
Description.plist, StartupParameters.plist, postinstall, preinstall);
просто мусор от установки (mysql-4.1.10a.spec, MySQL-shared-compat.spec,
ndb-config-2-node.ini); примеры конфигурации *.cnf; mysql-log-rotate; mysql.server)
- /usr/local/mysql/libexec/mysqld)
- /usr/local/mysql/sql-bench/
- /usr/local/mysql/mysql-test/
- /usr/local/mysql/data (базы данных, конфигурация, журналы, pid-файл)
- закоментировать fix_path в /usr/local/mysql/bin/mysql_config (для 4.1.18 не нужно)
- ln -s /usr/local/mysql/bin/mysql_config /usr/local/bin/mysql_config
- ldconfig
- cd /usr/local/mysql
- bin/mysql_install_db --user=mysql (при первой установке обязательно,
создание таблиц с правами, пользователя root
(все права!) и анонимного пользователя без паролей, таблицы help (не записалась в 4.1.16);
не портит существующие таблицы прав доступа)
- скопировать share/mysql/my-medium.cnf в data/my.cnf и слегка отредактировать
- [mysqld]
- skip-external-locking (не блокировать доступ к данным от ДРУГИХ процессов)
- параметры оптимизации
- skip-networking #если не нужен доступ по TCP/IP
(а еще лучше использовать ssh + port forward)
- secure
- skip-symbolic-link
- secure-auth
- skip-host-cache
- myisam-recover
- log-bin #журнал изменений для репликации
- log-slow-queries
- server-id=1 # идентификатор мастер-сервера репликации
- set-variable = max_connections=500
- раскомментировать переменные InnoDB
- [mysql]
- pager=less -S
- disable-pager
- no-beep
- secure-auth
- prompt=\U:\d>
- default-character-set=utf8
- chown -R root:mysql /usr/local/mysql (как root)
- chown -R mysql /usr/local/mysql/data
- кстати, mysql не нужны права на запись для my.cnf:
chown root /usr/local/mysql/data/my.cnf
- cp share/mysql/mysql.server /etc/rc.d/init.d/mysql
(м.б. убрать секцию LSB INFO, иначе MySQL запускается последним)
- chkconfig --add mysql
- service mysql start (ручной запуск для проверки)
- посмотреть журнал сервера (/usr/local/mysql/data/имя-хоста.err)
- простая проверка работоспособности
:
/usr/local/mysql/bin/mysqladmin version
/usr/local/mysql/bin/mysqlshow -u root mysql
- /usr/local/mysql/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | /usr/local/mysql/bin/mysql -u root mysql
- установка интерфейса с Perl (нужен доступ в Интернет и ncftp):
- cpan (при настройке не забыть указать прокси)
- # perl -MCPAN -e shell
- [cpan> install Bundle::CPAN (долго и пристаёт со всякими глупостями;
затем надо сделать reload cpan)]
- cpan> install Data::Dumper
- cpan> install DBI
- cpan> [force] install DBD::mysql
- не выходит каменный цветок (CentOS 4.2, MySQL 4.1.16/18, DBI 1.50
и DBD-mysql-3.0002 срослось)
- yum/rpm
- yum install perl-DBD-MySQL (сам mysql из поставки нам не нужен!)
- хочет другую библиотеку
- гм, устанавливаем вручную DBD-mysql-2.9004
- качаем, разворачиваем
- в Makefile.PL удаляем строку: "use Config();"
(только не спрашивайте меня почему, я по ходу исследований
переустановил половину перловых модулей ;)
- perl Makefile.PL --testuser test
- make
- убедиться, что сервер работает и имеется анонимный доступ без пароля
- make test (2 ошибки, закроем на них глаза)
- make install
- тестирование (make test, очень долго)
- отдельный тест: mysql -vvf test < ./tests/auto_increment.tst
(результат в tests/auto_increment.res)
- установка пароля администратора сервера: /usr/local/mysql/bin/mysql -u root
- SELECT Host, User FROM mysql.user;
- SET PASSWORD FOR 'root'@'localhost' = PASSWORD('пароль-администратора');
- SET PASSWORD FOR 'root'@'имя-хоста' = PASSWORD('пароль-администратора');
- удалить .mysql_history ;)
- зайти в sql-bench
- ./run-all-tests --user=test (нужны права для записи в директорию output,
час времени и 400 МБ на диске)
- можно удалить sql-bench и mysql-test
- остановить сервер и почистить журнал, запустить сервер
- настроить права доступа (как минимум, убрать анонимный доступ к test, test_):
/usr/local/mysql/bin/mysql -u root -p
- SELECT Host, User FROM mysql.user;
- DELETE FROM mysql.user WHERE User = '';
- DELETE FROM mysql.db WHERE User = '';
- FLUSH PRIVILEGES;
- /usr/local/mysql/bin/mysqladmin -u root -p drop test
- прочитать и выполнить указания по обновлению версии
(обычно требуется выполнить mysql_fix_privilege_tables)
- настройка SSL
- дырка в сетевом экране
Собранный сервер продолжил работу после
перевода компьютера на CentOS 4.0 после установки пакета совместимости (compat-libstdc++).
Клиент (собирался в RH9 и FC3):
- создать директорию для сборки, распаковать в нее mysql-4.1.10a.tar.gz (взять на зеркалах и проверить md5, GnuPG)
- иметь gcc лучше, чем 2.95.2 (gcc 3.2)
- иметь /usr/local/lib и /usr/local/mysql/lib/mysql в /etc/ld.so.conf
(ldconfig)
- создать группу mysql (27?)
- создать пользователя mysql (27?, в группе mysql) (зачем ему bash?)
- ключ --enable-thread-safe-client в ./configure отменяет --without-server,
пусть пока так, но мусора всё равно много
- ./configure --without-server --without-geometry --without-bench --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --enable-thread-safe-client --enable-assembler --with-openssl --with-charset=latin1 --with-extra-charsets=all --with-collation=latin1_general_ci CFLAGS="-mcpu=pentium4" CXXFLAGS="-mcpu=pentium4 -felide-constructors -fno-exceptions -fno-rtti"
- make (144 MB)
- make install (как root)(21 MB, из них 11 MB - тест)
- /usr/local/mysql/include/mysql/
- /usr/local/mysql/info/mysql.info
- /usr/local/mysql/man/
- /usr/local/mysql/lib/mysql (libmysqlclient (.a и .so.14.0.0), libmystrings); эту директорию указывать для libtool, либо занести в /etc/ld.so.conf
- /usr/local/mysql/bin/ (mysql, mysqladmin, mysqlbinlog, mysqlcheck, mysqlshow, mysqldump, mysqlimport, mysqltest, mysqlmanagerc, mysqlmanager-pwgen, mysqlbug, mysql_client_test, msql2mysql, mysqlaccess, mysql_config, mysql_convert_table_format, mysql_create_system_tables, mysqld_multi, mysqldumpslow, mysql_explain_log, mysql_find_rows, mysql_fix_extensions, mysql_fix_privilege_tables, mysqlhotcopy, mysql_secure_installation, mysql_setpermission, mysql_tableinfo, mysql_zap, make_win_src_distribution, make_win_binary_distribution)
- /usr/local/mysql/share/mysql/ (fill_help_tables.sql; mysql_fix_privilege_tables.sql; мусор для MacOS (Info.plist, Description.plist, StartupParameters.plist, postinstall, preinstall); просто мусор от установки (mysql-4.1.10a.spec, MySQL-shared-compat.spec, ndb-config-2-node.ini); примеры конфигурации *.cnf; mysql-log-rotate; mysql.server)
- /usr/local/mysql/mysql-test/
- /usr/local/mysql/data (базы данных, конфигурация, журналы, pid-файл)
- ldconfig
- удаление /usr/local/mysql/mysql-test/
- настройка SSL
- тестирование
- --prefix=куда-устанавливать (/usr/local)
- --with-unix-socket-path=куда-класть-unix-socket (можно менять в
файле настройки)
- --localstatedir=... (каталог для хранения БД, журналов; можно менять в
файле настройки)
- множество мелочных опций по месту установки
- --enable-maintainer-mode [no]
- --with-client-ldflags=-all-static
- --with-mysqld-ldflags=-all-static
- --enable-shared (делать разделяемые библиотеки)[yes]
- --enable-static (10% быстрее)[yes]
- --enable-thread-safe-client (если клиентская программа использует потоки)
- --enable-assembler
- --enable-local-infile (LOAD DATA LOCAL INFILE)[disable]
- --disable-largefile
- --with-mit-threads (для linux 2.2 не надо)
- --with-pthread (для linx 2.2 не надо)
- --with-named-thread-libs=где
- --with-named-curses-libs=где
- --with-named-z-libs=где
- --with-raid (удалён из 5.0; позволяет разносить куски файла по RAID 0)
- --with-tcp-port=порт [3306]
- --with-mysqld-user=имя-пользователя-для-mysqld
- --with-libwrap[=где]
- --with-pstack
- --without-debug (15% быстрее; в новых версиях наоборот надо включать)
- --without-server (только client)
- --with-embedded-server
- --without-query-cache
- --without-geometry
- --with-embedded-privilege-control (для встроенного сервера)
- --without-extra-tools (не компилировать утилиты в директории tools)
- --with-mysqlfs (собственная файловая система)
- --with-vio
- --with-openssl[=...]
- --without-docs
- --without-man
- --without-bench
- --without-readline (использовать системный readline вместо встроенного)
- --without-libedit (использовать системный libedit вместо встроенного)
- --with-charset=кодировка-по-умолчанию (latin1; binary, cp1251, koi8r, ucs2,
utf8, ...)
- --with-collation=по-умолчанию (latin1_swedish_ci; ascii_general_ci,
latin1_bin, latin1_general_ci, latin1_general_cs,
koi8r_general_ci, koi8r_bin,
cp1251_general_ci, cp1251_bin, cp1251_general_cs,
utf8_bin, utf8_general_ci (быстрее),
utf8_unicode_ci (соответствует стандарту), ucs2_general_ci,
ucs2_bin, uc2_unicode_ci ...;
ci - нечувствительный к регистру, cs - чувствительный к регистру)
- --with-extra-charsets=список-дополнительных-кодировок
(включая - none, complex, all)
- --with-isam
- --with-berkeley-db[=...]
- --without-innodb (в старых версиях наоборот надо включать)
- --with-example-storage-engine
- --with-archive-storage-engine
- --with-csv-storage-engine
- --with-gemini (Gemini DB)
Скрипт предназначен для /etc/rc.d/init.d (и линки в 0,2,3,5,6 не забыть).
Соответственно первый параметр start или stop (посылается сигнал процессу,
вместо выполнения "mysqladmin shutdown"). Пытается определить (весьма
запутанно) базовый каталог и каталог с данными с помощью
my[sql]_print_defaults (предварительно пытаясь её найти хоть где-нибудь).
Далее уточняет базовый каталог, каталог с данными, каталог с программами
из глобального конфигурационного файла /etc/my.cnf (секции [mysqld], [server],
[mysql.server] и [mysql_server]). Определяет местонахождение конфигурационного
файла сервера (/usr/local/mysql/data/my.cnf).
Ищет и запускает mysqld_safe (safe_mysqld)
в базовом каталоге.
Если нужны какие-либо специфические опции mysqld_safe, то их можно указать
здесь. В конфигурационном файле /etc/my.cnf могут содержаться переменные:
- user
- datadir
- basedir
- bindir
- pid-file
Установка для систем Red Hat (с SystemV init) выглядит так:
- cp share/mysql/mysql.server /etc/rc.d/init.d/mysql
- chkconfig --add mysql
- service mysql start (ручной запуск для проверки)
Обычно запускается скриптом
mysql.server.
mysqld_safe запускает mysqld и перезапускает его,
если тот упадёт. Проверяет, что не был запущен ранее.
Останавливает зависшие процессы. Запускать под root.
Пытается определить где что лежит (понимает только стандартные конфигурации,
иначе его надо запускать из BASEDIR). Собирает опции из секций mysqld, server и
mysqld_safe (safe_mysqld) конфигурацинных файлов и командной строки
(м.б. модифицированных опциями --no-defaults (не использовать конфигурационный
файл сервера), --defaults-file=имя-файл (использовать указанный файл вместо
конфигурационного файла сервера) и --defaults-extra-file=имя-файла
(использовать указанный файл в дополнение к конфигурационному файлу сервера)).
Передает их ("улучшив" некоторые из них) mysqld. Свои опции:
- --ledir=каталог-с-mysqld
- --mysqld=имя-программы-mysqld-в-ledir
- --mysqld-version=суффикс-программы-mysqld
- --log-error=имя-файла-с-сообщениями-об-ошибках
- --err-log=имя-файла-с-сообщениями-об-ошибках (будет удалён в 5.0)
- --open-files-limit=максимальное-число-открытых-файлов (для ulimit)
- --open-files=для-установки-ulimit-на-открытые-файлы (будет удалён в 5.0)
- --core-file-size=для-установки-ulimit-на-coresize
- --timezone=установить-TZ
- --nice=приоритет
- --pid-file=имя-файла
- --skip-kill-mysqld (не пытаться остановить зависшие процессы)
Есть закоментированные проверки всех таблиц перед запуском mysqld.
Пользователь по умолчанию - mysql.
Пытается запустить mysqld под "[nohup] [nice]".
Опции берутся в следующем порядке (последующие затирают
предыдущие):
- переменные окружения
- MYSQL_HISTFILE (вместо $HOME/.mysql_history)
- MYSQL_HOST (с каким хостом соединяться)
- MYSQL_PS1 (приглашение оболочки клиента)
- MYSQL_PWD (пароль, не рекомендуется)
- MYSQL_TCP_PORT
- MYSQL_UNIX_PORT
- "обычные" переменные: HOME, LD_RUN_PATH, PATH, TMPDIR, TZ, UMASK_DIR, UMASK
- глобальный конфигурационный файл /etc/my.cnf
- конфигурационный файл сервера (/usr/local/mysql/data/my.cnf, нельзя
поменять с помощью --datadir, но можно задать явно с помощью ключа
--defaults-file или отменить ключом --no-defaults)
- из файла, указанного ключом --defaults-extra-file (дополняет опции из
конфигурационного файла после чтения глобального файла, но до
пользовательского)
- ~/.my.cnf
- опции в командной строке (короткая (-h localhost)
и длинная (--host=localhost) формы, кроме короткой формы опции --password,
где пароль задаётся за -p без пробела (или не задаётся совсем))
Действуют на mysql, mysqld, mysqladmin, mysqlimport, mysqldump, myisamchk,
myisampack, mysql.server. Файл делится на секции (группы).
Секция начинается со строки, в которой указано имя секции в квадратных скобках.
Имя секции соответствует имени программы на которую она действует.
Комментарии начинаются с символов '#' или ';'.
Любая длинная опция программы (начинающаяся с двух минусов, запустите программу с
ключом --help) может быть использована здесь (минусы надо отбросить).
Пробелы вокруг первого символа '=' и в конце строки выжимаются,
можно использовать апострофы и кавычки обычным образом, а также \n, \t, \s,
\\, \r, \b.
Секция с именем client позволяет задать опции, общие для всех клиентских программ
(host, user, password). В версии 4.0.12 появилась возможность
создавать секции с именем вида mysqld-4.0. Переменные устанавливаются строкой:
set-variable = имя=значение
Начиная с версии 4.0.2 можно просто
писать: имя-переменной=значение, в т.ч. и в командной строке; вместо
подчёркиваний в именах можно использовать тире. Переменные бывают глобальные
и сессионные. Значение глобальных переменных устанавливается изначально
по умолчанию и могут быть измененны опциями командной строки или конфигурационного
файла (можно использовать суффиксы K, M и G).
Некоторые глобальные переменные можно изменить оператором SET GLOBAL
(необходимо иметь привилегию SUPER).
Максимальное значение переменной можно ограничить при запуске опцией
--maximum-имяпеременной. Сессионные переменные устанавливаются при подсоединении
клиента равными значению соответствующей глобальной переменной.
Некоторые сессионные переменные можно изменять оператором SET SESSION.
Посмотреть текущее значение переменной (сессионной?) можно с помощью
оператора SHOW VARIABLES. Полный список переменных приведён в главе 5.2.3.
Имеются также переменные состояния, которые можно только смотреть
оператором SHOW STATUS.
Опцию, имеющую булевское значение можно устанавливать
различными методами (4.0.2):
- --disable-опция
- --skip-опция
- --опция=0
- --enable-опция
- --опция[=1]
Если имя опции предварить строкой --loose- (4.0.2),
то программа выдаёт предупреждение, если не распознает опцию вместо
аварийного завершения (полезно для написания скриптов, совместимых с различными
версиями).
Проверить "собранные" из всех мест опции можно с помощью
ключа --print-defaults или утилиты my_print_defaults (имена секций указываются
в качестве параметоров).
Вместо ключей запуска можно использовать конфигурационные файлы (секции mysqld и server, для встроенного сервера - server,
embedded и имя-приложения_SERVER).
Опции:
- --allow-suspicious-udf (не рекомендуется, отключение запрета загрузки пустых
UDF)
- --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=директория
- --big-table (использовать диск для больших временных таблиц)
- --bind-address=IP-адрес (для хостов с несколькими адресами)
- --character-sets-dir=каталог-с-описаниями-таблиц-символов
- --character-set-server=кодировка-сервера-по-умолчанию
- --chroot=путь (до 4.0 делает неправильно)
- --collation-server=алгоритм-сортировки-символов-сервера-по-умолчанию
- --console (выдавать сообщения об ошибках на stdout/stderr)
- --core-file
- --datadir=каталог-данных
- --default-character-set=кодировка (переименована в --character-set-server)
- --default-collation=алгоритм-сортировки (переименована в --collation-server)
- --default-table-type=метод-хранения [MyISAM]
- --default-storage-engine= (синоним --default-table-type)
- --defaults-extra-file=дополнительно-к-my.cnf
- --defaults-file=имя-файла-параметров (вместо my.cnf)
- --default-time-zone=
- --delay-key-write[=OFF | ON | ALL] (управляет кешированием записи
индексов MyISAM)
- --des-key-file=имя-файла (содержит ключи по умолчанию для DES_ENCRYPT())
- --enable-locking (внешняя блокировка - если нужна блокировка нескольких
серверов или myisamchk к одной базе данных; работает неустойчиво и
медленно; переименована в --external-locking)
- --flush (сбрасывать буфера на диск после каждой SQL-команды)
- --help (выдает список опций; настройки, выбранные при сборке с учетом
текущих параметров и значения переменных)
- --init-file=имя-файла (при запуске читать SQL команды из файла)
- --innodb-safe-binlog
- --language (язык сообщений об ошибках для клиентов)
- --local-in-file=0 | 1 (0 запрещает LOAD DATA LOCAL)
- --log[=имя-файла] (записывать все соединения и команды в журнал)
- --log-bin[=имя-файла] (записывать журнал в новом двоичном формате
для репликации; только команды, изменяющие данные)
- --log-bin-index=имя-файла (хранит имена последних бинарных журналов)
- --log-error[=имя-файла]
- --log-long-format (добавлять во все журналы информацию о пользователе
и времени; начиная с 4.1 установлена по умолчанию)
- --log-short-format (не записывать в журнал дополнительную информацию)
- --log-slow-queries[=имя-файла] (записывать все слишком медленные -
занимающие более long_query_time секунд - команды в журнал)
- --log-queries-not-using-indexes (в журнал медленных запросов)
- --log-update[=имя-файла] (записывать изменения в журнал; удалена в 5.0)
- --log-warnings (в журнал ошибок; включена по умолчанию с 4.1.2)
- --low-priority-updates (INSERT/DELETE/UPDATE будут иметь меньший приоритет, чем SELECT)
- --memlock (не свопировать mysqld; Solaris и root)
- --myisam-recover[=опция,...] (проверка корректности myisam таблиц и способ
восстановления):
- DEFAULT
- BACKUP (делать резервную копию при исправлениях - .BAK)
- FORCE (исправлять даже если это приведет к потере многих данных)
- QUICK
- --new (использовать новые, т.е. недоотлаженные возможности)
- --no-defaults
- --old-passwords (для совместимости нового сервера со старыми клиентами
при занесении нового пароля он хешируется старым алгоритмом)
- --old-protocol (протокол с клиентами версии 3.20)
- --open-files-limit=максимальное-число-одновременно-открытых-файлов
- --pid-file=имя-файла
- --port=TCP-порт
- -O имя=значение (установить переменную, список по --help)
- --safe-mode (уменьшить уровень оптимизации)
- --safe-show-database (не показывать имена БД пользователям, которые
не имеют к ним никаких прав, начиная с 4.0.2 установлена по умолчанию,
так как появились права доступа SHOW DATABASES)
- --safe-user-create (пользователь не может создавать других пользователей
оператором GRANT, если у него нет прав доступа INSERT для mysql.user)
- --secure-auth (запретить авторизацию клиентов со старыми (короткий
хеш) паролями)
- --secure (двойная проверка IP-адресов - есть ли такая
опция? если ее указать, то не стартует. Или она теперь по умолчанию? Если нет,
то именами хостов вообще нельзя пользоваться!)
- --skip-bdb (отключить работу с типом таблиц BDB)
- --skip-concurrent-insert (отключиь возможность одновременной выборки
и вставки)
- --skip-delay-key-write (отключить буферизацию записи ключей;
с 4.0.3 надо использовать --delay-key-write=OFF)
- --skip-external-locking (новое имя для --skip-locking)
- --skip-grant-tables (отключить проверку прав доступа)
- --skip-host-cache (не использовать встроенный кеш DNS)
- --skip-innodb (отключить работу с типом таблиц InnoDB)
- --skip-isam
- --skip-locking (не использовать внешнюю блокировку; safe_mysqld использует
этот ключ; ключ применяется, если не нужна блокировка нескольких
серверов или myisamchk к одной базе данных; все равно внешняя блокировка
работает неустойчиво и медленно; команда LOCK работает даже с этим ключом)
- --skip-name-resolve (в таблицах прав доступа д.б. только IP)
- --skip-networking (не слушать TCP/IP, только через unix socket)
- --skip-new (не использовать новые, т.е. недоотлаженные возможности)
- --skip-show-database (разрешать выполнение команды SHOW DATABASE
только имеющим такую привилегию пользователям (при этом показывать
все БД), иначе любой пользователь может выполнить эту команду, но
ему будут показаны только те БД, к которым он имеет право доступа)
- --skip-symlink (--skip-symbolic-link, --symbolic-link, позволять
или не позволять создавать таблицы вне каталога данных по команде
CREATE TABLE)
- --skip-thread-priority (не использовать приоритеты потоков,
ускоряет ответ)
- --socket=имя-файла
- --sql-mode=режим[,...]
- --temp-pool (использовать ограниченное множество имён временных файлов,
помогает избежать утечки памяти в некоторых версиях Linux)
- --tmpdir=имя-директории (вместо /tmp, можно несколько директорий
через ':')
- --transaction-isolation=уровень (READ-UNCOMMITTED, READ-COMMITTED,
REPEATABLE-READ, SERIALIZABLE)
- --user=имя-пользователя (обязательно, если запускается из под root)
Завершить работу сервера можно послав процессу сигнал
SIGTERM или запустив утилиту "mysqladmin shutdown" (необходимы привилегии
SHUTDOWN).
Сервер может работать в различных режимах для
совместимости со стандартом ANSI или другими серверами (--ansi, --sql-mode).
Начиная с 4.1 режимы могут быть различными для каждого клиента.
Основные режимы синтаксиса и реакции на ошибки (режимы 5.0 опущены,
так как их там очень много ;):
- ANSI_QUOTES (двойные кавычки интерпретируются как ограничители идентификаторов,
а не строк)
- IGNORE_SPACE (разрешать использовать пробелы между именем функции и скобкой,
все имена функций становятся зарезервированными словами)
- NO_AUTO_VALUE_ON_ZERO (значение в автоинкрементных столбцах
автоматически увеличивается только при записи NULL, но не 0)
- NO_DIR_IN_CREATE (не разрешать указывать каталог при создании таблицы)
- NO_FIELD_OPTIONS (не выводить специфические опции MySQL в SHOW CREATE TABLE)
- NO_KEY_OPTIONS (не выводить специфические опции индексов MySQL в
SHOW CREATE TABLE)
- NO_TABLE_OPTIONS (не выводить специфические опции таблиц MySQL в
SHOW CREATE TABLE)
- NO_UNSIGNED_SUBTRACTION (результат вычитания является числом со знаком)
- ONLY_FULL_GROUP_BY
- PIPES_AS_CONCAT (две вертикальные черты не есть синоним для OR, а эквивалент
CONCAT)
- REAL_AS_FLOAT (REAL есть синоним FLOAT, а не DOUBLE)
Составные режимы:
- ANSI
- DB2
- MAXDB
- MSSQL
- MYSQL323
- MYSQL40
- ORACLE
- POSTGRESQL
- TRADITIONAL
Аутентификация пользователя производится по имени (до 16 символов),
паролю (м.б. пустым)
и хосту или его IP. Большинство клиентских программ по умолчанию
используют mysql-имя, совпадающее
с unix-именем, но это можно изменить с помощью ключа --user=. Пароль можно
задать:
- прямо в командной строке после ключа -p (без пробела, очень опасно)
- указав ключ -p без пароля (программа запросит пароль с клавиатуры, наиболее безопасно)
- в файле .my.cnf (права к этому файлу должны быть только у собственника),
секция [client], поля host, user и password
- с помощью переменной окружения MYSQL_PWD (очень опасно)
Вся информация о правах хранится в БД с именем mysql. Никто не должен иметь к ней доступа на чтение (см. про пароли).
Используются таблицы:
- user (используется чтобы понять - пускать/не пускать; данные здесь права
действуют на все БД; административные привилегии и операции с файлами
определяются только здесь)
- Host: VARCHAR(60),PRI, нечувствителен к регистру. Может содержать имя хоста,
IP адрес или localhost. Можно использовать шаблоны с символами '%' (любое количество
любых символов) и '_' (любой символ). Пустое поле означает,
что производится логическое "И" привилегий в данной строке и привилегий в
соответствующей строке таблицы host.
При использовании IP-адреса можно задавать сетевую маску
(в виде - /255.255.255.0 или /24 (?)).
- User: VARCHAR(16),PRI. Пустое поле соответствует любому имени, в данном случае
пользователь рассматривается как анонимный и предоставленное им имя заменяется
на пустое для дальнейших проверок прав доступа.
- Password: VARCHAR(41), в старых версиях CHAR(16), хеширован (функция PASSWORD()),
но не так как в Unix (функция ECRYPT()), знание даже
хешированного пароля позволяет выдать себя
за данного пользователя - пароль хешируется на стороне клиента!
Длина самого пароля не ограничена.
Может быть пустым - пользователь также должен предъявить пустой пароль.
В версии 4.1 хешированный пароль нельзя подслушать при передаче по TCP/IP
и использовать украденный хеш (как этого добились не говорится?)
- глобальные привилегии: enum('N','Y'), по умолчанию - 'N', действуют
для любой БД (рекомендуется давать только администраторам)
- Select_priv - выборка из строк таблицы
- Insert_priv - вставка строки в таблицу
- Update_priv - изменение строки таблицы
- Delete_priv - удаление строки таблицы
- Create_priv - создавать БД/таблицу
- Drop_priv - удалять БД/таблицу
- Reload_priv - позволяет выполнять административные команды (reload, refresh,
flush-*)
- Shutdown_priv - позволяет остановить mysqld (mysqladmin shutdown)
- Process_priv - позволяет выполнить processlist (можно смотреть текст команд,
выполняемых другими пользователями (в т.ч. SET PASSWORD))
- File_priv - читать файлы (LOAD DATA INFILE) и писать файлы (SELECT ...
INTO OUTFILE), с точки зрения Unix используются права, с которыми запущен
mysqld (в частности, он может прочитать /etc/passwd, любую БД и т.п.,
записать файл в /tmp и т.п., но не может переписать уже существующий файл)
- Grant_priv - передавать свои привилегии другим, два пользователя с
различными привилегиями могут объединить их ;)
- References_priv - не реализовано
- Index_priv - создавать/удалять индексы таблицы
- Alter_priv - изменять формат таблицы, в том числе переименовать ее, что
позволяет обмануть систему прав доступа
- Show_db_priv (позволяет смотреть по SHOW DATABASES имена БД,
к которым нет прав доступа)
- Super_priv (останавливать чужие процессы и изменять глобальные переменные)
- Create_tmp_table_priv (возможность создавать временные таблицы)
- Lock_tables_priv (возможность блокировать таблицы, к которым есть право на
SELECT)
- Execute_priv (5.0.3)
- Repl_slave_priv (выдаётся подчинённому серверу репликации)
- Repl_client_priv (позволяет выдавать SHOW MASTER STATUS, SHOW CLIENT STATUS)
- параметры SSL
- ssl_type - enum('','ANY','X509','SPECIFIED')
- ssl_cipher - blob
- x509_issuer - blob
- x509_subject - blob
- ограничения на использование ресурсов (сбрасывается по FLUSH USER_RESOURCES,
FLUSH PRIVILEGES или GRANT для определённого пользователя)
- max_questions - int(11) unsigned (запросов в час)
- max_updates - int(11) unsigned (изменений в час)
- max_connections - int(11) unsigned (соединений в час)
-
host
- Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
- Db: CHAR(64),PRI. '%' или пустое поле означает - любая БД.
- привилегии: enum('N','Y'), по умолчанию - 'N'
- Select_priv
- Insert_priv
- Update_priv
- Delete_priv
- Create_priv
- Drop_priv
- Grant_priv
- References_priv
- Index_priv
- Alter_priv
- Create_tmp_table_priv
- Lock_tables_priv
-
db
- Host: CHAR(60),PRI. Строка '%' означает - при доступе с любого хоста. Пустое
поле означает необходимость посмотреть в таблицу host.
- Db: CHAR(64),PRI. '%' или пустое поле означает - любая БД.
- User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
- привилегии: enum('N','Y'), по умолчанию - 'N'
- Select_priv
- Insert_priv
- Update_priv
- Delete_priv
- Create_priv
- Drop_priv
- Grant_priv
- References_priv
- Index_priv
- Alter_priv
- Create_tmp_table_priv
- Lock_tables_priv
-
tables_priv
- Host: CHAR(60), PRI. '%' или пустое поле означает - любой хост.
- Db: CHAR(64), PRI. Не м.б. пустым или содержать шаблоны.
- User: CHAR(16), PRI. Пустое поле - анонимный пользователь.
- Table_name: CHAR(64), PRI. Не м.б. пустым или содержать шаблоны.
- Grantor: CHAR(77), MUL (не используется)
- 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(64), PRI. Не м.б. пустым или содержать шаблоны.
- User: CHAR(16), PRI. Пустое поле - анонимный пользователь.
- Table_name: CHAR(64), PRI. Не м.б. пустым или содержать шаблоны.
- Column_name: CHAR(64), 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('новый пароль') или mysqladmin password.
Создание пользователя или добавление привилегий:
GRANT тип-привилегии [(список-столбцов)] [, тип-привилегии [(список-столбцов)] ...] ON { имя-таблицы | * | *.* | имя-БД.* } TO имя-пользователя[@имя-хоста] [ IDENTIFIED BY 'пароль' ] [, имя-пользователя[@имя-хоста] [ IDENTIFIED BY 'пароль' ] ... ] [REQUIRE SSL-параметры] [WITH {GRANT OPTION | MAX_QUERIES_PER_HOUR число | MAX_UPDATES_PER_HOUR число | MAX_CONNECTION_PER_HOUR число}]
Пароль задаются непосредственно или в хешированном виде
(необходимо добавить ключевое слово PASSWORD после BY).
Формат параметров SSL соединения:
- NONE (по умолчанию; возможно как шифрованное соединения,
так и незашифрованное)
- SSL (только шифрованное соединение, сертификат клиента не обязателен)
- X509 (только шифрованное соединение, требуется подписанный любым
CA сертификат)
- [CIPHER 'набор-шифрования' [AND]] [ISSUER 'полное-имя-CA' [AND]] [SUBJECT 'полное-имя-клиента' [AND]]
(только шифрованное соединение с дополнительными ограничениями;
CIPHER требует использования конкретного набора шифрования
(например, DHE-RSA-AES256-SHA);
ISSUER требует, чтобы сертификат был подписан указанным CA;
SUBJECT требует наличия сертификата на указанную персону;
имена задаются в формате со слешами)
Создание пользователя без привилегий (5.0.3):
CREATE USER имя-пользователя[@имя-хоста] [ IDENTIFIED BY 'пароль' ], ...
Изъятие привилегий:
REVOKE тип-привилегии [(список-столбцов)] [, тип-привилегии [(список-столбцов)] ...] ON { имя-таблицы | * | *.* | имя-БД.* } FROM имя-пользователя[@имя-хоста] [, имя-пользователя[@имя-хоста] ... ]
Отнять все привилегии:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM имя-пользователя[@имя-хоста] [, имя-пользователя[@имя-хоста] ...
Удаление пользователя (до 5.0.1 удаляет только запись в таблице
user): DROP USER имя-пользователя[@имя-хоста][, ...]
Удаление пользователя вместе с привилегиями:
SHOW GRANTS FOR ...;
REVOKE ...;
DELETE FROM mysql.user WHERE User='...' AND Host='...';
FLUSH PRIVILEGES;
Переименование пользователя (5.0.2):
RENAME USER старое-имя TO новое-имя [, ...]
Типы привилегий:
- ALL PRIVILEGES (aka ALL)
- ALTER
- ALTER ROUTINE (5.0.3
- CREATE
- CREATE ROUTINE (5.0.3)
- CREATE TEMPORARY TABLE
- CREATE VIEW (5.0.1)
- DELETE
- DROP
- EXECUTE (5.0.3)
- FILE
- GRANT OPTION (только для REVOKE)
- INDEX
- INSERT
- LOCK TABLES
- PROCESS
- REFERENCES (не реализовано)
- RELOAD
- REPLICATION CLIENT
- REPLICATION SLAVE
- SELECT
- SHOW DATABASES
- SHOW VIEW (5.0.1)
- SHUTDOWN
- SUPER
- UPDATE
- USAGE (никаких - просто место застолбить)
Для столбцов можно задавать только INSERT, SELECT и UPDATE. Для таблиц -
INSERT, SELECT, UPDATE, CREATE, DROP, DELETE, GRANT, INDEX, ALTER.
Использование "*.*" означает задание глобальных
привилегий. Использование "*" означает задание привилегий для текущей БД (если текущей БД нет, то глобальные).
SHOW GRANTS FOR имя@хост;
Если привилегии на уровне таблиц и колонок используются хотя бы для одного
пользователя, то проверки делаются для всех запросов всех пользователей,
что очень сильно замедляет работу.
GRANT и REVOKE не работают с таблицей host
(она вообще не используется в большинстве установок).
Запутанность системы и хеширование пароля на стороне
клиента производят тяжёлое впечатление.
Для упрощения жизни можно использовать утилиты mysqladmin и mysqlaccess.
Узнать имя, под которым система вас аутентифицировала можно с
помощью функции CURRENT_USER().
Не храните пароли и тому подобную информацию
в БД в открытом виде.
Предварительно требуется ознакомиться с
OpenSSL.
Опции командной строки и конфигурационного файла
- --ssl-ca=имя-файла (файл должен содержать сертификаты корневых CA)
- --ssl-capath=имя-каталога (каталог должен содержать файлы с сертификатами
корневых CA в формате PEM)
- --ssl-cert=имя-файла (файл должен содержать сертификат сервера)
- --ssl-cipher=список-допустимых-алгоритмов-шифрования (через двоеточие,
имеющийся список можно получить командой openssl ciphers)
- --ssl-key=имя-файла (файл должен содержать приватный ключ сервера в
незашифрованном виде)
Для примера опишу как использовать SSL соединения в
ситуации с собственным CA. Кладём самоподписанный корневой сертификат (см.
как его делать) в файл ca.crt в директории
данных. Создаём незашифрованный ключ сервера
и кладём его в файл mysql.key (обязательно права доступа - mysql:mysql, 400!).
Создаём запрос на подпись сертификата сервера
и посылаем его на подпись бюро сертификации (а скорее всего сами себе ;).
Подписанный сертификат кладём в файл mysql.crt.
Теперь в секцию mysqld конфигурационного файла дописываем следующие
строчки и перезапускаем сервер:
ssl-ca=/usr/local/mysql/data/ca.crt
ssl-cert=/usr/local/mysql/data/mysql.crt
ssl-key=/usr/local/mysql/data/mysql.key
Создаём клиента
GRANT ALL ON test.* TO test IDENTIFIED BY 'test' REQUIRE ISSUER '...' AND SUBJECT '...';
На клиентской машине кладём в домашний каталог файл ca.crt,
Создаём ключ клиента
и кладём его в файл test.key (права доступа - test:test, 400).
Создаём запрос на подпись сертификата клиента
и посылаем его на подпись бюро сертификации (а скорее всего сами себе ;).
Подписанный сертификат кладём в файл test.crt.
Теперь в файл .my.cnf дописываем в секцию client следующие строчки:
ssl-ca=/home/test/ca.crt
ssl-cert=/home/test/test.crt
ssl-key=/home/test/test.key
Не забываем про сетевой экран.
После соединения по TCP/IP (клиент mysql спрашивает
пароль пользователя MySQL и парольную фразу приватного ключа SSL)
проверяем заработал ли SSL:
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
Шифруются даже соединения через сокеты.
Сервер и клиентские программы могут работать с данными в различных
кодировках и с различными правилами сравнения/сортировки (MyISAM, HEAP/MEMORY
и InnoDB). Кодировка по умолчанию
задаётся при сборке (при запуске ./configure) ключом --with-charset=
(по умолчанию - latin1; binary, cp1251, koi8r, ucs2, utf8, ...).
Правила сортировки по умолчанию задаются при сборке ключом
--with-collation= (по умолчанию - latin1_swedish_ci; ascii_general_ci,
latin1_bin, latin1_general_ci, latin1_general_cs, koi8r_general_ci,
koi8r_bin, cp1251_general_ci, cp1251_bin, cp1251_general_cs, utf8_bin,
utf8_general_ci (быстрее), utf8_unicode_ci (соответствует стандарту),
ucs2_general_ci, ucs2_bin, uc2_unicode_ci, ...; где _ci - нечувствительный к регистру,
_cs - чувствительный к регистру, _bin - побайтное сравнение).
Полный список допустимых кодировок задаётся при сборке
ключом --with-extra-charsets= (полезные опции: all, none, complex (многобайтовые
кодировки)). Однобайтовые кодировки могут добавляться при запуске
добавлением файла с описанием кодировки в специальный каталог.
(ключ сервера/клиента: --character-sets-dir=). Запросы SHOW CHARACTER SET и
SHOW COLLATION выдают полный список допустимых кодировок и правил сортировки.
При запуске сервера можно изменить кодировку и правила
сортировки по умолчанию ключами --character-set-server= (--default-character-set=)
и --collation-server= (--default-collation). Текущую кодировку сервера и правила
сортировки можно узнать или изменить с помощью переменных character_set_server
и collation_server. Каждая БД имеет кодировку и правила сортировки,
которые задаются при создании или изменении БД
(по умолчанию наследуются текущие характеристики сервера), файл db.opt в каталоге БД.
Кодировка и правила сортировки для текущей БД (USE) хранятся
в переменных character_set_database и collation_database.
Каждая таблица имеет кодировку и правила сортировки, которые задаются
при создании или изменении таблицы (по умолчанию наследуются характеристики БД).
Каждая текстовая (CHAR, VARCHAR, TEXT) колонка имеет кодировку и правила
сортировки, которые задаются при создании или изменении таблицы
(по умолчанию наследуются характеристики таблицы).
Кодировка и правила сортировки по умолчанию со стороны клиента
задаются ключами --character-sets-dir= и --default-character-set=.
Текущая кодировка запросов клиента определяется переменной
character_set_client. Получив запрос, сервер преобразует его в кодировку
character_set_connection. При сравнениях с константами используются правила
collation_connection (установить collation_connection опцией
не удалось, срабатывает только default-character-set, но он устанавливает
сортировку по умолчанию).
Результат преобразуется в кодировку character_set_result
перед отправкой (специальная кодировка NULL для отмены перекодировки).
Итого: запрос от клиента преобразуется из character_set_client в
character_set_connection, извлечённые значения преобразуются из своих
кодировок в character_set_connection, вся обработка идёт в кодировке
character_set_connection с правилами сравнения collation_connection,
результат преобразуется из character_set_connection в character_set_result.
Запрос "SET NAMES 'кодировка'" сразу устанавливает все
переменные (неявно выполняется при соединении).
Запрос "SET CHARACTER SET кодировка" устанавливает
переменные character_set_client и character_set_result, а переменные
character_set_connection и collation_connection устанавливает в соответствии
с характеристиками текущей БД. Клиент не может использовать ucs2.
Каждая текстовая строка имеет кодировку и правила
сортировки ( [_кодировка] 'строка' [COLLATE имя-правила-сортировки]).
По умолчанию наследуются из character_set_connection и collation_connection.
Какое правило сортировки будет использовано в сложных выражениях
(содержащих элементы с разными правилами) - дело тонкое (и будет изменено
в 4.1.11). Следует учитывать, что метаданные (БД mysql) хранятся в utf8
(переменная character_set_system),
строковые константы по умолчанию имеют тип latin1 и перемешивать всё это надо
осторожно. Результат функций работы со строками с одним параметром
наследует кодировку и правила сортировки от аргумента. Имеются некоторые
возможности автоматического преобразования, но ещё недоделанные
(читай: правила игры будут ещё меняться).
Язык сообщений об ошибках задаётся при запуске сервера ключом --language=russian.
От правил сортировки зависит построение индексов, так что если
кодировка или правила сортировки для составляющих индекса изменились,
то индекс необходимо перестроить (например, myisamchk -r -q --set-character-set=).
Если в БД занесены тексты в UTF-8, а таблицы размечены в latin1:
mysqldump --skip-set-charset --no-data --default-character-set=latin1 имя-БД > /tmp/имя-БД.sql.dump
vim /tmp/имя-БД.sql.dump # %subst/latin1/utf8/
mysqldump --skip-set-charset --no-create-info --default-character-set=latin1 имя-БД > /tmp/имя-БД.data.dump
drop database имя-БД
create database имя-БД CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql default-character-set=utf8 < /tmp/имя-БД.sql.dump
mysql default-character-set=utf8 < /tmp/имя-БД.data.dump
Константы
- строка (в апострофах или кавычках, обратная косая черта как escape-символ
(\0, \', \", \b, \n, \r, \t, \\, \% (только в шаблонах), \_ (только в шаблонах));
две кавычки подряд внутри строки в кавычках интерпретируется как кавычка;
два апострофа подряд внутри строки в апострофах интерпретируется как апостроф;
в режиме ANSI строка в кавычках считается идентификатором, а не строкой;
перед апострофом можно указать имя кодировки, предваряемое подчёркиванием;
после строки может стоять ключевое слово COLLATE и тип сортировки)
- целое число (64 бита)
- вещественное число
- шестнадцатеричное число в формате 0x6c или x'4D':
в численном контексте (неприменимо в 4.1, есть функция CAST) как целое (64-бит),
в строковом контексте пара 16-ричных цифр преобразуется в байт
- логические: TRUE (1) и FALSE (0)
- битовые в формате b'010' (5.0.3)
- NULL (\N при экспорте/импорте)
Имена (идентификаторы)
- БД (имя каталога до 64 символов, кроме '/', '\' и точки)
- таблица (имя файла до 64 символов, кроме '/', '\' и '.')
- колонка (до 64 любых символов). Можно ссылаться, используя составные имена:
- col_name
- tbl_name.col_name
- db_name.tbl_name.col_name
- индекс (до 64 любых символов)
- алиас (до 255 любых символов)
Если в имени есть спецсимволы (не буква, не цифра, не '_', не '$')
или оно совпадает с зарегистрированным словом (глава 9.6),
то его (простое имя) надо заключать в обратные апострофы (или кавычки в режиме ANSI).
Нельзя использовать в именах байты 0x00 или 0xFF
(привет маленькому "я" в cp1251!), апостроф (до 4.1) и кавычку (до 4.1).
Имена не должны оканчиваться пробелом.
Имена хранятся в БД (.frm и таблицы привилегий) в utf8.
Имена БД и таблиц чувствительны к регистру в Unix
и нечувствительны в MS Windows. Имена колонок нечувствительны везде. Алиасы
на таблицы чувствительны везде, алиасы на колонки нечувствительны везде.
Имеется также системная переменная lower_case_table_names,
однако разработчики рекомендуют везде использовать строчные буквы для
идентификаторов и не создавать себе проблем.
Пользовательские переменные
Имя переменной начинается с '@', может содержать буквы, цифры, '_', '$', '.'.
Чувствительность к регистру меняется от версии к версии, так что рекомендуется
везде использовать строчные латинские буквы.
Первоначальное значение - NULL тиа строка.
Может содержать целое (64 бита), вещественное или
строку (кодировка и тип сортировки наследуются от выражения).
Можно использовать в тех местах, где разрешается использование
выражений (не числовых констант как во фразе LIMIT!). Действует для текущего
соединения. Не рекомендуется устанавливать и использовать переменную в одном
и том же запросе (например, переменая в SELECT вычисляется в момент посылки результата,
этот эффект нелегко учесть для новичка). Установка:
- SET @имя[:]=выражение [, ...];
- @имя:=выражение (внутри выражения)
Системные переменные
Системные переменные бывают глобальные и сессионные
(список в главе 5.2.3).
При запуске сервера значения глобальных переменных устанавливаются по умолчанию
(можно изменить заданием опций). Некоторые глобальные
переменные можно изменять запросом SET GLOBAL (требуются привилегии SUPER):
- SET GLOBAL имя-переменной=значение;
- SET @@global.имя-переменной=значение;
Посмотреть значения глобальных переменных можно запросом SHOW
GLOBAL VARIABLES [LIKE 'шаблон'] или SELECT @@global.имя-переменной.
Сессионные переменные устанавливаются в момент соединения в текущие значения
соответствующих глобальных переменых. Некоторые сессионные переменные
можно изменять запросом SET SESSION:
- SET [SESSION | LOCAL] имя-переменной=значение;
- SET @@session.имя-переменной=значение;
Посмотреть значения переменых можно запросом SHOW
[SESSION | LOCAL] VARIABLES [LIKE 'шаблон'] или SELECT @@[session.]имя-переменной.
Ещё бывают составные имена переменных, но они пока
используются только для управления кешем ключей MyISAM.
Комментарии
- как в C (начиная с '/*' до '*/'); если после '/*' стоит восклицательный
знак и номер версии, то содержимое комментария исполняется, если номер
версии равен или больше указанного
- как в sh (начиная с '#' до конца строки)
- как в SQL :) (начиная с '-- ' до конца строки, не забудьте про пробел!)
M - ширина поля при отображении (максимально - 255). D - число знаков в
дробной части (не более M-2 и 30). p - точность представления.
- Числовые (если число занимает меньше 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[(p)] [UNSIGNED] [ZEROFILL] (p от 0 до 24 или от 25 до 53,
используется только для определения необходимого для хранения места)
- FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] (4 байта)
- DOUBLE [PRECISION][(M,D)] [UNSIGNED] [ZEROFILL]
- REAL[(M,D)] [UNSIGNED] [ZEROFILL] (синоним DOUBLE)
- DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] (неупакованное десятичное
вещественное число; каждая цифра занимает 1 байт, '-' и '.'
не учитываются в M; по умолчанию D равно 0, M равно 10)
- DEC, NUMERIC, FIXED - синоним DECIMAL
- SERIAL - синоним BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
- BOOL[EAN] - синоним TINYINT (1); 0 - false, прочее - true
- BIT [(M)] - строка бит от 1 до 64 (5.0.3)
- Дата и время (проверка значений не очень тщательная, например,
дата 1999-11-31 будет воспринята нормально (до 5.0.2, режим ALLOW_INVALID_DATES);
допустимы равный нулю номер дня и номера месяца И дня равные нулю (режим NO_ZERO_IN_DATE);
неверное значение преобразуется в "нулевое" - 0000-00-00 (режим NO_ZERO_DATE);
заносить можно как строки с любыми разделителями полей в последовательности:
год, месяц, день), так и без разделителей или числа;
года 00-69 вводятся как 2000-2069, 70-99 - как 1970-1999)
- 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 байта;
при вводе время преобразуется в UTC, при выводе - во временную зону клиента;
если при INSERT или UPDATE (должны быть реальные изменения)
значение опущено (только первая или явно указанная колонка этого типа)
или равно NULL или NOW(), то заносится текущее время;
формат выдачи в версии 4.1 и выше: '9999-12-31 23:59:59' или число в числовом
контексте;
в ранних версиях формат выдачи зависит от 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', хотя доли пока не хранятся;
заносить можно как строки с любыми разделителями полей,
так и без разделителей или числа; допустимы сокращенные формы: SS, MMSS,
но HH:MM!)
- YEAR[(4|2)] (от 1901 до 2155 (по умолчанию) или от 1970 до 2069; 1 байт)
- Строки (в MySQL CHAR всегда NATIONAL;
надо учитывать, что
максимальная длина строки таблицы и пакета протокола клиент/сервер - 16 МБ
- и надо увеличить размер каких-то буферов как сервера, так и клиента;
CHAR, VARCHAR и TEXT могут иметь указание кодировки и алгоритма сравнения
(CHARACTER SET имя-кодировки COLLATE алгоритм-сравнения);
длина CHAR и VARCHAR указывается в символах, а не байтах (utf8);
VARCHAR, BLOB и TEXT - строки переменной длины;
BINARY - навязчивый атрибут, т.е. если операнд выражения - BINARY,
то все выражение - BINARY;
атрибут BINARY для CHAR, VARCHAR и TEXT задаёт бинарный алгоритм сравнения,
но не кодировку (наследуется от кодировки БД?);
BLOB - это последовательность байт, а TEXT - последовательность символов;
TEXT можно рассматривать как VARCHAR нужного размера, а
BLOB можно рассматривать как VARBINARY нужного размера, но хвостовые
пробелы не удаляются и не м.б. значения по умолчанию;
выделение памяти для BLOB и TEXT производится пообъектно, а не поколонно;
для CHAR и VARCHAR можно индексировать префикс колонки;
для BLOB и TEXT обязательно индексировать префикс фиксированной длины;
для VARCHAR и TEXT можно создавать
индекс специального вида FULLTEXT для индексирования всей колонки;
ORDER BY и GROUP BY работают только с объектами фиксированной длины или
первыми max_sort_length байтами)
- [NATIONAL] CHAR(M) [BINARY | ASCII | UNICODE]
(фиксированной длины от 1 до 255 символов (по умолчанию - 1);
дополняется справа пробелами; при извлечении правые пробелы удаляются; сортируются
и сравниваются в соответствии с алгоритмом сравнения;
ASCII - означает кодировку lanit1, UNICODE - ucs2;
если длина более 255, то молчаливо преобразуется в минимально возможный тип TEXT;
CHAR(0) занимает 1 бит и может принимать два значения - NULL и "")
- NCHAR - синоним NATIONAL CHAR
- CHARACTER - синоним CHAR
- CHAR BYTE - синоним CHAR BINARY
- [NATIONAL] VARCHAR(M) [BINARY] (строка переменной длины;
M задаёт максимальную длину, от 0 до 255 (до 65532 в 5.0.3);
правые пробелы удаляются при сохранении (до 5.0.3);
если длина более 255, то молчаливо преобразуется в минимально
возможный тип TEXT (до 5.0.3);
сортируются и сравниваются в соответствии с алгоритмом сравнения)
- 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)
- LONG VARCHAR - синоним MEDIUMTEXT
- BINARY(M) (последовательность байт фиксированной длины)
- VARBINARY(M) (последовательность байт переменной длины;
M задаёт максимальную длину)
- ENUM('строка1','строка2',...) [CHARACTER SET имя-кодировки COLLATE алгоритм-сравнения]
(может принимать значение из списка, NULL
или "" - как признак ошибки при вставке; не более 65535 различных значений;
1 или 2 байта; если описан как NULL, то по умолчанию вставляется NULL;
если описан как NOT NULL, то по умолчанию вставляется первая строка
из списка; каждая строка имеет индекс, начиная с 1; индекс "" равен 0;
индекс NULL равен NULL; в числовом контексте извлекается индекс, а не строка
(при вставке числа оно тоже рассматривается как индекс, кроме LOAD DATA);
сортировка производится по индексу (NULL, "", остальные);
зависимость от регистра букв при вставке определяется кодировкой и алгоритмом
сравнения, но извлекается в том виде, в каком колонка описывалась)
- SET('строка1','строка2',...) [CHARACTER SET имя-кодировки COLLATE алгоритм-сравнения]
(может одновременно принимать от 0 до 64 значений из списка;
элемент списка не может содержать запятую;
1, 2, 3, 4 или 8 байт;
зависимость от регистра букв при вставке определяется кодировкой и алгоритмом
сравнения, но извлекается в том виде, в каком колонка описывалась;
если значение SET извлекается/устанавливается в числовом контексте, то в числе каждому
установленому биту соответствует элемент множества (первый элемент
в описании множества соответствует младшему биту); сортируются как числа,
NULL младше всех)
- операции над базами данных
- CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET кодировка
[[DEFAULT] COLLATE алгоритм-сортировки]]
- ALTER DATABASE [db_name] [[DEFAULT] CHARACTER SET кодировка
[, [DEFAULT] COLLATE алгоритм-сортировки]]
- DROP DATABASE [IF EXISTS] db_name
- SHOW CREATE DATABASE имя
- USE имя
- SHOW TABLES
- операции над таблицами
- обслуживание таблиц
- OPTIMIZE TABLE имя-таблицы [, имя-таблицы,...]
полезно после больших удалений или изменений таблиц с переменной длиной строки:
сортировка индексов и дефрагментация;
а место под копию таблицы есть ("Table does not support optimize, doing recreate + analyze instead")?
- CHECK TABLE имя-таблицы [, имя-таблицы,...] {QUICK | FAST | MEDIUM | EXTEND | CHANGED}
- BACKUP TABLE имя-таблицы [, имя-таблицы,...] TO 'имя-директории'
- RESTORE TABLE имя-таблицы [, имя-таблицы,...] FROM 'имя-директории'
- ANALYZE TABLE имя-таблицы [, имя-таблицы,...]
пересчет распределения ключей для ускорения работы с таблицей
- REPAIR TABLE имя-таблицы [, имя-таблицы,...] [QUICK] [EXTENDED]
- SHOW TABLE STATUS [LIKE 'имя таблицы']
- операции над строками
- 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
Между именем функции и скобкой не должно быть пробела.
Операндами могут быть константы, имена колонок и переменные.
- группировка функций с помощью круглых скобок
- арифметические операции: +, -, *, /
- битовые функции: |, &, <<, >>, ~, 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-символ по умолчанию - "\"; чтобы найти '\n'
надо задать в шаблоне '\\n'; чтобы найти '\' - '\\\\')
- expr NOT LIKE шаблон [ESCAPE 'escape-символ']
- expr REGEXP шаблон (расширенное регулярное выражение)
- expr RLIKE шаблон (расширенное регулярное выражение)
- expr NOT REGEXP шаблон
- expr NOT RLIKE шаблон
- STRCMP(expr1,expr2) (арифметическое сравнение строк:
-1 если первая строка меньше, 0 если строки равны, 1 если первая строка больше)
- MATCH (колонка1,колонка2,...) AGAINST (expr)
(возвращает меру релевантности - положительное вещественное число - между
содержимым колонок и выражением; должен быть создан FULLTEXT индекс)
- преобразование типов
- BINARY (преобразование строки в двоичную - т.е. чувствительную к регистру)
- условные выражения
- IFNULL(expr1,expr2) (если expr1 есть NULL, то возвращает
expr2, иначе expr1)
- NULLIF(expr1,expr2) (если выражения равны, то возвращает
NULL, иначе - expr1; expr1 может вычисляться дважды)
- IF(expr1,expr2,expr3) (если expr1, то возвращает
expr2, иначе expr3)
- CASE значение1 WHEN [значение2] THEN результат1
[WHEN [значение3] THEN результат2 ...] [ELSE результатn]
END
(если значение1 равно значение2, то вернуть результат1, иначе сравнить
значение1 и значение3 и т.д.; в противном случае результатn; если его нет,
то NULL)
- CASE WHEN [условие1] THEN результат1
[WHEN [условие2] THEN результат2 ...]
[ELSE результатn] END
- математические функции (в случае ошибки возвращают NULL;
подробнее см. библиотеку C)
- унарный "-"
- ABS(X), SIGN(X), MOD(N,M), FLOOR(X), CEILING(X), ROUND(X),
ROUND(X,число-цифр-после-точки), EXP(X), LOG(X), LOG10(X), POWER(X,Y),
SQRT(X), PI(), COS(радиан), SIN(радиан), TAN(радиан), ACOS(X), ASIN(X),
ATAN(X), ATAN2(Y,X), COT(X), RAND(), RAND(seed), LEAST(X,Y,...),
GREATEST(X,Y,...), DEGREES(радиан), RADIANS(градусов),
TRUNCATE(X,число-цифр-после-точки)
- обработка строк (возвращают NULL, если длина результата больше
max_allowed_packet; позиции нумеруются с 1)
- ASCII(str) - ASCII-код первого символа строки
- ORD(str) - ASCII-код с учетом мультибайтных символов
- CONV(N,основание1,основание2) - преобразование числа из представления
с основанием1 в представление с основанием2
- BIN(N) - синоним CONV(N,10,2)
- OCT(N) - синоним CONV(N,10,8)
- HEX(N) - синоним CONV(N,10,16)
- CHAR(целое,...) - возвращает строку, составленную из символов с
соответствующими кодами
- CONCAT(str1,str2,...)
- CONCAT_WS(разделитель,str1,str2,...) - добавляет разделитель между
сливаемыми строками
- LENGTH(str), OCTET_LENGTH(str)
- CHAR_LENGTH(str), CHARACTER_LENGTH(str) - понимает многобайтные символы
- LOCATE(подстрока,строка[,начальная-позиция]), POSITION(подстрока IN строка),
INSTR(строка,подстрока) - понимает многобайтные символы
- LPAD(строка,длина,строка-заполнитель) - дополнить строку слева до
достижения указанной длины
- RPAD(строка,длина,строка-заполнитель) - дополнить строку справа до
достижения указанной длины
- LEFT(строка,длина) - вернуть указанное число символов слева, понимает
многобайтные символы
- RIGHT(строка,длина) - вернуть указанное число символов справа, понимает
многобайтные символы
- SUBSTRING(строка,начальная-позиция[,длина]),
SUBSTRING(строка FROM начальная-позиция[ FOR длина]),
MID(строка,начальная-позиция,длина) - понимает многобайтные символы
- SUBSTRING_INDEX(строка,разделитель,счетчик) - подстрока до указанного
числа разделителей (если число отрицательное, то справа;
понимает многобайтные символы)
- LTRIM(строка) - удаление левых пробелов
- RTRIM(строка) - удаление правых пробелов
- TRIM([[BOTH | LEADING | TRAILING] [префикс] FROM] строка) - если префикс
не указан, то удаляются пробелы)
- SPACE(число) - указанное число пробелов
- REPLACE(строка,что,на-что) - понимает многобайтные символы
- REPEAT(str,count)
- REVERSE(str) - понимает многобайтные символы
- INSERT(строка,позиция,длина,новая-строка) - на самом деле не вставка,
а замена; понимает многобайтные символы
- ELT(N,str1,str2,...) - возвращает N-ю строку
- FIELD(str,str1,str2,str3,...) - возвращает индекс строки str в списке
str1,...
- FIND_IN_SET(строка,список) - номер строки в списке (строки через запятую
или колонка типа SET)
- MAKE_SET(биты,строка1,строка2,...) - конкатенирует строки в список через
запятую, используются только строки для которых взведен бит
- EXPORT_BIT(биты,on-строка,off-строка[,разделитель,число-бит]) -
EXPORT_SET(5,'Y','N',',',4) выдает 'Y,N,Y,N'
- LCASE(строка) - переводит все буквы в нижний регистр (строчные)
- LOWER(строка) - переводит все буквы в нижний регистр (строчные)
- UCASE(строка) - переводит все буквы в верхний регистр (прописные)
- UPPER(строка) - переводит все буквы в верхний регистр (прописные)
- LOAD_FILE(полное-имя-файла) - содержимое файла возвращается как строка,
необходимо иметь привилегии работы с файлами; размер файла ограничен
max_allowed_packet
- работа со временем и датами
- DAYOFWEEK(дата) - воскресенье: 1, понедельник: 2 и т.д.
- WEEKDAY(дата) - понедельник: 0, вторник: 1 и т.д.
- DAYOFMONTH(дата)
- DAYOFYEAR(дата)
- MONTH(дата)
- DAYNAME(дата) - в виде: 'Thursday'
- MONTHNAME(дата) - в виде 'February'
- QUARTER(дата)
- WEEK(дата) - от 0 до 53; первый день недели - воскресенье
- WEEK(дата,начало-недели) - если начало-недели равно 0, то неделя начинается
с воскресенья, если равно 1, то с понедельника
- YEAR(дата)
- YEARWEEK(дата[,начало-недели]) - год и номер недели
- HOUR(время)
- MINUTE(время)
- SECOND(время)
- PERIOD_ADD(P,N) - добавить N месяцев к периоду P (P в формате YYYYMM)
- PERIOD_DIFF(P1,P2) - число месяцев между периодами
- DATE_ADD(дата,INTERVAL выражение единица-измерения) или
ADDDATE(дата,INTERVAL выражение единица-измерения) или
"время" + INTERVAL выражение единица-измерения: добавить интервал к
дате/времени
где единицы-измерения:
- SECOND
- MINUTE
- HOUR
- DAY
- MONTH ('1998-01-30' + Interval 1 month => '1998-02-28')
- YEAR
- MINUTE_SECOND ("минут:секунд")
- HOUR_MINUTE ("часов:минут")
- DAY_HOUR ("дней часов")
- YEAR_MONTH ("лет-месяцев")
- HOUR_SECOND ("часов:минут:секунд")
- DAY_MINUTE ("дней часов:минут")
- DAY_SECUND ("дней часов:минут:секунд")
- DATE_SUB(дата,INTERVAL выражение единица-измерения) или
SUBDATE(дата,INTERVAL выражение единица-измерения) или
"время" - INTERVAL выражение единица-измерения: вычесть интервал из
даты/времени
- EXTRACT(единица-измерения FROM дата) - возвращает интервал указанного типа
- TO_DAYS(дата) - возвращает номер дня с 0-го года (не учитывает
момент перехода на Грегорианский календарь)
- FROM_DAYS(N) - обратная к TO_DAYS()
- DATE_FORMAT(дата,формат) - преобразует дату в соответствии с форматом
(см. strftime(3), кроме отсутствия i18n: %M - полное английское имя месяца;
%W - полное английское имя дня недели; %D - день месяца с английским
суффиксом; %c - номер месяца от 1 до 12; %h - час от 01 до 12;
%i - минуты от 00 до 59)
- TIME_FORMAT(время,формат) - аналогично DATE_FORMAT, но ограниченно
часами, минутами и секундами
- CURDATE() - '1997-12-15' или 19971215 в зависимости от контекста
- CURRENT_DATE - синоним CURDATE()
- CURTIME() - '23:50:26' или 235026 в зависимости от контекста
- CURRENT_TIME - синоним CURTIME()
- NOW() или SYSDATE() или CURRENT_TIMESTAMP - '1997-12-15 23:50:26' или
19971215235026 в зависимости от контекста
- UNIX_TIMESTAMP([дата]) - число секунд с 1 января 1970 GMT, дата в
локальном времени
- FROM_UNIXTIME(timestamp[,формат]) - обратная к UNIX_TIMESTAMP()
- SEC_TO_TIME(секунд) - преобразует секунды в часы:минуты:секунды
- TIME_TO_SEC(время) - преобразует часы:минуты:секунды в секунды
- разное
- DATABASE() - имя текущей БД
- USER() или SYSTEM_USER() или SESION_USER() - текущее имя пользователя
и хост ('root@localhost')
- PASSWORD(строка) - перевод пароля во внутренний вид (не UNIX!)
- ENCRYPT(строка[,соль]) - UNIX-овый преобразование пароля
- ENCODE(строка,пароль) - шифровка (какой алгоритм?)
- DECODE(шифрованная-строка,пароль) - расшифровка
- MD5(строка)
- LAST_INSERT_ID([выражение])
- FORMAT(X,D) - вывод числа в виде 'xxx,xxx.xx', где D - число цифр после
точки
- VERSION() - '3.23.37-log'
- CONNECTION_ID()
- GET_LOCK(имя-замка,timeout-секунд) - возвращает 1 при успехе, 0 - при
timeout, NULL - при ошибке; освобождается при RELEASE_LOCK(),
новом GET_LOCK() или завершении потока
- RELEASE_LOCK(имя-замка) - возвращает 1 при успехе; 0 - если замок
был закрыт не этим потоком; NULL - если замок не существует
- INET_NTOA(выражение) - преобразование IP-адреса в сетевом формате
в "точечный" формат
- INET_ATON(выражение) - преобразование IP-адреса из "точечного" формата
в целое с сетевым порядком байт
- MASTER_POS_WAIT(имя-журнала,позиция) - синхроницация репликации
- функции для group by (использование данных функций в операторе
без group by влечет группирование всех строк)
- COUNT(выражение) - число не-NULL значений в извлеченных строках
- COUNT(*) - число извлеченных строк
- COUNT(DISTINCT выражение,[выражение...]) - число различных не-NULL значений
- AVG(выражение) - среднее
- MIN(выражение), MAX(выражение)
- SUM(выражение) - сумма (если не извлечено ни одной строки, то NULL)
- STD(выражение) или STDDEV(выражение) - стандартное отклонение
- BIT_OR(выражение) - побитовое или
- BIT_AND(выражение) - побитовое И
Программа mysql позволяет подсоединиться с серверу MySQL
и выполнить последовательность SQL-запросов с получением ответа на
экран терминала (эмулятора терминала). Имеется редактирование
командной строки с автодополнением имён (readline) с поддержкой истории (~/.mysql_history,
переменая окружения MYSQL_HISTFILE). Вместо терминала может принимать
SQL запросы со стандартного ввода. Вывод может быть переназначен в файл.
Параметры задаются ключами, переменными окружения и
в конфигурационном файле стандартным способом.
Секции конфигурационного файла: mysql и client. Кроме глобального (/etc/my.cnf)
и серверного (/usr/local/mysql/data/my.cnf) конфигурационных файлов
можно использовать личный файл $HOME/.my.cnf
Основные ключи (они же опции конфигурационного файла):
- имя-БД
- --auto-rehash (автозавершение имён таблиц и полей)
- --disable-auto-rehash
- --no-auto-rehash (однако, есть команда rehash)
- --batch (-B; выдавать результаты запросов по строке результата на
строку выходного файла, разделяя поля табуляциями)
- --character-sets-dirs=имена-каталогов
- --column-names (выводить имена колонок)
- --skip-column-names
- --compress (-C)
- --database=имя-БД (-D)
- --debug=опции,журнал
- --debug-info (-T, выдаётся статистика по завершении задачи)
- --default-character-set=имя
- --delimiter=символ (завершитель SQL-запроса; по умолчанию точка с запятой)
- --exec[ute]=SQL-команда (-e; выполнить команду и завершиться)
- --force (-f; продолжать даже при ошибках SQL)
- --help (-?)
- --html (-H; вывод в HTML)
- --host=имя-хоста-для-подключения (-h)
- --ignore-spaces (-i; игнорировать пробелы после имени функции)
- --line-numbers (выводить номер строки с ошибкой)
- --skip-line-numbers
- --local-infile[=0|1] (разрешить LOAD DATA LOCAL INFILE)
- --named-commands (-G; разрешать внутренние команды mysql в любой строке
запроса)
- --disable-named-commands (-g; действует по умолчанию; внутренние команды только
в первой строке запроса)
- --net_buffer_length=байт< (16384)/li>
- --max_allowed_packet=байт (16777216)
- --no-beep (не звенеть при ошибках)
- --one-database (-o; изменять только БД по умолчанию, пропуская SQL,
изменяющие прочие БД)
- --pager[=имя-программы] (использовать для вывода программы типа
less, more, cat)
- --disable-pager (не делать паузы в стиле more при выводе)
- --password[=пароль] (если пароль опущен, то будет запрошен отдельно;
не рекомендуется указывать пароль в командной строке;
-pпароль - без пробела!)
- --port=номер-порта-для-подключения (-P; 3306)
- --prompt=приглашение-командной-строки ("mysql>"; $MYSQL_PS1)
- --protocol=tcp | socket
- --quick (-q; не кешировать результат, а выдавать строки по мере получения)
- --raw (вместе с --batch; не преобразовывать поля в приемлимый для терминала вид)
- --reconnect (установлен по умолчанию; пересоединяться при разрыве связи)
- --skip-reconnect
- --safe-updates (-U; --i-am-a-dummy; позволять UPDATE и DELETE только
с использованием ключей)
- --select_limit=число (автоматически ограничивать количество строк для
SELECT в режиме --safe-updates; 1000)
- --max_join_size=число (автоматически ограничивать количество строк для
JOIN в режиме --safe-updates; 1000000)
- --secure-auth (отказываться соединяться с сервером по старому до-4.1
протоколу)
- --set-variable=имя=значение (-O; в новых версиях можно задавать значение
переменных непосредственно: --имя-переменной=значение)
- --sigint-ignore (не реагировать на SIGINT, CTRL-C)
- --silent (-s, можно несколько раз)
- --socket=имя-сокета-для-подключения (-S)
- --ssl-ca=имя-файла (файл должен содержать сертификаты корневых CA
в формате PEM)
- --ssl-capath=имя-каталога (каталог должен содержать файлы с сертификатами
корневых CA в формате PEM)
- --ssl-cert=имя-файла (файл должен содержать сертификат клиента
в формате PEM)
- --ssl-cipher=список-допустимых-алгоритмов-шифрования (через двоеточие,
имеющийся список можно получить командой openssl ciphers)
- --ssl-key=имя-файла (файл должен содержать приватный ключ клиента
в формате PEM; если ключ зашифрован, то перед соединением требуется
ввести парольную фразу)
- --skip-ssl
- --table (-t; вывод в табличном формате)
- --tee=имя-файла (помимо вывода на экран добавлять результат в файл)
- --disable-tee (не выводить во вспомогательный файл)
- --unbuffered (-n; сбрасывать буфер после каждого запроса)
- --user=имя-пользователя-MySQL (-u; по умолчанию берётся $USER)
- --verbose (-v; можно несколько раз)
- --vertical (-E; выдавать результат в виде столбца, вертикально)
- --version (-V)
- --wait (-w; при обрыве соединения подождать и повторить попытку)
- --connect_timeout=секунд
- --xml (-X; вывод в XML)
После соединения вводимые операторы SQL (должны завершаться
разделителем, обычно ';') передаются серверу, результаты выводятся на экран
(возможно, с использованием more или less).
Дополнительные команды имеют длинную (не требуется завершать
разделителем) и короткую формы (нельзя завершать разделителем):
- help (\h, ?)
- clear (\c, очистить строку)
- connect [имя-БД имя-хоста](\r, пересоединиться с сервером)
- delimiter (\d, установить разделитель вместо ';')
- edit (\e, редактировать команду в текстовом редакторе $EDITOR)
- ego (\G, послать команду и выводить результат вертикально)
- exit (\q, завершить работу)
- go (\g, послать команду)
- nopager (\n, не делать паузу между экранами вывода)
- notee (\t, не дублировать вывод в файл)
- pager имя-программы-и-аргументы (\P, делать паузу между экранами вывода;
рекомендуется "less -S" для просмотра вправо/влево)
- print (\p, вывести текст текущей команды)
- prompt строка-приглашения (\R, изменить текст приглашения)
- quit (\q, ^D, завершить работу)
- rehash (\#, обновить кеш автоматического дополнения имён)
- source имя-файла (\., читать операторы из файла)
- status (\s, вывести состояние соединения)
- system (\!, выполнить команду shell)
- tee имя-файла (\T, дублировать вывод в файл)
- use имя-БД (открыть БД)
При задании строки приглашения можно использовать спецификации формата
(при задании приглашения в конфигурационном файле или переменной окружения
необходимо учитывать, что там действуют свои правила использования '\'):
- \d - имя БД
- \h - имя хоста сервера
- \u - имя пользователя
- \U - user@host
- \p - IP адрес сервера
- \c - номер запроса
- много разных других
Журнал ошибок. Содержит сообщения о запуске и остановке сервера,
а также о грубых ошибках. Лежит в каталоге данных под именем `hostname`.err.
Имя можно задать ключом --log-error=имя-файла. По запросу FLUSH LOGS старый файл
переименовывается (добавляется суффикс -old) и создаётся новый.
Журнал запросов. Содержит описания всех клиентских
соединений и тексты всех SQL запросов (в порядке поступления, а не исполнения).
Запись в него включается ключом --log[=имя-файла].
По умолчанию, файл лежит в каталоге данных под именем `hostname`.log.
По запросу FLUSH LOGS файл переоткрывается (если предварительно переименовать файл,
то откроется новый файл со старым именем).
Журнал изменений (удалён в 5.0.0). Содержит тексты всех
SQL запросов, изменяющих данные (после выполнения запроса, но до снятия блокировок).
Запись в него включается ключом --log-update[=имя-файла].
По умолчанию, файл лежит в каталоге данных под именем `hostname`.номер
(номер увеличивается при каждом запуске или сбросе журналов).
Двоичный журнал изменений. Содержит информацию о всех
изменениях данных в двоичном формате, совместим с транзакциями, запись делается
после выполнения запроса (для таблиц с транзакциями - после COMMIT, если объём изменений
превышает binlog_cache_size, то создаётся временный файл; max_binlog_cache_size
ограничивает максимальный размер транзакции, которую можно записать в журнал;
статистика в переменных Binlog_cache_use и Binlog_cache_disk_use),
но до снятия блокировок. Запись в него включается ключём --log-bin[=имя-файла].
По умолчанию, файл лежит в каталоге данных под именем `hostname`-bin.номер
(номер увеличивается при каждом запуске или сбросе журналов или достижении
размера max_binlog_size). Можно удалить все или некоторые из них
запросом RESET MASTER или PURGE MASTER LOGS.
Также хранится таблица журналов в файле `hostname`-bin.index
(меняется ключом --log-bin-index=имя-файла).
Какие записи включать можно ограничить ключами --binlog-do-db=имя-БД (проверяется
не реальная изменяемая БД, а текущая, установленная с помощью USE) и
--binlog-ignore-db=имя-БД (также учитывается лишь имя текущей БД).
Глобальная переменная sync_binlog позволяет синхронизовать запись в БД и
двоичный журнал с указанным шагом. Чтобы откатка транзакций выполнялась после
аварийного рестарта одинаково для двоичного журнала и таблиц InnoDB необходимо
дополнительно указывать ключи --innodb-safe-binlog и обеспечить сброс буферов
на диск после каждой транзакции (авторы явно не уверены, что даже это поможет
во всех случаях).
Утилита mysqlbinlog преобразует двоичный журнал в запросы SQL в текстовом виде.
Замедляет работу сервера на 1%. При использовании двоичного журнала параллельные
вставки исполняются как обычные. Формат в версиях 3.x, 4.x и 5.x отличается.
Журнал медленных запросов. В него записываются все SQL запросы,
выполнение которых заняло больше, чем long_query_time секунд.
Запись в него включается ключом --log-slow-queries[=имя-файла].
Ключ --log-queries-not-using-indexes добавляет в него все запросы,
не использующие индексы.
По умолчанию, файл лежит в каталоге данных под именем `hostname`-slow.log.
По запросу FLUSH LOGS файл переоткрывается (если предварительно переименовать файл,
то откроется новый файл со старым именем).
Скрипт mysqldumpslow (perl) облегчает разбор получившегося журнала.
Файл mysql-log-rotate содержит пример конфигурации для
logrotate.
Все утилиты имеют ключ --help, обработка опций и параметров
осуществляется согласно общим правилам.
mysqladmin - выполнение административных задач
В качестве параметров задаются опции и команды. Опции:
- --help (заодно показывает значения переменных по умолчанию)
- --character-sets-dirs=имена-каталогов
- --compress (-C; использовать сжатие в протоколе обмена)
- --count=число (-c; сколько раз повторять команду)
- --default-character-set=имя
- --force (-f; не запрашивать подтверждений; если использвать несколько раз,
то не обращать внимания на ошибки)
- --host=имя (-h)
- --password[=пароль] (-pпароль)
- --port=порт (-P)
- --protocol=tcp | socket
- --silent (-s)
- --sleep=секунд (-i; повторять команду с интервалом)
- --socket=имя-файла (-S)
- --user=имя (-u)
- --verbose (-v)
- --vertical (-E)
- --wait[=число-попыток] (-w; при неудаче подождать и повторить)
- --set-variable имя=значение (connect_timeout, shutdown_timeout)
Команды (имя можно сокращать до минимально различимого):
- create имя-БД (создать БД)
- debug (начать запись отладочной информации в
журнал ошибок сервера)
- drop имя-БД (удалить БД и все её таблицы)
- extended-status (вывести значения переменных состояния)
- flush-hosts (сброс кеша DNS)
- flush-logs (переоткрыть журналы)
- flush-privileges (заново считать таблицы привилегий)
- flush-status (обнулить переменные состояния)
- flush-tables (запись всех буферизованных изменений и переоткрытие файлов,
содержащих таблицы; файлы можно предварительно подменить)
- flush-threads (?)
- kill номер-процесса-или-нити (?)
- password новый-пароль (для текущего пользователя MySQL)
- ping (проверить, работает ли mysqld)
- processlist (аналог SHOW PROCESSLIST или SHOW FULL PROCESSLIST)
- refresh (flush-tables + flush-logs)
- reload (flush-privileges)
- shutdown
- start-slave
- status
- stop-slave
- variables (вывести значения глобальных переменных)
- version
mysqldump - сохранение БД
Утилита позволяет вывести содержимое таблиц или БД
в виде SQL запросов для переноса на другой сервер или резервирования.
При вызове указываются имя БД и имена таблиц
(или имена БД в опции --databases или опция --all-databases), а также
опции в стандартном формате:
- --help (заодно показывает значения переменных по умолчанию)
- --add-drop-table (добавлять запрос DROP TABLE перед CREATE TABLE)
- --add-locks (обрамлять вывод каждой таблицы скобками LOCK TABLES и
UNLOCK TABLES; ускоряет дальнейшую загрузку)
- --all-databases (-A)
- --allow-keywords (позволять создание колонок с именами, совпадающими с
зарезервированными словами - перед именем колонки приписывается имя таблицы)
- --comments[=0|1] (в виде комментариев записывается дополнительная информация)
- --skip-comments
- --compact (отключает вывод всех дополнительных запросов - комментарии, DROP
TABLE, LOCK TABLES и т.п.)
- --compatible=ansi | mysql323 | mysql40 | postgresql | oracle | mssql | db2 | maxdb |
no_key_options | no_table_options | no_field_options (можно использовать
несколько значений через запятую)
- --complete-insert (-c; использовать полный формат INSERT - с именами колонок)
- --compress (-C; использовать сжатие в протоколе обмена)
- --create-options (--all; выводить в CREATE TABLE все специфические для MySQL
возможности)
- --databases имя-БД ... (-B; выдаётся содержимой всей БД; в начале вставляются
запросы CREATE DATABASE и USE)
- --default-character-set=имя
- --delayed-insert (использовать INSERT DELAYED)
- --delete-master-logs (для главного сервера репликации - удалить двоичные журналы
после работы)
- --disable-keys (-K; обрамлять вывод каждой таблицы командами, отключающими
модификацию индекса при добавлении каждой записи и создающими индекс
один раз для всей таблицы)
- --extended-insert (-e; группировать создание нескольких записей в один запрос
INSERT)
- --flush-logs (-F; сбрасывать журналы сервера перед записью каждой БД;
требуются привилегии RELOAD)
- --force (-f; продолжать сброс в случае ошибки)
- --host=имя (-h)
- --hex-blob (выводить содержимое колонок типа BINARY, VARBINARY и BLOB
в виде шестнадцатеричных констант)
- --lock-all-tables (-x; установить глобальную блокировку изменений на всё время
сброса)
- --lock-tables (-l; перед сбросом каждой таблицы блокировать все таблицы
данной БД)
- --master-data[=1|2] (имя и позиция в двоичном журнале записываются в выходной поток;
требуются привилегии RELOAD)
- --no-create-db (-n; не записывать запросы CREATE DATABASE в выходной поток)
- --no-create-info (-t; не записывать запросы CREATE TABLE в выходной поток)
- --no-data (-d; не записывать содержимое таблиц в выходной поток)
- --opt (сокращение для совокупности всех оптимизирующих опций; включён по умолчанию)
- --skip-opt
- --password[=пароль] (-pпароль)
- --port=порт (-P)
- --protocol=tcp | socket
- --quick (-q; без буферизации)
- --quote-names (-Q; заключать имена БД, таблиц и столбцов в кавычки или обратные
апострофы в зависимости от режима; включён по умолчанию)
- --skip-quote-names
- --result-file=имя-файла (-r)
- --set-charset (добавлять SET NAMES кодировка-по-умолчанию в выходной поток;
включён по умолчанию)
- --skip-set-charset
- --single-transaction (только для InnoDB; выполнить запрос BEGIN перед сбросом;
получается согласованное состояние всей БД без блокировки работы других
клиентов; несовместим с --lock-tables; рекомендуется --quick)
- --socket=имя-файла (-S)
- --tab=имя-каталога (-T; для каждой таблицы создаётся файл .sql с запросом
CREATE TABLE и файл .txt с содержимым таблицы: колонки разделяются табуляциями,
записи - NL; формат можно поменять опциями: --fields-terminated-by=,
--fileld-enclosed-by=, --fileld-optionally-enclosed-by=, --fields-escaped-by,
--lines-terminated-by= со значениями аналогичными LOAD DATA INFILE)
- --user=имя (-u)
- --verbose (-v)
- --where=условие (-w; фильтр позволяет выделить часть таблицы)
- --xml (-X; выводить в формате XML)
mysqlhotcopy - копирование таблиц MyISAM
Скрипт (perl) mysqlhotcopy позволяет копировать таблицы MyISAM
командами cp и scp (т.е. очень быстро) без остановки сервера (используются запросы
LOCK TABLES и FLUSH TABLES). Опции читаются из секций client и mysqlhotcopy
конфигурационного файла. Необходимы права для чтения файлов БД,
привилегию SELECT для таблиц и привилегию RELOAD.
В качестве параметров указывается перечень БД
и имя каталога для сохранения. После имени БД можно указать точку и регулярное
выражение в слешах, ограничивающее имена копируемых таблиц. Опции:
- --help
- --allowold (переименовывать старые файлы в _old)
- --checkpoint=имя-БД.имя-таблицы (?)
- --dryrun (-n; реальных действий не производить)
- --flushlog (сбросить журналы после блокировки таблиц)
- --keepold (не удалять старые файлы)
- --method=cp|scp
- --noindices (не копировать индексы, их можно воссоздать myisamchk -rq)
- --password=пароль (-pпароль; нельзя опускать)
- --port=порт (-P)
- --quite (-q)
- --socket=имя-файла (-S)
- --suffix=строка (доббавлять к именам скопированных файлов)
- --tmpdir=имя-каталога
- --user=имя (-u)
mysqlimport - загрузка текстовых файлов в таблицы
Утилита mysqlimport предоставляет интерфейс для запроса
LOAD DATA INFILE. В качестве параметров указывается имя БД и список файлов.
Имя таблицы определяется по имени файла (суффикс обрезается).
Опции соответствуют возможностям запроса LOAD DATA INFILE (см. описание):
- --help
- --columns=имена-колонок-через-запятую (-c; определяют порядок колонок в файле)
- --compress (-C)
- --delete (-D; предварительно очистить таблицу)
- колонки в текстовом файле разделяются табуляциями, записи - NL;
формат можно поменять опциями: --fields-terminated-by=,
--fileld-enclosed-by=, --fileld-optionally-enclosed-by=, --fields-escaped-by,
--lines-terminated-by= со значениями аналогичными LOAD DATA INFILE
- --host=имя (-h)
- --force (-f; продолжать загрузку следующей таблицы в случае ошибки)
- --ignore (пропускать строчки с дублирующим значением уникального индекса)
- --ignore-lines=число (пропустить первые строки файла)
- --local (-L; читать локальные файлы с клиентского компьютера)
- --lock-tables (-l; блокировать все таблицы на запись перед чтением файлов)
- --password[=пароль] (-pпароль)
- --port=порт (-P)
- --protocol=tcp | socket
- --replace (-r; заменять записи с дублирующим значением уникального индекса)
- --silent (-s)
- --socket=имя-файла (-S)
- --user=имя (-u)
- --verbose (-v)
mysqlshow - выдача информации о БД и таблицах
Утилита mysqlshow предоставляет интерфейс для запроса
SHOW. В качестве параметров указывается имя БД, имя таблицы, имя колонки
(все параметры можно опустить - будет выдан список БД). Можно указывать
шаблоны (% и _). Опции:
- --help
- --character-sets-dirs=имена-каталогов
- --compress (-C)
- --default-character-set=имя
- --host=имя (-h)
- --keys (-k; показывать индексы)
- --password[=пароль] (-pпароль)
- --port=порт (-P)
- --protocol=tcp | socket
- --socket=имя-файла (-S)
- --status (-i; показывать дополнительную информацию о таблицах)
- --user=имя (-u)
- --verbose (-v, можно использовать несколько раз)
mysqlaccess - создание пользователей и управление привилегиями
Скрипт (perl) mysqlaccess позволяет проверить наличие прав
доступа для набора хост-пользователь-БД, что упрощало работу с привилегиями
в старых версиях. В новых версиях MySQL GRANT/REVOKE сильно облегчил жизнь
и скрипт выглядит заброшенным.
myisamchk - проверка и исправление таблиц
Перед запуском рекомендуется скопировать файлы.
Возможно стоит вместо myisamchk использвать SQL запросы CHECK, REPAIR,
OPTIMIZE, ANALYZE напрямую или через утилиту mysqlcheck, иначе придётся
останавливать сервер или обеспечивать взаимную блокировку (и FLUSH TABLES или
mysqladmin flush-tables), а ведь вы запускаете mysqld с ключом --skip-external-locking.
При вызове указываются имена файлов, содержащих таблицы (.MYI), и опции в стандартном
формате:
- --help (заодно показывает значения переменных по умолчанию)
- --silent (-s, можно использовать дважды)
- --verbose (-v, можно использовать трижды)
- переменные полнотекстового индекса: ft_max_word_len, ft_min_word_len,
ft_stopword_file, decode_bits (должны совпадать с переменными сервера,
т.к. не хранятся в индексе)
- переменные оптимизации: key_buffer_size, read_buffer_size, write_buffer_size,
sort_buffer_size, myisam_block_size, sort_key_blocks
- опции проверки таблиц:
- --check (-c)
- --check-only-changed (-C; проверять только таблицы, изменившиеся со времени
предыдущей проверки)
- --extend-check (-e, тщательная проверка)
- --fast (-F, только незакрытые таблицы)
- --force (-f; восстанавливать таблицы при нахождении ошибок)
- --information (-i, выдача статистики)
- --medium-check (-m)
- --read-only (-T, при отсутствии взаимной блокировки не записывать
флаг проверки в БД)
- --update-state (-U, записывать флаги проверки и состояния таблицы в БД;
требуется взаимная блокировка с сервером)
- опции восстановления:
- --backup (-B, файлы данных копируются в .BAK)
- --character-sets-dirs=имена-каталогов
- --correct-checksum
- --data-file-length=длина
- --extend-check (-e, пытается восстановить всё, что найдёт, включая мусор)
- --force (-f, игнорирует наличие старых временных файлов .TMD)
- --keys-used=битовая-маска (например, 0 запрещает создание индексов)
- --no-symlinks (-l, не проходить по символьным ссылкам, в 4.0 проход
запрещён вовсе)
- --parallel-recover (-p, отлаженность - альфа)
- --quick (-q, можно использовать дважды)
- --recover (-r, заодно удаляет накопившийся мусор)
- --safe-recover (-o, находит больше ошибок, но медленный)
- --set-collation=
- --sort-recover (-n, создавать индексы сортировкой вместо вставки)
- --tmpdir=каталог (-t, а места требуется много)
- --unpack (-u, распаковывать таблицы, созданные myisampack)
- опции анализа, оптимизации и получения информации (про блокировку не забывать):
- --analyze (-a, анализировать распределение ключей)
- --description (-d)
- --set-auto-increment[=начальное-значение]
- --sort-index (-S)
- --sort-records=номер-индекса (-R, нумеруются с 1, см. SHOW KEYS)
mysqlcheck - проверка и исправление таблиц
Утилита позволяет проверять, исправлять и оптимизировать таблицы MyISAM
без остановки сервера (представляет собой интерфейс к SQL запросам CHECK,
REPAIR, OPTIMIZE, ANALYZE). При вызове указываются имя БД и имена таблиц
(или имена БД в опции --databases или опция --all-databases), а также
опции в стандартном формате:
- --help (заодно показывает значения переменных по умолчанию)
- --all-databases (-A)
- --all-in-1 (-1; создавать один запрос для всей БД, вместо потабличной обработки)
- --analyze (-a, анализировать распределение ключей)
- --auto-repaire (если при проверке обнаружены ошибки, то после проверки
последней таблицы начать восстановление)
- --character-sets-dirs=имена-каталогов
- --check (-c; режим проверки)
- --check-only-changed (-C; проверять только таблицы, изменившиеся со времени
предыдущей проверки)
- --compress (-C; использовать сжатие в протоколе обмена)
- --default-character-set=имя
- --databases (-B; в качестве параметров указываются не таблицы, а БД)
- --extended (-e, тщательная проверка или восстановление; может восстановить мусор)
- --fast (-F, только незакрытые таблицы)
- --force (-f; продолжать в случае ошибок)
- --host=имя (-h)
- --medium-check (-m)
- --optimize (-o; режим оптимизации)
- --password[=пароль] (-pпароль)
- --port=порт (-P)
- --protocol=tcp | socket
- --quick (-q)
- --repaire (-r; режим восстановления)
- --silent (-s)
- --socket=имя-файла (-S)
- --user=имя (-u)
- --verbose (-v)
myisampack - сжатие таблиц
Утилита позволяет сжимать таблицы MyISAM (обычно вдвое).
После сжатия таблицы можно использовать только для чтения. Необходимо
останавливать сервер или обеспечивать взаимную блокировку (и FLUSH TABLES или
mysqladmin flush-tables), а ведь вы запускаете mysqld с ключом --skip-external-locking.
Расспаковка осуществляется утилитой myisamchk.
После сжатия таблицы необходимо воссоздать индексы, например:
myisamchk -rq --sort-index --analyze имя-таблицы.MYI
mysqladmin flush-tables
При вызове указываются имена файлов, содержащих таблицы (.MYI), и опции в стандартном
формате:
- --help (заодно показывает значения переменных по умолчанию)
- --backup (-b; старые файлы получают суффикс .OLD)
- --character-sets-dirs=имена-каталогов
- --force (-f, игнорирует наличие старых временных файлов .TMD)
- --join=имя-таблицы (объединять все обрабатываемые таблицы в одну;
таблицы должны иметь одинаковую структуру)
- --packlength=1|2|3 (-p; сколько байт тратить на длину записи)
- --silent (-s)
- --test (-t)
- --tmpdir=каталог (-T)
- --verbose (-v)
mysqlbinlog - обработка двоичных журналов
Утилита преобразует указанные двоичные журналы в последовательность
SQL запросов (в виде комментариев записываются также времена, номера нитей и т.д.).
Двоичный журнал может быть получен непосредственно от [удалённого] сервера. Опции:
- --help (заодно показывает значения переменных по умолчанию)
- --database=имя-БД (-d; обрабатывать записи только для данной БД)
- --disable-log-bin (-D; добавляет в выводимый поток команду отключения
вывода в двоичный журнал и включения обратно в конце)
- --force-read (-f; игнорировать непонятные записи в журнале)
- --host=имя (-h)
- --local-load=имя-каталога (-l; сюда утилита записывает временные файлы и отсюда
они берутся для запросов LOAD DATA INFILE; файлы необходимо удалить потом
вручную; запросы LOAD DATA INFILE преобразуются в LOAD DATA LOCAL INFILE,
так что требуются соответствующие права для клиента и сервера)
- --ofsset=число (-O; пропустить указанное число записей)
- --password[=пароль] (-pпароль)
- --port=порт (-P)
- --protocol=tcp | socket
- --read-from-remote-server (-R)
- --result-file=имя-файла (-r)
- --short-form (-s; не выводить вспомогательную информацию - времена и пр.)
- --socket=имя-файла (-S)
- --start-datetime время (выводить записи, начинающиеся с указанного времени;
локальное время в формате TIMESTAMP или DATETIME - "YYYY-MM-DD HH:MM:SS")
- --stop-datetime время (выводить записи до указанного времени;
локальное время в формате TIMESTAMP или DATETIME - "YYYY-MM-DD HH:MM:SS")
- --start-position=начальная-позиция
- --stop-position=конечная-позиция
- --to-last-log (-t; не останавливаться в конце файла, а брать следующий и т.д.)
- --user=имя (-u)
isamchk
isamlog
perror - толкование сообщений об ошибках
Утилита perror по номеру ошибки выдаёт текст сообщения.
phpMyAdmin позволяет администрировать БД MySQL (создавать, удалять и редактировать
поля, таблицы и базы) с помощью веб-интерфейса используя Apache
и PHP (4.3.0/5.2.5 или новее, желательно наличие GD2 и zlib).
Установка phpMyAdmin 2.6.3-pl1 (2.10.0.2-all-languages, 2.11.4-all-languages,
2.11.5.1-all-languages-utf-8-only) на Apache2 с авторизацией по SSL:
- загрузить и развернуть архив
в каталоге документов (возможно, переименовав его)
- создать пользователя phpmy (49) в группе phpmy (49)
- cd имя-каталога-phpMyAdmin
- cp config.sample.inc.php config.inc.php
- chown -R phpmy:apache .
- chmod 660 config.inc.php
- создать пользователя pma в MySQL
GRANT SELECT, INSERT, DELETE, UPDATE ON `phpmyadmin`.* TO 'pma'@localhost IDENTIFIED BY 'пароль';
GRANT SELECT, INSERT, DELETE, UPDATE ON `phpmyadmin`.* TO 'pma' IDENTIFIED BY 'пароль' REQUIRE SSL;
- удалить ~/.mysql_history
- выполнить скрипт scripts/create_tables_mysql_4_1_2+.sql с правами администратора MySQL
- отредактировать config.inc.php
- PmaAbsoluteUri = абсолютный-URL-к-phpMyAdmin (автоопределение не всегда срабатывает)
- auth_type = http (?)
- controluser = pma
- controlpass = пароль
- pmadb = phpmyadmin
- bookmarktable = pma_bookmark и прочие
-
- зайти на https://имя-сервера/каталог-phpMyAdmin/index.php, выбрать свой сертификат
для передачи, ввести имя и пароль в смысле MySQL
Так как каждая таблица представляет собой отдельный файл,
то резервирование данных легко осуществляется обычным копированием файлов.
Однако предварительно необходимо либо остановить сервер, либо заблокировать
запись в таблицу (LOCK TABLES) и сбросить индексы (FLUSH TABLES) перед
копированием (и не забыть разблокировать таблицу (UNLOCK TABLES) после
копирования).
Резервирование на уровне SQL запросов можно сделать
с помощью SELECT INTO или BACKUP TABLE.
Полное копирование каждой базы можно осуществить с помощью утилиты
mysqldump (получается файл в формате команд SQL, которые можно пропустить через mysql
непосредственно или предварительно обработав) или perl-скрипта mysqlhotcopy
(только MyISAM).
Обновления относительно последнего mysqldump можно
получить запустив сервер с записью двоичного журнала (--log-bin; FLUSH LOGS
начинает новый журнал в серии).
Ещё есть возможность оперативного дублирования БД
(репликация) на вспомогательный сервер (slave).
|
Bog BOS: MySQL: установка, настройка, описание
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru