Можна також робити те, що ви хочете, безпосередньо маніпулюючи базою даних. Там деталі можуть дещо відрізнятися залежно від вашої ситуації, але основні кроки пройдуть приблизно так:
Встановіть свою вікі в режим лише для читання . Ви не хочете, щоб хтось намагався редагувати вікі під час вашої роботи з базою даних.
Зробіть резервну копію свого вікі. (Це настійно рекомендується перед будь-якими незворотними масовими видаленнями.)
Видаліть усі облікові записи користувачів, створені спамерами. Якщо, як у вищезазначеному питанні, ви були єдиним дійсним користувачем, ви можете просто зробити:
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 .
Після цього все перевірте, чи все виглядає добре, і якщо так, вимкніть режим лише для читання - сподіваємось після встановлення деяких функцій проти спаму, щоб уникнути повторної появи проблеми.