Как правильно удалить весь контент страницы в MediaWiki?
Я нашел эту страницу, которая объясняет, как удалить все страницы в MediaWiki, но я совсем не уверен, что работает DELETE FROM page;
хорошая идея Схема MediaWiki довольно сложна и просто удаляет page
Таблица, вероятно, оставляет много неразрешенных зависимостей в базе данных, которые не будут разрешены.
Тем не менее, я хочу полностью удалить все страницы вики (фактически, копию вики). Есть ли несколько простой способ сделать это?
2 ответа
Небольшая модификация отличного ответа от 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`
Конечно, не копируйте вслепую мои примеры, если вы не собираетесь стереть весь контент, а не только некоторые подмножества, и даже тогда лучше сделать резервную копию базы данных и каталога, прежде чем делать что-то необратимое;)
Вы действительно имеете в виду пустой (то есть редактируете его, чтобы заменить текст пустой строкой, оставляя старый текст и все предыдущие версии общедоступными в истории страниц) или удаляете?
Самый простой способ удалить все, вероятно, получить список всех ваших страниц (используйте 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, которые могут выполнить удаление за вас, если у вас нет доступа к оболочке.