File Leggimi relativo al failover del mirroring (ODBC)
In questo esempio viene illustrata la funzionalità di failover del mirroring disponibile in SQL Server 2005 SP1. L'esempio non è supportato in SQL Server 2005 Express Edition (SQL Server Express).
Linguaggi
Nell'esempio viene utilizzato Visual C++.
Prerequisiti
Prima di eseguire questo esempio, verificare che siano installati i prodotti software seguenti:
- SQL Server 2005 incluso Motore di database.
- Gli esempi di Motore di database di SQL Server 2005, inclusi in SQL Server 2005. È possibile scaricare la versione più recente degli esempi dal Centro per sviluppatori di Microsoft SQL Server.
- .NET Framework SDK 2.0 o Microsoft Visual Studio 2005. È possibile ottenere .NET Framework SDK gratuitamente. Vedere Installazione di .NET Framework SDK. È necessario modificare la variabile di ambiente INCLUDE in modo da includere la directory \Microsoft SQL Server\90\SDK\Include. Se si utilizza Microsoft Visual Studio 2005, è possibile eseguire questa operazione nell'ambiente di sviluppo. Per ulteriori informazioni, vedere Finestra di dialogo Directory di VC++, Progetti e soluzioni, Opzioni.
È inoltre necessario configurare un database mirror per il database principale. Per ulteriori informazioni, vedere How to: Set Large Data (OLE DB) e Risoluzione dei problemi relativi all'impostazione del mirroring del database.
In alternativa, è possibile attivare il mirroring del database nel computer in uso con gli script seguenti. Questi script possono essere eseguiti in SQL Server Management Studio o tramite SQLCMD al prompt dei comandi.
Verifica che il database e gli endpoint utilizzati nell'esempio non siano presenti nell'istanza del server principale
Lo script seguente controlla che il server principale non includa un nome di database o di endpoint utilizzato dall'esempio.
-- Step 1 (on Principal)
-- Return primary server instance to a premirroring state
--
ALTER DATABASE HADB SET PARTNER OFF
DROP DATABASE HADB;
DROP ENDPOINT Mirroring;
EXEC sys.sp_dbmmonitordropmonitoring;
Verifica che il database e gli endpoint utilizzati nell'esempio non siano presenti nell'istanza del server mirror
Lo script seguente controlla che l'istanza del server mirror non includa un nome di database o di endpoint utilizzato dall'esempio.
-- Step 2 (on Mirror)
-- Return mirror server instance to a premirroring state
--
ALTER DATABASE HADB SET PARTNER OFF
RESTORE DATABASE HADB WITH RECOVERY;
DROP DATABASE HADB;
DROP ENDPOINT Mirroring;
Creazione del database e delle relative copie di backup
Questo script viene eseguito sull'istanza del server principale e crea il database e le relative le copie di backup.
-- Step 3 (on Principal)
-- create db and backups
--
USE master;
GO
CREATE DATABASE HADB;
ALTER DATABASE HADB SET RECOVERY FULL;
-- CREATE BACKUPS
BACKUP DATABASE HADB
TO DISK = 'C:\HADB.bak'
WITH FORMAT;
GO
BACKUP LOG HADB
TO DISK = 'C:\HADB.bak';
Creazione del database mirror
Questo script viene eseguito sull'istanza del server che includerà il database mirror e crea il database mirror dalla copia di backup creata con lo script precedente. Se il server mirror e il server principale non si trovano sullo stesso computer fisico, è necessario copiare c:\hadb.bak dal server principale al server mirror.
-- Step 4 (on Mirror)
-- Create the mirror database
RESTORE DATABASE HADB
FROM DISK='C:\HADB.bak'
WITH NORECOVERY, FILE=1,
MOVE 'HADB' TO 'C:\HADB.mdf',
MOVE 'HADB_log' TO 'C:\HADB_log.ldf'
;
RESTORE LOG HADB
FROM DISK='C:\HADB.bak'
WITH NORECOVERY, FILE=2,
MOVE 'HADB' TO 'C:\HADB.mdf',
MOVE 'HADB_log' TO 'C:\HADB_log.ldf'
;
Creazione di un endpoint del mirroring nel server principale
Questo script viene eseguito sull'istanza del server principale e crea un endpoint del mirroring.
-- Step 5 (on Principal)
-- create mirroring endpoint on PRINCIPAL server
--
CREATE ENDPOINT Mirroring
STATE = STARTED
AS TCP(LISTENER_PORT = 7022)
FOR database_mirroring (ROLE = PARTNER);
Creazione di un endpoint del mirroring nell'istanza del server mirror
Questo script viene eseguito sull'istanza del server mirror e crea un endpoint del mirroring.
Per visualizzare il nome del computer e del dominio, ovvero il nome completo del computer, aprire la finestra delle proprietà del computer (in Windows XP, fare clic con il pulsante destro del mouse su Risorse del computer, scegliere Proprietà e visualizzare la scheda Nome computer).
-- Step 6 (on MIRROR)
-- create mirroring endpoint
--
CREATE ENDPOINT Mirroring
STATE = STARTED
AS TCP(LISTENER_PORT = 7023)
FOR database_mirroring (ROLE = PARTNER);
-- also on mirror, set partner to PRINCIPAL server
--(This must be done on mirror first.)
ALTER DATABASE HADB SET PARTNER='tcp://machine_name.domain:7022';
Impostazione del server principale per il server mirror
Questo script viene eseguito sul server principale e specifica il database mirror. È possibile che a questo punto si verifichi un errore se il server principale dispone di un firewall che impedisce le connessioni alla porta 7022. In tal caso, inserire un'eccezione nel firewall per questo numero di porta.
-- Step 7 (on Principal)
-- Set partner to the mirror server on port 7023
--
ALTER DATABASE HADB SET PARTNER='tcp://machine_name.domain:7023';
-- start collecting mirroring history:
USE master;
EXEC sys.sp_dbmmonitoraddmonitoring;
Generazione dell'esempio
Per generare l'esempio, aprire il file Failover.sln in Visual Studio (CTRL+MAIUSC+O) e scegliere Genera soluzione dal menu Genera oppure richiamare MSBUILD dal prompt dei comandi per la soluzione.
Esecuzione dell'esempio
- In Visual Studio richiamare il comando Avvia senza eseguire debug (CTRL+F5).
- Se per la generazione è stato utilizzato MSBuild.exe, richiamare Failover.exe.
- Modificare il server principale e il server mirror nell'interfaccia utente specificando i nomi dei server in uso.
- Fare clic su Init Table. Verrà creata una tabella semplice in cui una delle colonne verrà utilizzata come contatore degli aggiornamenti.
- Fare clic su Connetti.
- Fare clic su Aggiorna per aggiornare la tabella e quindi su Commit per eseguire il commit delle modifiche apportate al database.
- Per forzare il failover manuale, fare clic su Failover.
Osservazioni
A questo punto è possibile fare clic su Connetti, Aggiorna, Commit e Disconnetti. Il valore del campo Count viene incrementato ogni volta che si fa clic su Aggiorna. Se si fa clic su Failover prima di eseguire il commit degli aggiornamenti, ci si disconnette e quindi ci si riconnette, lo stato dell'aggiornamento verrà visualizzato dopo l'ultimo commit. Durante la disconnessione verrà restituito un errore e verrà eseguito il rollback della connessione e della transazione corrente dopo il failover.
Un'applicazione è in grado di rilevare il server a cui si connette e il partner di tale server, se la casella di controllo Rilevamento modifiche è selezionata. Questa impostazione è vantaggiosa, in quanto un'applicazione che aggiorna la propria stringa di connessione si connetterà più probabilmente al server attivo direttamente all'avvio e soprattutto può avere costi di manutenzione a lungo termine nulli. Si supponga che il mirroring del server A venga eseguito da B e che in A si verifichi un errore. B diventa il server attivo. Viene quindi introdotto un nuovo server C come mirror di B. Un'applicazione che richiede A come server principale e B come mirror non riesce a connettersi quando B esegue il failover su C.
Fare clic su Continuous Test e osservare il contatore. Fare quindi clic su Failover a intervalli. Il tempo di failover viene visualizzato (controllare il codice per vedere come viene misurato). Il codice descrive inoltre una semplice logica di failover di alto livello. Se infatti la transazione corrente viene persa, si faranno alcuni tentativi per ristabilire la connessione, tre in questo caso, e si ripeterà la transazione non riuscita o la si segnalerà all'utente.
Sono disponibili alcuni pulsanti che consentono di ottenere un'impostazione client corrente per l'alias ActiveServer e per impostare questo alias nel server attivo corrente. Se si utilizza un alias con script e utilità, è possibile utilizzare SMO per aggiornarlo dopo il failover. Le utilità e gli script si connetteranno quindi al nuovo server attivo.