Datenbank Spiegelung im Microsoft SQL Server 2005
Die Spiegelung einer SQL Server 2005 Datenbank ist eine einfache Möglichkeit zur Erstellung einer Standby-Datenbank. Im Gegensatz zum Log-Shipping ist die Erstellung und Wartung eines Datenbankspiegels sehr einfach und bietet darüberhinaus erweiterte Möglichkeiten.
Hinweis: die aktuelle Implementierung der Datenbank Spiegelung wird von Microsoft als experimentell eingestuft! Die finale Version wird im ersten Halbjahr 2006 verfügbar.
Vor der Theorie soll zuerst die Praxis stehen. Im Anschluss daran werden die theoretischen Grundlagen zur Datenbank Spiegelung erarbeitet. In unserem Szenario werden drei SQL Server Instanzen verwendet:
- Der Principal Server verwaltet die zu spiegelnde Datenbank (SQLLaunchVPC\SQLDev01)
- Der Mirror Server verwaltet den Datenbankspiegel (SQLLaunchVPC\SQLDev02)
- Der Witness Server kontrolliert die Spiegelung (SQLLaunchVPC\SQLExpress)
Alle drei Instanzen befinden sich auf einem Server. Der Witness Server ist eine SQL Server 2005 Express Edition.
Hinweis: Sofern der Mirror Server ausschließlich für die Bereitstellung der Standby Datenbank verwendet wird ist keine zusätzliche SQL Server Lizenz notwendig! (Diese Aussage ist wie immer in Lizenzfragen ohne Gewähr!)
Zur Erstellung eines Datenbankspiegels werden die folgenden Schritte durchgeführt:
- Erstellung eines Endpoints auf dem Prinzipal Server (CREATE ENDPOINT)
- Erstellung eines Endpoints auf dem Mirror Server (CREATE ENDPOINT)
- Erstellung eines Endpoints auf dem Witness Server (CREATE ENDPOINT)
- Wiederherstellungsmodel der zu spiegelnden Datenbank setzen (ALTER DATABASE)
- Erstellung einer Datenbanksicherung der zu spiegelnden Datenbank auf dem Principal Server (BACKUP DATABASE)
- Restore der Datenbanksicherung auf dem Mirror Server (RESTORE DATABASE)
- Erstellung einer Transaktionsprotokollsicherung der zu spiegelnden Datenbank auf dem Principal Server (BACKUP LOG)
- Restore der Transaktionsprotokollsicherung auf dem Mirror Server (RESTORE LOG)
- Erstellen einer Beziehung zwischen Mirror und Principal in der gespiegelten Datenbank auf dem Mirror Server (ALTER DATABASE)
- Erstellen einer Beziehung zwischen Principal und Mirror in der zu spiegelnden Datenbank auf dem Principal Server (ALTER DATABASE)
- Erstellen einer Beziehung zwischen Principal und Witness in der zu spiegelnden Datenbank auf dem Principal Server (ALTER DATABASE)
- Kontrolle des Status über die Abfrage der Systemtabelle sys.database_mirroring
Erstellung der Endpunkte
Die Kommunikation zwischen dem Prinzipal Server, dem Mirror Server und dem Witness Server erfolgt über einen dedizierten TCP Kanal. Hierzu müssen die entsprechenden Endpunkte in den drei SQL Server Instanzen definiert werden.
Hinweis: da alle drei Instanzen auf einem Server verwaltet werden müssen unterschiedliche Ports verwendet werden. In einem "echten" Szenario würden die Instanzen auf verschiedenen Servern verwaltet, so das gleiche Ports verwendet werden können!
Zur Erstellung der Endpunkte öffnen Sie im SQL Server Managament Studio ein neues Query Window und führen das folgende Skript aus. Achten Sie drauf das der SQLCMD Modus eingeschaltet ist (die Zeilen mit der Anweisung :CONNECT müssten dann grau hinterlegt dargestellt werden).
:CONNECT SQLLaunchVPC\SQLDev01
USE AdventureWorks
CREATE ENDPOINT Mirroring
STATE=STARTED
AS TCP (LISTENER_PORT=5091)
FOR DATABASE_MIRRORING (ROLE=ALL)
GO
:CONNECT SQLLaunchVPC\SQLDev02
CREATE ENDPOINT Mirroring
STATE=STARTED
AS TCP (LISTENER_PORT=5092)
FOR DATABASE_MIRRORING (ROLE=ALL)
GO
:CONNECT SQLLaunchVPC\SQLExpress
CREATE ENDPOINT Mirroring
STATE=STARTED
AS TCP (LISTENER_PORT=5090)
FOR DATABASE_MIRRORING (ROLE=ALL)
GO
Erstellen des Datenbankspiegels
Der Datenbankspiegel wird über eine Datenbanksicherung erzeugt. Hierzu wird zunächst eine Vollsicherung der zu spiegelnden Datenbank auf dem Principal Server erzeugt und auf dem Mirror Server eingespielt. Da dieser Vorgang je nach Datenbankgröße einige Zeit in Anspruch nehmen kann wird nach der Wiederherstellung das Transaktionsprotokoll der zu spiegelnden Datenbank auf dem Principal Server gesichert und auf dem Mirror Server eingespielt.
Hinweis: die Wiederherstellung der Sicherungen auf dem Mirror Server müssen immer mit der Option NORECOVERY erfolgen! Die zu spiegelnde Datenbank muss im Wiederherstellungsmodel "Vollständig" betrieben werden.
:CONNECT SQLLaunchVPC\SQLDev01
ALTER DATABASE [AdventureWorks] SET RECOVERY FULL WITH NO_WAIT
GO
BACKUP DATABASE [AdventureWorks]
TO DISK = 'C:\Backup\AdventureWorks_dump.bak'
WITH INIT
GO
:CONNECT SQLLaunchVPC\SQLDev02
RESTORE DATABASE [AdventureWorks]
FROM DISK = 'C:\Backup\AdventureWorks_dump.bak'
WITH
MOVE 'AdventureWorks_Data' TO
'C:\Program Files\Microsoft SQL Server\MSSQL.4' +
'\MSSQL\Data\AdventureWorks_Data.mdf',
MOVE 'AdventureWorks_Log' TO
'C:\Program Files\Microsoft SQL Server\MSSQL.4' +
'\MSSQL\Data\AdventureWorks_Log.ldf',
NORECOVERY, REPLACE
:CONNECT SQLLaunchVPC\SQLDev01
BACKUP LOG [AdventureWorks]
TO DISK = 'C:\Backup\AdventureWorksLog_Dump.bak'
WITH INIT
GO
:CONNECT SQLLaunchVPC\SQLDev02
RESTORE LOG [AdventureWorks]
FROM DISK = 'C:\Backup\AdventureWorksLog_Dump.bak'
WITH NORECOVERY
GO
Beziehungen herstellen, Spiegelung starten
ALs letzter Schritt müssen nun die Beziehungen zwischen den Instanzen aufgebaut werden. Der Mirror Server muss den Principal Server kennen und umgekehrt und der Principal Server kennt den Witness Server.
:CONNECT SQLLaunchVPC\SQLDev02
ALTER DATABASE AdventureWorks
SET PARTNER = 'TCP://SQLLaunchVPC:5091'
GO
:CONNECT SQLLaunchVPC\SQLDev01
ALTER DATABASE AdventureWorks
SET PARTNER = 'TCP://SQLLaunchVPC:5092'
GO
ALTER DATABASE AdventureWorks
SET WITNESS = 'TCP://SQLLaunchVPC:5090'
GO
Abfragen des Status
Nun kann der Status der Spiegelung durch Abfrage der Systemtabelle sys.database_mirroring festgestellt werden.