2

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

Тем не менее, я хочу полностью удалить все страницы вики (на самом деле это копия вики). Есть ли несколько простой способ сделать это?

2 ответа2

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

Кроме того, как ни крути, пространства имен, определенные в этой конкретной установке Викимедиа (согласно запросу 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-script, как в:

:; 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, которые могут сделать удаление за вас, если у вас нет доступа к оболочке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .