Tentei espelhar banco de dados com GUI e T-SQL, mas tive problemas em ambos os casos.
Aqui estão algumas informações sobre infraestrutura e SSMS:
A INFRAESTRUTURA
- Servidor principal com SQL Server 2017 Enterprise Edition
- Servidor espelho com SQL Server 2017 Enterprise Edition
- Servidor testemunha com SQL Server 2017 Express Edition
- Todos os servidores SO: Windows Server 2016 Standard
- Todos os servidores com firewall desabilitado
- Todos os servidores em domínio comum
- Todos os servidores têm os mesmos usuários e privilégios
- Telnet funciona perfeitamente com a porta 5022 em todos os servidores
- Criei usuário para gerenciar serviço em todos os servidores com GRANT CONNECT ON ENDPOINT::Mirroring
Informações do SQL Server Management Studio - SSMS:
Microsoft SQL Server Management Studio 14.0.17289.0
Microsoft Analysis Services Client Tools 14.0.1016.283
Microsoft Data Access Components (MDAC) 10.0.14393.0
Microsoft MSXML 3.0 6.0
Microsoft Internet Explorer 9.11.14393.0
Microsoft .NET Framework 4.0.30319.42000
Operating System 6.3.14393
Vou explicar os dois casos de erro, com GUI e T-SQL.
Com GUI:
Terminais de configuração bem-sucedidos em todos os servidores
Mas eu tive esse erro quando tentei iniciar o espelhamento
É tão confuso porque o banco de dados deve estar em status de recuperação no servidor espelho. Mas li alguns posts sobre isso e é recomendado configurar com T-SQL, então
COM T-SQL:
Com o T-SQL eu tive esse problema:
Msg 1418, Level 16, State 1, Line 54 O endereço de rede do servidor "TCP://HML-SQLS-01-TST.domain.br:5022" não pode ser alcançado ou não existe. Verifique o nome do endereço de rede e se as portas para os terminais locais e remotos estão operacionais.
Deixe-me explicar passo a passo que eu tinha seguido:
SERVIDOR PRINCIPAL
CREATE DATABASE mirror
GO
ALTER DATABASE mirror
SET RECOVERY FULL
GO
USE mirror
GO
CREATE TABLE TESTE(
id INT IDENTITY(1,1),
descricao VARCHAR(255)
);
BACKUP DATABASE mirror
TO DISK = 'F:\Backup\mirror-full.bak'
GO
BACKUP LOG mirror
TO DISK = 'F:\Backup\mirror-log.bak'
GO
CREATE ENDPOINT Mirroring
STATE = started
AS TCP (listener_port=5022)
FOR database_mirroring (role=partner)
GO
USE MASTER
GO
CREATE LOGIN [DOMAIN\svc.witness] FROM WINDOWS
GO
GRANT CONNECT ON ENDPOINT::Mirroring TO [DOMAIN\svc.witness];
GO
SERVIDOR ESPELHO
CREATE ENDPOINT Mirroring
STATE = started
AS TCP (listener_port=5022)
FOR database_mirroring (role=partner)
GO
RESTORE DATABASE mirror
FROM DISK = 'F:\Backup\mirror-full.bak'
WITH NORECOVERY
GO
RESTORE DATABASE mirror
FROM DISK = 'F:\Backup\mirror-log.bak'
WITH NORECOVERY
GO
USE MASTER
GO
CREATE LOGIN [DOMAIN\svc.witness] FROM WINDOWS
GO
GRANT CONNECT ON ENDPOINT::Mirroring TO [DOMAIN\svc.witness];
GO
SERVIDOR TESTEMUNHA
create endpoint Mirroring
state = started
as tcp (listener_port=5022)
for database_mirroring (role=WITNESS)
go
USE MASTER
GO
CREATE LOGIN [DOMAIN\svc.witness] FROM WINDOWS
GO
GRANT CONNECT ON ENDPOINT::Mirroring TO [DOMAIN\svc.witness];
GO
SERVIDOR ESPELHO
alter database mirror
set partner = 'TCP://HML-SQLS-01.domain.br:5022'
GO
PRINCIPAL SERVER (O erro aparece nesta execução)
--The error pops in this execution:
alter database mirror
set partner = 'TCP://HML-SQLS-01-TST.domain.br:5022'
GO
Msg 1418, Level 16, State 1, Line 54 O endereço de rede do servidor "TCP://HML-SQLS-01-TST.domain.br:5022" não pode ser alcançado ou não existe. Verifique o nome do endereço de rede e se as portas para os terminais locais e remotos estão operacionais.
Mas se eu tentar este comando no CMD, funcionará perfeitamente:
telnet hml-sqls-01-tst.domain.br 5022
ENDPOINTS EM SERVIDORES:
Ponto de extremidade do servidor principal
Endpoint do servidor espelhado
Ponto de extremidade do servidor testemunha
Alguém já passou por isso ou poderia sugerir um caminho a seguir?
Relacionado à pergunta, mas não à resposta: Embora você tenha o SQL Server 2017 com Enterprise Edition , por que considerar um recurso que está em manutenção e pode ser removido no futuro.
No entanto, no seu caso, sugiro verificar as seguintes áreas (se ainda não o tiver feito), espero que isso resolva o problema:
Eu verifiquei o LOG através de Management>SQL Server Logs>Current e mostrou que o serviço tentou se conectar no endpoint com o usuário padrão da instância do SQL Server (no meu caso [DOMAIN\svc.ssms])
Então, eu concedo permissão de endpoint de conexão a este usuário e funciona bem.
Siga os comandos usados em todos os servidores:
Estou incomodado em não usar o usuário [DOMAIN\witness] na tentativa de conexão, mesmo concedendo a permissão de conexão ao endpoint. Não é uma solução mais elegante, mas resolve meu caso. No entanto, pode haver melhores práticas ou métodos. Se você sabe, peço que comente abaixo.
Grato a todos!
Não sei por que, mas tente executar o comando Alter database no Secondary, primeiro, usando 5022 como o número da porta. Em seguida, execute o comando Alter database no Primary, em seguida, usando 5023 como o número da porta. Deixe-me saber se você continuar recebendo o mesmo erro.