按照基本操作建立镜像同步的时候,最后步骤报错
服务器网络地址 "TCP://XXXXXXX:5022" 无法访问或不存在。
请检查网络地址名称,并检查本地和远程端点的端口是否正常运行
查询sql日志,发现是‘10052(远程主机强迫关闭了一个现有的连接。)’,初步判断是权限原因。针对这种报错,在网上搜索了大神用证书授权的解决方案后,自己测试通过,记录一下步骤。(本案例是双机热备,只有主体服务器和镜像服务器,没有见证服务器)
- 创建数据库主密钥
USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘YourPassword‘;
删除的话用drop命令,使用相同方式在镜像服务器创建主密钥
- 创建证书,并用主密钥加密
USE master GO CREATE CERTIFICATE Host_A_Cert WITH Subject = ‘Host_A Certificate‘, Expiry_Date = ‘2080-1-1‘; --过期日期
删除的话用drop命令,使用相同方式在镜像服务器创建Host_B_Cert的证书
- 创建端点
IF NOT EXISTS ( SELECT * FROM sys.database_mirroring_endpoints ) BEGIN CREATE ENDPOINT [DatabaseMirroring] STATE = STARTED AS TCP ( LISTENER_PORT = 5022,LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE Host_A_Cert, ENCRYPTION = REQUIRED Algorithm AES, ROLE = ALL ); END
使用相同方式在镜像服务器创建Host_B_Cert证书的端点
- 备份证书
BACKUP CERTIFICATE Host_A_Cert TO FILE = ‘C:\ShareFolders\Host_A_Cert.cer‘;
将备份出来的证书复制到镜像服务器。使用相同方式在镜像服务器备份证书Host_B_Cert,将镜像服务器证书复制到主体服务器。
- 创建登录账号
CREATE LOGIN Host_B_Login WITH PASSWORD = ‘YourPassword‘;
创建一个账号给镜像服务器使用,使用同样方式在镜像服务器创建一个账号Host_A_Login给主体服务器使用。
- 创建用户,并映射到刚才创建的登录账号
CREATE USER Host_B_User For Login Host_B_Login;
使用相同方式在镜像服务器创建用户Host_A_User映射到刚才创建的登录账号
- 使用证书授权用户
CREATE CERTIFICATE Host_B_Cert AUTHORIZATION Host_B_User FROM FILE = ‘C:\Certifications\Host_B_Cert.cer‘;
创建一个新证书,并使用刚才从镜像服务器复制过来的证书导入,然后映射用户到这个新证书上。在镜像服务器也这样执行一遍。
- 将登录账号授权访问端口
GRANT CONNECT ON ENDPOINT::[DatabaseMirroring] TO [Host_B_Login];
在镜像服务器上也执行一遍。至此,证书授权结束。
- 执行镜像配置步骤(主体备份数据库,镜像还原数据库,具体自行搜索,网上都有)
sqlserver 镜像配置问题 (针对服务器网络地址 "TCP://XXXXX:5022" 无法访问或不存在。 请检查网络地址名称,并检查本地和远程端点的端口是否正常运行)