2

当维护脚本 deleteOldRevisions 内存不足时(尝试在 32 位下分配超过 2 GB),是否有可能删除修订。我什至没有得到 ID 列表来逐步删除它。

也许直接使用SQL?

我已经尝试/阅读了https://www.mediawiki.org/wiki/Manual:Reduce_size_of_the_database 并且还使用 SQL 在没有外壳访问权限的情况下删除旧的 MediaWiki 修订?

4

1 回答 1

5

嗯,是的......在看了那个脚本之后,我并不惊讶它失败了。确实应该修复它以迭代页面,而不是仅仅在内存中构建一个巨大的列表。我想唯一没有这样的原因是,对于像 Wikipedia 这样的 wiki,删除修订实际上并不是一个通常会做的事情。

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

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

  • 或者,您可以制作一个只包含每个页面的最新修订版的 wiki 转储,然后删除 wiki 上的所有页面(即page,revisiontext表中的所有内容)并从转储中导入它们。

  • 原则上,如果您知道自己在做什么,您也可以直接使用 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 上的所有修订版本。

于 2013-10-24T00:59:29.537 回答