Перейти к содержанию

MySQL проблемы

MySQL (vpn-db на 10.99.87.62) — основная база данных. Проблемы с MySQL напрямую влияют на backend API, выдачу конфигов и синхронизацию серверов.


Симптомы

  • Backend логи: Too many connections / HikariPool connection timeout
  • Admin Panel: медленная загрузка или 502 на страницах с данными
  • VPN Config Service: mysql_sync завершается с ошибкой
  • Grafana алерт: MySQL Slow Queries / MySQL Connections High

Подключение к MySQL

# Через VPN Config Service (прокси через ssh-internal.sh)
./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden  Databases)' vpn"

Или одиночный запрос:

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden  Databases)' vpn -e 'QUERY'"

Диагностика

1. Проверить число соединений

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'SHOW STATUS LIKE \"Threads_connected\"; SHOW VARIABLES LIKE \"max_connections\";'"

Если Threads_connected близко к max_connections — исчерпание пула.

2. SHOW PROCESSLIST — что держит соединения

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'SHOW FULL PROCESSLIST;'"

Смотреть: - Команды в состоянии Sleep с большим Time — висячие соединения (норма если их мало) - Команды Query с большим Time — медленные запросы, возможно с блокировкой - Locked — ожидание lock

3. Lock wait timeout

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started LIMIT 10;'"

Если есть транзакции со старым trx_started — они могут блокировать другие запросы.

4. Slow queries

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'SHOW STATUS LIKE \"Slow_queries\"; SHOW STATUS LIKE \"Questions\";'"

5. Дисковое место

./scripts/ssh-internal.sh 10.99.87.62 "df -h /var/lib/docker"

MySQL падает при нехватке места — смотреть, что там занимает место:

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db du -sh /var/lib/mysql/* | sort -h | tail -10"

6. Статус InnoDB

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'SHOW ENGINE INNODB STATUS\G' | grep -A 30 'LATEST DETECTED DEADLOCK'"

Причины и решения

Connection exhaustion (Too many connections)

Причина: Backend увеличил batch-size или concurrency, превысив HikariCP pool × соединений.

Решение — временное увеличение лимита:

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'SET GLOBAL max_connections = 500;'"

Убить висячие Sleep-соединения:

./scripts/ssh-internal.sh 10.99.87.62 "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
  -e \"SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist \
        WHERE command = 'Sleep' AND time > 300;\" \
  | tail -n +2 | docker exec -i vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)'"

Перезапустить backend (сбросит пул HikariCP):

./scripts/ssh-internal.sh 10.99.87.249 \
  "docker restart vpn-back-blue && sleep 5 && \
   curl -s http://localhost:8080/actuator/health"

Lock wait timeout

Причина: Длинная транзакция удерживает row lock, другие запросы ждут.

# Найти и убить блокирующую транзакцию:
./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'SELECT trx_id, trx_mysql_thread_id, trx_started, trx_state \
       FROM information_schema.INNODB_TRX ORDER BY trx_started LIMIT 5;'"

# Убить блокирующий поток (THREAD_ID из processlist):
./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'KILL THREAD_ID;'"

Slow queries

Найти тяжёлые запросы через performance_schema:

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e 'SELECT digest_text, count_star, avg_timer_wait/1e12 as avg_sec \
       FROM performance_schema.events_statements_summary_by_digest \
       ORDER BY avg_timer_wait DESC LIMIT 10;'"

Дисковое место критично

Очистить бинарные логи:

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden  Databases  root)' \
   -e \"PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);\""

Очистить Docker-мусор:

./scripts/ssh-internal.sh 10.99.87.62 "docker system prune -f"

Полезные запросы

Самые крупные таблицы

SELECT table_name,
       ROUND((data_length + index_length) / 1024 / 1024, 1) AS size_mb
FROM information_schema.tables
WHERE table_schema = 'vpn'
ORDER BY (data_length + index_length) DESC
LIMIT 10;

Активные аккаунты и трафик

SELECT COUNT(*) as active_accounts
FROM account
WHERE valid_to > NOW() AND status = 'ACTIVE';

Эскалация

  • P0 (MySQL недоступен, все сервисы упали): немедленно уведомить Nikita (Ops)
  • Резервная копия БД: docs/administration/database-backup-restore.md
  • История инцидентов: monorepo incidents/ (пример: DATABASE-TIMEOUT-EXHAUSTION-2026-02-15)

См. также: Подключение к БД · Runbooks · Бэкап и восстановление · DevOps скрипты