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