3.08. Справочник по MySQL
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Справочник по MySQL
1. Архитектурные элементы
1.1. Основные компоненты MySQL
- mysqld — основной серверный процесс, управляющий базами данных, соединениями, транзакциями и выполнением запросов.
- mysql — клиентская программа командной строки для взаимодействия с сервером.
- mysqladmin — утилита администрирования (остановка, перезагрузка, проверка состояния).
- mysqldump — инструмент логического резервного копирования.
- mysqlcheck — утилита проверки и восстановления таблиц.
- mysql_upgrade — скрипт обновления системных таблиц после обновления версии сервера.
- mysql_config_editor — средство безопасного хранения учетных данных в файле
.mylogin.cnf.
1.2. Структура хранения
- Data Dictionary — централизованный словарь метаданных, начиная с MySQL 8.0, реализованный как InnoDB-таблицы в схеме
mysql. - System Tablespace — файл
ibdata1, содержащий системные таблицы, откатные сегменты и данные общих таблиц. - Undo Tablespaces — отдельные файлы для хранения undo-логов (настраивается через
innodb_undo_directory). - Redo Log — журнал предзаписи (
ib_logfile0,ib_logfile1), используется для восстановления после сбоя. - Binary Log — журнал всех изменений данных и структур, необходимый для репликации и PITR (Point-in-Time Recovery).
- General Query Log — лог всех подключений и запросов (включается через
general_log). - Slow Query Log — лог медленных запросов (включается через
slow_query_log). - Error Log — основной лог ошибок сервера.
2. Типы данных
2.1. Числовые типы
- Целочисленные:
TINYINT— 1 байт, диапазон от -128 до 127 (или 0–255 беззнаковый).SMALLINT— 2 байта, диапазон от -32768 до 32767.MEDIUMINT— 3 байта, диапазон от -8388608 до 8388607.INTилиINTEGER— 4 байта, диапазон от -2147483648 до 2147483647.BIGINT— 8 байт, диапазон от -9223372036854775808 до 9223372036854775807.
- С плавающей точкой:
FLOAT(M,D)— одинарная точность, 4 байта.DOUBLE(M,D)— двойная точность, 8 байт.REAL— синонимDOUBLEпри включённомREAL_AS_FLOAT.
- Фиксированная точность:
DECIMAL(M,D)илиNUMERIC(M,D)— хранимое значение с точным количеством цифр, до 65 цифр в целой части.
2.2. Строковые типы
- Фиксированной длины:
CHAR(M)— строка фиксированной длины до 255 символов.
- Переменной длины:
VARCHAR(M)— строка переменной длины до 65535 байт.
- Большие объекты:
TINYTEXT— до 255 байт.TEXT— до 65535 байт.MEDIUMTEXT— до 16 МБ.LONGTEXT— до 4 ГБ.
- Бинарные:
BINARY(M)— бинарная строка фиксированной длины.VARBINARY(M)— бинарная строка переменной длины.TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB— бинарные аналоги TEXT-типов.
2.3. Типы даты и времени
DATE— дата в форматеYYYY-MM-DD, диапазон от '1000-01-01' до '9999-12-31'.TIME— время в форматеHH:MM:SS[.fraction], диапазон от '-838:59:59' до '838:59:59'.DATETIME— дата и время, диапазон от '1000-01-01 00:00:00' до '9999-12-31 23:59:59'.TIMESTAMP— дата и время с автоматическим преобразованием в UTC, диапазон от '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' UTC.YEAR— год в форматеYYYY, диапазон от 1901 до 2155.
2.4. Специальные типы
ENUM('value1', 'value2', ...)— строка, принимающая одно из заданных значений.SET('value1', 'value2', ...)— строка, содержащая любую комбинацию заданных значений.JSON— тип для хранения и обработки JSON-документов (начиная с MySQL 5.7).
3. Функции
3.1. Строковые функции
CONCAT(str1, str2, ...)— объединение строк.SUBSTRING(str, pos, len)— извлечение подстроки.LENGTH(str)— длина строки в байтах.CHAR_LENGTH(str)— длина строки в символах.UPPER(str),LOWER(str)— преобразование регистра.TRIM([LEADING|TRAILING|BOTH] [remstr] FROM str)— удаление пробелов или указанной строки.REPLACE(str, from_str, to_str)— замена подстроки.REGEXP_REPLACE(str, pattern, replacement)— замена по регулярному выражению.JSON_EXTRACT(json_doc, path)— извлечение значения из JSON.JSON_SET(json_doc, path, val[, path, val]...)— установка значения в JSON.
3.2. Числовые функции
ABS(X)— модуль числа.CEIL(X),FLOOR(X)— округление вверх и вниз.ROUND(X, D)— округление до D знаков.RAND([N])— генерация случайного числа.POWER(X, Y)— возведение в степень.SQRT(X)— квадратный корень.MOD(N, M)— остаток от деления.
3.3. Функции даты и времени
NOW()— текущие дата и время.CURDATE(),CURTIME()— текущая дата и время соответственно.DATE_ADD(date, INTERVAL expr unit)— добавление интервала.DATEDIFF(date1, date2)— разница в днях.TIMESTAMPDIFF(unit, datetime1, datetime2)— разница в указанных единицах.UNIX_TIMESTAMP([date])— преобразование даты в Unix-время.FROM_UNIXTIME(unix_timestamp)— обратное преобразование.
3.4. Агрегатные функции
COUNT(expr)— количество строк.SUM(expr)— сумма значений.AVG(expr)— среднее значение.MIN(expr),MAX(expr)— минимальное и максимальное значение.GROUP_CONCAT(expr ORDER BY ... SEPARATOR sep)— конкатенация значений в группе.
3.5. Условные функции
IF(condition, true_val, false_val)— условное выражение.CASE WHEN cond1 THEN res1 [WHEN cond2 THEN res2 ...] [ELSE resN] END— многоусловное ветвление.NULLIF(expr1, expr2)— возвращает NULL, если значения равны.COALESCE(val1, val2, ...)— возвращает первый ненулевой аргумент.
3.6. Функции безопасности и информации
USER(),CURRENT_USER()— информация о текущем пользователе.DATABASE()— текущая база данных.VERSION()— версия сервера.SESSION_USER(),SYSTEM_USER()— псевдонимы дляUSER().
4. Системные переменные
Системные переменные делятся на глобальные (влияют на весь сервер) и сессионные (влияют только на текущее соединение). Изменяются через SET GLOBAL или SET SESSION.
4.1. Основные переменные
autocommit— автоматическое завершение каждой команды как отдельной транзакции.sql_mode— режим совместимости и строгости SQL (например,STRICT_TRANS_TABLES,NO_ZERO_DATE).default_storage_engine— движок таблиц по умолчанию (обычноInnoDB).character_set_server— кодировка по умолчанию для сервера.collation_server— правило сортировки по умолчанию.max_connections— максимальное число одновременных подключений.wait_timeout— время ожидания неактивного соединения до закрытия.interactive_timeout— аналогично для интерактивных сессий.tmp_table_size,max_heap_table_size— ограничения на размер временных таблиц в памяти.sort_buffer_size— буфер для сортировки в рамках сессии.join_buffer_size— буфер для соединений без индексов.read_buffer_size— буфер для последовательного чтения.read_rnd_buffer_size— буфер для чтения в произвольном порядке.
4.2. Переменные InnoDB
innodb_buffer_pool_size— основной кэш данных и индексов (рекомендуется 70–80% ОЗУ).innodb_log_file_size— размер одного файла redo log.innodb_log_files_in_group— количество файлов redo log.innodb_flush_log_at_trx_commit— частота сброса лога на диск (1 — полная безопасность, 2 — компромисс, 0 — максимальная производительность).innodb_file_per_table— каждая таблица хранится в отдельном.ibdфайле.innodb_flush_method— метод записи на диск (O_DIRECT,fsyncи др.).innodb_io_capacity,innodb_io_capacity_max— ограничение IOPS для фоновых операций.
4.3. Переменные репликации
server_id— уникальный идентификатор сервера в репликации.log_bin— включение binary log.binlog_format— формат бинарного лога (STATEMENT,ROW,MIXED).gtid_mode— включение глобальных идентификаторов транзакций.enforce_gtid_consistency— требование совместимости запросов с GTID.relay_log— путь к relay-логам на реплике.read_only— запрет модификации данных на реплике.
5. Конфигурационные параметры (my.cnf / my.ini)
Файл конфигурации MySQL (my.cnf в Linux/macOS, my.ini в Windows) читается при запуске сервера. Он может содержать секции: [mysqld], [mysql], [mysqldump], [client] и другие.
5.1. Основные параметры в секции [mysqld]
Сетевые настройки
port = 3306— порт прослушивания.bind-address = 0.0.0.0— IP-адрес, на котором слушает сервер.0.0.0.0разрешает подключения с любого адреса.socket = /var/run/mysqld/mysqld.sock— путь к Unix-сокету (Linux/macOS).skip-networking— отключает TCP/IP-подключения, разрешая только локальные через сокет.
Безопасность
secure-file-priv = /var/lib/mysql-files/— ограничивает каталог для операцийLOAD DATA INFILEиSELECT ... INTO OUTFILE.local-infile = 0— отключает клиентскую загрузку файлов из локальной машины.require_secure_transport = ON— требует использование SSL/TLS для всех подключений.default_authentication_plugin = caching_sha2_password— плагин аутентификации по умолчанию (начиная с MySQL 8.0).
Память и буферы
key_buffer_size— размер буфера для индексов MyISAM.innodb_buffer_pool_size— основной кэш InnoDB (рекомендуется 70–80% доступной RAM).tmp_table_size,max_heap_table_size— максимальный размер временных таблиц в памяти.table_open_cache— количество открытых дескрипторов таблиц.thread_cache_size— кэш потоков для повторного использования.
Журналирование
log-error = /var/log/mysql/error.log— путь к логу ошибок.general_log = 1— включает общий лог запросов.general_log_file = /var/log/mysql/general.logslow_query_log = 1— включает лог медленных запросов.slow_query_log_file = /var/log/mysql/slow.loglong_query_time = 2— порог времени (в секундах) для попадания в slow log.log_queries_not_using_indexes = 1— записывает в slow log запросы без использования индексов.
Binary Log и репликация
server-id = 1— уникальный ID сервера (обязателен при репликации).log_bin = /var/log/mysql/mysql-bin.log— включает binary log.binlog_format = ROW— формат бинарного лога (STATEMENT,ROW,MIXED).expire_logs_days = 7— автоматическое удаление старых binlog-файлов.max_binlog_size = 100M— максимальный размер одного файла binlog.
InnoDB
innodb_data_home_dir = /var/lib/mysql/innodb_data_file_path = ibdata1:12M:autoextendinnodb_log_group_home_dir = /var/lib/mysql/innodb_log_file_size = 48Minnodb_log_files_in_group = 2innodb_flush_log_at_trx_commit = 1innodb_file_per_table = 1innodb_flush_method = O_DIRECTinnodb_io_capacity = 200innodb_io_capacity_max = 2000
Характеристики поведения
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION— строгий режим SQL.character-set-server = utf8mb4collation-server = utf8mb4_unicode_cidefault-storage-engine = InnoDBexplicit_defaults_for_timestamp = 1— изменяет поведение TIMESTAMP-полей.
6. SQL-операторы
6.1. DDL (Data Definition Language)
CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset] [COLLATE collation];DROP DATABASE [IF EXISTS] db_name;CREATE TABLE tbl_name (col_def, ..., [ENGINE=engine]);ALTER TABLE tbl_name ADD COLUMN col_def;DROP TABLE [IF EXISTS] tbl_name;TRUNCATE TABLE tbl_name;— полная очистка таблицы с сбросом автоинкремента.RENAME TABLE old_name TO new_name;
6.2. DML (Data Manipulation Language)
INSERT INTO tbl (col1, col2) VALUES (val1, val2);UPDATE tbl SET col = val WHERE condition;DELETE FROM tbl WHERE condition;SELECT col1, col2 FROM tbl WHERE condition GROUP BY col HAVING filter ORDER BY col LIMIT n;
6.3. TCL (Transaction Control Language)
START TRANSACTION;COMMIT;ROLLBACK;SAVEPOINT sp_name;ROLLBACK TO SAVEPOINT sp_name;
6.4. DCL (Data Control Language)
CREATE USER 'user'@'host' IDENTIFIED BY 'password';DROP USER 'user'@'host';GRANT priv_type ON db.tbl TO 'user'@'host';REVOKE priv_type ON db.tbl FROM 'user'@'host';FLUSH PRIVILEGES;— перезагрузка привилегий из таблицы.
6.5. Административные команды
SHOW DATABASES;SHOW TABLES;SHOW COLUMNS FROM tbl;SHOW CREATE TABLE tbl;SHOW PROCESSLIST;KILL connection_id;SET GLOBAL variable_name = value;RESET MASTER;— очистка binary log.PURGE BINARY LOGS BEFORE 'datetime';
7. Права и безопасность
7.1. Уровни привилегий
- Глобальный (
*.*) — влияет на все базы и таблицы. - Базы данных (
db.*) — влияет на все объекты в указанной БД. - Таблицы (
db.tbl) — влияет на конкретную таблицу. - Столбцы (
db.tbl (col1, col2)) — влияет на указанные столбцы.
7.2. Основные привилегии
ALL PRIVILEGES— полный доступ.SELECT,INSERT,UPDATE,DELETE— манипуляции с данными.CREATE,DROP,ALTER— управление структурой.INDEX— создание и удаление индексов.REFERENCES— внешние ключи.EXECUTE— выполнение хранимых процедур.USAGE— «нулевая» привилегия (часто используется для установки лимитов).
7.3. Роли (MySQL 8.0+)
CREATE ROLE 'app_reader', 'app_writer';GRANT SELECT ON app_db.* TO 'app_reader';GRANT INSERT, UPDATE ON app_db.* TO 'app_writer';GRANT 'app_reader' TO 'user'@'host';SET DEFAULT ROLE ALL TO 'user'@'host';
7.4. Аудит и логирование действий
- Встроенного аудита нет в Community Edition. Используется Enterprise Audit Plugin или сторонние решения.
- Все действия можно частично отследить через general log и binary log.
8. Администрирование
8.1. Управление пользователями
- Создание:
CREATE USER 'dev'@'%' IDENTIFIED BY 'strong_password'; - Удаление:
DROP USER 'dev'@'%'; - Смена пароля:
ALTER USER 'dev'@'%' IDENTIFIED BY 'new_password'; - Блокировка/разблокировка:
ALTER USER 'dev'@'%' ACCOUNT LOCK;
ALTER USER 'dev'@'%' ACCOUNT UNLOCK;
8.2. Резервное копирование и восстановление
- Логическое резервное копирование:
mysqldump --single-transaction --routines --triggers --events db_name > backup.sql - Восстановление:
mysql db_name < backup.sql - Физическое резервное копирование (InnoDB):
Используетсяmysqlbackup(Enterprise) илиPercona XtraBackup(Community). - Точка во времени (PITR):
Комбинирует полный дамп и применение binary log с помощьюmysqlbinlog.
8.3. Мониторинг
- Информация о состоянии:
SHOW STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS; - Информация о переменных:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; - Активные соединения:
SHOW PROCESSLIST; - Блокировки InnoDB:
SELECT * FROM performance_schema.data_locks;
SELECT * FROM performance_schema.data_lock_waits;
8.4. Обслуживание таблиц
- Анализ:
ANALYZE TABLE tbl_name; - Оптимизация:
OPTIMIZE TABLE tbl_name; -- для InnoDB перестраивает таблицу - Проверка целостности:
CHECK TABLE tbl_name; - Восстановление:
REPAIR TABLE tbl_name; -- только для MyISAM
9. Производительность
9.1. Индексы
- B-Tree — стандартный тип для большинства столбцов.
- Full-Text — для полнотекстового поиска (
MATCH ... AGAINST). - Spatial — для геоданных (MyISAM, InnoDB начиная с 5.7).
- Prefix Index — индекс по первым N символам:
CREATE INDEX idx ON tbl (col(20)); - Composite Index — составной индекс по нескольким столбцам.
- Covering Index — индекс, содержащий все запрашиваемые столбцы.
9.2. EXPLAIN и анализ плана выполнения
EXPLAIN SELECT ...— показывает план запроса.- Ключевые поля:
type:const,eq_ref,ref,range,index,ALL.key: используемый индекс.rows: оценка числа просматриваемых строк.Extra: дополнительная информация (Using index,Using filesort,Using temporary).
9.3. Performance Schema
- Включается через
performance_schema = ONв конфигурации. - Предоставляет данные о:
- Ожиданиях (waits)
- SQL-запросах (
events_statements_history) - Блокировках
- Использовании индексов
- Пример:
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY avg_timer_wait DESC LIMIT 10;
9.4. Query Cache (устарело)
- Удалён в MySQL 8.0. Не используется.
10. Репликация
10.1. Типы репликации
- Асинхронная — мастер не ждёт подтверждения от реплик.
- Полусинхронная — требует подтверждения хотя бы от одной реплики.
- Групповая (Group Replication) — основано на протоколе Paxos, обеспечивает согласованность.
10.2. Настройка основной репликации
На мастере:
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
Создание пользователя:
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_pass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
На реплике:
server-id = 2
relay_log = mysql-relay-bin
read_only = ON
gtid_mode = ON
enforce_gtid_consistency = ON
Запуск репликации:
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='repl_pass',
MASTER_AUTO_POSITION=1;
START SLAVE;
10.3. Мониторинг репликации
SHOW SLAVE STATUS\G— ключевые поля:Slave_IO_Running,Slave_SQL_Running,Seconds_Behind_Master.- Ошибки: проверяются в
Last_IO_Error,Last_SQL_Error.
10.4. Multi-Source Replication
Одна реплика может получать данные от нескольких мастеров (начиная с MySQL 5.7).
11. JSON
11.1. Хранение
- Столбец типа
JSONавтоматически проверяет валидность документа. - Хранится в бинарном формате для быстрого доступа.
11.2. Основные функции
JSON_EXTRACT(col, '$.key')илиcol->'$.key'JSON_SET(col, '$.key', 'value')JSON_INSERT,JSON_REPLACE,JSON_REMOVEJSON_CONTAINS(col, '{"key": "value"}')JSON_KEYS(col)JSON_LENGTH(col)
11.3. Индексирование JSON
- Генерируемые виртуальные столбцы:
ALTER TABLE t ADD COLUMN name VARCHAR(30) AS (json_col->>'$.name');
CREATE INDEX idx_name ON t (name);
12. Оконные функции (MySQL 8.0+)
Оконные функции позволяют выполнять вычисления по группам строк без свёртки.
12.1. Синтаксис
function_name() OVER (
[PARTITION BY expr, ...]
[ORDER BY expr [ASC|DESC], ...]
[frame_clause]
)
12.2. Основные функции
ROW_NUMBER()— нумерация строк.RANK(),DENSE_RANK()— ранжирование с пропусками или без.LEAD(expr, offset),LAG(expr, offset)— доступ к следующей/предыдущей строке.FIRST_VALUE(expr),LAST_VALUE(expr)— первое и последнее значение в окне.NTILE(n)— деление на n групп.- Агрегатные функции:
SUM(),AVG(),MIN(),MAX()— могут использоваться как оконные.
12.3. Пример
SELECT
name,
salary,
AVG(salary) OVER (PARTITION BY dept) AS avg_dept_salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
13. Обратная совместимость
13.1. Изменения в MySQL 8.0
- Удалён Query Cache.
- По умолчанию используется
utf8mb4иutf8mb4_0900_ai_ci. - Аутентификация по умолчанию —
caching_sha2_password. - Словарь данных перенесён в InnoDB.
- Групповые привилегии заменены ролями.
- Поддержка общих табличных выражений (CTE):
WITH recursive_cte AS (...)
SELECT * FROM recursive_cte;
13.2. Миграция с MySQL 5.7
- Проверить совместимость запросов с
sql_mode. - Обновить клиентские драйверы для поддержки нового метода аутентификации.
- Выполнить
mysql_upgradeпосле обновления (в MySQL 8.0 эта команда устарела; обновление происходит автоматически при запуске).
14. Полезные команды и практики
14.1. Быстрый экспорт таблицы в CSV
SELECT * FROM tbl
INTO OUTFILE '/tmp/tbl.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
(Требует разрешения secure-file-priv.)
14.2. Поиск «тяжёлых» запросов
SELECT
query,
exec_count,
avg_timer_wait / 1000000000 AS avg_sec
FROM performance_schema.events_statements_summary_by_digest
WHERE schema_name = 'your_db'
ORDER BY avg_timer_wait DESC
LIMIT 10;
14.3. Восстановление пароля root
- Остановить MySQL.
- Запустить с
--skip-grant-tables. - Подключиться без пароля.
- Выполнить:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; - Перезапустить сервер в обычном режиме.
14.4. Проверка использования индексов
SELECT
table_schema,
table_name,
index_name,
seq_in_index,
column_name
FROM information_schema.statistics
WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema')
ORDER BY table_schema, table_name, index_name, seq_in_index;
15. Распространённые ошибки и решения
| Ошибка | Причина | Решение |
|---|---|---|
ERROR 1045 (28000): Access denied | Неверное имя пользователя, хост или пароль | Проверить user и host в mysql.user; использовать ALTER USER |
ERROR 1205 (HY000): Lock wait timeout exceeded | Долгая транзакция блокирует другие | Увеличить innodb_lock_wait_timeout; найти и завершить блокирующую транзакцию |
ERROR 1114 (HY000): The table is full | Достигнут лимит tmp_table_size или диска | Увеличить tmp_table_size; оптимизировать запрос |
ERROR 1062 (23000): Duplicate entry | Нарушение уникальности | Проверить данные или использовать INSERT IGNORE / ON DUPLICATE KEY UPDATE |
ERROR 2002 (HY000): Can't connect to local MySQL server | Сервер не запущен или сокет недоступен | Проверить статус службы; указать правильный socket |
16. Рекомендации по настройке сервера
16.1. Для разработки
innodb_buffer_pool_size = 128Mmax_connections = 50general_log = 1(временно)sql_mode = ""(для гибкости, но не в продакшене)
16.2. Для продакшена
innodb_buffer_pool_size = 70–80% RAMinnodb_log_file_size = 1–2 ГБinnodb_flush_log_at_trx_commit = 1binlog_format = ROWgtid_mode = ONsql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTIONcharacter_set_server = utf8mb4collation_server = utf8mb4_unicode_cislow_query_log = 1long_query_time = 1
16.3. Безопасность
- Отключить
local-infile. - Использовать
secure-file-priv. - Ограничить пользователей по хосту (
'user'@'app-server'). - Регулярно обновлять MySQL.
- Не использовать учётную запись root для приложений.