Плагин MySQL

Мониторинг серверов баз данных MySQL и MariaDB с подробными метриками, отслеживающими запросы, соединения, репликацию, движок хранения InnoDB и многое другое.

Обзор

Плагин MySQL собирает детальные метрики с серверов MySQL/MariaDB, включая:

  • Статистика соединений - Активные соединения, попытки подключения, прерванные соединения
  • Производительность запросов - Запросы в секунду, медленные запросы, производительность кэша запросов
  • Блокировки таблиц - Немедленные и ожидающие блокировки таблиц
  • Метрики InnoDB - Буферный пул, операции со строками, запись в лог, deadlock'и
  • Репликация - Статус master/slave, лаг репликации, позиция relay log
  • Потоки - Выполняющиеся потоки, подключённые потоки, кэшированные потоки
  • Временные объекты - Временные таблицы, временные файлы на диске

Требования

Версия MySQL/MariaDB

  • MySQL: 5.7 или новее
  • MariaDB: 10.3 или новее
  • Протестировано с: MySQL 5.7, 8.0, 8.1; MariaDB 10.3, 10.5, 10.6, 10.11

Зависимости Python

pip install pymysql>=1.0.0

Устанавливается автоматически при использовании PLUGINS=mysql во время установки агента.

Сетевой доступ

Агент должен иметь возможность подключиться к MySQL:

# Test connectivity
mysql -h localhost -u monitor -p -e "SELECT 1"

Конфигурация

Базовая конфигурация

plugins:
  mysql:
    enabled: true
    host: localhost
    port: 3306
    user: monitor
    password: 'monitoring-password'

С выбором базы данных

plugins:
  mysql:
    enabled: true
    host: localhost
    port: 3306
    user: monitor
    password: 'monitoring-password'
    database: 'information_schema'  # Optional test database

Удалённый сервер MySQL

plugins:
  mysql:
    enabled: true
    host: mysql-server.example.com
    port: 3306
    user: monitor
    password: 'secure-password'

С SSL/TLS

plugins:
  mysql:
    enabled: true
    host: mysql.example.com
    port: 3306
    user: monitor
    password: 'secure-password'
    ssl: true
    ssl_ca: '/path/to/ca-cert.pem'       # Optional
    ssl_cert: '/path/to/client-cert.pem' # Optional
    ssl_key: '/path/to/client-key.pem'   # Optional

Все параметры конфигурации

plugins:
  mysql:
    enabled: true              # Enable/disable plugin
    host: localhost            # MySQL hostname or IP
    port: 3306                 # MySQL port (default: 3306)
    user: monitor              # MySQL username
    password: ''               # MySQL password
    database: ''               # Database to connect to (optional)
    charset: utf8mb4           # Connection charset (default: utf8mb4)
    connect_timeout: 10        # Connection timeout in seconds
    ssl: false                 # Use SSL/TLS (default: false)
    ssl_ca: ''                 # Path to CA certificate file
    ssl_cert: ''               # Path to client certificate file
    ssl_key: ''                # Path to client key file

Переменные окружения

Конфигурацию можно переопределить переменными окружения:

export MYSQL_HOST="localhost"
export MYSQL_PORT="3306"
export MYSQL_USER="monitor"
export MYSQL_PASSWORD="secret"
export MYSQL_DATABASE=""

Настройка MySQL

Создание пользователя мониторинга

Для MySQL 5.7 и MariaDB:

CREATE USER 'monitor'@'localhost' IDENTIFIED BY 'your-secure-password';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';
FLUSH PRIVILEGES;

Для MySQL 8.0+:

CREATE USER 'monitor'@'localhost' IDENTIFIED BY 'your-secure-password';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';
FLUSH PRIVILEGES;

Для удалённого мониторинга:

CREATE USER 'monitor'@'%' IDENTIFIED BY 'your-secure-password';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'%';
FLUSH PRIVILEGES;

Необходимые привилегии

Минимально необходимые:

  • PROCESS - Просмотр всех потоков и процессов
  • REPLICATION CLIENT - Просмотр статуса репликации

Почему именно эти привилегии?

  • PROCESS разрешает SHOW FULL PROCESSLIST и SHOW ENGINE INNODB STATUS
  • REPLICATION CLIENT разрешает SHOW MASTER STATUS и SHOW SLAVE STATUS

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

Проверка прав пользователя

SHOW GRANTS FOR 'monitor'@'localhost';

Ожидаемый вывод:

+----------------------------------------------------------------+
| Grants for monitor@localhost                                   |
+----------------------------------------------------------------+
| GRANT PROCESS, REPLICATION CLIENT ON *.* TO `monitor`@`localhost` |
+----------------------------------------------------------------+

Собираемые метрики

Метрики соединений

Метрика Описание Единица Тип
threads_connected Текущее число подключённых потоков Количество Gauge
threads_running Текущее число выполняющихся потоков Количество Gauge
max_used_connections Пиковое число одновременных соединений Количество Gauge
max_connections Максимально допустимое число соединений Количество Gauge
aborted_connections Неудачные попытки подключения Количество Counter
connection_errors_max_connections Соединения, отклонённые из-за лимита Количество Counter
connection_percent Процент использования соединений Проценты Gauge

Мониторинг:

  • threads_connected приближается к max_connections = нужно увеличить лимит
  • Высокое aborted_connections = проблемы с аутентификацией или наплыв соединений
  • Скачок threads_running = узкое место по запросам

Метрики запросов

Метрика Описание Единица Тип
questions_total Всего выполненных операторов Количество Counter
queries_total Всего запросов (включая хранимые процедуры) Количество Counter
slow_queries_total Запросы, превышающие long_query_time Количество Counter
com_select Операторы SELECT Количество Counter
com_insert Операторы INSERT Количество Counter
com_update Операторы UPDATE Количество Counter
com_delete Операторы DELETE Количество Counter

Расчёт запросов в секунду:

qps = (questions_total_now - questions_total_before) / time_elapsed

Метрики блокировок таблиц

Метрика Описание Единица Тип
table_locks_immediate Немедленно предоставленные блокировки таблиц Количество Counter
table_locks_waited Блокировки таблиц, которым пришлось ждать Количество Counter

Коэффициент конкуренции за блокировки:

lock_contention = table_locks_waited / (table_locks_immediate + table_locks_waited)

Здоровое значение: < 0.01 (1%)

Буферный пул InnoDB

Метрика Описание Единица Тип
innodb_buffer_pool_pages_total Всего страниц буферного пула Страницы Gauge
innodb_buffer_pool_pages_data Страницы, содержащие данные Страницы Gauge
innodb_buffer_pool_pages_free Свободные страницы Страницы Gauge
innodb_buffer_pool_read_requests Логические запросы на чтение Количество Counter
innodb_buffer_pool_reads Чтения с диска Количество Counter
innodb_buffer_pool_hit_rate Hit rate кэша буферного пула Проценты Gauge
innodb_buffer_pool_usage_percent Процент использования буферного пула Проценты Gauge

Hit rate буферного пула:

hit_rate = ((read_requests - reads) / read_requests) * 100

Здоровое значение: > 99%

Операции со строками InnoDB

Метрика Описание Единица Тип
innodb_rows_read Прочитано строк Количество Counter
innodb_rows_inserted Вставлено строк Количество Counter
innodb_rows_updated Обновлено строк Количество Counter
innodb_rows_deleted Удалено строк Количество Counter

Блокировки InnoDB

Метрика Описание Единица Тип
innodb_row_lock_waits Количество ожиданий блокировки строк Количество Counter
innodb_row_lock_time Общее время ожидания блокировки строк Миллисекунды Counter

Среднее время ожидания блокировки:

avg_wait = innodb_row_lock_time / innodb_row_lock_waits

Метрики репликации (только slave)

Метрика Описание Единица Тип
replication_running Потоки SQL/IO slave запущены (1=да, 0=нет) Boolean Gauge
replication_lag_seconds Лаг репликации (-1 если NULL) Секунды Gauge

Здоровье репликации:

  • replication_running должно быть 1 (оба потока — IO и SQL — запущены)
  • replication_lag_seconds должно быть < 10 секунд

Временные объекты

Метрика Описание Единица Тип
created_tmp_tables Создано временных таблиц Количество Counter
created_tmp_disk_tables Создано временных таблиц на диске Количество Counter
tmp_disk_table_ratio Процент временных таблиц на диске Проценты Gauge

Доля дисковых временных таблиц:

tmp_disk_table_ratio = (created_tmp_disk_tables / created_tmp_tables) * 100

Высокая доля (> 25%) = увеличьте tmp_table_size и max_heap_table_size

Конфигурация памяти

Метрика Описание Единица Тип
innodb_buffer_pool_size_mb Размер буферного пула InnoDB MB Gauge
key_buffer_size_mb Размер кэша ключей MyISAM MB Gauge

Системные метрики

Метрика Описание Единица Тип
uptime_seconds Время работы сервера MySQL Секунды Gauge
bytes_sent Всего байт, отправленных клиентам Байты Counter
bytes_received Всего байт, полученных от клиентов Байты Counter

Кэш запросов (только MySQL 5.7 и более ранние версии)

Метрика Описание Единица Тип
query_cache_size_mb Размер кэша запросов MB Gauge
qcache_hits Попадания в кэш запросов Количество Counter
qcache_inserts Вставки в кэш запросов Количество Counter

Примечание: Кэш запросов был удалён в MySQL 8.0. Эти метрики появляются только на серверах MySQL 5.7 и MariaDB.

Метрики дашборда

Дашборд StatusRadar отображает:

Карточка обзора

  • Status - Сервер MySQL работает/не работает
  • Version - Версия MySQL/MariaDB
  • Uptime - Время работы сервера
  • QPS - Запросы в секунду

График соединений

  • Подключённые потоки
  • Выполняющиеся потоки
  • Попытки подключения
  • Прерванные соединения

График производительности запросов

  • Запросы в секунду
  • Разбивка SELECT/INSERT/UPDATE/DELETE
  • Медленные запросы

График буферного пула InnoDB

  • Размер буферного пула (страницы)
  • Страницы данных
  • Грязные страницы
  • Hit rate буферного пула

График операций InnoDB

  • Прочитано/вставлено/обновлено/удалено строк в секунду

Статус репликации (если slave)

  • Лаг репликации (секунды)
  • Статус IO-потока
  • Статус SQL-потока

Блокировки таблиц

  • Немедленные блокировки
  • Ожидающие блокировки
  • Коэффициент конкуренции за блокировки

Установка

Быстрая установка

PLUGINS='mysql' \
MYSQL_USER='monitor' \
MYSQL_PASSWORD='your-password' \
TOKEN='your-agent-token' \
bash -c "$(curl -sL https://statusradar.dev/install-agent.sh)"

Установка на существующий агент

  1. Создайте пользователя MySQL:

    CREATE USER 'monitor'@'localhost' IDENTIFIED BY 'secure-password';
    GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';
    FLUSH PRIVILEGES;
  2. Установите зависимость Python:

    cd /opt/statusradar
    source venv/bin/activate  # If using venv
    pip install pymysql
  3. Включите плагин в конфигурации:

    sudo nano /opt/statusradar/config/agent.yaml

    Добавьте:

    plugins:
      mysql:
        enabled: true
        host: localhost
        port: 3306
        user: monitor
        password: 'secure-password'
  4. Перезапустите агент:

    sudo systemctl restart statusradar-agent
  5. Проверьте:

    sudo journalctl -u statusradar-agent -n 50 --no-pager | grep mysql

    Ожидаемо:

    INFO: Plugin mysql: Metrics collected successfully

Тестирование

Ручной тест плагина

cd /opt/statusradar
python3 plugins/mysql_plugin.py

Ожидаемый вывод:

Plugin: mysql
Enabled: True
Available: True

Collecting metrics...
{
  "threads_connected": 15,
  "threads_running": 2,
  "threads_cached": 8,
  "connections": 1250,
  "questions": 45000,
  "slow_queries": 5,
  "innodb_buffer_pool_pages_total": 8192,
  "innodb_buffer_pool_pages_data": 7500,
  "innodb_buffer_pool_read_requests": 1000000,
  "innodb_buffer_pool_reads": 1000,
  "innodb_rows_read": 500000,
  "innodb_rows_inserted": 10000,
  "slave_running": 0,
  ...
}

Тест подключения к MySQL

# Basic connection test
mysql -h localhost -u monitor -p -e "SELECT 1"

# Test with password from command line
mysql -h localhost -u monitor -p'your-password' -e "SELECT 1"

# Remote server
mysql -h mysql.example.com -u monitor -p'password' -e "SELECT 1"

# Check permissions
mysql -h localhost -u monitor -p'password' -e "SHOW GRANTS"

Тест команд статуса

# Test SHOW STATUS
mysql -h localhost -u monitor -p'password' -e "SHOW GLOBAL STATUS LIKE 'Threads_connected'"

# Test SHOW VARIABLES
mysql -h localhost -u monitor -p'password' -e "SHOW GLOBAL VARIABLES LIKE 'max_connections'"

# Test replication status (slave only)
mysql -h localhost -u monitor -p'password' -e "SHOW SLAVE STATUS\G"

Устранение неполадок

Плагин не собирает метрики

Проверка 1: Запущен ли MySQL?

sudo systemctl status mysql
# or
sudo systemctl status mariadb

Проверка 2: Может ли агент подключиться?

mysql -h localhost -u monitor -p'password' -e "SELECT 1"

Проверка 3: Верны ли учётные данные?

# Check config
cat /opt/statusradar/config/agent.yaml | grep -A8 mysql

Проверка 4: Установлен ли Python-пакет?

python3 -c "import pymysql; print(pymysql.__version__)"

Проверка 5: Проверьте логи агента

sudo journalctl -u statusradar-agent -n 100 --no-pager | grep mysql

Распространённые ошибки

"Access denied for user"

Ошибка:

ERROR: Plugin mysql: (1045, "Access denied for user 'monitor'@'localhost' (using password: YES)")

Причины:

  1. Неверный пароль в конфигурации
  2. Пользователь не существует
  3. У пользователя нет доступа с хоста агента

Решение:

-- Check if user exists
SELECT User, Host FROM mysql.user WHERE User = 'monitor';

-- Check user permissions
SHOW GRANTS FOR 'monitor'@'localhost';

-- Recreate user if needed
DROP USER 'monitor'@'localhost';
CREATE USER 'monitor'@'localhost' IDENTIFIED BY 'new-secure-password';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';
FLUSH PRIVILEGES;

Обновите конфигурацию агента правильным паролем и перезапустите.

"Can't connect to MySQL server"

Ошибка:

ERROR: Plugin mysql: (2003, "Can't connect to MySQL server on 'localhost' (111)")

Причины:

  1. MySQL не запущен
  2. Неверный host/port
  3. Файрвол блокирует соединение
  4. MySQL не слушает на ожидаемом интерфейсе

Решение:

# Check if MySQL is running
sudo systemctl status mysql

# Check MySQL port
sudo netstat -tlnp | grep 3306

# Check MySQL bind address
mysql -e "SHOW VARIABLES LIKE 'bind_address'"

# If bind_address is 127.0.0.1, can only connect from localhost
# To allow remote connections, edit /etc/mysql/my.cnf:
# bind-address = 0.0.0.0

"No module named 'pymysql'"

Ошибка:

ERROR: No module named 'pymysql'

Решение:

pip install pymysql
# Or if using venv:
cd /opt/statusradar && source venv/bin/activate && pip install pymysql

"Command denied to user"

Ошибка:

ERROR: (1227, 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation')

Причина: Отсутствует привилегия PROCESS или REPLICATION CLIENT

Решение:

GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';
FLUSH PRIVILEGES;

Метрики показывают ноль

Симптом: Некоторые метрики всегда показывают 0

Проверьте переменные статуса:

mysql -u monitor -p -e "SHOW GLOBAL STATUS"

Распространённые причины:

  • slow_queries = 0 - Нет медленных запросов (это хорошо!)
  • innodb_deadlocks = 0 - Нет deadlock'ов (это хорошо!)
  • seconds_behind_master = NULL - Сервер не является slave
  • aborted_connects = 0 - Нет неудачных соединений (это хорошо!)

Влияние на производительность

На MySQL

Незначительное влияние:

  • Плагин выполняет SHOW GLOBAL STATUS и SHOW SLAVE STATUS один раз за интервал сбора
  • Это легковесные запросы только для чтения (время выполнения < 10 мс)
  • Без сканирования таблиц, без блокировок, без изменения данных
  • Использует внутренние счётчики статистики MySQL

Бенчмарк:

  • QPS MySQL с мониторингом: 10,000+ queries/sec
  • QPS MySQL без мониторинга: 10,000+ queries/sec
  • Накладные расходы: < 0.01%

На агент

Использование ресурсов:

  • Память: +15 MB
  • CPU: +3% во время сбора (0.2-0.5 секунды)
  • Сеть: +2 KB за сбор

Сценарии использования

1. Мониторинг производительности запросов

Отслеживайте:

  • Запросы в секунду
  • Медленные запросы
  • Соотношение SELECT и INSERT/UPDATE/DELETE

Настройте оповещения на:

  • Падение QPS (проблема приложения)
  • Скачок медленных запросов
  • Внезапное изменение типов запросов

2. Мониторинг пула соединений

Отслеживайте:

  • Подключённые потоки
  • Выполняющиеся потоки
  • Прерванные соединения
  • Максимально использованные соединения

Настройте оповещения на:

  • Соединения приближаются к max_connections
  • Высокое aborted_connects (> 5%)
  • Множество простаивающих соединений

3. Тюнинг буферного пула InnoDB

Отслеживайте:

  • Hit rate буферного пула
  • Процент грязных страниц
  • Свободные страницы

Настройте оповещения на:

  • Hit rate < 99%
  • Свободные страницы = 0 (буферный пул слишком мал)
  • Грязные страницы > 75% (проблемы с контрольными точками)

4. Мониторинг лага репликации

Отслеживайте:

  • seconds_behind_master
  • Статус IO/SQL-потоков slave
  • Позицию relay log

Настройте оповещения на:

  • Лаг > 30 секунд
  • Потоки slave остановлены
  • Ошибки репликации

5. Анализ конкуренции за блокировки

Отслеживайте:

  • Ожидающие блокировки таблиц
  • Ожидания блокировки строк InnoDB
  • Deadlock'и

Настройте оповещения на:

  • Конкуренция за блокировки > 5%
  • Скачок deadlock'ов
  • Среднее ожидание блокировки > 100 мс

Лучшие практики

1. Используйте выделенного пользователя мониторинга

Нельзя:

-- Don't use root or application user
user: root
password: root_password

Нужно:

-- Create dedicated read-only user
CREATE USER 'monitor'@'localhost' IDENTIFIED BY 'secure-random-password';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';

2. Установите надёжный пароль

# Generate strong password
openssl rand -base64 32

Используйте в конфигурации:

plugins:
  mysql:
    password: 'Y8jK9mN4pQ3rS2tU7vW1xZ5aB6cD0eF=='

3. Следите за ключевыми метриками InnoDB

Важнейшие метрики для наблюдения:

  • Hit rate буферного пула (должен быть > 99%)
  • Грязные страницы (должны быть < 75%)
  • Ожидания блокировки строк (должны быть минимальны)
  • Deadlock'и (разбирайтесь, если > 0)

4. Настройте подходящие оповещения

Оповещения по соединениям:

threads_connected > max_connections * 0.8
aborted_connects > 100/hour

Оповещения по производительности:

slow_queries > 10/minute
innodb_buffer_pool_hit_rate < 0.99
seconds_behind_master > 30 (slaves only)

5. Регулярное обслуживание

Еженедельно:

  • Просматривайте лог медленных запросов
  • Проверяйте тренды лага репликации
  • Следите за эффективностью буферного пула

Ежемесячно:

  • Оптимизируйте таблицы при фрагментации > 20%
  • Пересматривайте и корректируйте размер буферного пула
  • Проверяйте неиспользуемые индексы

6. Защитите файл конфигурации

chmod 600 /opt/statusradar/config/agent.yaml
chown root:root /opt/statusradar/config/agent.yaml

Расширенная конфигурация

MySQL с подключением через сокет

plugins:
  mysql:
    enabled: true
    unix_socket: '/var/run/mysqld/mysqld.sock'
    user: monitor
    password: 'password'

MySQL с другой кодировкой

plugins:
  mysql:
    enabled: true
    host: localhost
    user: monitor
    password: 'password'
    charset: utf8mb4  # or latin1, utf8, etc.

Несколько экземпляров MySQL

Чтобы мониторить несколько экземпляров MySQL на одном сервере:

Вариант 1: несколько агентов (рекомендуется)

  • Установите отдельный агент для каждого экземпляра
  • Каждый агент мониторит один экземпляр MySQL

Вариант 2: пользовательская конфигурация

  • Сейчас не поддерживается
  • Функция запланирована для будущего релиза

Примеры конфигураций

Сервер разработки

plugins:
  mysql:
    enabled: true
    host: localhost
    port: 3306
    user: monitor
    password: 'dev-password'

Продакшен-master

plugins:
  mysql:
    enabled: true
    host: localhost
    port: 3306
    user: monitor
    password: 'strong-production-password'
    connect_timeout: 10

Продакшен-slave

plugins:
  mysql:
    enabled: true
    host: localhost
    port: 3306
    user: monitor
    password: 'strong-production-password'
    # Plugin automatically detects slave status

Удалённый MySQL (SSL)

plugins:
  mysql:
    enabled: true
    host: mysql-prod.example.com
    port: 3306
    user: monitor
    password: 'secure-password'
    ssl: true
    ssl_ca: '/etc/ssl/certs/mysql-ca.pem'
    connect_timeout: 15

MySQL в Docker

plugins:
  mysql:
    enabled: true
    host: 172.17.0.2  # Docker container IP
    port: 3306
    user: monitor
    password: 'password'

Справочник по метрикам

Полный список метрик

Плагин собирает 30+ метрик из SHOW GLOBAL STATUS и SHOW GLOBAL VARIABLES:

Метрики соединений:

  • threads_connected, threads_running
  • max_used_connections, max_connections
  • aborted_connections, connection_errors_max_connections
  • connection_percent (вычисляется)

Метрики запросов:

  • questions_total, queries_total, slow_queries_total
  • com_select, com_insert, com_update, com_delete

Метрики блокировок таблиц:

  • table_locks_immediate, table_locks_waited

Буферный пул InnoDB:

  • innodb_buffer_pool_pages_total, innodb_buffer_pool_pages_data
  • innodb_buffer_pool_pages_free
  • innodb_buffer_pool_read_requests, innodb_buffer_pool_reads
  • innodb_buffer_pool_hit_rate (вычисляется)
  • innodb_buffer_pool_usage_percent (вычисляется)

Операции со строками InnoDB:

  • innodb_rows_read, innodb_rows_inserted
  • innodb_rows_updated, innodb_rows_deleted

Блокировки InnoDB:

  • innodb_row_lock_waits, innodb_row_lock_time

Репликация (только slave):

  • replication_running, replication_lag_seconds

Временные объекты:

  • created_tmp_tables, created_tmp_disk_tables
  • tmp_disk_table_ratio (вычисляется)

Конфигурация памяти:

  • innodb_buffer_pool_size_mb, key_buffer_size_mb

Система:

  • uptime_seconds, bytes_sent, bytes_received

Кэш запросов (только MySQL 5.7):

  • query_cache_size_mb, qcache_hits, qcache_inserts

Дальнейшие шаги

On this page