当维护skript deleteOldRevisions内存不足时(尝试在32位下分配2 GB以上的内存),是否可以删除修订版本。我什至没有得到要逐步删除的ID列表。
也许直接使用SQL?
我已经尝试/已经阅读过https://www.mediawiki.org/wiki/Manual:Reduce_size_of_the_database ,还可以使用SQL删除没有Shell访问权限的旧MediaWiki修订版吗?
嗯,是的。。。偷看了那个脚本之后,我并不奇怪它失败了。确实应该固定它以遍历页面,而不是仅在内存中构建一个巨大的列表。我想不是唯一的原因是,对于像Wikipedia这样的Wiki来说,删除修订实际上不是通常所做的事情。
无论如何,除了修复脚本之外,我还看到了许多可能的解决方法:
deleteOldRevisions.php脚本可以获取页面ID的列表。您可以尝试一次运行Wiki上的每一页。您甚至可以编写一个简单的Shell脚本来循环运行它,从页面ID 1开始,直到您的Wiki当前最大页面ID计数。
或者,您可以对Wiki进行转储,使其仅包含每个页面的最新修订,然后删除Wiki上的所有页面(即page,revision和text表中的所有内容),然后将其从转储中导入。
page
revision
text
原则上,如果您知道自己在做什么, 则 还 可以 直接使用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维护脚本来修复诸如最近的更改之类的问题,否则它们将指向已删除的修订。然后确保一切看起来都应该正确,然后再次关闭只读模式。