Як правильно видалити весь вміст сторінки в MediaWiki?


2

Я знайшов цю сторінку, яка пояснює, як видалити всі сторінки в MediaWiki, але я зовсім не впевнений, що біг DELETE FROM page;- це гарна ідея. Схема MediaWiki досить складна і просто видалення pageтаблиці, ймовірно, залишає у базі даних безліч невирішених залежностей, які не вирішуються.

Тим не менш, я хочу ретельно видалити всі сторінки на вікі (фактично копію вікі). Чи є дещо простий спосіб зробити це?

Відповіді:


4

Невелика модифікація чудової відповіді, яку надав Tgr: чомусь MySQL на нашому сервері MediaWiki (і його клон, який потрібно стерти) відмовився від CASE...WHEN...THENконструкцій, тому я зробив еквівалентні заміни в оболонці:

:; mysql my_wiki -s -N -e \
     "SELECT CONCAT(page_namespace, ':', page_title) FROM page;" | \
     sed -e 's,^0:,:,' -e 's,^1:,Talk:,' \
         -e 's,^2:,User:,' -e 's,^3:,User talk:,' \
         -e 's,^6:,File:,' -e 's,^7:,File talk:,' \
         -e 's,^[0-9][0-9]*:.*$,,' \
     | egrep -v '^$' > /DUMP/wikipage-list-utf8.txt

Якщо вам потрібно переглянути список, і ваш термінал не є UTF-8 (як у мене не було), ви можете iconvпередати текстовий файл до кодування терміналу, наприклад:

:; iconv -f utf8 -t cp1251 < /DUMP/wikipage-list-utf8.txt

Крім того, для чого це варто, простори імен, визначені у цій конкретній установці Wikimedia (відповідно до запиту api.php), були:

<ns id="-2" case="first-letter" canonical="Media" xml:space="preserve">Медиа</ns>
<ns id="-1" case="first-letter" canonical="Special" xml:space="preserve">Служебная</ns>
<ns id="0" case="first-letter" content="" xml:space="preserve" />
<ns id="1" case="first-letter" subpages="" canonical="Talk" xml:space="preserve">Обсуждение</ns>
<ns id="2" case="first-letter" subpages="" canonical="User" xml:space="preserve">Участник</ns>
<ns id="3" case="first-letter" subpages="" canonical="User talk" xml:space="preserve">Обсуждение участника</ns>
<ns id="4" case="first-letter" subpages="" canonical="Project" xml:space="preserve">Simsla</ns>
<ns id="5" case="first-letter" subpages="" canonical="Project talk" xml:space="preserve">Обсуждение Simsla</ns>
<ns id="6" case="first-letter" canonical="File" xml:space="preserve">Файл</ns>
<ns id="7" case="first-letter" subpages="" canonical="File talk" xml:space="preserve">Обсуждение файла</ns>
<ns id="8" case="first-letter" subpages="" canonical="MediaWiki" xml:space="preserve">MediaWiki</ns>
<ns id="9" case="first-letter" subpages="" canonical="MediaWiki talk" xml:space="preserve">Обсуждение MediaWiki</ns>
<ns id="10" case="first-letter" canonical="Template" xml:space="preserve">Шаблон</ns>
<ns id="11" case="first-letter" subpages="" canonical="Template talk" xml:space="preserve">Обсуждение шаблона</ns>
<ns id="12" case="first-letter" subpages="" canonical="Help" xml:space="preserve">Справка</ns>
<ns id="13" case="first-letter" subpages="" canonical="Help talk" xml:space="preserve">Обсуждение справки</ns>
<ns id="14" case="first-letter" canonical="Category" xml:space="preserve">Категория</ns>
<ns id="15" case="first-letter" subpages="" canonical="Category talk" xml:space="preserve">Обсуждение категории</ns>

Вибачте, теги локалізовані, але "канонічні" назви - це те, що ми шукаємо, і вони є достатньо описовими.

Окрім елементів, які я перетворив sedвище, були також записи в просторах імен 8, 10 та 12, які здавалися скоріше "системними даними", а не вмістом користувачів, і оскільки намір полягав у повторному використанні існуючої установки установки лише без вмісту - так Я не передав їх до сценарію delete, як у:

:; php deleteBatch.php /DUMP/wikipage-list-utf8.txt

Дякую Tgr за чудово детальний та зв’язаний пост - це все, що мені потрібно було для початку :)

Що стосується інструментів, що надаються з MediaWiki, то це було "правильне" видалення вмісту, переміщення в базу даних, щоб його можна було відмінити. Для реального витирання це потрібно очистити на рівні бази даних. У нашому випадку ми не дуже піклувалися про вміст (ми піклувались про те, щоб його не було з клону; потрібна була лише налаштування, щоб створити новий вікі-сайт), тому нижче - приблизно те, що я зробив, згідно журналу історії MySQL ( Я переглянув дамп SQL бази даних, щоб побачити, які таблиці мають найбільший розмір та вміст, і, схоже, не містить системних даних, таких як фрагменти тексту довідки чи локалізації):

DELETE FROM text WHERE old_id IN (SELECT ar_text_id FROM archive);
DELETE FROM files WHERE old_id IN (SELECT fa_id FROM filearchive);
delete from logging;
delete from archive;
delete from filearchive;
delete from recentchanges;
delete from searchindex;
delete from uploadstash;
delete from watchlist;
delete from ipblocks;
delete from objectcache;
update user set user_password = 'cV%@4dF.' where user_id not in (1,2,3);

Я також витер сам додані файли:

:; rm -f `find mediawiki/images -type f`

Звичайно, не слід копіювати наосліп мої приклади, якщо ви не збираєтесь витерти весь вміст, а не лише деякий підмножина, і навіть тоді краще зробити резервну копію як бази даних, так і каталогу, перш ніж робити щось незворотне;)


1

Ви дійсно маєте на увазі порожнє (тобто відредагуйте його, щоб замінити текст порожнім рядком, залишивши старий текст та всі попередні версії публічно видимими в історії сторінки) або видаливши?

Найпростіше видалити все, мабуть, отримати список усіх ваших сторінок (скористайтеся api.php?action=query&meta=siteinfo&siprop=namespacesдля отримання списку всіх просторів імен та їх канонічних назв, потім отримайте список усіх сторінок SELECT CONCAT(CASE page_namespace WHEN 0 THEN '' WHEN 1 THEN 'Talk' ..., ':', page_title) FROM pageі передайте файл, що містить цей список сторінок deleteBatch.php.

Для блокування можна використовувати той самий список із edit.phpдеякими сценаріями bash.

Існують також різні інструменти, такі як pywikibot, які можуть зробити видалення для вас, якщо у вас немає доступу до оболонки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.