Небольшая модификация отличного ответа от 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`
Конечно, не копируйте вслепую мои примеры, если вы не собираетесь стереть весь контент, а не только некоторые подмножества, и даже тогда лучше сделать резервную копию базы данных и каталога, прежде чем делать что-то необратимое;)