Create mirror between two server without witness (High safety without automatic failover - synchronous).
This exemple use TechNet Virtual Labs : Exploring AlwaysOn Availability Groups in SQL Server 2014
This script will not change anything in your database, it just will create the scripts for.
All script was create for TechLabs :
Primary Server SQL Server : SQLONE Secondary Server SQL Server : SQLTWO Mirroring User : contoso\SQLService Temp Path : \\SQLONE\s$ Mirroing Port : 5022 ENDPOINT name : Hadr_endpoint
You need change it for yours servers.
Step zero: We use TechLabs to do this tutorial then we delete all configurations before we start.
** Attention when you run on your SQL Server.**
- Remove Database Mirroring;
- Remove Certificates, Master Key, EndPoints. (if it’s possible, and maybe, additional steps are necessary).
Step 1: Prepare mirror
- Add Login user You need to create a user on AD, and add this user on both SQL Servers
2. Create End Points You need to use the name of login created the End Points, and you cannot use your login.
Step 2: Mirroring a database
- Set full recovery model on database.
2. Change owner user to “sa”. It’s not necessary, but if you do not change it, you must be sure that you have the same user on secondary server.
3. Set Trustworthy OFF Trustworthy is always OFF on a new mirror database.
4. Backup database
5. Backup login
6. Restore database
7. Restore log
8. Set partners
* High safety without automatic failover: All committed transactions are guaranteed to be written to disk on the mirror server. Manual failover is possible when the partners are connected to each other and the database is synchronized.
The loss of a partner has the following effect:
* If the mirror server instance becomes unavailable, the principal continues. * If the principal server instance becomes unavailable, the mirror stops but is accessible as a warm standby; the database owner can force service to the mirror server instance (with possible data loss).
* We will use xp_cmdshell.
Step zero:
1. Remove Database Mirroring :
Execute on primary server
1
2--------------------------------------
3-- Meta script : Script to STOP mirroring
4-- Primary server: SQLONE
5-- Secondary server: SQLTWO
6--------------------------------------
7GO
8:OUT $(TEMP)\deleteit1.txt
9:CONNECT SQLONE
10GO
11:OUT STDOUT
12GO
13PRINT 'GO'
14PRINT ':CONNECT ' + @@servername;
15PRINT 'GO'
16PRINT 'PRINT ''----------------------'';';
17PRINT 'PRINT ''-- Script to STOP mirroring'';';
18PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
19PRINT 'PRINT ''----------------------'';';
20PRINT '-- Server name: <a href="mailto:'+@@servername">'+@@servername</a>
21PRINT 'USE Master;'
22SET NOCOUNT ON;
23DECLARE @sql nvarchar(MAX);
24DECLARE @dbname nvarchar(255);
25BEGIN TRY DROP TABLE #db; END TRY BEGIN CATCH END CATCH;
26SELECT f.name into #db FROM sys.database_mirroring AS m INNER JOIN sys.databases AS f ON m.database_id = f.database_id WHERE (f.database_id > 4);
27
28DECLARE @sqltemplate nvarchar(MAX);
29SET @sqltemplate = '
30IF (EXISTS(SELECT f.name FROM sys.database_mirroring AS m INNER JOIN sys.databases AS f ON m.database_id = f.database_id WHERE f.name = <a href="mailto:''@dbname''">''@dbname''</a> AND mirroring_guid IS NOT NULL))
31BEGIN
32 PRINT ''-- Remove Mirroring Database "@dbname" ''
33 ALTER DATABASE [@dbname] SET PARTNER OFF;
34END;
35'
36WHILE ((SELECT count(*) FROM #db)>0) BEGIN
37SET @sql = '';
38SELECT TOP 1 @dbname = name , @sql = REPLACE(@sqltemplate, <a href="mailto:'@dbname'">'@dbname'</a>, name) FROM #db f ORDER BY f.name;
39DELETE FROM #db WHERE name = @dbname;
40PRINT @sql;
41END
42GO
43PRINT 'GO'
44GO
45:OUT $(TEMP)\deleteit1.txt
46GO
47:CONNECT SQLTWO
48GO
49:OUT STDOUT
50GO
51PRINT 'GO'
52PRINT ':CONNECT ' + @@servername;
53PRINT 'GO'
54PRINT 'PRINT ''----------------------'';';
55PRINT 'PRINT ''-- Script to STOP mirroring'';';
56PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
57PRINT 'PRINT ''----------------------'';';
58PRINT '-- Server name: <a href="mailto:'+@@servername">'+@@servername</a>
59PRINT 'USE Master;'
60SET NOCOUNT ON;
61DECLARE @sql nvarchar(MAX);
62DECLARE @dbname nvarchar(255);
63BEGIN TRY DROP TABLE #db; END TRY BEGIN CATCH END CATCH;
64SELECT f.name into #db FROM sys.database_mirroring AS m INNER JOIN sys.databases AS f ON m.database_id = f.database_id WHERE (f.database_id > 4);
65
66DECLARE @sqltemplate nvarchar(MAX);
67SET @sqltemplate = '
68IF (EXISTS(SELECT f.name FROM sys.database_mirroring AS m INNER JOIN sys.databases AS f ON m.database_id = f.database_id WHERE f.name = <a href="mailto:''@dbname''">''@dbname''</a> AND mirroring_guid IS NOT NULL))
69BEGIN
70 PRINT ''-- Remove Mirroring Database "@dbname" ''
71 ALTER DATABASE [@dbname] SET PARTNER OFF;
72END;
73'
74WHILE ((SELECT count(*) FROM #db)>0) BEGIN
75SET @sql = '';
76SELECT TOP 1 @dbname = name , @sql = REPLACE(@sqltemplate, <a href="mailto:'@dbname'">'@dbname'</a>, name) FROM #db f ORDER BY f.name;
77DELETE FROM #db WHERE name = @dbname;
78PRINT @sql;
79END
80GO
81PRINT 'GO'
82GO
83:OUT $(TEMP)\deleteit2.txt
84GO
2. Remove Certificates, Master Key, EndPoints
Execute on both servers : primary & secundary
1
2PRINT 'PRINT ''----------------------'';';
3PRINT 'PRINT ''-- Script to clean Certificates, MasterKey, EndPoints'';';
4PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
5PRINT 'PRINT ''----------------------'';';
6PRINT '-- Server name : ' + @@servername
7
8DECLARE @template nvarchar(MAX);
9DECLARE @sql nvarchar(MAX);
10
11PRINT '-- DROP ENDPOINT'
12SET @sql = '';
13SET @template = 'IF EXISTS ( SELECT * FROM sys.tcp_endpoints WHERE name = ''@endpointName'') DROP ENDPOINT [@endpointName];';
14SELECT @sql = replace(@template,'@endpointName',[name]) FROM sys.tcp_endpoints WHERE [type] = 4;
15IF (@sql <> '') PRINT @sql;
16PRINT 'GO';
17
18SET @sql = '';
19IF (EXISTS(SELECT database_name = d.name , dek.encryptor_type , cert_name = c.name FROM sys.dm_database_encryption_keys dek LEFT JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint INNER JOIN sys.databases d ON dek.database_id = d.database_id WHERE d.database_id > 4)) BEGIN
20SELECT @sql = @sql + 'Database : [' + d.name + '] uses certificate ['+c.name+']'+char(13) FROM sys.dm_database_encryption_keys dek LEFT JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint INNER JOIN sys.databases d ON dek.database_id = d.database_id WHERE d.database_id > 4
21PRINT 'PRINT ''-- ATTENTION : The master key and some certificates cannot be dropped if it is used by a database'';'
22PRINT '/* ';
23PRINT @sql + '*/';
24END;
25PRINT '-- DROP CERTIFICATE';
26SET @sql = '';
27SET @template = 'IF EXISTS ( SELECT * FROM sys.certificates WHERE name = ''@certificateName'' ) DROP CERTIFICATE [@certificateName];';
28SELECT @sql = @sql + replace(@template,'@certificateName',[name]) FROM sys.certificates WHERE pvt_key_encryption_type = 'MK';
29IF (@sql <> '') PRINT @sql;
30PRINT 'GO';
31
32PRINT '-- DROP MASTER KEY';
33SET @sql = '';
34SET @sql = 'IF EXISTS ( SELECT * FROM sys.symmetric_keys WHERE [name] LIKE ''%DatabaseMasterKey%'') DROP MASTER KEY;'
35IF (@sql <> '') PRINT @sql;
36PRINT 'GO';
or just run this :
1
2--------------------------------------
3-- Meta script : Script to clean Certificates, MasterKey, EndPoints
4-- Primary server: SQLONE
5-- Secondary server: SQLTWO
6--------------------------------------
7GO
8:OUT $(TEMP)\deleteit.txt
9GO
10:CONNECT SQLONE
11GO
12:OUT STDOUT
13GO
14PRINT ':CONNECT '+@@servername;
15PRINT 'PRINT ''----------------------'';';
16PRINT 'PRINT ''-- Script to clean Certificates, MasterKey, EndPoints'';';
17PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
18PRINT 'PRINT ''----------------------'';';
19PRINT '-- Server name : ' + @@servername
20
21DECLARE @template nvarchar(MAX);
22DECLARE @sql nvarchar(MAX);
23
24PRINT '-- DROP ENDPOINT'
25SET @sql = '';
26SET @template = 'IF EXISTS ( SELECT * FROM sys.tcp_endpoints WHERE name = ''@endpointName'') DROP ENDPOINT [@endpointName];';
27SELECT @sql = replace(@template,'@endpointName',[name]) FROM sys.tcp_endpoints WHERE [type] = 4;
28IF (@sql <> '') PRINT @sql;
29PRINT 'GO';
30
31SET @sql = '';
32IF (EXISTS(SELECT database_name = d.name , dek.encryptor_type , cert_name = c.name FROM sys.dm_database_encryption_keys dek LEFT JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint INNER JOIN sys.databases d ON dek.database_id = d.database_id WHERE d.database_id > 4)) BEGIN
33SELECT @sql = @sql + 'Database : [' + d.name + '] uses certificate ['+c.name+']'+char(13) FROM sys.dm_database_encryption_keys dek LEFT JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint INNER JOIN sys.databases d ON dek.database_id = d.database_id WHERE d.database_id > 4
34PRINT 'PRINT ''-- ATTENTION : The master key and some certificates cannot be dropped if it is used by a database'';'
35PRINT '/* ';
36PRINT @sql + '*/';
37END;
38PRINT '-- DROP CERTIFICATE';
39SET @sql = '';
40SET @template = 'IF EXISTS ( SELECT * FROM sys.certificates WHERE name = ''@certificateName'' ) DROP CERTIFICATE [@certificateName];';
41SELECT @sql = @sql + replace(@template,'@certificateName',[name]) FROM sys.certificates WHERE pvt_key_encryption_type = 'MK';
42IF (@sql <> '') PRINT @sql;
43PRINT 'GO';
44
45PRINT '-- DROP MASTER KEY';
46SET @sql = '';
47SET @sql = 'IF EXISTS ( SELECT * FROM sys.symmetric_keys WHERE [name] LIKE ''%DatabaseMasterKey%'') DROP MASTER KEY;'
48IF (@sql <> '') PRINT @sql;
49PRINT 'GO';
50GO
51:OUT $(TEMP)\deleteit1.txt
52GO
53:CONNECT SQLTWO
54GO
55:OUT STDOUT
56GO
57PRINT ':CONNECT '+@@servername;
58PRINT 'PRINT ''----------------------'';';
59PRINT 'PRINT ''-- Script to clean Certificates, MasterKey, EndPoints'';';
60PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
61PRINT 'PRINT ''----------------------'';';
62PRINT '-- Server name : ' + @@servername
63
64DECLARE @template nvarchar(MAX);
65DECLARE @sql nvarchar(MAX);
66
67PRINT '-- DROP ENDPOINT'
68SET @sql = '';
69SET @template = 'IF EXISTS ( SELECT * FROM sys.tcp_endpoints WHERE name = ''@endpointName'') DROP ENDPOINT [@endpointName];';
70SELECT @sql = replace(@template,'@endpointName',[name]) FROM sys.tcp_endpoints WHERE [type] = 4;
71IF (@sql <> '') PRINT @sql;
72PRINT 'GO';
73
74SET @sql = '';
75IF (EXISTS(SELECT database_name = d.name , dek.encryptor_type , cert_name = c.name FROM sys.dm_database_encryption_keys dek LEFT JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint INNER JOIN sys.databases d ON dek.database_id = d.database_id WHERE d.database_id > 4)) BEGIN
76SELECT @sql = @sql + 'Database : [' + d.name + '] uses certificate ['+c.name+']'+char(13) FROM sys.dm_database_encryption_keys dek LEFT JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint INNER JOIN sys.databases d ON dek.database_id = d.database_id WHERE d.database_id > 4
77PRINT 'PRINT ''-- ATTENTION : The master key and some certificates cannot be dropped if it is used by a database'';'
78PRINT '/* ';
79PRINT @sql + '*/';
80END;
81PRINT '-- DROP CERTIFICATE';
82SET @sql = '';
83SET @template = 'IF EXISTS ( SELECT * FROM sys.certificates WHERE name = ''@certificateName'' ) DROP CERTIFICATE [@certificateName];';
84SELECT @sql = @sql + replace(@template,'@certificateName',[name]) FROM sys.certificates WHERE pvt_key_encryption_type = 'MK';
85IF (@sql <> '') PRINT @sql;
86PRINT 'GO';
87
88PRINT '-- DROP MASTER KEY';
89SET @sql = '';
90SET @sql = 'IF EXISTS ( SELECT * FROM sys.symmetric_keys WHERE [name] LIKE ''%DatabaseMasterKey%'') DROP MASTER KEY;'
91IF (@sql <> '') PRINT @sql;
92PRINT 'GO';
93GO
94:OUT $(TEMP)\deleteit2.txt
95GO
Step 1: Prepare mirror
1. Create End Points on both servers: [Hadr_endpoint]
1
2GO
3:connect SQLONE
4GO
5PRINT '-- Server name: '+@@servername
6PRINT '---- Create Endpoint'
7CREATE ENDPOINT [Hadr_endpoint]
8 STATE=STARTED
9 AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
10 FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE
11, ENCRYPTION = REQUIRED ALGORITHM AES)
12GO
13PRINT '---- GRANT CONNECT ON ENDPOINT'
14GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [contoso\SQLService];
15GO
16PRINT '---- AUTHORIZATION ON ENDPOINT'
17ALTER AUTHORIZATION ON ENDPOINT::[Hadr_endpoint] TO [contoso\SQLService];
18GO
19:connect SQLTWO
20GO
21PRINT '-- Server name: '+@@servername
22PRINT '---- Create Endpoint'
23CREATE ENDPOINT [Hadr_endpoint]
24 STATE=STARTED
25 AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
26 FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE
27, ENCRYPTION = REQUIRED ALGORITHM AES)
28GO
29PRINT '---- GRANT CONNECT ON ENDPOINT'
30GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [contoso\SQLService];
31GO
32PRINT '---- AUTHORIZATION ON ENDPOINT'
33ALTER AUTHORIZATION ON ENDPOINT::[Hadr_endpoint] TO [contoso\SQLService];
34GO
Set mirror to database : Adventureworks2012
1
2:CONNECT SQLONE
3GO
4PRINT '-- Database "Adventureworks2012" ';
5IF (EXISTS(SELECT * FROM sys.databases WHERE NOT(recovery_model_desc = 'FULL') AND [name] = 'Adventureworks2012' ))
6BEGIN
7 PRINT '---- Fix recovery mode full'
8 ALTER DATABASE [Adventureworks2012] SET RECOVERY FULL WITH NO_WAIT;;
9END;
10IF (EXISTS(SELECT * FROM sys.databases WHERE NOT(suser_sname(owner_sid) = 'sa') AND [name] = 'Adventureworks2012' ))
11BEGIN
12 PRINT '---- Fix owner user to "sa"'
13 USE [Adventureworks2012];EXEC dbo.sp_changedbowner @loginame = N'sa',@map=false;
14END;
15
16-- TRUSTWORTHY is set to OFF when a database is backed up. Therefore, TRUSTWORTHY is always OFF on a new mirror database.
17-- If the database needs to be trustworthy after a failover, additional setup steps are necessary.
18-- For more information, see How to: Set Up a Mirror Database to Use the Trustworthy Property.
19IF (EXISTS(SELECT * FROM sys.databases WHERE (is_trustworthy_on = 0) AND [name] = 'Adventureworks2012' ))
20BEGIN
21 PRINT '---- Set TRUSTWORTHY OFF'
22 ALTER DATABASE [Adventureworks2012] SET TRUSTWORTHY OFF;
23END;
24
25GO
26PRINT '---- Backup Database "Adventureworks2012"';
27BACKUP DATABASE [Adventureworks2012] TO DISK = N'\\SQLONE\s$\Adventureworks2012_backup.BAK' WITH NOFORMAT, INIT, NAME = N'Adventureworks2012-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
28BACKUP LOG [Adventureworks2012] TO DISK = N'\\SQLONE\s$\Adventureworks2012_backup-Log.BAK' WITH NOFORMAT, INIT, NAME = N'Adventureworks2012-Log Database Backup' , SKIP, NOREWIND, NOUNLOAD, STATS = 10;
29GO
30
31:CONNECT SQLTWO
32GO
33PRINT '---- Restore Database "[Adventureworks2012]"';
34-- DROP DATABASE [Adventureworks2012];
35RESTORE DATABASE [Adventureworks2012] FROM DISK = N'\\SQLONE\s$\Adventureworks2012_backup.BAK' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5;
36RESTORE LOG [Adventureworks2012] FROM DISK = N'\\SQLONE\s$\Adventureworks2012_backup-Log.BAK' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5;
37GO
38
39GO
40:CONNECT SQLONE
41GO
42PRINT '---- DATABASE [Adventureworks2012] SET PARTNER Server: ' + @@servername
43ALTER DATABASE [Adventureworks2012] SET PARTNER = 'TCP://SQLTWO:5022';
44GO
45
46GO
47:CONNECT SQLTWO
48GO
49PRINT '---- DATABASE [Adventureworks2012] SET PARTNER Server: ' + @@servername
50ALTER DATABASE [Adventureworks2012] SET PARTNER = 'TCP://SQLONE:5022';
51GO
Mirroring all database
1
2PRINT 'PRINT ''----------------------'';';
3PRINT 'PRINT ''-- Script to mirror a database'';';
4PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
5PRINT 'PRINT ''----------------------'';';
6PRINT 'USE Master;'
7SET NOCOUNT ON;
8--------------------------
9-- Parameters
10DECLARE @PrimaryServer nvarchar(1024) = 'SQLONE';
11DECLARE @SecondaryServer nvarchar(1024) = 'SQLTWO';
12DECLARE @pathTemp nvarchar(1024) = '\\SQLONE\s$';
13DECLARE @RestoreDataPath nvarchar(1024) = 'c:\DemoDatabases\Data';
14DECLARE @RestoreLogPath nvarchar(1024) = 'c:\DemoDatabases\Log';
15DECLARE @CreateRestorePath BIT = 1;
16DECLARE @MirrorPort nvarchar(5) = '5022';
17
18-- Select databases
19BEGIN TRY DROP TABLE #db; END TRY BEGIN CATCH END CATCH;
20SELECT * INTO #db FROM sys.databases f WHERE
21f.state_desc = 'ONLINE' AND (f.database_id > 4);
22
23--------------------------
24
25DECLARE @sql nvarchar(MAX);
26DECLARE @dbname nvarchar(255);
27
28DECLARE @cmdCreatepathRestore nvarchar(max) = '';
29IF (@CreateRestorePath=1)
30BEGIN
31SET @cmdCreatepathRestore = '
32GO
33:CONNECT @SecondaryServer
34GO
35PRINT ''-- Server name : ''+@@servername;
36EXEC sp_configure ''show advanced options'', 1;
37RECONFIGURE;
38EXEC sp_configure ''xp_cmdshell'', 1;
39RECONFIGURE;
40GO
41exec xp_cmdshell N''MD @RestoreDataPath'';
42exec xp_cmdshell N''MD @RestoreLogPath'';
43GO
44'
45SET @cmdCreatepathRestore = REPLACE(@cmdCreatepathRestore,'@RestoreLogPath', @RestoreLogPath);
46SET @cmdCreatepathRestore = REPLACE(@cmdCreatepathRestore,'@RestoreDataPath', @RestoreDataPath);
47SET @cmdCreatepathRestore = REPLACE(@cmdCreatepathRestore,'@PrimaryServer', @PrimaryServer);
48SET @cmdCreatepathRestore = REPLACE(@cmdCreatepathRestore,'@SecondaryServer', @SecondaryServer);
49END
50PRINT @cmdCreatepathRestore;
51
52DECLARE @sqltemplateSet nvarchar(MAX) = '
53
54PRINT ''------------------------------------------------'';
55PRINT '''';
56PRINT ''-- Database "@dbname" '';
57PRINT '''';
58PRINT ''------------------------------------------------'';
59GO
60:CONNECT @PrimaryServer
61GO
62PRINT ''-- Server name : ''+@@servername;
63IF (EXISTS(SELECT * FROM sys.databases WHERE NOT(recovery_model_desc = ''FULL'') AND [name] = ''@dbname'' ))
64BEGIN
65 PRINT ''---- Fix recovery mode full''
66 ALTER DATABASE [@dbname] SET RECOVERY FULL WITH NO_WAIT;;
67END;
68IF (EXISTS(SELECT * FROM sys.databases WHERE NOT(suser_sname(owner_sid) = ''sa'') AND [name] = ''@dbname'' ))
69BEGIN
70 PRINT ''---- Fix owner user to "sa"''
71 USE [@dbname];EXEC dbo.sp_changedbowner @loginame = N''sa'',@map=false;
72END;
73
74IF (EXISTS(SELECT * FROM sys.databases WHERE (is_trustworthy_on = 0) AND [name] = ''@dbname'' ))
75BEGIN
76 PRINT ''---- Set TRUSTWORTHY OFF''
77 PRINT ''---- TRUSTWORTHY is set to OFF when a database is backed up. Therefore, TRUSTWORTHY is always OFF on a new mirror database.''
78 PRINT ''---- If the database needs to be trustworthy after a failover, additional setup steps are necessary.''
79 PRINT ''---- For more information, see How to: Set Up a Mirror Database to Use the Trustworthy Property.''
80 ALTER DATABASE [@dbname] SET TRUSTWORTHY OFF;
81END;
82';
83SET @sqltemplateSet = REPLACE(@sqltemplateSet,'@PrimaryServer', @PrimaryServer);
84SET @sqltemplateSet = REPLACE(@sqltemplateSet,'@SecondaryServer', @SecondaryServer);
85
86DECLARE @sqltemplateBackUp nvarchar(MAX);
87SET @sqltemplateBackUp = '
88GO
89:CONNECT @PrimaryServer
90GO
91PRINT ''-- Server name : ''+@@servername;
92PRINT ''-- Backup Database "@dbname" '';
93BACKUP DATABASE [@dbname] TO DISK = N''@pathTemp\@dbname_backup.BAK'' WITH NOFORMAT, INIT, NAME = N''@dbname-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 5;
94GO
95BACKUP LOG [@dbname] TO DISK = N''@pathTemp\@dbname_backup-Log.BAK'' WITH NOFORMAT, INIT, NAME = N''@dbname-Log Database Backup'' , SKIP, NOREWIND, NOUNLOAD, STATS = 5;
96GO
97';
98SET @sqltemplateBackUp = REPLACE(@sqltemplateBackUp,'@pathTemp', @pathTemp);
99SET @sqltemplateBackUp = REPLACE(@sqltemplateBackUp,'@PrimaryServer', @PrimaryServer);
100SET @sqltemplateBackUp = REPLACE(@sqltemplateBackUp,'@SecondaryServer', @SecondaryServer);
101
102DECLARE @sqltemplateRestore nvarchar(MAX);
103SET @sqltemplateRestore = '
104print ''GO'';
105PRINT '':CONNECT @SecondaryServer'';
106print ''GO'';
107PRINT ''PRINT ''''---- Restore Database : [@dbname]'''';''
108declare @sql nvarchar(max) = ''RESTORE DATABASE [@dbname] FROM DISK = N''''@pathTemp\@dbname_backup.BAK'''' WITH FILE = 1'';
109select @sql = @sql + '', MOVE N''''''+[name]+ '''''' TO N''''''+ case when [type] = 0 then ''@RestoreDataPath\'' else ''@RestoreLogPath\'' end + case when [name] like ''@dbname_%'' then [name] else ''@dbname_''+[name] end + case when [type] = 0 then ''.mdf'' else ''.ldf'' end + '''''''' from [@dbname].sys.database_files;
110set @sql = @sql + '', NORECOVERY, NOUNLOAD, REPLACE, STATS = 5;'';
111print @sql;
112print ''GO'';
113PRINT ''RESTORE LOG [@dbname] FROM DISK = N''''@pathTemp\@dbname_backup-Log.BAK'''' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5;''
114print ''GO'';
115--';
116SET @sqltemplateRestore = REPLACE(@sqltemplateRestore,'@RestoreLogPath', @RestoreLogPath);
117SET @sqltemplateRestore = REPLACE(@sqltemplateRestore,'@RestoreDataPath', @RestoreDataPath);
118SET @sqltemplateRestore = REPLACE(@sqltemplateRestore,'@pathTemp', @pathTemp);
119SET @sqltemplateRestore = REPLACE(@sqltemplateRestore,'@PrimaryServer', @PrimaryServer);
120SET @sqltemplateRestore = REPLACE(@sqltemplateRestore,'@SecondaryServer', @SecondaryServer);
121
122DECLARE @sqltemplateSetPartner nvarchar(MAX);
123SET @sqltemplateSetPartner = '
124GO
125-- Secondary must be first
126:CONNECT @SecondaryServer
127GO
128PRINT ''---- DATABASE [@dbname] SET PARTNER Server: '' + @@servername
129ALTER DATABASE [@dbname] SET PARTNER = ''TCP://@PrimaryServer:5022'';
130GO
131
132GO
133:CONNECT @PrimaryServer
134GO
135PRINT ''---- DATABASE [@dbname] SET PARTNER Server: '' + @@servername
136ALTER DATABASE [@dbname] SET PARTNER = ''TCP://@SecondaryServer:5022'';
137GO
138'
139SET @sqltemplateSetPartner = REPLACE(@sqltemplateSetPartner,'@PrimaryServer', @PrimaryServer);
140SET @sqltemplateSetPartner = REPLACE(@sqltemplateSetPartner,'@SecondaryServer', @SecondaryServer);
141SET @sqltemplateSetPartner = REPLACE(@sqltemplateSetPartner,'@MirrorPort', @MirrorPort);
142
143WHILE ((SELECT count(*) FROM #db)>0)
144BEGIN
145
146 SET @sql = '';
147
148 SELECT TOP 1 @dbname = name
149 FROM #db f
150 ORDER BY f.name;
151 DELETE FROM #db
152 WHERE
153 name = @dbname;
154
155 PRINT 'GO';
156
157 SET @sql = REPLACE(@sqltemplateSet, '@dbname', @dbname);
158 PRINT @sql;
159
160 SET @sql = REPLACE(@sqltemplateBackUp, '@dbname', @dbname);
161 PRINT @sql;
162
163 SET @sql = REPLACE(@sqltemplateRestore, '@dbname', @dbname);
164 EXEC (@sql);
165
166 SET @sql = REPLACE(@sqltemplateSetPartner, '@dbname', @dbname);
167 PRINT (@sql);
168
169 PRINT 'PRINT ''------------------------------------------------'';';
170 PRINT 'GO';
171 PRINT 'GO';
172END
Set Trustworthy ON
1
2PRINT 'PRINT ''----------------------'';';
3PRINT 'PRINT ''-- Script to set Trustworthy ON'';';
4PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
5PRINT 'PRINT ''----------------------'';';
6PRINT 'USE Master;'
7SET NOCOUNT ON;
8DECLARE @sql nvarchar(MAX);
9DECLARE @dbname nvarchar(255);
10BEGIN TRY DROP TABLE #db; END TRY BEGIN CATCH END CATCH;
11SELECT * INTO #db FROM sys.databases f WHERE f.state_desc = 'ONLINE'
12AND (f.database_id > 4)
13
14DECLARE @sqltemplate nvarchar(MAX);
15SET @sqltemplate = '
16PRINT ''-- Database "?" '';
17IF (EXISTS(SELECT * FROM sys.databases WHERE (is_trustworthy_on = 0) AND [name] = ''?'' ))
18BEGIN
19 PRINT ''---- Set TRUSTWORTHY ON''
20 ALTER DATABASE [?] SET TRUSTWORTHY ON ;
21END;
22'
23WHILE ((SELECT count(*) FROM #db)>0) BEGIN
24SET @sql = '';
25SELECT TOP 1 @dbname = name , @sql = REPLACE(@sqltemplate, '?', name) FROM #db f ORDER BY f.name;
26DELETE FROM #db WHERE name = @dbname;
27PRINT @sql;
28END
Copy logins
1
2PRINT 'PRINT ''----------------------'';';
3PRINT 'PRINT ''-- Script to Logins'';';
4PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
5PRINT 'PRINT ''----------------------'';';
6PRINT 'USE Master;'
7SET NOCOUNT ON;
8
9DECLARE @StriptSql TABLE ( [NumberRow] [int] IDENTITY(1,1) NOT NULL , SqlCmd nvarchar(MAX) );
10
11INSERT INTO @StriptSql ( SqlCmd ) VALUES ( '-- Logins' );
12INSERT INTO @StriptSql ( SqlCmd ) SELECT 'IF (SUSER_ID('+QUOTENAME(SP.name,'''')+') IS NULL) BEGIN CREATE LOGIN ' +QUOTENAME(SP.name)+
13CASE WHEN SP.type_desc = 'SQL_LOGIN' THEN ' WITH PASSWORD = ' +CONVERT(NVARCHAR(MAX),SL.password_hash,1)+ ' HASHED, CHECK_EXPIRATION = '
14+ CASE WHEN SL.is_expiration_checked = 1 THEN 'ON' ELSE 'OFF' END +', CHECK_POLICY = ' +CASE WHEN SL.is_policy_checked = 1 THEN 'ON,' ELSE 'OFF,' END ELSE ' FROM WINDOWS WITH' END
15+' DEFAULT_DATABASE=[' +SP.default_database_name+ '], DEFAULT_LANGUAGE=[' +SP.default_language_name+ '] END;' COLLATE SQL_Latin1_General_CP1_CI_AS AS [-- Logins To Be Created --] FROM sys.server_principals AS SP LEFT JOIN sys.sql_logins AS SL ON SP.principal_id = SL.principal_id WHERE SP.type IN ('S','G','U')
16AND SP.name NOT LIKE '##%##'
17AND SP.name NOT LIKE 'NT AUTHORITY%'
18AND SP.name NOT LIKE 'NT SERVICE%'
19AND SP.name <> ('sa') ORDER BY SP.type_desc , SP.name;
20
21INSERT INTO @StriptSql ( SqlCmd ) VALUES ( '-- Server Roles' );
22INSERT INTO @StriptSql ( SqlCmd ) SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + SL.name + ''', @rolename = N''' + SR.name + ''';' FROM master.sys.server_role_members SRM JOIN master.sys.server_principals SR ON SR.principal_id = SRM.role_principal_id JOIN master.sys.server_principals SL ON SL.principal_id = SRM.member_principal_id WHERE SL.type IN ('S','G','U')
23AND SL.name NOT LIKE '##%##'
24AND SL.name NOT LIKE 'NT AUTHORITY%'
25AND SL.name NOT LIKE 'NT SERVICE%'
26AND SL.name <> ('sa');
27
28INSERT INTO @StriptSql ( SqlCmd ) VALUES ( '-- Permissions to Be Granted' );
29INSERT INTO @StriptSql ( SqlCmd ) SELECT CASE WHEN SrvPerm.state_desc <> 'GRANT_WITH_GRANT_OPTION' THEN SrvPerm.state_desc ELSE 'GRANT' END
30+ ' ' + SrvPerm.permission_name + ' TO [' + SP.name + ']' +
31CASE WHEN SrvPerm.state_desc <> 'GRANT_WITH_GRANT_OPTION' THEN '' ELSE ' WITH GRANT OPTION' END + ';' COLLATE database_default AS [-- Server Level Permissions to Be Granted --] FROM sys.server_permissions AS SrvPerm JOIN sys.server_principals AS SP ON SrvPerm.grantee_principal_id = SP.principal_id WHERE SP.type IN ( 'S', 'U', 'G' )
32AND SP.name NOT LIKE '##%##'
33AND SP.name NOT LIKE 'NT AUTHORITY%'
34AND SP.name NOT LIKE 'NT SERVICE%'
35AND SP.name <> ('sa');
36
37DECLARE @sql nvarchar(max);
38DECLARE @NumberRow INT;
39WHILE (exists (SELECT * FROM @StriptSql))
40BEGIN
41 SELECT TOP 1 @NumberRow=[NumberRow], @sql = SqlCmd FROM @StriptSql order by [NumberRow];
42 DELETE FROM @StriptSql WHERE [NumberRow]=@NumberRow;
43 PRINT @sql;
44END
Script to failover all database You must run on principal server that will be the new secondary server.
1
2PRINT 'PRINT ''----------------------'';';
3PRINT 'PRINT ''-- Script to manual failover'';';
4PRINT 'PRINT ''-- Created : '+ CAST(GetDate() AS NVARCHAR(100))+''';';
5PRINT 'PRINT ''----------------------'';';
6PRINT 'USE Master;'
7SET NOCOUNT ON;
8DECLARE @sql nvarchar(MAX);
9DECLARE @dbname nvarchar(255);
10BEGIN TRY DROP TABLE #db; END TRY BEGIN CATCH END CATCH;
11SELECT * INTO #db FROM sys.databases
12WHERE (database_id > 4)
13
14DECLARE @sqltemplate nvarchar(MAX);
15SET @sqltemplate = '
16GO
17USE master;
18DECLARE @mirroring_state nvarchar(10);
19DECLARE @mirroring_state_desc nvarchar(100);
20DECLARE @mirroring_role nvarchar(10);
21DECLARE @mirroring_role_desc nvarchar(100);
22SELECT @mirroring_state= m.mirroring_state , @mirroring_state_desc=m.mirroring_state_desc , @mirroring_role_desc= m.mirroring_role_desc , @mirroring_role=m.mirroring_role FROM sys.database_mirroring AS m INNER JOIN sys.databases AS f ON m.database_id = f.database_id WHERE (f.name = ''@dbname'')
23IF (@mirroring_state IS NULL) BEGIN PRINT ''-- FAIL @dbname : Database No mirroring'';END
24ELSE IF (NOT(@mirroring_state = 4)) BEGIN PRINT ''-- FAIL @dbname : NOT SYNCHRONIZED'';END
25ELSE IF (@mirroring_role <> 1) BEGIN PRINT ''-- FAIL @dbname : NOT PRINCIPAL''; END
26ELSE BEGIN PRINT ''-- OK @dbname : FAILOVER''; ALTER DATABASE [@dbname] SET PARTNER FAILOVER; END;
27GO
28'
29WHILE ((SELECT count(*) FROM #db)>0) BEGIN
30SET @sql = '';
31SELECT TOP 1 @dbname = name , @sql = REPLACE(@sqltemplate, '@dbname', name) FROM #db f ORDER BY f.name;
32DELETE FROM #db WHERE name = @dbname;
33PRINT @sql;
34END
Sources: Establish a Database Mirroring Session Using Windows Authentication (SQL Server Management Studio https://technet.microsoft.com/en-us/library/ms188712(v=sql.110).aspx
How to: Prepare a Mirror Database for Mirroring (Transact-SQL) https://technet.microsoft.com/en-us/library/ms189047(v=sql.105).aspx
Add a Database Mirroring Witness Using Windows Authentication (Transact-SQL) https://technet.microsoft.com/en-us/library/ms190430(v=sql.110).aspx
The Database Mirroring Endpoint (SQL Server) https://docs.microsoft.com/en-us/sql/database-engine/database-mirroring/the-database-mirroring-endpoint-sql-server
Create a Database Mirroring Endpoint for Windows Authentication (Transact-SQL) https://docs.microsoft.com/en-us/sql/database-engine/database-mirroring/create-a-database-mirroring-endpoint-for-windows-authentication-transact-sql
How to: Remove Database Mirroring (Transact-SQL) https://technet.microsoft.com/en-us/library/ms189112(v=sql.105).aspx
Manually Fail Over a Database Mirroring Session (Transact-SQL) https://docs.microsoft.com/en-us/sql/database-engine/database-mirroring/manually-fail-over-a-database-mirroring-session-transact-sql
Comments