Назад | Перейти на главную страницу

Невозможно добавить свидетеля в мою настройку зеркалирования

Я пытаюсь настроить зеркалирование со свидетелем, используя свои 3 выделенных сервера под управлением SQL Server 2008 R2. Я настроил все, как описано в этом сообщении в блоге

Зеркальное отображение между основным и дополнительным серверами работает нормально. Но когда я запускаю самую последнюю команду, чтобы добавить свидетеля

alter database citec_vc_prod set witness = 'TCP://witness_address:witness_port';

Через несколько секунд я получаю следующую ошибку:

Сообщение 1456, уровень 16, состояние 3, строка 1 Не удалось отправить команду ALTER DATABASE на удаленный экземпляр сервера TCP: // witness_address: witness_port. Конфигурация зеркального отображения базы данных не изменилась. Убедитесь, что сервер подключен, и повторите попытку.

Кроме того, журнал событий на главном сервере показывает следующую ошибку:

Не удалось отправить команду ALTER DATABASE на удаленный экземпляр сервера «TCP: // адрес_свидетеля: порт_свидетеля». Конфигурация зеркального отображения базы данных не изменилась. Убедитесь, что сервер подключен, и повторите попытку.

Я уже отключил брандмауэр на свидетеле и успешно выполнил telnet-соединение от участника к конечной точке зеркалирования на следящем сервере, чтобы убедиться в отсутствии проблем с подключением. Тем не менее, я все еще получаю эту ошибку.

Моя установка выглядит следующим образом:

Principal: SQL Server 2008 R2 Standard 10.50.1617
Mirror: SQL Server 2008 R2 Standard 10.50.1617
Witness: SQL Server 2008 R2 Express 10.50.2500

Каждый из серверов находится в отдельной рабочей группе.

Пожалуйста, помогите мне, гуру SQL-серверов, вы моя единственная надежда!

Редактировать: Вот полный журнал команд T-SQL, которые я использовал для настройки зеркалирования. Как только первая попытка не удалась с описанной выше проблемой, я удалил все и начал с нуля. Однако та же проблема повторилась.

-- PRINCIPAL
create master key encryption by password = 'mypassword';
GO
create certificate "server1.ourdomain.com_cert" with subject = 'server1.ourdomain.com certificate', start_date = '2007/11/01', expiry_date = '2020/11/01';
GO 

Create endpoint endpoint_mirroring state = started
as tcp(listener_port = 5022, listener_ip = all)
for database_mirroring (authentication = certificate "server1.ourdomain.com_cert", encryption = disabled,  role = all);
GO
Backup certificate "server1.ourdomain.com_cert" to file = 'f:\cert\server1.ourdomain.com_cert.cer';
GO 

-- MIRROR
create master key encryption by password = 'mypassword';
GO
create certificate "server2.ourdomain.com_cert" with subject = 'server2.ourdomain.com certificate', start_date = '2007/11/01', expiry_date = '2020/11/01';
GO
Create endpoint endpoint_mirroring state = started
as tcp(listener_port = 5022, listener_ip = all)
for database_mirroring (authentication = certificate "server2.ourdomain.com_cert", encryption = disabled,  role = all);
GO
Backup certificate "server2.ourdomain.com_cert" to file = 'f:\cert\server2.ourdomain.com_cert.cer';
GO 

-- WITNESS
create master key encryption by password = 'mypassword';
GO
create certificate "witness.ourdomain.com_cert" with subject = 'witness.ourdomain.com certificate', start_date = '2007/11/01', expiry_date = '2020/11/01';
GO
Create endpoint endpoint_mirroring state = started
as tcp(listener_port = 5022, listener_ip = all)
for database_mirroring (authentication = certificate "witness.ourdomain.com_cert", encryption = disabled,role = witness);
GO
Backup certificate "witness.ourdomain.com_cert" to file = 'd:\cert\witness.ourdomain.com_cert.cer';
GO 

-- PRINCIPAL again
create login "server2.ourdomain.com_login" with PASSWORD = 'mypassword';
GO
create user "server2.ourdomain.com_user" from login "server2.ourdomain.com_login";
GO
select * from sys.certificates
Create certificate "server2.ourdomain.com_cert"
Authorization "server2.ourdomain.com_user"
From file = 'f:\cert\server2.ourdomain.com_cert.cer';
GO
Grant CONNECT ON Endpoint::endpoint_mirroring to [server2.ourdomain.com_login];
GO
------
create login "witness.ourdomain.com_login" with PASSWORD = 'mypassword';
GO
create user "witness.ourdomain.com_user" from login "witness.ourdomain.com_login";
GO
Create certificate "witness.ourdomain.com_cert"
Authorization "witness.ourdomain.com_user"
From file = 'f:\cert\witness.ourdomain.com_cert.cer';
GO
Grant CONNECT ON Endpoint::endpoint_mirroring to [witness.ourdomain.com_login];
GO 

-- MIRROR again
create login "server1.ourdomain.com_login" with PASSWORD = 'mypassword';
GO
create user "server1.ourdomain.com_user" from login "server1.ourdomain.com_login";
GO
Create certificate "server1.ourdomain.com_cert"
Authorization "server1.ourdomain.com_user"
From file = 'f:\cert\server1.ourdomain.com_cert.cer';
GO
Grant CONNECT ON Endpoint::Endpoint_mirroring to [server1.ourdomain.com_login];
GO
-------
create login "witness.ourdomain.com_login" with PASSWORD = 'mypassword';
GO
create user "witness.ourdomain.com_user" from login "witness.ourdomain.com_login";
GO
Create certificate "witness.ourdomain.com_cert"
Authorization "witness.ourdomain.com_user"
From file = 'f:\cert\witness.ourdomain.com_cert.cer';
GO
Grant CONNECT ON Endpoint::Endpoint_mirroring to [witness.ourdomain.com_login];
GO 

-- WITNESS again
create login "server1.ourdomain.com_login" with PASSWORD = 'mypassword';
GO
create user "server1.ourdomain.com_user" from login "server1.ourdomain.com_login";
GO
Create certificate "server1.ourdomain.com_cert"
Authorization "server1.ourdomain.com_user"
From file = 'd:\cert\server1.ourdomain.com_cert.cer';
GO
Grant CONNECT ON Endpoint::Endpoint_mirroring to [server1.ourdomain.com_login];
GO
-------
create login "server2.ourdomain.com_login" with PASSWORD = 'mypassword';
GO
create user "server2.ourdomain.com_user" from login "server2.ourdomain.com_login";
GO
Create certificate "server2.ourdomain.com_cert"
Authorization "server2.ourdomain.com_user"
From file = 'd:\cert\server2.ourdomain.com_cert.cer';
GO
Grant CONNECT ON Endpoint::endpoint_mirroring to [server2.ourdomain.com_login];
GO 

-- MIRROR again
alter database MyDBName set partner OFF
alter database MyDBName set partner = 'TCP://server1.ourdomain.com:5022';
GO 

-- PRINCIPAL again
alter database MyDBName set partner OFF
alter database MyDBName set partner = 'TCP://server2.ourdomain.com:5022';
GO
alter database MyDBName set witness OFF
alter database MyDBName set witness = 'TCP://witness.ourdomain.com:5022';
GO

Изменить 2: По просьбе Ремуса я прикрепил профилировщик к трем экземплярам сервера, пытаясь добавить свидетель. Я искал :

Database Mirroring State Change
Broker:Connection Event

Я не мог отслеживать «Аудит входа в систему зеркального отображения базы данных», так как не мог найти его в «Списке событий» в профилировщике. Это ведь не в разделе «Аудит безопасности»?

Во всяком случае, я не мог следить за такими событиями на свидетеле или в зеркале. Я пробовал, но событий просто не было. На главном были такие мероприятия:

  Database Mirroring Connection                 32  2011-12-09 20:04:07.983 1       39796   2 - Connected   c6b6054d-56c0-4589-922a-29a40fdd9d96            1   0X01        tcp://<MyWitnessIP>:5022    principal.mytopleveldomain.com,3809                                             
    Audit Database Mirroring Login                  30  2011-12-09 20:04:08.133 1       39797   1 - Login Success               1   0X01        tcp://<MyWitnessIP>:5022    principal.mytopleveldomain.com,3809                 1   witness.mytopleveldomain.com_login      CERTIFICATE Microsoft Unified Security Protocol Provider    Initiator       
    Database Mirroring State Change DBM: Synchronized Principal without Witness -> DBM: Synchronizing Principal             27  2011-12-09 20:04:27.980 9       39798               2   1   0X01            principal.mytopleveldomain.com,3809         Zeiterfassung-Staging   0   13                          
    Database Mirroring State Change DBM: Synchronizing Principal -> DBM: Synchronized Principal without Witness             27  2011-12-09 20:04:28.237 9       39799               13  1   0X01            principal.mytopleveldomain.com,3809         Zeiterfassung-Staging   0   2                           
    Database Mirroring Connection   An error occurred while receiving data: '64(failed to retrieve text for this error. Reason: 15105)'.                30  2011-12-09 20:05:42.530 1       39803   4 - Closing c6b6054d-56c0-4589-922a-29a40fdd9d96            1   0X01        tcp://<MyWitnessIP>:5022    principal.mytopleveldomain.com,3809                                             
    Database Mirroring Connection                   30  2011-12-09 20:05:42.533 1       39804   5 - Closed  c6b6054d-56c0-4589-922a-29a40fdd9d96            1   0X01        tcp://<MyWitnessIP>:5022    principal.mytopleveldomain.com,3809                                             


Database Mirroring Connection                   32  2011-12-09 20:04:07.983 1       39796   2 - Connected   c6b6054d-56c0-4589-922a-29a40fdd9d96            1   0X01        tcp://85.214.251.151:5022   srv1.logmytime.de,3809                                              
Audit Database Mirroring Login                  30  2011-12-09 20:04:08.133 1       39797   1 - Login Success               1   0X01        tcp://85.214.251.151:5022   srv1.logmytime.de,3809                  1   wtn.logmytime.de_login      CERTIFICATE Microsoft Unified Security Protocol Provider    Initiator       
Database Mirroring State Change DBM: Synchronized Principal without Witness -> DBM: Synchronizing Principal             27  2011-12-09 20:04:27.980 9       39798               2   1   0X01            srv1.logmytime.de,3809          Zeiterfassung-Staging   0   13                          
Database Mirroring State Change DBM: Synchronizing Principal -> DBM: Synchronized Principal without Witness             27  2011-12-09 20:04:28.237 9       39799               13  1   0X01            srv1.logmytime.de,3809          Zeiterfassung-Staging   0   2                           
Database Mirroring Connection   An error occurred while receiving data: '64(failed to retrieve text for this error. Reason: 15105)'.                30  2011-12-09 20:05:42.530 1       39803   4 - Closing c6b6054d-56c0-4589-922a-29a40fdd9d96            1   0X01        tcp://85.214.251.151:5022   srv1.logmytime.de,3809                                              
Database Mirroring Connection                   30  2011-12-09 20:05:42.533 1       39804   5 - Closed  c6b6054d-56c0-4589-922a-29a40fdd9d96            1   0X01        tcp://85.214.251.151:5022   srv1.logmytime.de,3809  

Я с удовольствием отзеркалю и другие события, но, пожалуйста, дайте мне знать, в каком разделе событий я могу их найти при настройке профилировщика.

Редактировать 3: У меня была еще одна попытка профилирования свидетеля, на этот раз почти со всеми типами событий. И наконец я получил некоторые данные:

Trace Start                     2011-12-10 01:24:08.180                                                                                             
ErrorLog    2011-12-10 01:24:40.40 Logon       Database Mirroring Login succeeded for user 'principal.ourdomain.com_login'. Authentication mode: CERTIFICATE.  [CLIENT: <principalip>]
                29  2011-12-10 01:24:40.400 1   28046   1428                    1   0X01        witness.ourdomain.com,3809          master  0       sa                          
EventLog    Database Mirroring Login succeeded for user 'principal.ourdomain.com_login'. Authentication mode: CERTIFICATE.  [CLIENT: <principalip>]             29  2011-12-10 01:24:40.400 1   28046   1429                    1   0X01        witness.ourdomain.com,3809          master  0       sa  

Затем я проделал то же самое с зеркалом, но у меня остались только эти два довольно неважных события:

ErrorLog    2011-12-10 01:38:02.14 spid29s     Database mirroring is inactive for database 'DatabaseName'. This is an informational message only. No user action is required.
            sa                      29  2011-12-10 01:38:02.143         
EventLog    Database mirroring is inactive for database 'DatabaseName'. This is an informational message only. No user action is required.          sa                      29  2011-12-10 01:38:02.143     0XA20500000A0000000F000000570049004E003600360036004800520054004B003700540032004800000000000000  
ErrorLog    2011-12-10 01:38:22.40 spid29s     Database mirroring is active with database 'DatabaseName' as the mirror copy. This is an informational message only. No user action is required.
            sa                      29  2011-12-10 01:38:22.407         
EventLog    Database mirroring is active with database 'DatabaseName' as the mirror copy. This is an informational message only. No user action is required.            sa                      29  2011-12-10 01:38:22.407     0XA10500000A0000000F000000570049004E003600360036004800520054004B003700540032004800000000000000  

Однако я до сих пор не вижу информации о том, почему не удается добавить свидетеля.

Можете ли вы прикрепить SQL Profiler к все трое вовлеченные экземпляры и отслеживают эти события:

Затем попробуйте еще раз установить сеанс зеркального отображения. Убедитесь, что вы выбрали все столбцы при добавлении событий. Начните с пустого шаблона.

2011-12-09 20:04:07.983  Database Mirroring Connection    Connected   
2011-12-09 20:04:08.133  Audit Database Mirroring Login   Login Success
2011-12-09 20:04:27.980  Database Mirroring State Change DBM: 
  Synchronized Principal without Witness -> 
  DBM: Synchronizing Principal             
2011-12-09 20:04:28.237  Database Mirroring State Change DBM: 
  Synchronizing Principal -> 
  DBM: Synchronized Principal without Witness
2011-12-09 20:05:42.530  Database Mirroring Connection   An error occurred... 

Вот объяснение того, что происходит:

  • в 20:04:07 директор соединяется со свидетелем
  • в 20:04:08 главный и свидетель завершают успешное установление связи (аудит выполнен успешно)
  • в 20:04:27 DBM изменяет состояние с синхронизированного без свидетеля на синхронизированное
  • в 20:04:28 DBM изменяет состояние обратно с синхронизированного на синхронизированное без свидетеля
  • в 20:05:42 соединение со свидетелем прерывается из-за бездействия и закрывается

Эта последовательность событий указывает на то, что соединение между принципалом и свидетелем функционирует. Запрос на добавление свидетеля не выполняется, и этому может быть несколько причин. Подобные события должны происходить и на зеркале, и на свидетеле, непонятно, почему вы говорите, что могли зафиксировать их только на главном.

Некоторое время я сталкивался с UNABLE configure Witness, пока не понял, что сертификат, который я использовал на конечной точке Mirror, отличается от конечной точки Principal & Witness.

Как только я использовал один и тот же сертификат (скопированный с Принципала на 2-й и 3-й серверы) для конечных точек зеркалирования в Принципал, Зеркало и Свидетель, я смог решить

"Witness_address" - это IP-адрес или имя?

Если это имя, может ли каждый сервер разрешить имя любого другого сервера? (разные рабочие группы = без разрешения имен = необходимо использовать файл DNS или HOSTS)

Зеркальное отображение уже указано и СОСТОЯНИЕ конечной точки свидетеля НАЧАЛОСЬ? Чтобы проверить: ВЫБЕРИТЕ role_desc, state_desc FROM sys.database_mirroring_endpoints
Вы также:
1. Создана конечная точка:
СОЗДАТЬ ENDPOINT Endpoint_Mirroring
СОСТОЯНИЕ = НАЧАЛО
Как TCP (LISTENER_PORT = 7022)
FOR DATABASE_MIRRORING (ROLE = WITNESS)
ИДТИ

  1. вы используете одну и ту же учетную запись домена на всех экземплярах?

  2. убедиться, что для этой учетной записи установлены разрешения на конечной точке?
    --Создайте логин для экземпляров партнерского сервера,
    - которые оба работают как MYDOMAIN \ dbousername:
    Мастер ИСПОЛЬЗОВАНИЯ;
    ИДТИ
    СОЗДАТЬ ЛОГИН [MYDOMAIN \ dbousername] ИЗ WINDOWS;
    ИДТИ
    - Предоставление разрешений на подключение на конечной точке для входа в учетную запись партнеров
    GRANT CONNECT ON ENDPOINT :: Endpoint_Mirroring TO [MYDOMAIN \ dbousername];
    ИДТИ

Видеть Вот Больше подробностей.

В соответствии с http://msdn.microsoft.com/en-us/library/ms190430.aspx ...

Чтобы выполнить инструкцию SET WITNESS, сеанс зеркального отображения базы данных должен быть уже запущен (между партнерами), а для STATE конечной точки свидетеля должно быть установлено значение STARTED.

Почему в вашем сценарии прямо перед «установкой свидетеля» указано «изменить базу данных MyDBName, установить партнера OFF»? Разве это не разрушает зеркальное отображение?