如何正确删除 MediaWiki 中的所有页面内容?

如何正确删除 MediaWiki 中的所有页面内容?

我发现这一页这解释了如何删除 MediaWiki 中的所有页面,但我完全不相信运行DELETE FROM page;是一个好主意。MediaWiki 架构相当复杂,仅仅删除page表可能会在数据库中留下许多未解决的依赖关系,而这些依赖关系将无法解决。

尽管如此,我想彻底删除 wiki 上的所有页面(实际上是 wiki 的副本)。有没有比较直接的方法可以做到这一点?

答案1

对 Tgr 提供的出色答案进行了轻微修改:由于某种原因,我们 MediaWiki 服务器上的 MySQL(及其要被擦除的克隆)拒绝了构造CASE...WHEN...THEN,因此我在 shell 中进行了等效的替换:

:; 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 中还有一些条目看起来更像是“系统数据”而不是用户内容,而且由于目的是仅在没有内容的情况下重用现有安装的设置 - 所以我没有将它们传递给删除脚本,如下所示:

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

感谢 Tgr 提供的非常详细且有链接的帖子 - 这是我所需要的全部内容 :)

就 MediaWiki 提供的工具而言,这是“正确”删除内容,在数据库中重新定位以便可以取消删除。要真正清除内容,必须在数据库级别进行清理。在我们的案例中,我们不太关心内容(我们关心的是它应该从克隆中删除,只需要设置以创建新的 wiki 站点),因此根据 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`

当然,不要盲目复制我的例子,除非您打算擦除所有内容而不仅仅是某些子集,即使在那时,最好在做任何不可逆的事情之前备份数据库和目录;)

答案2

您真的是指空白(即编辑它以用空字符串替换文本,使旧文本和所有以前的版本在页面历史记录中公开可见)还是删除?

删除所有内容的最简单方法可能是获取所有页面的列表(使用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 脚本。

还有各种工具,例如pywiki机器人如果您没有 shell 访问权限,它可以为您执行删除操作。

相关内容