admin

当deleteOldRevisions内存不足时,如何删除旧的MediaWiki修订版

sql

当维护skript deleteOldRevisions内存不足时(尝试在32位下分配2
GB以上的内存),是否可以删除修订版本。我什至没有得到要逐步删除的ID列表。

也许直接使用SQL?

我已经尝试/已经阅读过https://www.mediawiki.org/wiki/Manual:Reduce_size_of_the_database
,还可以使用SQL删除没有Shell访问权限的旧MediaWiki修订版吗?


阅读 137

收藏
2021-06-07

共1个答案

admin

嗯,是的。。。偷看了那个脚本之后,我并不奇怪它失败了。确实应该固定它以遍历页面,而不是仅在内存中构建一个巨大的列表。我想不是唯一的原因是,对于像Wikipedia这样的Wiki来说,删除修订实际上不是通常所做的事情。

无论如何,除了修复脚本之外,我还看到了许多可能的解决方法:

  • deleteOldRevisions.php脚本可以获取页面ID的列表。您可以尝试一次运行Wiki上的每一页。您甚至可以编写一个简单的Shell脚本来循环运行它,从页面ID 1开始,直到您的Wiki当前最大页面ID计数。

  • 或者,您可以对Wiki进行转储,使其仅包含每个页面的最新修订,然后删除Wiki上的所有页面(即pagerevisiontext表中的所有内容),然后将其从转储中导入。

  • 原则上,如果您知道自己在做什么可以 直接使用SQL删除旧修订。

在弄乱数据库之前,您 始终
要做的第一件事是将Wiki设置为只读模式并进行完整备份。如果您以前没有做过,那么在进行真正的Wiki不可撤消的操作之前,最好先将备份
还原 到本地测试Wiki上。

然后,要删除除每个页面的最新修订之外的所有修订,请运行以下SQL命令:

    DELETE FROM revision WHERE NOT EXISTS
  ( SELECT * FROM page WHERE page_id = rev_page AND page_latest = rev_id )

请注意,上面的命令只会删除旧的修订 元数据
,而不会删除那些修订的实际文本。摆脱旧文本记录的最简单方法是运行purgeOldText.php维护脚本,尽管您也
应该 也可以使用SQL来执行此操作,例如:

    DELETE FROM text WHERE NOT EXISTS
  ( SELECT * FROM revision WHERE rev_text_id = old_id )

最后,如果一切顺利,我建议运行rebuildall.php维护脚本来修复诸如最近的更改之类的问题,否则它们将指向已删除的修订。然后确保一切看起来都应该正确,然后再次关闭只读模式。

  • 最后,如果您这样做是为了节省空间,请考虑压缩旧的修订版本,而不是直接删除它们。这将节省大量空间,同时仍可在Wiki上保持所有修订可用。
2021-06-07