我有一个带有代理的数据库,该代理定期删除(通过Java代理,“removePermanently”方法)视图中的所有文档并重新创建它们。
几个月后,我注意到数据库大小显着增加。 通过此命令显示数据库信息
sh database <dbpath>
结果是我有很多已删除的文件(我想它们是删除存根)
Document Type Live Deleted
Documents 1,922 817,378
压缩数据库,恢复了80%的空间。
有没有办法以编程方式明确删除存根以避免“数据库爆炸”?或者,有没有办法正确管理这种情况(删除和创建文档)?
答案 0 :(得分:1)
不要删除文件!重复使用它们。这是最好的答案。认真。获取现有文档,清除字段并设置Form:=“Obsolete”。通过附加& Form != "Obsolete"
修改所有视图的选择公式。使用选择公式Form = "Obsolete"
创建名为“已过时”的新隐藏视图,而不是创建新文档,更改代码以转到过时视图,获取可用文档并设置新字段值(包括更改“表单”字段)。如果“过时”视图中没有足够的可用文件,则仅创建新文档。通过这样做而失去的任何性能,实际上应该与您似乎拥有的文档数量相比最小,将通过避免您正在创建的NSF文件的增长和碎片来抵消。完成所有删除并创建新文档。
但是,如果你没有办法做到这一点 - 也许某些不受你控制的第三方工具就是创建文档 - 那么知道你所谈论的数据库是否被复制是很重要的。如果它被复制,那么你必须非常小心,因为在所有副本被更新之前清除删除存根将导致删除的文档“恢复生机”如果在删除之前已经脱机的副本返回上线。
如果数据库根本没有被复制,或者可以快速地在所有副本中可靠地复制,那么您可以减少清除间隔。转到“复制设置”对话框,找到标有“删除最近__天未修改的文档”的复选框。选中不复选框,但在天数中输入一个小数字。删除存根的清除间隔将设置为此数字的1/3。因此,如果将其设置为3,则效果将是存根保留1天然后清除,给您24小时以确保所有副本都是最新的。如果需要更多,请将间隔设置得更高,并根据需要保持3倍的倍数。如果服务器长时间停机(超过清除间隔),请调整操作过程,以便确定禁止在数据库恢复之前将数据库复制到该服务器在线,可以删除并重新创建副本。但请注意,用户副本会造成同样的问题,并且实际上无法控制或意识到可能脱机的用户副本的时间超过清除间隔。无论如何,请记住:执行不复选框。要减少删除存根仅的清除间隔,只需减少数量。
除此之外,以编程方式删除删除存根的唯一方法是使用Notes C API。可以从LotusScript调用所需的例程,但根据我的经验,一旦存根和文档的总数太高,您可能会遇到错误,可能必须创建和部署数据库的新非副本副本才能获得过去了。您可以在此previous question的答案中找到代码以及我的解释。
答案 1 :(得分:1)
我必须遵循理查德的建议来重复使用文件。我最近有一个类似的项目,开始的方式是删除所有内容,每晚导入50万条记录。删除存根和FT索引的增长很快成为问题,占用大量磁盘空间并显着降低性能。我试图管理删除存根,但我显然违背了Domino的架构。
我在这里阅读了理查德的建议,并采用了这种方法。这就是我的所作所为:
1)根据表单创建2个视图 - 一个用于&#39;活动&#39;记录,以及另一个“非活动”记录记录
2)通过为两个视图设置autoupdate = false来启动代理
3)使用stampall(&#34;表格&#34;,&#34;无效&#34;)将所有活动记录更改为无效
4)使用notesview.refresh()
手动刷新2个视图5)开始导入数据。对于每条记录,将文档从非活动记录池中拉出(通过走“非活动”视图)
6)如果池中的非活动记录用完,则创建新的
7)导入完成后,再次手动刷新视图
8)使用db.createftindex(0,true)重新创建FT索引
代码实际上并不复杂,并且它运行的时间大约相同,如果不是比我原来的方法更快。
谢谢理查德!
另外,请查看高级数据库属性 - 有些内容可以帮助优化数据库。
答案 2 :(得分:0)
听起来你很清醒&#34;通过定期删除所有文档并从其他来源创建新文档来定义数据库的内容。把它切掉。如果数据已在Notes数据库中,请保留文档。你正在做的事情是非常低效的。