E bene si ... di ritorno dalle tanto sospirate ferie mi sono subito dovuto scontrare con un bel problemone! Un istanza di Microsoft ADAM sulla quale si basa un applicazione che gestisco ha iniziato a non funzionare più!

Nei log di ADAM c'erano diversi errori di cui un paio proprio brutti :-|

Event Type: Error
Event Source: ADAM [istanza-adam02] ISAM
Event Category: Database Page Cache
Event ID: 474
Date: 22/08/2006
Time: 11.36.26
User: N/A
Computer: SERVER-ADAM02
Description:
istanza-adam02 (776) ADAMDSA: The database page read from the file "G:\Microsoft ADAM\istanza-adam02\data\adamntds.dit" at offset 1769930752 (0x00000000697f0000) for 8192 (0x00002000) bytes failed verification due to a page checksum mismatch. The expected checksum was 2313748482 (0x89e90002) and the actual checksum was 2394373653 (0x8eb73e15). The read operation will fail with error -1018 (0xfffffc06). If this condition persists then please restore the database from a previous backup. This problem is likely due to faulty hardware. Please contact your hardware vendor for further assistance diagnosing the problem.


Event Type: Error
Event Source: ADAM [istanza-adam02] Replication
Event Category: (5)
Event ID: 2108
Date: 22/08/2006
Time: 11.37.08
User: NT AUTHORITY\ANONYMOUS LOGON
Computer: SERVER-ADAM02
Description:
The description for Event ID ( 2108 ) in Source ( ADAM [istanza-adam02] Replication ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details. The following information is part of the event: CN=mario.rossi,OU=Internet,O=Company,C=it; a6061ced-e215-44c6-b855-d2954b7bd0eb; SERVER-ADAM02.domain.local:5c961d28-e54f-484f-b97a-d33a73980b4f; While accessing the hard disk, a disk operation failed even after retries.; 1127; JET_errReadVerifyFailure, Checksum error on a database page; -1018.



La cosa che più mi preoccupava era che ADAM conteneva "appena" 1.600.000 utenti circa e che non avevo letto d' installazioni con un DIT superiori a 8 Gbyte  :-(

Vabbè penso magari è stato solo un problema momentaneo ... provo a fare una search ldap  ma l'output non è confortante :


***Searching...
ldap_search_s(ld, "OU=Internet,O=Company,C=it", 1, "(CN=sergio.bianchi)", attrList, 0, &msg)
Error: Search: Operations Error. <1>
Server error: 000020EF: SvcErr: DSID-020800E4, problem 5012 (DIR_ERROR), data -1018
Result <1>: 000020EF: SvcErr: DSID-020800E4, problem 5012 (DIR_ERROR), data -1018
Matched DNs:
Getting 0 entries:

 

Metto subito off-line l'istanza visto che ne ho un altra funzionante e penso : "Oh che bello, oggi le emozioni non mancano :-)"

Visto gli errori nei log faccio girare subito i diagnostici forniti dal vendor che testano dischi/raid ma quest' ultimi non evidenziano alcun malfunzionamento.
 

Allora carico subito dsdbutil.exe per l'amministrazione di ADAM da riga di comando per effettuare un integrity check.

Nel  frattempo, visto che ci siamo, incappo anche in un bug documentato di dsdbutil.exe quando si tenta di effettuare operazioni di questo tipo su DIT di grosse dimensioni; bug fortunatamente risolto da una fix rilasciata tempo fà e successivamente inclusa nel Service Pack 1 di Microsoft ADAM rilasciato a Giugnoi e quindi "al volo" mi installo anche la SP1....

 

A questo punto rilancio un Integrity check ma le cose non migliorano :

Doing Integrity Check for db: G:\Microsoft ADAM\istanza-adam02\data\adamntds.dit
Checking database integrity.
Scanning Status (% complete)

0 10 20 30 40 50 60 70 80 90 100
|----|----|----|----|----|----|----|----|----|----|
..................................................

Integrity check completed. Database is CORRUPTED!
Operation terminated with error -1206( JET_errDatabaseCorrupted, Non database file or corrupted db ).
 

Provo allora a lanciare un Checksum :


Checksum Status (% complete)

0 10 20 30 40 50 60 70 80 90 100
|----|----|----|----|----|----|----|----|----|----|
..............ERROR: page 216054 returned page 208848.
ERROR: page 216055 returned page -1156284289.
ERROR: page 216054 checksum failed ( 0xbfc494b6 / 0x597fa688 ).
ERROR: page 216055 checksum failed ( 0x8eb73e15 / 0x89e90002 ).
.....................................

Operation terminated with error -1206( JET_errDatabaseCorrupted, Non database file or corrupted db ).



Insomma la situazione si faceva sempre più ingarbugliata, continuo a controllare un pò di cose  e alla fine mi sono ricordato che fondamentalmente ADAM è in realtà un database o meglio Active Directory in versione "light" e che :


Microsoft Windows 2000 Directory Service is implemented on top of an indexed sequential access method (ISAM) table manager. This table is the same table manager that is used by Microsoft Exchange Server, the file replication service, the security configuration editor, the certificate server, Windows Internet Name Service (WINS), and other Windows 2000 components. The version of the database that Windows 2000 uses is called extensible storage engine (ESENT).
 
ESENT is a transacted database system that uses log files to support rollback semantics to ensure that transactions are committed to the database. Ideally, you should locate data and log files on separate drives to improve performance and to support recovery of the data if a disk fails.
 
The data file is called Ntds.dit. You can use the commands on the Files menu in Ntdsutil to manage the Directory Service data and log files.
 
ESENT provides its own tool called Esentutl.exe that you can use for certain database file management functions. Esentutl.exe is installed in the Winnt\System32 folder. Several of the Ntdsutil file management commands initiate Esentutl, which reduces the need to learn that tool's command-line arguments. If Ntdsutil initiates Esentutl, Esentutl generates a separate window that is configured with a large history so that you can scroll back to see all of the Esentutl progress indicators.

 

"Esentutl.exe" in Windows 2003 è in realtà invocato da NTDSUtil.exe quando si usano comandi di compact , recovery per il database di AD; copio subito Esentutl.exe nella direcotry di ADAM e lo lancio in modalità recover e magicamente :


Performing soft recovery...


operation completed successfully


Ho fatto ripartire l'istanza ed è ritornato tutto online!

http://technet2.microsoft.com/WindowsServer/en/library/91559a2b-b666-442c-bdd2-df4b7c46983c1033.mspx?mfr=true

Altre informazioni su ADAM potete trovarle in questo articolo che ho pubblicato tempo fà :

http://www.sysadmin.it/pages/guide/guide.asp?ID=79&titolo=Active%20Directory%20in%20Application%20Mode%20%20/%20parte%201a


Insomma tutto è bene quello che finisce bene ...

un pò come diceva il Sig. "Rezzonico" della TV Svizzera in Mai dire GOL dopo essere stato salvato dal polizziotto "Uber" :-) 

Potevo rimanere offeso eh! ;-)