Вопрос или проблема
У меня есть приложение, которое может только добавлять записи в базу данных. Поэтому, когда нам нужно обновить данные в старой заявке, мы удаляем старую запись и создаем новую с новыми данными.
Приложение работало нормально в течение 2 лет, пока несколько месяцев назад не произошло аварийное завершение работы сервера, после чего записи случайным образом начали удаляться из таблицы или автоматически одобряться в их статусах. Эти автоматические одобрения не происходят из приложения, потому что, когда одобрение приходит из приложения, мы фиксируем имя пользователя сессии. У этих автоматически одобренных записей имя пользователя сессии равно null.
Иногда через несколько дней несколько записей исчезает случайным образом. Например, запрос на одобрение 7 позиций успешно одобряется, а через месяц 3 позиции исчезают.
В основном я работал с SQL Server и BigQuery, и это мой первый опыт с MySQL. Мне действительно нужны какие-то рекомендации о том, с чего начать искать логи и т.д.
Итог: сервер базы данных находится в Gcloud внутри контейнера Kubernetes, если эта информация имеет значение.
Ответ или решение
Ваша ситуация с базой данных MySQL требует внимательного анализа, поскольку проблема возникает после сбоя сервера и связана с исчезновением записей и автоматическим одобрением статусов. Вот полное руководство по диагностике и решению данной проблемы.
Шаг 1: Анализ журнала транзакций и журналы MySQL
Первым делом вам необходимо проверить журналы MySQL. Это поможет вам понять, что именно происходило во время сбоев и после них:
-
Журнал ошибок MySQL: В этом журнале вы можете найти записи об ошибках, сбоях и предупреждениях. Путь к журналу определяется в конфигурационном файле
my.cnf
. По умолчанию он может находиться в/var/log/mysql/error.log
или аналогичном месте. -
Журнал запросов: Если у вас включен бинарный журнал (binary log), вы сможете увидеть все изменения, сделанные в базе данных, включая удаление записей. Это может быть полезно для отслеживания, какие операции выполнялись до исчезновения данных.
-
Журнал аудита: Если вы используете сторонние кошельки, такие как Percona Audit Log Plugin или другие механизмы аудита, проверьте эти журналы. Они могут дать информацию о том, какие запросы были выполнены и кто их запускал.
Шаг 2: Проверка конфигурации Kubernetes и MySQL
Разберитесь в конфигурации вашего окружения Kubernetes:
-
Проверка ограничений ресурсов: Убедитесь, что вашему поду MySQL достаточно ресурсов (CPU, памяти), чтобы он мог корректно работать. Ограничения могут привести к нестабильной работе базы данных.
-
Проверка настроек репликации: Если вы используете репликацию, возможно, проблема связана с неправильной синхронизацией данных между мастер- и слейв-узлами.
-
Настройки восстановления: Убедитесь, что механизмы резервного копирования и восстановления настроены правильно. Если данные были потеряны из-за сбоя, вам может потребоваться восстановление из резервной копии.
Шаг 3: Изучение логики приложения
Поскольку ваша система создает новые записи при удалении старых, потребуется произвести анализ кода приложения:
-
Проверка логики удаления: Убедитесь, что процесс удаления записей не включает неожиданные условия, которые могли бы удалить больше данных, чем вы предполагаете.
-
Следите за сохранением данных: Проверьте, правильно ли данные сохраняются при создании новых записей. Возможно, неправильно прописана логика при создании, что приводит к удалению или потере данных.
-
Логирование операций: Включите логирование всех ключевых операций с базой данных (вставки, удаления), чтобы лучше понять, что происходит при каждом запуске приложения.
Шаг 4: Методы обнаружения проблем
-
Использование триггеров: Вы можете создать триггеры в MySQL для отслеживания операций удаления. Это позволяет регистрировать информацию о том, какие записи были удалены и кем это было сделано.
-
Мониторинг активности: Разработайте и внедрите систему мониторинга для трекинга активности в базе данных. Инструменты, такие как Prometheus или Grafana, могут помочь в визуализации и обнаружении аномалий.
Шаг 5: Предотвращение будущих проблем
-
Бэкапы: Настройте регулярные резервные копии базы данных. Это позволит быстро восстановить данные в случае их потери.
-
Процессы и политики безопасности: Убедитесь, что у вашего приложения только необходимые права доступа для работы с базой данных, чтобы избежать случайных или злонамеренных действий.
Заключение
Следование приведенным выше рекомендациям поможет вам глубже понять проблемы, возникающие с вашей базой данных MySQL, и предпринять необходимые шаги для их устранения. Начните с анализа журналов и конфигураций, а затем переходите к проверке логики приложения. Если проблема продолжит возникать, возможно, имеет смысл обратиться к специалистам по поддержке MySQL или к YOUR CLOUD SERVICE PROVIDER для получения более детальной помощи.