Очистка БД

Очистка БД

от Геннадий Юрич -
Количество ответов: 6

Добрый вечер!

Надеюсь получить помощь специалистов.

Имеется Moodle 3.2.1+ (Build: 20170112) и отсутствует системный администратор 😕, потому приходиться самим решать все вопросы.

С некоторых пор, особенно при большом количестве посетителей (для нас это человек 80), сайт стал жутко тормозить. Если же активных пользователей 2-3 человека, то пользоваться сайтом можно, но с нюансами.

Например, такие действия как "Синхронизация группы" или "Удаление курса" могут запросто уложить сайт на несколько минут (ответ 503).

Есть подозрения на криво настроенный сервер, но также мы (с коллегами) заметили, что размер базы превышает 60 ГБ и попытки как-то повлиять на это ничего не дают.

Самые объемные таблицы:

  • logstore_standard_log
  • grade_grades_history
  • question_attempts
  • question_attempt_steps
Пробовали через cron - то виснет ("белый экран"), то таймаут при выполнении (просто перестаёт выводить информацию), то пишет, что всё окей, но на деле объем не уменьшается и таблицы эти не чистятся (а должны, ибо указано их чистить).
Недавно наткнулся на этот плагин: https://moodle.org/plugins/local_deleteoldquizattempts
но поставить его не могу, ибо опять видимый таймаут или 503 (в ином случае).
Увеличение таймаута ни к чему не приводит - 503 или "белый экран".
Думали очистить таблицы с помощью SQL, но! после попытки удалить, таким образом, ненужные дисциплины, размер базы не изменился вообще. Теперь я сомневаюсь, что при удалении были затронуты связанные записи в других таблицах. Если так, получается, весь мусор остался, только теперь непонятно как от него избавиться (120 лишних дисциплин было). Ожидал каскадного удаления...

Заранее, спасибо!

В ответ на Геннадий Юрич

Re: Очистка БД

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
Ожидал каскадного удаления...
ХаХаХа!  Давно так не смеялся! Оно до сих пор не умеет использовать связи между таблицами!
В описании таблиц есть описание связей,  но они не используются (как и 10 лет назад).

Бекап moodle умеете делать ?
А восстанавливать его ?
Если оба ответа "да", то вы ничем кроме потерянного времени не рискуете при эспериментах с удалением.

В moodle есть "корзина" для удаления курсов, так что возможно вы курсы вообще не удаляли...

logstore_standard_log можно чистить средствами sql.
grade_grades_history - история выполнения курсов, которая сохраняется после удаления данных из самого курса. https://moodle.org/mod/forum/discuss.php?d=353090

Про очистку question_attempts & question_attempt_steps скорее всего нужно думать после восстановления производительности системы.

В вашем случае сначала нужно понять почему такие тормоза. Если это из-за низкой скорости работы БД, то нужно смотреть какие запросы тормозят. Есть несколько вариантов в которых что-то можно исправлять:
1) недостаток памяти на сервере ( это проблема администратора сервера). Как временный вариант вынести БД на другой компутер.
2) недостаток памяти для sql сервера ( в настройках mysql). База больщих объемов требует несколько других настроек.
3) отсутствие индексов в таблицах по которым идет активный поиск из-за ошибок в БД. В mysql индексы легко умирали.
В moodle вроде был проверяльщик состояния БД.

Про ошибку 503 смотрите логи!
Возможно размер таблиц стал невминяемым из-за ограничений ресурсов php или ограничения длительности запроса.
Запускайте cron из cli и смотрите что происходит.
В ответ на Виталий Лавров

Re: Очистка БД

от Геннадий Юрич -
Благодарю за ответ!

Не разбираюсь в теме, но как тогда работает всё это дело без связей?)
Где-то видел структуру одной из таблиц moodle (не помню какой), где было прописано каскадное удаление. Из этого и сделал такой вывод, а выходит...

Бекап сделаем и восстановим... наверное...
Одна только logstore_standard_log занимает более 20Гб.
Сегодня коллега пробовал забекапить базу, но срочно пришлось отменить операцию, и завалился сервер (после этого очень долго стартовал MySql и сайт сейчас работает медленнее).

Запускали cron из cli и ничего нужного нам не увидели. Задачи с окончанием cleanup_task не выполняются вообще, ничего по ним не выводится, хотя в планировщике на сайте выставлены.

По поводу "проверяльщика состояния" - https://docs.moodle.org/38/en/How_to_check_your_database_for_corruption - не оно?
В ответ на Геннадий Юрич

Re: Очистка БД

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
связи (forign key) нужны для обеспечения целостности данных. Но можно обеспечивать целостность данных и просто на уровне php-кода. Если с кодом все в порядке, а руками вы в базу не лезете (не ваш случай), то целостность данных не будет нарушена. В старых версиях mysql не было foreign key, от этого всё пошло. Когда техническая возможность появилось, оказалось, что качество кода достаточное, чтобы не добавлять ключи.
теперь, когда нет данных в родительской таблице, вам придется удалять из дочерних запросами вида DELETE FROM mdl_course_modules where no exists (select * mdl_course where mdl_course.id = mdl_course_modules.course_id)

каскадное удаление у вас может быть только, если оно было сделано руками кем-то из "доработчиков" системы. Из коробки и опытными разработчиками moodle такое не используются.

восстанавливайте бэкап частями, исключив из него таблицу с логами, чтобы сэкономить треть времени. Согласен с Вадимом, сам по себе объем логов вообще на производительность нее влияет.

запускать cron из cli нужно регулярною Задача очистки может срабатывать не при каждом запуске.
задачи планировщика можно запускать и без cron, по требованию, есть специальный скрипт, чтобы запустить только нужную задачу.

писал где-то в соседней теме, как можно пользоваться средствами мониторинга сервера, чтобы понять, где узкое место. В первую очередь нужно понять, каких именно ресурсов не хватает
В ответ на Vadim Dvorovenko

Re: Очистка БД

от Геннадий Юрич -
Благодарю за ответ!

Это, выходит, столько мусора у нас, что хоть всё заново ставь.
Админа, как такового, давно нет, а удалять выпускников фильтрацией по группам - морока, ещё и с постоянно вылезающими "503" после удаления очередной "группы", вот и влез руками на свою голову...
Коллега пробовал делать дамп - оборвался с ошибкой. Попробуем исключить таблицу с логами.
В ответ на Геннадий Юрич

Re: Очистка БД

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
В mysql бекап можно делать путем копирования каталога с БД. Только нужно чтобы в это время туда никто не писАл.
Это будет значительно быстрее чем mysqldump.
Смотрите логи на тему ошибки 503! У php есть 2 причины: лимит процессорного времени и лимит по памяти, плюс к этому может быть превышение таймаута выполнения запроса в веб-сервере.
cron при своей работе может требовать значительно больше памяти и процессорного времени.
В ответ на Геннадий Юрич

Re: Очистка БД

от Vadim Tabunshchik -
Изображение пользователя Developers

logstore_standard_log - отключите журнал вовсе или настройте на хранение записей за небольшой период. Это всё тут: Администрирование → Плагины → Журнал событий → Стандартный журнал событий. Отключите logguests. Таблицу вообще можно почистить от записей, если логи не нужны: TRUNCATE TABLE mdl_logstore_standard_log.

grade_grades_history - отключите историю оценок (disablegradehistory) или уменьшите время жизни - gradehistorylifetime

question_attempts и question_attempt_steps - поставьте плагин Вадима Дворовенко local_deleteoldquizattempts, настройте минимальный срок хранения попыток. Поначалу запустите задачи \local_deleteoldquizattempts и \task\delete_attempts_task в планировщике вручную. Возможно, это придется сделать несколько раз.

Изменения увидите не сразу, а после того, как крон отработает (даже не с первого раза). И руками в базе лазить не советую, всё прекрасно настраивается и чистится через админку.

ЗЫ: у меня логи хранятся с июля 2014 года, падение производительности не замечено.

Базу (индексы, значения по умолчанию) проверьте тут: Администрирование → Разработка → Редактор XMLDB

Ещё полезно проверить схему БД: https://docs.moodle.org/38/en/Verify_Database_Schema