
Automatically running a Fixup on Corrupt databases
by
Paul Farris
on Sun 20 Sep 2009 09:04 BST
Sometimes the Compact task will fail to complete due to a problem with the structure of a database. This can usually be fixed by manually running a Fixup command, at the Admin Console, which will correct the problem with the database corruption.
This is a manual process which will need to be carried out by the Domino Administrator. To prevent the admin having to do this I have written the Lotusscript agent below which can be put into a database, on a server in the Domain, to execute automatically.
- Create a new blank database on your Domino server.
- Create a new agent from the Designer.
- Set the agent type as Lotusscript.
- Copy and paste the Lotusscript below into the code window.
| %REM Agent Auto Fixup Created Aug 2009 by Paul Farris Description: Agent to automatically run a remote fixup command. %END REM Option Public Option Declare Sub Initialize() Dim session As New NotesSession Dim db As NotesDatabase Dim doc,doc2 As NotesDocument Dim item As NotesItem Dim unProcessedDocuments As NotesDocumentCollection Dim dc As NotesDocumentCollection Dim contents,substring,servername,consolereturn As String Dim string_start,string_end As Integer Dim result As Variant Dim rti As NotesRichTextItem Dim found As integer Print "Running Auto fixup" Set db = session.CurrentDatabase Set unProcessedDocuments = db.UnprocessedDocuments Set doc = unProcessedDocuments.GetFirstDocument() If Not(doc Is Nothing) Then found=0 Print unProcessedDocuments.Count & " new documents found" Set doc2 = New NotesDocument( db ) Set rti = doc2.CreateRichTextItem("Body") While Not(doc Is Nothing) If doc.Hasitem("Body") And doc.HasItem("EventText") And doc.HasItem("ServerName") Then Set item = doc.GetFirstItem("Body") contents = item.Text string_start = InStr(1,contents, |"|)+1 string_End = InStr(string_start,contents, |"|) substring = Mid$(contents, string_start, string_end-string_start) If string_End>0 Then Print "Found: " & substring servername = doc.ServerName(0) consolereturn = session.SendConsoleCommand(servername, substring) Print consolereturn Call rti.AddNewLine(1) Call rti.AppendText("Sending remote command to " & servername & " for " & StrRightBack(substring," ")) found=found+1 Else Print "Auto Fixup Error - String not found" End If End If Call session.UpdateProcessedDoc(doc) Set doc = unprocessedDocuments.GetNextDocument(doc) Wend If found>0 then doc2.Subject ="Auto Fixup summary" doc2.SendTo = "Notes Administrator/Org" doc2.Form = "Memo" Call doc2.Send(False) End if Else Print "Auto Fixup: No documents found" End If End Sub |
- Set the agent Trigger to “On Event”.
- Select “After Document are created or modified”.
- Set “Runtime Security Level” to “Allow Restricted Operations”.
- Sign the agent with an ID which can run restricted operations on the server.
- Create a mail-in database entry, in the Domain address book, pointing to this database.
- Configure DDM (Domino Domain Monitoring) with an event handler, when the message is “Database is corrupt -- Cannot allocate space”, to send an email to a mail-in database setup previously.
Now whenever a compact fails it will send the email alert, to the database, which will trigger the execution of the agent. The remote commend is sent to the server and an email generated to notify the admin. One less job for a busy admin to do.