Зеркала, зеркала, зеркала.

Наш рабочий сервис предоставлявляется клиентам, следовательно он должен быть отказоустойчивым, поэтому все узлы сервиса задублированы. Ниже инструкция, как организовать зеркало на MS SQL, с использованием витнеса. - - - - - - Запускаем на сервере1 SQL server Management Studio и выполняем по очереди следующие команды, предварительно заменив имя_сервера на реальное имя сервера.

*1. Создаем master key базы данных master

USE [master];
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'пипецкакойдлинныйисложныйпароль';
GO

*2. Сразу же и немедленно создаем резервную копию этого ключа

USE [master];
BACKUP MASTER KEY TO FILE = 'полный путь к файлу куда класть ключ'
ENCRYPTION BY PASSWORD = 'пипецкакойдлинныйисложныйпароль2';
GO

*3. Создаем сертификат


USE [master];CREATE CERTIFICATE имя_сервера
WITH SUBJECT = 'имя_сервера certificate for database mirroring',
EXPIRY_DATE = '04/01/2015'; (Потом пришлось с этим повозиться, но это в следующей статье)
GO

*4. Создаем точку подключения

USE [master];
CREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE имя_сервера, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
GO

*5. Создаем резервную копию сертификата (нужна для копирования сертификата на другие сервера для создания зеркала)


USE [master];
BACKUP CERTIFICATE имя_сервера TO FILE = 'полный_путь_к_файлу_куда_класть_сертификат.cer';
GO

*6. Копируем полученный на шаге 5 сертификат на сервер2 и на witness


Запускаем на сервере2 SQL server Management Studio и выполняем по очереди следующие комманды предварительно заменив имя_сервера на реальное имя сервера2.

1*. Создаем master key базы данных master

USE [master];
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'пипецкакойдлинныйисложныйпароль3';
GO

*2. Сразу же и немедленно создаем резервную копию этого ключа

USE [master];
BACKUP MASTER KEY TO FILE = 'полный путь к файлу куда класть ключ'
ENCRYPTION BY PASSWORD = 'пипецкакойдлинныйисложныйпароль4';
GO

*3. Создаем сертификат

USE [master];CREATE CERTIFICATE имя_сервера2
WITH SUBJECT = 'имя_сервера2 certificate for database mirroring',
EXPIRY_DATE = '04/01/2015';
GO

*4. Создаем точку подключения

USE [master];
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED AS TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL)
FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE имя_сервера2 , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL);
GO

*5. Создаем резервную копию сертификата (нужна для копирования сертификата на другие сервера для создания зеркала)

USE [master];
BACKUP CERTIFICATE имя_сервера2 TO FILE = 'полный_путь_к_файлу_куда_класть_сертификат.cer';
GO

*6. Копируем полученный на шаге 5 сертификат на сервер1 и на witness
*7. Создаем на сервере2 логин для сервера1

USE [master];
CREATE LOGIN имя_сервера1_login WITH PASSWORD = 'пипецкакойдлинныйисложныйпароль5';
GO

*8. Создаем на сервере2 в базе master пользователя для логина имя_сервера1_login

USE [master];
CREATE USER имя_сервера1_user FOR LOGIN имя_сервера1_login;
GO

*9. Привязываем сертификат имя_сервера1 к пользователю имя_сервера1_user

USE [master];
CREATE CERTIFICATE имя_сервера1 AUTHORIZATION имя_сервера1_user FROM FILE ='полный_путь_к_файлу_с_сертификатом_сервера1.cer '
GO

*10. Даем разрешение логину имя_сервера1_login подключаться к точке подключения

USE [master];
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [имя_сервера1_login];
GO

Переходим на сервер_witness и выполняем следующие комманды:

*1. Создаем master key базы данных master

USE [master];
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'пипецкакойдлинныйисложныйпароль7';
GO

*2. Сразу же и немедленно создаем резервную копию этого ключа

USE [master];
BACKUP MASTER KEY TO FILE = 'полный путь к файлу куда класть ключ'
ENCRYPTION BY PASSWORD = 'пипецкакойдлинныйисложныйпароль8';
GO

*3. Создаем сертификат

USE [master];
CREATE CERTIFICATE имя_витнеса
WITH SUBJECT = 'имя_витнеса certificate for database mirroring',
EXPIRY_DATE = '04/01/2015';
GO

*4. Создаем точку подключения

USE [master];
CREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE имя_витнеса, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = WITNESS);
GO

*5. Создаем резервную копию сертификата (нужна для копирования сертификата на другие сервера для создания зеркала)

USE [master];
BACKUP CERTIFICATE имя_витнеса TO FILE = 'полный_путь_к_файлу_куда_класть_сертификат.cer';
GO

*6. Копируем полученный на шаге 5 сертификат на сервер1 и на сервер2
*7. Создаем на витнесе логин для сервера1

USE [master];
CREATE LOGIN имя_сервера1_login WITH PASSWORD = 'пипецкакойдлинныйисложныйпароль9';
GO

*8. Создаем на витнесе в базе master пользователя для логина имя_сервера1_login

USE [master];
CREATE USER имя_сервера1_user FOR LOGIN имя_сервера1_login;
GO

*9. Привязываем сертификат имя_сервера1 к пользователю имя_сервера1_user

USE [master];
CREATE CERTIFICATE имя_сервера1 AUTHORIZATION имя_сервера1_user FROM FILE = 'полный_путь_к_файлу_с_сертификатом_сервера1.cer ';
GO

*10. Даем разрешение логину имя_сервера1_login подключаться к точке подключения

USE [master];
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [имя_сервера1_login];
GO 

*11. Создаем на витнесе логин для сервера2

USE [master];
CREATE LOGIN имя_сервера2_login
WITH PASSWORD = 'пипецкакойдлинныйисложныйпароль10';
GO

*12. Создаем на витнесе в базе master пользователя для логина имя_сервера2_login


USE [master];
CREATE USER имя_сервера2_user FOR LOGIN имя_сервера2_login;
GO

*13. Привязываем сертификат имя_сервера2 к пользователю имя_сервера2_user

USE [master];
CREATE CERTIFICATE имя_сервера2
AUTHORIZATION имя_сервера2_user
FROM FILE = 'полный_путь_к_файлу_с_сертификатом_сервера2.cer';
GO

*14. Даем разрешение логину имя_сервера2_login подключаться к точке подключения

USE [master];
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [имя_сервера2_login];
GO

Переходим снова на сервер1 и выполняем следующие комманды:

*1. Создаем на сервере1 логин для сервера2

USE [master];
CREATE LOGIN имя_сервера2_login
WITH PASSWORD = 'пипецкакойдлинныйисложныйпароль6';
GO

*2. Создаем на сервере1 в базе master пользователя для логина имя_сервера2_login

USE [master];
CREATE USER имя_сервера2_user FOR LOGIN имя_сервера2_login;
GO

*3. Привязываем сертификат имя_сервера2 к пользователю имя_сервера2_user

USE [master];
CREATE CERTIFICATE имя_сервера2
AUTHORIZATION имя_сервера2_user
FROM FILE = 'полный_путь_к_файлу_с_сертификатом_сервера2.cer';
GO

*4. Даем разрешение логину имя_сервера2_login подключаться к точке подключения

USE [master];
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [имя_сервера2_login];
GO

*5. Создаем на сервере1 логин для витнеса

USE [master];
CREATE LOGIN имя_витнеса_login
WITH PASSWORD = 'пипецкакойдлинныйисложныйпароль6';
GO

*6. Создаем на сервере1 в базе master пользователя для логина имя_ витнеса_login

USE [master];
CREATE USER имя_витнеса_user FOR LOGIN имя_витнеса_login;
GO

*7. Привязываем сертификат имя_витнеса к пользователю имя_витнеса_user

USE [master];
CREATE CERTIFICATE имя_витнеса
AUTHORIZATION имя_витнеса_user
FROM FILE = 'полный_путь_к_файлу_с_сертификатом_витнеса.cer';
GO

*8. Даем разрешение логину имя_витнеса_login подключаться к точке подключения

USE [master];
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [имя_витнеса_login];
GO 

Переходим снова на сервер2 и выполняем следующие комманды:

*1. Создаем на сервере2 логин для витнеса

USE [master];
CREATE LOGIN имя_витнеса_login
WITH PASSWORD = 'пипецкакойдлинныйисложныйпароль6';
GO

*2. Создаем на сервере2 в базе master пользователя для логина имя_ витнеса_login

USE [master];
CREATE USER имя_витнеса_user FOR LOGIN имя_витнеса_login;
GO

*3. Привязываем сертификат имя_витнеса к пользователю имя_витнеса_user

USE [master];
CREATE CERTIFICATE имя_витнеса
AUTHORIZATION имя_витнеса_user
FROM FILE = 'полный_путь_к_файлу_с_сертификатом_витнеса.cer';
GO

*4. Даем разрешение логину имя_витнеса_login подключаться к точке подключения

USE [master];
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [имя_витнеса_login];
GO

Далее делаем бекап базы и бекап лога транзакций на сервере 1 и преносим этот бекап на сервер2. Восстанавливаем этот бекап в режиме no recovery. Выполняем на сервере2 следующую комманду:
ALTER DATABASE [имя_базы] SET PARTNER = N’TCP://имя_сервера1:5022′


Переходим на сервер 1 и выполняем:

  1. ALTER DATABASE [имя_базы] SET PARTNER = N'TCP://имя_сервера2:5022'
  2. ALTER DATABASE [имя_базы] SET WITNESS = N'TCP://имя_витнеса:5022'
  3. ALTER DATABASE [имя_базы] SET SAFETY FULL;

После этого проверяем состояние базы на обоих серверах, на сервере1 должно быть состояние Principal,Synchronized, на сервере2 Mirror,Synchronized / Restoring.