SQL Server på svenska
En svensk blogg om SQL Server, skriven på svenska. Kodexempel, fördjupningar och reflexioner på vad som händer i SQL Server-världen
Installation av SQL Server 2005 hänger sig
Försök och fånga


.NET (1) BLOB (1) Bloggen (2) DBA (2) Design (1) Felhantering (1) Installation (1) Optimering (4) Säkerhet (1) SQL Server 2000 (2) SQL Server 2005 (2) SQL Server 2008 (1)


 Tuesday, April 15, 2008
Installation av SQL Server 2005 hänger sig

När man installerar SQL Server 2005 kan man få problem med att installationen verkar "hänga sig" medan den gör "Setting File Security". Tittar man i loggen är det sista den gör något i stil med "Write_sqlFileSDDL".

I själva verket har inte installationen hängt sig. Den tar bara EXTREMT lång tid på sig att hoppa till nästa steg. Problemet beskrivs av Microsoft i en KB-artikel (http://support.microsoft.com/kb/910070) som Active Directory-relaterat. Om domänen har många trust-relationer med andra domäner kan det ta lång tid att göra uppslag i katalogen. Det verkar stämma med min erfarenhet. Jag har stött på problemet då jag installerat SQL Server 2005 på maskiner som ingår i ett stort Active Directory, spritt över flera kontor, med ibland så långsam uppkoppling som 128kbit/s.

Det finns en Hotfix att hämta från Microsoft. Det finns också en "Workaround" listad i samma KB-artikel, som funkade bra för mig. Den går ut på att helt enkelt inaktivera nätverkskortet en stund, så att SQL Server-installationen kan förstå att den inte kommer att hitta en AD-resurs, och istället gå vidare med livet och slutföra installationen.

Ett problem med att inaktivera ett nätverkskort kan förstås vara att man gör sin installation på en server som man inte har fysisk tillgång till. Det kan upplevas som lite svårt att logga in med Remote Desktop om man har inaktiverat nätverket på servern... Det kan man lösa genom att köra ett command-script som inaktiverar nätverkskortet, pausar en stund och sedan aktiverar nätverkskortet.

Syntaxen för att inaktivera och aktivera nätverkskort varierar från version till version av Windows. I Windows Server 2003 ser det ut såhär:

netsh interface set interface "Local Area Connection" DISABLED

och

netsh interface set interface "Local Area Connection" ENABLED

Då återstår alltså bara att lägga till "pausa en stund" så har vi en färdig bat- eller cmd-fil som gör vad vi vill. Men det är dessvärre inte "bara" att pausa ett script. PAUSE-kommandot som finns i Windows pausar i väntan på att användaren ska trycka på en tangent. Det är inte dirket användbart när vi vill använda vårt script för att inaktivera ett nätverkskort, pausa och sen aktivera. Det blir svårt att trycka på en tangent när ens fjärranslutning kopplats ned så att man inte längre kommer åt maskinen som scriptet körs på... Lyckligtvis finns det andra saker man kan göra för att pausa ett script. Jag har använt mig av "ping 127.0.0.1", dvs att pinga "loopback interfacet" (svensk översättning någon?).

Ett helt script kan alltså se ut såhär:

REM Inaktivera nätverkskort
netsh interface set interface "Local Area Connection" DISABLED
REM Pausa cirka 10 sekunder
ping -n 10 127.0.0.1
REM Aktivera nätverkskort
netsh interface set interface "Local Area Connection" ENABLED

Intressant?
Andra bloggar om Installation, netsh, SQL Server 2005

Comments [0]   Kategorier: Installation | SQL Server 2005

 Thursday, March 27, 2008
Försök och fånga

En för mig välkommen nyhet som introducerades i SQL Server 2005 är felhantering genom TRY/CATCH.

Innan TRY/CATCH såg felhantering typiskt ut något i den här stilen (lite förenklat):

 

--create table tabell (fält varchar(10))

DECLARE @error int
SET @error=0
BEGIN TRAN
INSERT INTO tabell (fält) VALUES('abcde12345abcde12345')
SET
@error=@@error
IF @error>0
BEGIN
      PRINT @error
      ROLLBACK TRAN
      GOTO PROC_EXIT
END

INSERT INTO tabell (fält) VALUES('abcdefghijabcdefghij')
SET
@error=@@error
IF @error>0
BEGIN
      PRINT @error
      ROLLBACK TRAN
      GOTO PROC_EXIT
END

I
NSERT INTO tabell (fält) VALUES('12345678901234567890')
SET
@error=@@error
IF @error>0
BEGIN
      PRINT @error
      ROLLBACK TRAN
      GOTO PROC_EXIT
END

COMMIT TRAN

PROC_EXIT:

Med TRY/CATCH är det kortare och i min mening betydligt mer lättförståligt:

BEGIN TRY
BEGIN TRAN

INSERT INTO tabell (fält) VALUES('12345678901234567890')
      INSERT INTO tabell (fält) VALUES('abcdefghijabcdefghij')
      INSERT INTO tabell (fält) VALUES('abcde12345abcde12345')
COMMIT
TRAN
END TRY
BEGIN CATCH
      IF @@TRANCOUNT>0
            ROLLBACK TRAN
      PRINT ERROR_MESSAGE()
END CATCH

En avgörande skillnad finns mellan "gamla" och "nya" sättet att felhantera: Med TRY/CATCH kastas inga fel till klienten, så det kan definitivt vara läge att slänga in en RAISERROR i sitt CATCH-block.

Intressant?
Andra bloggar om SQL Server, SQL Server 2005, Felhantering

Comments [0]   Kategorier: Felhantering | SQL Server 2005


Top Datorer bloggar
Bloggar.Topplista.se - topplistan med de b�sta bloggarna - l�gg till din blogg du ocks�!
BlogRankers.com
Bloggtoppen.se
Datorer
BloggRegistret.se




Total Posts: 14
This Year: 2
This Month: 0
This Week: 0
Comments: 64