Также возможно делать то, что вы хотите, непосредственно манипулируя базой данных. Там детали могут немного отличаться в зависимости от вашей ситуации, но основные шаги будут выглядеть примерно так:
Установите вашу вики в режим только для чтения . Вы не хотите, чтобы кто-то пытался редактировать вики, пока вы возитесь с базой данных.
Сделайте резервную копию вашей вики. (Это настоятельно рекомендуется перед любым необратимым массовым удалением в любом случае.)
Удалить все учетные записи пользователей, созданные спамерами. Если, как и в приведенном выше вопросе, вы были единственным действительным пользователем, вы можете просто сделать:
DELETE FROM user WHERE user_id != YOUR_USER_ID;
В качестве альтернативы, если новые действительные учетные записи не были созданы после того, как спамеры обнаружили вики, вы можете найти самый большой действительный идентификационный номер пользователя и сделать:
DELETE FROM user WHERE user_id > LAST_VALID_USER_ID;
Или вы можете использовать инструмент администратора, такой как phpMyAdmin, чтобы вручную выбрать действительные учетные записи и удалить остальные.
Очистите лишние данные, связанные с удаленными учетными записями. Это не является строго необходимым, но эти осиротевшие записи бесполезны и будут просто загромождать вашу базу данных, если вы не удалите их:
DELETE FROM user_groups WHERE ug_user NOT IN (SELECT user_id FROM user);
DELETE FROM user_properties WHERE up_user NOT IN (SELECT user_id FROM user);
DELETE FROM user_newtalk WHERE user_id NOT IN (SELECT user_id FROM user);
Удалите все изменения, не сделанные действительным пользователем:
Это большой шаг; все до того, как это было подготовлено, все после того, как это очищено. После удаления всех спам-аккаунтов вы можете просто:
DELETE FROM revision WHERE rev_user > 0 AND rev_user NOT IN (SELECT user_id FROM user);
Если в вашей вики отключено анонимное редактирование (что я настоятельно рекомендую для приватных / тестовых вики), то приведенного выше запроса должно быть достаточно, чтобы избавиться от всех версий спама. Если вы включили анонное редактирование, вам придется раздавать анонимный спам отдельно.
Если вы уверены, что все анонимные правки в вашей вики - это спам, единственные правки, сделанные с помощью UID 0, которые нам, возможно, потребуется сохранить, - это изменения, сделанные самим MediaWiki (например, страницы, импортированные извне вики). В этом случае должен работать примерно такой запрос:
DELETE FROM revision WHERE rev_user = 0 AND rev_user_text BETWEEN '1' AND '999';
Это удалит все ревизии по UID 0, где имя пользователя выглядит (смутно) как адрес IPv4; то есть начинается с цифры от 1 до 9.
Если в вашей вики есть какие-то законные анонимные правки, вам, возможно, придется стать немного более креативным. Если количество IP-адресов, используемых законными незарегистрированными редакторами, ограничено, вы можете просто добавить предложение, подобное AND rev_user_text NOT IN ('1.2.3.4', '5.6.7.8', '9.10.11.12')
приведенному выше запросу, чтобы исключить вклады этих IP-адресов из удаления. Вы также можете добавить такие условия, как, например, AND rev_user_text NOT LIKE '192.168.%'
сохранить все изменения с IP-адресов, начиная с определенного префикса.
Приведенные выше запросы избавят от версий спама (хотя их содержание все еще останется в text
таблице), но оставят page_latest
поле любых затронутых страниц, указывающих на несуществующую редакцию. Это может вызвать путаницу, поэтому нам лучше это исправить.
Во-первых, нам нужно стереть page_latest
столбец для всех страниц:
UPDATE page SET page_latest = 0;
Далее мы перестроим столбец, запустив сценарий обслуживания attachLatest.php (рекомендуется; не забудьте использовать --fix
параметр, чтобы скрипт фактически изменял базу данных), или с помощью SQL-запроса вручную:
UPDATE page SET page_latest =
(SELECT MAX(rev_id) FROM revision WHERE rev_page = page_id);
Наконец, мы удалим все страницы, для которых не было найдено действительных ревизий (потому что они были созданы спаммерами и никогда не имели какого-либо действительного контента):
DELETE FROM page WHERE page_latest = 0;
В завершение перестройте таблицы ссылок, текстового индекса и последних изменений, запустив сценарий обслуживания rebuildall.php . Вы также можете удалить содержимое удаленных версий спама из базы данных, чтобы они не занимали там ненужного места, запустив сценарий обслуживания purgeOldText.php .
Как только это будет сделано, убедитесь, что все выглядит хорошо, и если это так, отключите режим только для чтения - надеюсь, после установки некоторых функций защиты от спама, чтобы предотвратить повторение проблемы.