Получить CHECKSUM таблиц БД, используя API Moodle

Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -
Number of replies: 19

Всем привет!

Что-то не могу найти способ получить CHECKSUM  таблиц БД, используя штатные средства API Moodle.

$DB->execute() возвращает только bool, а других средств пользовательских запросов вроде и нет?

Подскажите, кто сталкивался с подобной проблемой, pls!

(Moodle 2.8.12   PHP 5.4.45   MySQL 5.5.31    MS Windows 7)





Sum of ratings: -
In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Виталий Лавров -
Picture of Эксперт по Moodle
А при чем тут execute ? Это select.
CHECKSUM() это фича чисто M$. Во всех остальных БД нужно придумывать свои велосипеды решения.

In reply to Виталий Лавров

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -
А при чем тут select?
Решение, конечно, есть. Можно самому выполнить подключение к бд moodle и средствами php вытащить checksum нужной таблицы, например так:
$res = $DBTmp ->query("CHECKSUM TABLE {$tab}") ;
while( $row = $res->fetch_assoc() )
{
$checksum = $row['Checksum'];
}
Но вроде такой подход не приветствуется. Вот об этом и был вопрос.
Можно ли средствами API Moodle получить checksum из базы MySQL?
In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Виталий Лавров -
Picture of Эксперт по Moodle
В moodle нет специального API для получения CHECKSUM.
Для доступа к БД в moodle есть свой API https://docs.moodle.org/dev/Data_manipulation_API

PS moodle совсем недавно научился использовать транзакции, а вы тут хотите поддержку новомодной нестандартизированной фичи востребованнность которой в продакшене равна нулю. У разработчиков есть более гуманные способы отследить изменения в таблицах.
In reply to Виталий Лавров

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -

Если не трудно, можно подробнее о гуманных способах?😊

In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Vadim Dvorovenko -
Picture of Developers Picture of Майнтейнер перевода
Checksum table блокирует таблицу на всё время вычисления Checksum, в результате другие процессы не смогут в течение этого времени осуществлять запись в эту таблицу. В Moodle могут быть огромные таблицы типа файлов и логов,, для которых этот процесс может занимать часы. Такое неприемлемо для веб-приложений, ведь веб-сервер должен обслуживать параллельно большое количество запросов.
Поэтому сперва объясните, ради чего вам такое понадобилось, иначе мы не сможем предложить вам подходящее решение
In reply to Vadim Dvorovenko

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -

Разрабатывается плагин, в котором используется информация о структуре теоретического материала и банка заданий на moodle-сервере. Эта информация периодически записывается в рабочих таблицах плагина. Перед тем, как осуществлять запись производится проверка наличия изменений в определенных таблицах сервера (это course_categories, course, course_sections и т.п.). Поскольку используется MySQL - есть готовое решение: проверка CHECKSUM нужных таблиц. Но, как оказалось, применить его через API moodle, невозможно. Тогда остается либо считывать CHECKSUM в обход API, либо применять другие методы контроля наличия изменений в таблицах сервера. Был бы благодарен за наводку на оные.

ЗЫ. Кстати, phpmyadmin дает единицы миллисекунд на оценку CHECKSUM проверяемых таблиц. Думаю, даже если бы затраты составляли единицы секунд, это было бы не критично для работы сервера, поскольку данные проверки должны происходить с периодом в неделю, а то и в месяц.

In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Виталий Лавров -
Picture of Эксперт по Moodle
> Кстати, phpmyadmin дает единицы миллисекунд на оценку CHECKSUM проверяемых таблиц. Думаю, даже если бы затраты
> составляли единицы секунд, это было бы не критично для работы сервера, поскольку данные проверки должны
> происходить с периодом в неделю, а то и в месяц.
Почитайте https://dev.mysql.com/doc/refman/5.7/en/checksum-table.html
Все это не бесплатно с точки зрения накладных расходов.

Общий способ - сделать счетчик изменений таблиц и триггером менять его при insert/update/delete.
Это дешевле, чем пересчитывать КС при измемении строк. update/delete кучи строк будет давать всего 1 изменение.

Еще раз убеждаюсь, что разработчики mysql больные на всю голову. Сделать отдельную команду и при этом требовать доступность SELECT.
Даже в mssql догадались сделать эту фичу в виде функции, результат которой можно получить стандартным способом.
In reply to Виталий Лавров

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -
Триггеры? ОК, если я правильно понял, плагин при установке на сервер должен создать для каждой проверяемой таблицы сервера отдельный триггер и соответствующую таблицу истории изменений. Но тогда возникает вопрос какую функцию API moodle нужно использовать для создания mysql-триггера? Или опять придется действовать в обход? 

И еще не совсем понятно следующее: если  нужно контролировать любое изменение, то потребуется создавать по несколько триггеров UPDATE/INSERT/DELETE на каждую контролируемую таблицу сервера?
In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Виталий Лавров -
Picture of Эксперт по Moodle
> Но тогда возникает вопрос какую функцию API moodle нужно использовать для создания mysql-триггера?
$DB->execute() - нам же не нужно получать данные, нам нужен только статус выполнения операции.

Там можно делать один триггер на все операции. В процедуре выполняемой триггером можно получить имя таблицы и операцию для которой он вызван.

Если вам хочется получать статус изменения таблиц через стандартное moodle API DB, то что мешает сделать хранимую процедуру, которая выполняет "checksum table xxx" и возвращает результат в виде строки?
In reply to Виталий Лавров

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -
Спасибо за уделенное внимание проблеме.
Все же остановлюсь на получении checksum в обход API.
Триггерное решение не воодушевляет своей громоздкостью, а применение хранимых процедур для команды checksum table, судя по отзывам из сети, выглядит сомнительно, да и не очень мотивированно: городить тот же огород ради применения стандарта moodle?
In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Vadim Dvorovenko -
Picture of Developers Picture of Майнтейнер перевода

Ваше решение с checksum всё-равно неправильное для многопоточной системы. 

Если вам нужно гарантировать отсутствие изменений  в рамках одного процесса, сам нужно использовать  транзакцию и shared lock для тех строк, которые не должны поменяться и lock for update для тех строк, которые должны поменяться. В этом случае никакие другие процессы не смогут ничего изменить никакие строки до  окончания вашей транзакции, а значит и целостность данных будет обеспечена.

Если вам нужно гарантировать отсутствие изменений при нескольких процессах (например, что значения до отправки формы и после отправки формы обратно на сервер совпадали), нужно вычислять контрольные значения только по тем строкам, которые вы затрагиваете, а не по всем таблицам. Иначе может возникнуть следующая ситуация. Вы вычислили контрольную сумму таблицы. В это время какой-то преподаватель начал редактировать свой курс, переименовал название раздела. При этом это может произойти в курсе, который не имеет к вашему плагину никакого отношения. В результате у вас контрольная сумма не сойдется. А mysql не умеет вычислять контрольную сумму по отдельным строкам (как функция в mssql, про которую писал Виталий).

Если вы думаете, что можно создать в moodle систему, в которой контент будет управляться только автоматически, и всегда будет полностью соответствовать неким внешним данным, то это утопия. Опыт показывает, что со временем всегда появятся дополнительные курсы для служебного назначения, какие-то курсы, где что-то будет правиться вручную, а из-за этого подход с контрольными суммами по всей таблице будет не жизненным.

Как вариант, в вашем плагине подписаться на события изменения курсов/категорий/секций, и при их возникновении сверять только отдельные элементы структуры.

Пока из вашего описания не понял, к какому из перечисленных вариантов ближе ваша ситуация.

In reply to Vadim Dvorovenko

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -

Данная процедура не будет происходить слишком часто, например, раз в неделю или в месяц. Разве критично для работы веб-сайта, если раз в месяц в определенное время он на десяток минут будет недоступен по техническим причинам. Даже банки такое практикуют)) При таком режиме никаких конфликтов происходить не может и решение с checksum вполне сгодится. Разве нет? После определения таблиц, претерпевших изменение, происходит анализ их содержимого, удовлетворяющего заданным условиям, но это уже осуществляется в соответствии с API moodle и не должно мешать текущей работе сайта. 

Вполне допускаю, что в процессе реализации что-то вылезет, но пока оставлю с checksum-ом. Как пишут отцы-основатели: Moodle не сразу строилась.

In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Vadim Dvorovenko -
Picture of Developers Picture of Майнтейнер перевода
Раз у вас есть возможность отключать сайт на техобслуживание, то почему бы просто не первести его в maintenance mode, и не выполнить процесс, чётко понимая, что никто кроме вас ничего не меняет.
Если же вы будете сверяться с контрольной суммой, сделанный месяц / неделю назад, то очень высока вероятность что она не сойдется, таким образом, в любом случае потребуется анализировать отдельные строки. Так почему же сразу не начать со сравнения строк.
In reply to Vadim Dvorovenko

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -

Да, это вполне приемлемый подход. Возможно, так в конечном итоге и будет. Особенность разрабатываемого сайта в том, что  теоретический материал подчиняется строгой иерархии. Это означает, что таблицы верхних уровней иерархии меняются значительно реже, чем таблицы, нижних уровней, содержащие полнотекстовый контент, но все же меняются. Если время на анализ таблиц будет сопоставимо с временем на проверку checksum, вероятно, так и сделаю. 

Но вот все же, хотелось бы понять, почему checksum возбуждает такую критику у спецов? Ну проверка и проверка - в чем криминал, если не в потере времени, не в нарушении работы сайта? 

In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Vadim Tabunshchik -
Picture of Developers

В Moodle отслеживаются изменения в курсах и это используется при автоматическом резервном копировании - можно исключить курсы, не имеющие изменений с момента последнего копирования. Только этот механизм отслеживания не использует проверку CHECKSUM таблиц, вам это уже попытались объяснить, что это, мягко говоря, несколько глупо. Отслеживание основано на анализе таблицы логов, в которую записываются абсолютно все действия всех пользователей. Если найдены записи с какими-то изменениями в курсе, значит нужно создать свежую резервную копию этого курса. Вот и всё API smile

In reply to Vadim Tabunshchik

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -
Здесь речь идет не о резервных копиях курсов, мягко говоря.😊
In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -

Вопрос косвенно связан с предыдущим. 

Идея такая. Если нужна проверка изменений в конкретной записи можно использовать поле timemodified в тех таблицах, где оно присутствует. Но тут обнаружилась такая странная штука. В таблице lesson_answers поле timemodified присутствует, но какое-то неживое - при любых изменениях вопросов в странице там глухо сидит 0. Это - баг мудла или что-то в настройках? 

(Moodle 2.8.12   PHP 5.4.45   MySQL 5.5.31    MS Windows 7)

In reply to Олег Голосовский

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Vadim Dvorovenko -
Picture of Developers Picture of Майнтейнер перевода

конечно баг. для таких мелочей нет настройки. lesson несколько раз переписывался, может при каком-то переписывании забыли про эту колонку. Поставьте 3.9 и посмотрите, как там

In reply to Vadim Dvorovenko

Re: Получить CHECKSUM таблиц БД, используя API Moodle

by Олег Голосовский -

Ясно.Спасибо. 

Меня пока локальный сервер, так что переустановка  - геморрой, проще сделать что-то типа md5.