背景:客户的数据库需要做主从备份,通过镜像的方式实现。
问题1:数据库提示服务器网络地址 “TCP://xxx:5022″ 无法访问或不存在。请检查网络地址名称,并检查本地和远程端点的端口是否正常运行。 (Microsoft SQL Server,错误: 1418)
问题2:数据库日志Database Mirroring login attempt failed with error: 'Connection handshake failed. There is no compatible authentication protocol. State 21.'
先说问题1各种查找资料,并没有找到有用的东西,最后翻看了数据库的日志记录,得到问题2,翻译过来连接握手失败。没有兼容的身份验证协议。
我创建镜像都是官方的教程一步一步操作的,实在想不通,然后使用select * from sys.database_mirroring_endpoints查看对比了主从数据库的异同点,发现有两个字段的值不同,connection_auth和connection_auth_desc,这两个大概意思就是连接认证,有预感越来越接近真相了,第一反应想把这两个字段值改成一样,写了一条修改语句,结果提示“不允许对系统目录进行即席更新。”,没办法只有一不做二不休直接删除重建。
删除语句:
DROP ENDPOINT [Endpoint_Mirroring]
重建语句:
CREATE ENDPOINT [Endpoint_Mirroring]
STATE = STARTED
AS TCP(LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (ENCRYPTION = REQUIRED ALGORITHM RC4, ROLE = ALL)
GO
注意为了保持统一,建议主从数据库的Endpoint都删了重建。
然后再次执行创建镜像的流程,这里就不在赘述,记录两条关键语句:
从服务器执行:
ALTER DATABASE 从库 SET PARTNER =N'TCP://domain1:5022';
主服务器执行:
ALTER DATABASE 主库 SET PARTNER =N'TCP://domain2:5022';
执行顺序不能颠倒。还有一点我在数据库上右键手动创建镜像从来没成功过,直接执行语句简单粗暴反而能成功。