Lotus domino 无法从数据库中获取600000个删除存根

Lotus domino 无法从数据库中获取600000个删除存根,lotus-domino,Lotus Domino,更新:我发布了一个:show数据库mycleandb.nsf,我可以看到仍然有835000个删除存根。我似乎无法移除它们 总结: 我们有一个大型数据库,我们现在准备开始缩减到一个更易于管理的大小。 我删除了文档,但留下的数据库似乎无法复制,接收到错误:无法扩展ID表-内存不足 详情: 当前live数据库中大约有1400000个文档,我们可以立即将其减少到650000个。通过进一步的设计/架构工作,我们可以将其减少到300000。此web应用程序群集在5台服务器上,1台为应用程序“中心”,3台HT

更新:我发布了一个:show数据库mycleandb.nsf,我可以看到仍然有835000个删除存根。我似乎无法移除它们

总结: 我们有一个大型数据库,我们现在准备开始缩减到一个更易于管理的大小。 我删除了文档,但留下的数据库似乎无法复制,接收到错误:无法扩展ID表-内存不足

详情: 当前live数据库中大约有1400000个文档,我们可以立即将其减少到650000个。通过进一步的设计/架构工作,我们可以将其减少到300000。此web应用程序群集在5台服务器上,1台为应用程序“中心”,3台HTTP\SSO服务器位于反向代理之后,第5台服务器为外部服务的访问点。集线器每30分钟启动一次推拉复制(没有文档限制),日志显示没有复制错误。事务日志是为服务器上的运行时性能设置的,备份是在不在集群中的另一台备份服务器上执行的。我们每天进行归档,每天归档大约1500份文档

到目前为止,将近2年过去了,应用程序运行良好……除了这里和那里的一些噩梦:-)。但是,我们终于可以缩减数据库了

在进行任何工作之前,I OS备份live DB,并将其复制到测试服务器。在测试服务器上,我做了一个:CL拷贝mylivedb.nsf mycleandb.nsf 然后在mycleandb.nsf中,我删除了文档,将数据库中的文档减少到650000个

我所追求的只是一个新副本,而不是副本,请参见下面的副本问题,因此我发出了另一个命令…为了在不删除存根的情况下给我一个新副本,据我所知,副本不会复制del的存根: CL复制mycleandb.nsf mycleandbNEW.nsf …这还可以确保,如果网络上存在任何恶意复制副本,我们不会将所有文档都恢复(并非所有服务器都是8.5.3,因此我们无法使用数据库属性设置删除存根的截止日期)

但我得到一个问题:无法扩展ID表-内存不足。 我试过这个: CL复制mycleandb.nsf mycleandbNEW.nsf副本 …同样的事情

尝试在此处找到mycleandb.nsf的步骤: …同样的事情

将清除间隔更改为0天,如下所述,还将清除日期设置为将来: …同样的事情

然后运行了一个: 加载压缩mycleandb.nsf-B …同样的事情

我在这里看到了这个线程,这是一个类似的情况,除了,我们在集群\复制方面没有任何问题…还没有!

所以,我有一个数据库,我已经从中删除了文档,我可以打开它,它似乎正常工作,但我不能复制它

复制\群集问题: 我以前见过这个错误:无法扩展ID表-内存不足…我所做的是,删除我们的一个主服务器,操作系统将数据库复制到有问题的服务器,重新启动

我总是使用Admin Client\Dom console创建新的副本,但在这种情况下,每当我这样做时,都会用文档淹没数据库,但清除间隔在所有服务器上都是正确的。新的复制副本是从集线器服务器创建的,集线器服务器每30分钟启动一次与所有集群伙伴的推拉复制,因此,如果这是一个删除存根问题,它会一直出现吗

我明天不会查看它,看看是否还有任何删除存根,但我不知道如何继续


非常感谢您的评论或建议。

根据我的经验,如果修改的文档+存根总数太多,Domino中实际清除删除存根的代码将无法工作。我认为这可能是Notes API内部相当深的一个限制,再加上必须使用的算法——即查看在清除间隔日期之前修改的所有Notes——可能是一个非常大的数字

您的最佳选择可能是创建本地非副本副本并重新部署

我之前研究过这个。我发现了一些LotusScript代码,它使用Notes C API调用来清除各种博客上发布的删除存根。(我想原始代码可能来自Rod Whitely,但我不确定。)我的版本代码如下

当在文档+存根总数在200万到300万之间的数据库上运行时,它会得到“无法扩展ID表-内存不足”。我从未就此联系过IBM支持人员,因为这实际上只是我的一个附带项目。最后,我只是制作了生产数据库的非副本副本,然后将清除间隔设置得足够低,这样存根的数量就再也不会太多了

Declare Private Sub IDDestroyTable Lib wAPIModule Alias "IDDestroyTable" _
( ByVal hT As Long)
Declare Private Function IDScan Lib wAPIModule Alias "IDScan" _
( ByVal hT As Long, ByVal F As Integer, ID As Long) As Integer
Declare Private Function NSFDbOpen Lib wAPIModule Alias "NSFDbOpen" _
( ByVal P As String, hDB As Long) As Integer
Declare Private Function NSFDbClose Lib wAPIModule Alias "NSFDbClose" _
( ByVal hDB As Long) As Integer
Declare Private Function NSFDbGetModifiedNoteTable Lib wAPIModule Alias "NSFDbGetModifiedNoteTable" _
( ByVal hDB As Long, ByVal C As Integer, ByVal S As Currency, U As Currency, hT As Long) As Integer
Declare Private Function NSFNoteDelete Lib wAPIModule Alias "NSFNoteDelete" _
( ByVal hDB As Long, ByVal N As Long, ByVal F As Integer) As Integer
Declare Private Function OSPathNetConstruct Lib wAPIModule Alias "OSPathNetConstruct" _
( ByVal NullPort As Long, ByVal Server As String, ByVal FIle As String, ByVal PathNet As String) As Integer
Declare Private Sub TimeConstant Lib wAPIModule Alias "TimeConstant" _
( ByVal C As Integer, T As Currency)

Function countAndDeleteStubsByOpenDatabase(db As NotesDatabase, deleteFlag As boolean) As Long

        If db Is Nothing GoTo bail

        Dim forever As Currency
        Dim last As Currency
        Dim hT As Long
        Dim RRV As Long
        Dim hDB As Long
        Dim path As String
        Dim nStubs As Long
        Dim ret As integer

        On Error GoTo bail  

        path = Space(1024)
        Call OSPathNetConstruct(0, db.Server, db.FilePath, path)
        Call NSFDbOpen(path, hDB)

        Call TimeConstant(2, forever)
        Call NSFDbGetModifiedNoteTable(hDB, &H7FFF, forever, last, hT)

        nStubs = 0

        ret = IDScan(hT, True, RRV)

        While Not (ret = 0)
            If RRV < 0 Then
                If (deleteFlag = true) Then 
                    NSFNoteDelete hDB, RRV And &H7FFFFFFF, &H0201 
                End If
                nStubs = nStubs + 1
            End If
            ret = IDScan(hT, False, RRV)
        Wend

        IDDestroyTable hT
        NSFDbClose hDB

        If deleteFlag = True Then
            Print "Deleted " + CStr(nStubs) + " stubs for " + db.Filepath  + " on " + db.Server
        Else
            Print "Counted " + CStr(nStubs) + " stubs for " + db.Filepath  + " on " + db.Server 
        End If


        countAndDeleteStubsByOpenDatabase = nStubs

        On Error GoTo 0

        Exit Function

        bail:
            Print "Unexpected error in countAndDeleteStubsByOpenDatabase. Line " + CStr(Erl) + " " + CStr(Err()) + " " + Error(Err())
            countAndDeleteStubsByOpenDatabase = 0

    End Function
声明私有子IDDestroyTable Lib wAPIModule别名“IDDestroyTable”_
(ByVal hT As Long)
声明专用函数IDScan Lib wAPIModule别名“IDScan”_
(ByVal hT为长,ByVal F为整数,ID为长)为整数
声明私有函数NSFDbOpen Lib wAPIModule别名“NSFDbOpen”_
(ByVal P作为字符串,hDB作为长)作为整数
声明私有函数NSFDbClose Lib wAPIModule别名“NSFDbClose”_
(ByVal hDB等长)作为整数
声明私有函数NSFDbGetModifiedNoteTable Lib wAPIModule别名“NSFDbGetModifiedNoteTable”_
(ByVal hDB为长,ByVal C为整数,ByVal S为货币,U为货币,hT为长)为整数
声明私有函数NSFNoteDelete Lib wAPIModule别名“NSFNoteDelete”_
(ByVal hDB为长,ByVal N为长,ByVal F为整数)为整数
声明专用函数OSPathNetConstruct Lib wAPIModule别名“OSPathNetConstruct”_
(ByVal NullPort为长,ByVal Server为字符串,ByVal FIle为字符串,ByVal PathNet为字符串)为整数
声明私有子时间常数Lib wAPIModule别名“TimeConstant”_
(ByVal C为整数,T为货币)
函数countandDeleteStubsByPendDatabase(db作为NotesDatabase,deleteFlag作为boolean)的长度
如果db什么都不是,就去保释吧
永远黯淡如货币
作为货币
迟钝
变暗RRV为长
变暗hDB为长