1

更新:私は:show database mycleandb.nsfを発行しましたが、835,000の削除スタブがまだ残っていることがわかります。私はそれらを取り除くことができないようです。

概要:大規模なデータベースがあり、より管理しやすいサイズに縮小する準備ができています。ドキュメントを削除しましたが、データベースが残っているため、コピーまたは複製できないようで、エラーが発生します:IDテーブルを拡張できません-メモリが不足しています。

詳細:現在のライブデータベースには約1,400,000のドキュメントが含まれていますが、すぐに650,000に減らすことができます。さらにいくつかの設計/アーキテクチャ作業を行うことで、これを300,000に減らすことができます。このWebアプリケーションは5台のサーバーにクラスター化されています。1台はアプリケーションの「ハブ」であり、3台のHTTP \ SSOサーバーがリバースプロキシの背後にあり、5台目のサーバーが外部サービスのアクセスポイントです。HUBは30分ごとにPUSH\PULLレプリケーションを開始し(ドキュメントの制限なし)、ログにはレプリケーションエラーは表示されません。トランザクションログはサーバーのランタイムパフォーマンスに設定され、バックアップはクラスター内にない別のバックサーバーで実行されます。1日に約1,500のドキュメントをアーカイブするアーカイブを毎日実行しています。

これまでのところ、ほぼ2年が経ち、アプリケーションは正常に実行されています...あちこちでいくつかの悪夢を除けば:-)。しかし、ようやくデータベースを縮小できるようになりました。

作業の前に、OSはライブDBをバックアップし、テストサーバーにコピーしました。テストサーバーで、次のことを行いました。CL copy mylivedb.nsf mycleandb.nsf mycleandb.nsfで、ドキュメントを削除してDBを650,000ドキュメントに減らしました。

私が求めているのはレプリカではなく新しいコピーだけです。以下のレプリカの問題を参照してください。別のコマンドを発行しました...削除スタブなしで新しいコピーを取得するには、COPYがdelのスタブをコピーしないことを理解しています。 :CL copy mycleandb.nsf mycleandbNEW.nsf ...これにより、不正なレプリカがネットワーク上に存在する場合でも、ドキュメントがすべて戻されないようになります(すべてのサーバーが8.5.3であるとは限らないため、 tデータベースプロパティを使用して、削除スタブの締め切り日を設定します)

しかし、私は次のことをしました:IDテーブルを拡張できません-メモリが不足しています。これを試しました:CLコピーmycleandb.nsf mycleandbNEW.nsfREPLICA...同じこと。

mycleandb.nsfに対してここで見つかった手順を試してみました: http ://www-01.ibm.com/support/docview.wss?uid =swg21220384 ...同じこと。

ここで説明するように、パージ間隔を0日に変更し、パージ日も将来に設定します: http ://www-01.ibm.com/support/docview.wss?uid=swg21095683 ...同じこと。

次に、次のコマンドを実行しました。compact mycleandb.nsf-B...同じことをロードします。

私はここでこのスレッドを見ましたが、これは同様の状況ですが、クラスタリング\レプリケーションに問題はありません...まだです! http://www-10.lotus.com/ldd/nd85forum.nsf/DateAllFlatWeb/74d3e0f5467f843885257aaf0081abe5?OpenDocument

だから、私はドキュメントを削除したDBを持っています、それを開くことができます、それは機能しているように見えますが、それをコピー/複製することはできません。

レプリケーション\クラスターの問題:以前にこのエラーが発生しました:IDテーブルを拡張できません-メモリが不足しています...そして私が行ったことは、プライマリサーバーの1つを削除し、OSが問題のあるサーバーにDBをコピーし、再起動することです。

私は常にAdminClient\ Domコンソールを使用して新しいレプリカを作成しましたが、この場合、データベースをドキュメントで溢れさせますが、パージ間隔はすべてのサーバーで正しいです。新しいレプリカはHUBサーバーから作成されました。HUBサーバーは、30分ごとにすべてのクラスターメイトとのPUSH \ PULLレプリケーションを開始します。したがって、これが削除スタブの問題である場合、それは常に現れますか?

明日NotesPeekを実行して、削除スタブがまだ残っているかどうかを確認しますが、続行する方法がわかりません。

感謝の気持ちを込めてコメントや提案をいただきました。

4

2 に答える 2

2

私の経験では、変更されたドキュメントとスタブの合計数が多すぎると、実際に削除スタブをパージする Domino のコードは機能しません。これはおそらく Notes API の内部にかなり深い制限であり、使用する必要があるアルゴリズム (パージ間隔の日付より前に変更されたすべてのメモを調べること) と組み合わせると、非常に大きな数になる可能性があると思います。

最良のオプションは、ローカルの非レプリカ コピーを作成して再デプロイすることです。

これは昔調べました。Notes C API 呼び出しを使用して、さまざまなブログに投稿された削除スタブをパージする LotusScript コードを見つけました。(元のコードは 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

私は試したことはありませんが、このコードを変更して、最新の 1 日分のスタブを検索し、それらを削除してから、さらに 1 日戻って最新のスタブを取得し、削除することができるかもしれないということも思いつきました。ただし、C の TIMEDATE 構造体を通貨フィールドとして処理する必要があることを考えると、LotusScript で行うのはそれほど簡単ではないかもしれません。もちろん、最新のスタブを最初に削除することは、実際にやりたいこととは正反対ですが、この戦略は idtables の制限を回避する可能性があります。

于 2012-12-10T17:47:34.133 に答える