SQL 2000 Cluster en startup parameters

Wow, na dit weekend heb ik weer een hoop geleerd van SQL server….

Wat nou als je de SQL service start en hij klapt er direct weer uit. Zeker wanneer je een Move group doet op een SQL Cluster en hij faalt direct, ook wanneer je de SQL resource weer terugplaatst naar de originele node en wederom niet opstart. De Event Viewer geeft wazige meldingen zoals:

  • Event ID 1000: Faulting application sqlservr.exe, version 2000.80.2039.0, faulting module msvcr71.dll, version 7.10.3052.4, fault address 0x00011da1.
  • Event ID 17052: [sqsrvres] StartResourceService: Failed to start MSSQLSERVER service.  CurrentState: 1
  • Event ID 17052: [sqsrvres] OnlineThread: ResUtilsStartResourceService failed (status 435)
  • Event ID 17052: [sqsrvres] OnlineThread: Error 435 bringing resource online.

Met deze events kun je weinig, ook googlen helpt weinig… Goed, dan wordt het tijd om eens goed te kijken naar wat er misgaat. We starten een cmd sessie en starten het SQLservr.exe process, we krijgen de volgende melding:

2007-12-17 10:15:24.24 server    Microsoft SQL Server  2000 – 8.00.2039 (Intel X86)
        May  3 2005 23:18:38
        Copyright (c) 1988-2003 Microsoft Corporation
        Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

2007-12-17 10:15:24.24 server    Copyright (C) 1988-2002 Microsoft Corporation.

2007-12-17 10:15:24.24 server    All rights reserved.
2007-12-17 10:15:24.24 server    Server Process ID is 352.
2007-12-17 10:15:24.24 server    Logging SQL Server messages in file ‘C:Program FilesMicrosoft SQL ServerMSSQLlogERRORLOG’.
2007-12-17 10:15:24.25 server    SQL Server is starting at priority class ‘normal'(4 CPUs detected).
2007-12-17 10:15:24.36 server    Using ‘dbghelp.dll’ version ‘4.0.5’
*Stack Dump being sent to C:Program FilesMicrosoft SQL ServerMSSQLlogSQLDump0001.txt
2007-12-17 10:15:24.39 server    SqlDumpExceptionHandler: Process 132 generated fatal exception c0000094 EXCEPTION_INT_DIVIDE_BY_ZERO. SQL Server is terminating this process.
* ******************************************************************************
*
*
* BEGIN STACK DUMP:
*   12/17/07 10:15:24 spid 0
*
*   Exception Address = 006CE3EB (SQLExit + 001668F4 Line 0+00000000)
*   Exception Code    = c0000094 EXCEPTION_INT_DIVIDE_BY_ZERO
*
*  MODULE                          BASE      END       SIZE
* sqlservr                       00400000  00CBAFFF  008bb000
* ntdll                          7C800000  7C8BFFFF  000c0000
* kernel32                       77E40000  77F41FFF  00102000
* Invalid Address                77F50000  77FEBFFF  0009c000
* Invalid Address                77C50000  77CEEFFF  0009f000
* Invalid Address                7C3A0000  7C41AFFF  0007b000
* MSVCR71                        7C340000  7C395FFF  00056000
* opends60                       41060000  41065FFF  00006000
* SHELL32                        7C8D0000  7D0D2FFF  00803000
* GDI32                          77C00000  77C47FFF  00048000
* USER32                         77380000  77411FFF  00092000
* msvcrt                         77BA0000  77BF9FFF  0005a000
* SHLWAPI                        77DA0000  77DF1FFF  00052000
* sqlsort                        42AE0000  42B6FFFF  00090000
* ums                            41070000  4107DFFF  0000e000
* comctl32                       77420000  77522FFF  00103000
* sqlevn70                       41080000  4108AFFF  0000b000
* dbghelp                        02800000  028FFFFF  00100000
*
*        Edi: 00000000:
*        Esi: 00C45E80: 00032760  01110000  01DF0000  00000012  0003FFFF  000278DD
*        Eax: 00000000:
*        Ebx: 00000001:
*        Ecx: 00000000:
*        Edx: 00000000:
*        Eip: 006CE3EB: 25E9F1F7  85FFD45B  61850FFF  6AFFD45B  E8CE8B00  FFD45A1C
*        Ebp: 000AF800: 000AF81C  0041401F  00000001  00000000  00000000  00000000
*      SegCs: 0000001B:
*     EFlags: 00010246: 00730065  00430000  004D004F  00550050  00450054  004E0052
*        Esp: 000AF7D8: 00000000  00C4E0E8  00000001  0000001C  000AF804  00000000
*      SegSs: 00000023:
* ******************************************************************************
*
* —————————————————————
—————

* Short Stack Dump
* 006CE3EB Module(sqlservr+002CE3EB) (SQLExit+001668F4)
* 0041401F Module(sqlservr+0001401F)
* 00414078 Module(sqlservr+00014078)
* 0041566B Module(sqlservr+0001566B)
* 005A09C9 Module(sqlservr+001A09C9) (SQLExit+00038ED2)
* 005655F8 Module(sqlservr+001655F8)
* 005B26DA Module(sqlservr+001B26DA) (SQLExit+0004ABE3)
* 005B37AB Module(sqlservr+001B37AB) (SQLExit+0004BCB4)
* 77E523CD Module(kernel32+000123CD) (IsProcessorFeaturePresent+0000009E)
* ——————————————————————————-

2007-12-17 10:15:29.97 server    Stack Signature for the dump is 0x2514D343
2007-12-17 10:15:29.99 server    SQL Server is aborting. Fatal exception c0000094 caught.

Goed, nou niet echt. Op een SQL cluster met zo’n 150GB aan database breekt het zweet mij dan toch wel enigszins uit EEK

Ik begin dan met troubleshooten:

  • Databases en logs verplaatsen (buiten systeem databases; zoals master, tempdb, pubs, model etc.), controleren en helaas…
  • Vervangen van systeem databases, controleren en helaas…
  • Verplaatsen van de master.mdf en mastlog.ldf, controleren en hé een andere melding:

2007-12-17 10:53:49.32 server    Microsoft SQL Server  2000 – 8.00.2039 (Intel X86)
        May  3 2005 23:18:38
        Copyright (c) 1988-2003 Microsoft Corporation
        Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

2007-12-17 10:53:49.32 server    Copyright (C) 1988-2002 Microsoft Corporation.

2007-12-17 10:53:49.32 server    All rights reserved.
2007-12-17 10:53:49.32 server    Server Process ID is 2000.
2007-12-17 10:53:49.33 server    Logging SQL Server messages in file ‘C:Program FilesMicrosoft SQL ServerMSSQLlogERRORLOG’.
2007-12-17 10:53:49.33 server    initconfig: Error 2(The system cannot find the file specified.) opening ‘C:Program FilesMicrosoft SQL ServerMSSQLdatamaster.mdf’ for configuration information.

Oké, dit is positief, ja positief, want dit zou dan wel eens in de opstartparameters van SQL kunnen zitten (Startup Parameters). En inderdaad wanneer ik het register open en de key ‘HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerMSSQLServerParameters’ bekijk zie ik inderdaad iets vreemds: de SQLArg3 string met een waarde ‘-P’. Volgende stap is een export maken van de register key en de waarde SQLArg3 verwijderen. YES, binnen de cmd start de SQL server weer op! Maar goed, nu het Cluster nog, via de Cluster Manager de SQLService resource, Bring online en helaas… Hij faalt direct! En de register waarde SQLArg3 is weer terug… Ok, maar hoe verwijder je nou die opstartparameters dan van een Cluster resource? Ik vermoedde op dat moment dat dit door de Quorum (het hart van Windows Cluster) geregeld zou worden. Nou eerlijk gezegd heb ik daar een beetje hulp bij nodig…. Na een paar uur had ik een goede SQL specialist bij Microsoft te pakken. Hij vertelde me het volgende:

  • Ga naar het register en de volgende key: ‘HKEY_LOCAL_MACHINEClusterResources’
  • Zoek daar de GUID met als inhoud Name – SQL Server
  • Onthou het nummer met de waarde: ‘SOFTWAREMicrosoftMSSQLSERVERMSSQLSERVER’
  • Ga naar je Quorum schijf, MSCSGUID en verwijder daar (na eerst een back-up gemaakt te hebben) het bestand met het nummer.cpt
  • Verwijder de SQLArg3 waarde
  • Breng SQL Server, via het Cluster, weer online

WERKEN DUS!

Cool Wink… Maar wel een héél eng en bizar probleem. Het wordt nog een stapje erger… In onze ontwikkel omgeving heb ik de SQL start-up parameters bekeken, en hé daar staat hij ook: ‘-p’. Maar na een herstart van de SQL Service start de SQL service gewoon, zonder problemen! Ok, vaag?! Dan maak ik er maar voor de grap ‘-P’ van en ja hoor: hij gaat net zo hard onderuit als het op Cluster.

Nou zou ik graag willen weten wat de ‘-p’ switch doet, iemand? De SQL specialist van Microsoft had ook geen idee…

Ok, ik heb nagevraagd wat de -P switch doet en dat is het volgende:

From what I understand and have found the -P startup parameter is used to simulate a specific number of processors for SQL Server regardless of the actual number that exist on the computer. For example if the computer only has 1 processor and -P4 is in the startup parameters then SQL Server acts as if there are 4 processors on the box instead of only 1.

Daniel
http://www.pepperbyte.com