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. Дисковое место¶
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-мусор:
Полезные запросы¶
Самые крупные таблицы¶
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;
Активные аккаунты и трафик¶
Эскалация¶
- P0 (MySQL недоступен, все сервисы упали): немедленно уведомить Nikita (Ops)
- Резервная копия БД:
docs/administration/database-backup-restore.md - История инцидентов: monorepo
incidents/(пример: DATABASE-TIMEOUT-EXHAUSTION-2026-02-15)
См. также: Подключение к БД · Runbooks · Бэкап и восстановление · DevOps скрипты