I created a series of batch files and SQL scripts to do the steps below. I only included the scripts for the mirroring stuff but the other referenced SQL scripts are pretty basic SQL commands (except the restore database script, that one is kind of tricky due to how I've implemented it) and creating them will give you an opportunity to change the SQLCMD mode variables. If you want to Direct Message me on twitter (@jcumberland) with your email address I can send you the full set of scripts. I have removed the full paths on the file names as well.
- sets recovery mode for database
- removes mirroring
- remove mirror database
- backup database
- backup log
- copies bak file
- copies trn file
- restores database backup
- restores log backup
- deletes bak file
- deletes trn file
- set up mirroring between the principal and mirror
/*------------------------------------------------------*/
-- REPLACE THESE VALUES
/*------------------------------------------------------*/
/*------------------------------------------------------*/
-- BATCH FILE 1, CALLS UTILITY BATCH FILE
/*------------------------------------------------------*/
@echo off
set PRIMARYHOST=
set MIRRORHOST=
set INST=
set DRIVE=
set DRTARGETDIR="%DRIVE%:\MSSQL.1\MSSQL\DATA\"
set LOGDIR="%DRIVE%:\MSSQL.1\MSSQL\DATA\"
set PORT=
set PRIMARYINST=%PRIMARYHOST%\%INST%
set MIRRORINST=%MIRRORHOST%\%INST%
@echo on
call drdbsetup.bat %PRIMARYHOST% %MIRRORHOST% %PRIMARYINST% %MIRRORINST% %DRIVE% %DRTARGETDIR% %PORT% %LOGDIR%
pause
/*------------------------------------------------------*/
-- BATCH FILE 2 - CALLS THE SQL SCRIPTS
/*------------------------------------------------------*/
rem -- set recovery mode to full
sqlcmd /E /S%3 -i SetRecoveryMode.sql -v DATABASE="%8"
rem -- remove mirroring
sqlcmd /E /S%3 -i MirroringRemove.sql -v DATABASE="%8"
sqlcmd /E /S%4 -i MirroringRemoveMirror.sql -v DATABASE="%8"
rem -- full backup
sqlcmd /E /S%3 -i BackupDatabaseFull.sql -v BACKUPPATH="%5:\" -v DATABASE=%8
rem -- log backup
sqlcmd /E /S%3 -i BackupDatabaseLog.sql -v BACKUPPATH="%5:\" -v DATABASE=%8
rem -- copy backup files to mirror
copy \\%1\%5$\*.bak %6 /y
copy \\%1\%5$\*.trn %6 /y
rem -- remove backup files from primary
del \\%1\%5$\*.bak
del \\%1\%5$\*.trn
rem -- restore database from backup directory
sqlcmd /E /S%4 -i RestoreDatabase.sql -v BKDIR=%6 -v DATADIR=%6 -v LOGDIR=%9
rem -- restore database log
sqlcmd /E /S%4 -i RestoreLog.sql -v BACKUPPATH=%6 -v DATABASE=%8
rem -- remove backup files from mirror
del %6\*.bak
del %6\*.trn
rem -- set up mirroring
sqlcmd /E /S%4 -i MirroringSetup.sql -v PRINCIPAL="%3" -v MIRROR="%4" -v PRINCIPAL_DNS="%1." -v MIRROR_DNS="%2.yourdomain.local" -v DATABASE_NAME="%8" -v PORT=%7
/*------------------------------------------------------*/
-- MirroringSetup.sql
/*------------------------------------------------------*/
/*-----------------------------------------------------*/
-- run on principal
/*-----------------------------------------------------*/
:connect $(PRINCIPAL)
GO
-- creates endpoint
if not exists (select * from sys.endpoints where name = 'Mirroring')
begin
CREATE ENDPOINT Mirroring
AUTHORIZATION []
STATE = STARTED AS TCP (
LISTENER_PORT = $(PORT)
,LISTENER_IP = ALL
)
FOR DATA_MIRRORING (
ROLE = PARTNER
,AUTHENTICATION = WINDOWS NEGOTIATE
,ENCRYPTION = REQUIRED ALGORITHM RC4
)
end
go
/*-----------------------------------------------------*/
-- run on mirror
/*-----------------------------------------------------*/
:connect $(MIRROR)
GO
-- creates endpoint
if not exists (select * from sys.endpoints where name = 'Mirroring')
begin
CREATE ENDPOINT Mirroring
AUTHORIZATION []
STATE = STARTED AS TCP (
LISTENER_PORT = $(PORT)
,LISTENER_IP = ALL
)
FOR DATA_MIRRORING (
ROLE = PARTNER
,AUTHENTICATION = WINDOWS NEGOTIATE
,ENCRYPTION = REQUIRED ALGORITHM RC4
)
end
go
-- Sets up mirror partnership
ALTER DATABASE [$(DATABASE_NAME)] SET PARTNER = N'TCP://$(PRINCIPAL_DNS):$(PORT)'
go
-- Removes mirror monitoring
if exists (select * from msdb..sysjobs where [name] ='Database Mirroring Monitor Job')
begin
EXEC sp_dbmmonitordropmonitoring
end
go
-- Sets up mirror monitoring
EXEC sys.sp_dbmmonitoraddmonitoring -- default is 1 minute
go
/*-----------------------------------------------------*/
-- run on principal
/*-----------------------------------------------------*/
:connect $(PRINCIPAL)
GO
-- Sets up mirror partnership
ALTER DATABASE [$(DATABASE_NAME)] SET PARTNER = N'TCP://$(MIRROR_DNS):$(PORT)'
go
-- Removes mirror monitoring
if exists (select * from msdb..sysjobs where [name] ='Database Mirroring Monitor Job')
begin
EXEC sp_dbmmonitordropmonitoring
end
go
-- Sets up mirror monitoring
EXEC sys.sp_dbmmonitoraddmonitoring -- default is 1 minute
go
/*------------------------------------------------------*/
-- DRMirroringRemove.sql
/*------------------------------------------------------*/
if exists ( select * from sys.database_mirroring where db_name(database_id) = '$(DATABASE)' and mirroring_guid is not null )
begin
ALTER DATABASE [$(DATABASE)] SET PARTNER OFF
end
go
WAITFOR DELAY '00:00:10'
go
/*------------------------------------------------------*/
-- DRMirroringRemoveMirror.sql
/*------------------------------------------------------*/
if exists ( select * from sys.database_mirroring where db_name(database_id) = '$(DATABASE)' and mirroring_guid is not null )
begin
ALTER DATABASE [$(DATABASE)] SET PARTNER OFF
end
go
WAITFOR DELAY '00:00:10'
go
DROP DATABASE [$(DATABASE)]
go