В общем для MediaWiki большой размер БД это типичная проблема ибо все версии страниц сохраняются и база получается тяжёлой. Со временем база данных сильно разрастается и приходится искать способы для того, что бы её уменьшить. Перовое, что приходит на ум это удалить старые версии страниц. Об этом и поговорим.
Если ввести в строку поиска поисковой системы запрос «mediawiki delete old versions» (МедиаВики удалить старые версии), то можно наткнуться на множество страниц мануалов с официального сайта этого движка. Самый популярный мануал называется «Reduce size of the database» и на русский эта страница не переведена. В общем я просмотрел все имеющиеся способы для решения этой проблемы и решил их описать.
У MediaWiki есть механизмы для автоматического удаления старых версий страниц. Соответствующие php скрипты идёт в комплекте с CMS и находятся в папке maintenance.
deleteOldRevisions.php
deleteOldRevisions.php это файл сценария обслуживания для удаления старых изменений (версий) страниц из базы данных. Сценарий удаляет все старые, не удаленные, изменения, а затем вызывает purgeOldText.php, чтобы очистить текстовые записи. Это может быть полезно для уменьшения размера базы данных. Все старые версии страниц будут автоматически удалены.
Это скрипт не удаляет какие-либо удалённые ревизии, которые хранятся в архивной таблице. Используйте скрипт обслуживания deleteArchivedRevisions.php , чтобы удалить все строки из таблицы архива.
Использование
Удаление всех старых ревизий:
php deleteOldRevisions.php --delete
Удаление всех старых ревизий указанных страниц (идентификаторы страниц 1, 2, 15 и 38):
php deleteOldRevisions.php --delete 1 2 15 38
deleteArchivedRevisions.php
deleteArchivedRevisions.php файл сценария обслуживания нужный для того чтобы удалить все архивные (скрытые от посторонних глаз) изменения, очистив архивную таблицу. Эти изменения уже будет нельзя восстановить, они удаляются навсегда.
Когда страница ‘удалена’ администратором, записи переносятся из таблицы «просмотра» в «архивную» таблицу. Сценарий удаляет все записи из архивной таблицы, а затем вызывает purgeOldText.php. Это может быть полезно для уменьшения размера базы данных.
Использование
Удаление всех архивных ревизий:
php deleteArchivedRevisions.php --delete
Опции (ключи запуска)
Опция/параметр | Описание |
---|---|
—delete | Удалять данные (иначе отображает только ряд изменений). |
—help (-h) | Показать сообщения справки скрипта. |
—quiet (-q) | Suppresses all non-error specific output. |
—conf | Определяет местоположение файла LocalSettings.php, если он хранится в местоположении по умолчанию. |
—wiki | Определяет вики ID. Полезно в ситуациях, когда на сервере развернуты несколько вики. |
—globals | Выводит глобальные данные в конце обработки для целей отладки. |
—memory-limit | Устанавливает конкретное ограничение памяти для скрипта, «максимальное» для каких-либо ограничений или «по-умолчанию» для каких-либо изменений. |
—server | Имя протокола и сервер для использования в URL-адреса. Это иногда необходимо. |
—profiler | Set to «text» or «trace» to show profiling output. |
—dbuser | Пользователь БД для использования в скрипте. |
—dbpass | Пароль пользователя БД для использования в скрипте. |
$wgCompressRevisions
$wgCompressRevisions это переменная, которая в случае установки в значение в true определяет, что все будущие изменения страницы будут сжаты, т.е. текст будет хранится в БД в сжатом виде. Это работает только если включена поддержка Zlib в PHP.
Вы также можете сжимать тексты старых ревизий, для этого используйте сценарий compressOld.php. Так же требуется поддержка Zlib иначе данные при выгрузке прочитаны не будут.
После того, как вы включите $wgCompressRevisions, сжатые тексты не будет больше искаться в БД при помощи SQL запросов (сценариев). Это означает, любое расширение требующее поиска при помощи SQL запросов попросту не будет работать. Если вы этого не хотите, но всё же хотите сжать старые ревизии, то просто запускайте периодически скрипт CompressOld.php вместо включения опции $wgCompressRevisions.
compressOld.php
compressOld.php это сценарий обслуживания для сжатия текста старых ревизий страниц с использованием GZIP.
Если используется опция -t Gzip, то он сжимает каждый текст «пересмотра» (включая текущий пересмотр всех страниц) и сохраняет его обратно в той же записи таблицы.
Сжатые тексты недоступны для поиска при помощи SQL запросов.
purgeOldText.php
purgeOldText.php — файл сценария обслуживания, который может быть использован для очистки БД от неиспользуемых текстовых записей. Он будет удалять из таблицы текста любые записи, которые не связаны с какой-либо существующей или архивной редакцией.
Сиротские текстовые записи не должны существовать в нормальном режиме работы CMS. Предполагается, что каждая запись в текстовой таблице должна быть связана с любой записью в таблице изменений или архивной таблицы. Ожидается, что этот сценарий не найдёт ничего, но проверять всё же стоит. Такие «битые» (несвязанные) записи могут быть оставлены после сценариев с ошибками или прямых манипуляций с базами данных. Этот сценарий будет чистить их, и приводить всё в согласованное состояние, удаляя сиротские текстовые записи. Это не должно никак быть заметно на страницах просматриваемых любыми пользователями или администраторами.
Текстовая таблица содержит фактические данные контента вики страницы и лишний мусор может занять значительное место его удаление поможет освободить место. Оптимизация текстовой таблице MySQL рекомендуется после очистки многих текстовых записей.
Использование
Очистить все мусорные (не привязанные) сиротские тексты:
php purgeOldText.php —purge
purgeDeletedFiles.php
purgeDeletedFiles.php — скрипт обслуживания, который может быть использован для очистки диска и базы от удалённых файлов.
Заключение
Вот собственно и все проверенные мной встроенные инструменты MediaWiki, которые могут понадобиться для того, что бы уменьшить объём БД сайта на CMS MediaWiki, хотя список далеко не исчерпывающий.
Если вы серьёзно обеспокоены проблемой объёма БД сайта и чисткой сайта, то советую вам поставить выполнение этих скриптов в cron (планировщик задач) по расписанию, что бы все эти действия выполнялись автоматически в указанное время.