【已苦思7天】数据库镜像配置之疑惑
本人手持邹建的圣书《深入浅出Sql server》,搜遍google,baidu,sogou,youdao,soso等搜索引擎,并日夜苦思持续一周,
仍然无法解决这个必须必须解决的问题,哪位好心人可怜可怜一下我,
我必当终身为奴以身相许(前提是你不嫌弃),以报答解救之恩啊
环境: window2003+ sql server 2008 R2
服务器A:主服务器
服务器B:镜像服务器
证书方式,无见证服务器
源代码:见最下方
问题:
本人使用同一方式在两个服务器测试配置数据库镜像 ,同步成功,然后在另外两个服务器再次配置,出现以下错误:
在镜像服务器执行ALTER DATABASE JX SET PARTNER='...'执行成功
切换到主服务器执行以下语句
ALTER DATABASE JX SET PARTNER = 'TCP://124.172.242.105:5088';
出现错误:
消息 1418,级别 16,状态 1,第 1 行
服务器网络地址 "TCP://124.172.242.105:5088" 无法访问或不存在。请检查网络地址名称,并检查本地和远程端点的端口是否正常运行。
此时计算机日志(两条):
TCP://124.172.242.105:5088 的数据库镜像连接错误 4 'An error occurred while receiving data: '64(指定的网络名不再可用。)'.'。
已经终止对数据库 'JX' 的数据库镜像操作
再次执行语句,错误信息变了(注意:先后两次执行同一语句的错误不一样)提示:
消息 1499,级别 16,状态 1,第 1 行
数据库镜像错误: 状态 1460,严重性 16,状态 1,字符串 JX。
此时计算机日志(三条):
服务器实例 Partner 拒绝了配置请求;有关详细信息,请阅读它的错误日志文件。原因 1460 和状态 1 可能有助于 Microsoft 诊断问题。这是一个短期存在的错误,再次发出请求就可能会成功。请纠正问题的原因(如果发现了的话),然后重试。
数据库镜像错误: 状态 1460,严重性 16,状态 1,字符串 JX。
已经终止对数据库 'JX' 的数据库镜像操作。
并已确保以下内容无问题,本人反侧尝试,但是均失败:
1 登陆名一致性(包括uid)?
2 防火墙或防护软件已经允许了端口
3 数据库与日志备份还原无问题
4 数据库启动服务尝试使用-T1400跟踪标志(根据网络资料提供)
5 sql server 服务均由Network Service登陆
6 先是镜像服务器的执行SET PARTNER通过,再执行主服务器的SET PARTNER,出错, 尝试对调主备服务器,均发现在主服务器执行时出错,(由此是否可以断定,与服务器防火墙或一些环境无关?)
- SQL code
--=============================================== --主服务器执行 --===============================================USE master;CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'abc@2010';goCREATE CERTIFICATE Cert_A WITH SUBJECT = 'HOST_A certificate' , START_DATE = '20110101',EXPIRY_DATE = '20990101'goBACKUP CERTIFICATE Cert_A TO FILE = 'D:\快盘\Cert_A.cer';goCREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORT=5088 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE Cert_A , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );go--=============================================== --镜像服务器执行 --===============================================USE master;CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'abc@2010';CREATE CERTIFICATE Cert_BWITH SUBJECT = 'HOST_B certificate' , START_DATE = '20110101',EXPIRY_DATE = '20990101'goBACKUP CERTIFICATE Cert_B TO FILE = 'E:\快盘\Cert_B.cer';goCREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORT=5088 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE Cert_B , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );go--复制Cert_A到镜像服务器,复制Cert_B到主服务器--=============================================== --主机执行 --=============================================== CREATE CERTIFICATE cert_B FROM FILE = 'D:\快盘\Cert_B.cer';goCREATE LOGIN loginToB FROM CERTIFICATE cert_B;goGRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO loginToB;go--=============================================== --镜像服务器执行 --===============================================CREATE CERTIFICATE cert_A FROM FILE = 'E:\快盘\Cert_A.cer';goCREATE LOGIN loginToA FROM CERTIFICATE cert_A;goGRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO loginToA;go --服务器环境配置完毕,下面开始操作数据库 --=============================================== --主服务器执行 --===============================================--设置数据库完全备份模式alter database JX set recovery fullgo--备份backup database JX to disk=N'D:\快盘\JX.bak' with formatgoBACKUP LOG JX TO DISK = 'D:\快盘\JX_log.bak' GO--=============================================== --镜像服务器执行 --=============================================== --还原数据库,若路径有修改,需要move RESTORE DATABASE JX FROM DISK='E:\快盘\JX.bak' WITH NORECOVERY, MOVE 'JX' TO 'D:\Database\JX.mdf', MOVE 'JX_Log' TO 'D:\Database\JX.ldf';GO--还原日志, file=1表示第一份日志,如果多份,需重复执行RESTORE LOG JX FROM DISK = 'E:\快盘\JX_log.bak' WITH FILE=1, NORECOVERY --配置数据库镜像,先在镜像服务器执行 ALTER DATABASE JX SET PARTNER = 'TCP://ip:5088'; --=============================================== --主服务器执行 --===============================================ALTER DATABASE JX SET PARTNER = 'TCP://ip:5088';
[解决办法]
没有手工同步登名及密
[code=SQL][/code]
--主机执行:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'itdba!@#123';
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
START_DATE = '10/10/2011';
--备机执行:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'itdba!@#123';
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
START_DATE = '10/10/2011';
端
--主机执行:
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
--备机执行:
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
互
--主机执行:
BACKUP CERTIFICATE HOST_A_cert TO FILE = 'D:\SQLBackup\HOST_A_cert.cer';
--备机执行:
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'D:\SQLBackup\HOST_B_cert.cer';
添加用
--主机执行:
CREATE LOGIN HOST_B_login WITH PASSWORD = 'itdba!@#123';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\SQLBackup\HOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
--备机执行:
CREATE LOGIN HOST_A_login WITH PASSWORD = 'itdba!@#123';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE ='D:\SQLBackup\HOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
手工同步登名及密
在主数据库中执行如下语句:
USE master;
select sid,name from syslogins;
0x6FF81B32DAC76D43989AA56577C6C2A5
行:
USE master;
exec sp_addlogin
@loginame = 'HOST_B_login',
@passwd = 'itdba!@#123',
@sid = 0x6FF81B32DAC76D43989AA56577C6C2A5 ;
承接上文,该节是描述如何同步主备数据库内的数据。
原及日,在还原数据的时候需要使用选上“with non recover”。
建立镜像
由于是实验,没有为服务器配置双网卡,IP地址与图有点不一样,但是原理一样。
--主机执行:
ALTER DATABASE SMT_PRD SET PARTNER = 'TCP://192.168.0.1:5022';
--如果主体执行不成功,尝试在备机中执行如下语句:
ALTER DATABASE SMT_PRD SET PARTNER = 'TCP://192.168.0.2:5022';
[解决办法]
服务器网络地址 "TCP://124.172.242.105:5088" 无法访问或不存在。
[解决办法]
还是用 netstat 和 telnet 命令 看看 5088 端口 是否已经开通