Database Mirroring och SQL login

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Ok, antag att du har bestämt dig för att säkra upp din databas och tänker använda Database Mirroring.

Du förbereder databaserna (primär och spegel), konfigurerar speglingen, startar den och allt är frid och fröjd, applikationen fungerar fint och databaserna är speglade.

Det naturliga efter detta är att man vill testa speglingen. Sagt och gjort, du initierar en failover och förväntar dig att allt skall fungera problemfritt. Dock händer det som inte får hända: Applikationen får inte kontakt med databasen igen. Vad kan ha gått fel?

En orsak av flera tänkbara är att, om applikationen använder sig av SQL logins, måste dessa skapas på både primär och spegel med samma SID. Anledningen är att när man skapar ett login så genererar SQL Sever automatiskt en ny SID så även om man har samma loginnamn på två olika servrar får dessa olika SID och därmed matchar ej loginen mellan servrarna med resultatet att applikationen tappar kontakten med databasen vid failover.

Detta görs enklast genom att först skapa loginet på den primära servern och sedan skapa loginet på spegelservern med samma SID. För att ta reda på vilken SID som skapats för loginet kan man köra följande på den primära servern:

SELECT SID FROM sys.sql_logins WHERE NAME = ‘LoginNamn’ Sedan måste man skapa samma login på spegelservern enl följande: CREATE LOGIN <LoginNamn> WITH PASSWORD = <Lösenord>, SID = <SID från den primära servern>

Detta är inget problem om man har login som är Windows användare/grupp eftersom loginet skapas med en SID baserad på Windows användaren/gruppen i Active Directory och således är samma för båda servrarna.

Som alltid är det rekommenderat att applikationer använder Windows konton vid uppkoppling mot databasen men verkligheten stämmer inte alltid överens med ens önskningar.