您的位置:首页 > 数据库

SQL Server数据库镜像部署 错误1418’处理及证书验证

2012-12-20 17:01 357 查看

SQL Server数据库镜像部署

‘数据库镜像’是SQLServer数据库功能最强的一种热备份方法,也是环境要求最高的一种。其配置环节比较麻烦,本人新手研究了三天,中途遇到了许多问题,希望其他第一次做这个部署的同行不要像我这样走许多弯路。

一.原理(零基础者看,三天之前我就不知道)

通俗点,就是有两个服务器上存在一个相同的数据库,一个作为主服务器,一个备用,备用服务器上的数据库始终与主服务器保持同步更改。当主服务器挂掉的时候,备用的数据库就被激活(之前是镜像状态不可访问)代替主服务器工作。见证服务器(可选,也可以就是备用服务器用不同端口,只是会降低性能)用来检测主服务器状态是否正常,当主的坏掉后会知道切换到备用的,检测主的修好后再切换回来,切换时间很快。

二.环境要求

至少两台服务器,服务器与服务器能内部访问,安装相同版本的SQL Server(2000,2005,2008),且SQLserver必须为专业版(professional)、企业版(enterprise),测试版(evaluation)和标准版不支持,我的是SQLserver 2008 enterprise,不知道SQL Server2012标准版和测试版是否支持,开启TCP/IP协议。

服务器一般不会关防火墙,为了SQL08R2能够正常工作,需要在防火墙上打开相应

的端口。本文中介绍数据库镜 像需要打开的端口是TCP-1433和TCP-5022端口。

三.开始镜像

1.准备数据库

假定主服务器名称为SQL-1,备用服务器名称为SQL-2,见证服务器名称为SQL-3。开始数据库存在SQL-1上,要镜像的数据库名为Test

2.备份数据库

定位Test,右键-‘属性’-选择‘选项’页,将其恢复模式设置为完整。(SQL-1)









备份该数据库,两次:完整备份及事物日志备份Test.bak(SQL-1)





事物日志备份:





3.还原数据库(关键)

将备份文件拷贝到备用服务器上,在备份服务器上,新建与主服务器上同名的数据库Test,还原备份文件Test.bak,操作与以往不同,具体:定位Test右键-任务-还原,选择数据源文件Test.bak,勾选完整和事物日志(SQL-2)





在‘选项’中,勾选‘覆盖现有数据库’,同时选择‘不对数据库执行任何操作,不回滚未提交的事务。可以还原其他事务日志。(RESTOREWITH NORECOVERY)’。





击确定之后Test数据库会呈现‘正在还原。。。’不可访问状态,然后操作主服务器SQL-1。

3.部署镜像

定位Test数据库,右键-‘任务’-‘镜像’在弹出的窗口中选择‘配置安全性’(SQL-1)。





选择‘是’,点击下一步。





为了方便,取消选择‘见证服务器实例选项’,可以在今后添加。点击‘下一步’





侦听端口默认5022,端口名称自定,点击‘下一步’。





选择备份服务器SQL-2,会提示连接,可以直接用默认的‘sa’账户连接,端口默认5022,名称随意。点击‘下一步’





要求输入账户名称,这里比较麻烦,输入的账户在另一台服务器上必须要有connect权限(SQL Server默认会阻止匿名访问)。我使用的是SQL证书验证,关于证书会在下一篇进行详解。这里输入相应的账户。点击‘下一步’。





会出现相关的配置信息,点击‘完成’.





新弹出的窗口中会验证你输入的登录账户,点击‘关闭’,在弹出的窗口中选择‘开始镜像’。





可能会跳出下面这个错误,提示缺少限定域名FQDN,可以无视。





接下来到了最后一步,也是最让人头疼地方,相信大多数人第一次操作时都会遇到这个错误,我在这里停了一天。引起这个错误的原因很多,这里说其中一种,其他的下一篇博客记录。进行镜像同步时,需要在每一台服务器上启用“RemoteDAC”:





选中服务器 右键-‘方面’,打开“查看方面”窗口,在“方面”下拉菜单中选择“外围应用配置器”,指定“方面属性”的“RemoteDacEnabled”值为“True”。我认为这个操作不能解决90%的1418错误。。。执行失败后在SQLServer日志上会有详细的错误信息





四.测试手动故障转移(SQL-1)

在SQL-1上选择Test数据库,右键-‘任务’-‘镜像’,在弹出窗口中点击‘故障转移’。





此时SQL-1上的Test数据库变成了镜像不可用状态(下图),SQL-2上则变成了主题数据库代替SQL-1运作。







SQL镜像部署‘错误1418’处理及证书验证

SQL镜像部署能很好的应对服务器数据库崩溃甚至整个服务器数据被破坏的情况。如何部署在我的上一篇文章中,只要不出错很快就能操作完成,但是这种几率很小。我分享一下我第一次部署中遇到的各种问题,主要针对1418错误。

一、首先在备用服务器上还原的时候,点了‘还原’之后数据库一直显示‘正在还原…’且不可用,当时以为还需要等一段时间,其实它是在等你在主服务器上对它进行镜像操作。不知道有木有人也犯过这种错误。

二、在点击开始镜像时出现下面的警告:缺少完全限定域名(FQDN)





解决方法很简单,提示此错误,意思是说你不在同一个网域,只是一个WORKGROUP,通常在同一个网域不会有此错误出现,但SQLServer 2008镜像设置,并不一定需要在同一个网域中,只要修改电脑的DNS尾码即可,修改方式如下:

右键点击【计算机】选择属性,选择计算机名称tab,点击【其他】按钮,将DNS尾码设置成相同的值,如test.com,电脑名称若为primary,则完整的电脑名称就为primary.test.com,将镜像server的DNS尾码设置成相同值,需要重启计算机





三、错误1418,单纯的看弹出的错误消息没有任何帮助,具体错误原因要查看主服务器和备用服务器的SQLServer日志,我就是根据这个一步一步解决了表面原因相同的1418错误。

1.第一次点击‘开始镜像’报1418错误,多半是主备服务器之间TCP协议无法通过电脑名称确定对方的IP地址,这个错误会在主服务器上的SQLServer日志中找到。其实在最开始配置完成之后点击‘开始镜像’之前留意一下下图中的‘网络服务器地址’直接显示备用服务器的IP地址那绝对是这个原因



解决方式:用记事本修改系统盘下WINDOWS/system32/drivers/etc下面的文件hosts(可能需要修改hosts的权限),在该文件下加入主体及镜像地址的IP及对应的电脑名称,格式如下:
#127.0.0.1 localhost——#号代表注释了,后面不要加
192.168.0.101 primary.test.com
192.168.0.102 mirror.test.com
注意,在两台server上都要加,如果还有见证server,见证server上也要加入,就会有3条
2.还是定位到SQL Server日志,如果出现下面的错误



也许中文版的SQL提示会是中文的,我的是英文版。这个错误的主要意思是‘正在在访问xpstar.dll,但是没有用户可以对其进行操作’,OK,修改xpstar.dll的权限。
操作:找到xpstar.dll这个文件,我这儿在C:\ProgramFiles\Microsoft SQLServer\MSSQL10.MSSQLSERVER\MSSQL\Binn目录下,修改它的权限,我把它上面的‘当前用户和组’都设为了完全控制,操作完成后还会提示xplog70.dll也要修改,xplog70在相同目录下。我在两台服务器上都做了修改(一劳永逸,不知道有无副作用),问题解决。




3.在我这儿执行上面的操作后依然报1418错误,也许其他人没我这么悲催。依然SQL Server日志





意思是它在访问备用服务器上的镜像数据库时被备用服务器给终止了,这个错误纠结了我一天。转到备用服务器上,它是这样提示的(看来中文SQLServer还是提示的英文)




大概意思是它不接受匿名的访问,这里涉及到两台数据库服务器之间的访问权限问题了。通过百度(准确率让人汗颜)终于找到了解决办法,利用SQL证书能让两个SQLServer相互信任。创建证书利用SQL Query语句完成
首先在主服务器上,一段一段执行一下语句(以‘go’为一段)
Use master

Creat masterkey encryption by password='mainpassword';--创建数据库主密钥

go
Createcertificate host_A_cert withsubject='host_A_certificate', start_date='05/05/2012',expiry_date='12/12/2050';--创建主服务器SQL证书‘host_A_cert’,过期时间‘2050’,默认1年

go
Create endpointEndpoint_Mirroring

state=started

as TCP(listener_port=5022,Listener_IP=all)

for Database_Mirroring(AUTHENTICATION=CERTIFICATEhost_A_cert,ENCRYPTION=REQUIRED ALGORITHMAES,ROLE=PARTNER);--创建依附与证书的镜像端点'Endpoint_Mirroring',默认5022端口

go
BACKUPCERTIFICATE host_A_cert TOFILE='D:\dbMirror\host_A.cer';--将证书备份到D盘
变换一下证书名称,在备份服务器和见证服务器上执行上述语句,可以设置备机证书为host_B_cert,见证机为host_C_cert.
证书互换:将主机上的host_A.cer拷贝到备机和见证机上,备机的host_B.cer拷贝到主机和见证机上,见证机的host_C.cer拷贝到主机和备机上,为了方便,将证书都统一放到D:\dbMirror文件夹下面。
主机依次执行下面语句
Create loginhost_B_login withpassword='123'--为备机创建一个登录帐号‘host_B_login’
go
create userhost_B_user for loginhost_B_login;--为帐号‘host_B_login’创建登录名
go
Createcertificate host_B_cert
authorizationhost_B_user
fromfile='D:\dbMirror\host_B.cer'--将账户与证书关联起来
go
grant connect onendpoint::Endpoint_Mirroring to[host_B_login];--添加Connect权限
go
将上述的‘B’改为‘C’再次执行为见证机添加Connect权限(没有见证机的跳过);
最后主机添加自己的登录账户和登录名
Create loginhost_A_login with password='123'
go
create userhost_A_user for Certificate host_A_cert;
go
grant connect onendpoint::Endpoint_Mirroring to [host_A_login];
go
主机上的操作算是告一段落
在备机和见证机上执行上面的所有语句,关键的地方(‘ABC’的地方互换一下)修改一下,注意几点:上述语句都是在master数据库上完成的;执行的语句针对的是整个SQLServer,不是某一个数据库;登录账户的密码必须一致(这里是123);如果备机和见证机是同一台服务器,会涉及到不同端口,上述语句改动会很大。
执行后的效果:在三天服务器上都会有‘host_A_login’、‘host_B_login’、‘host_C_login’三个登录账户,且可以用该账户登录相应服务器上的SQLServer。
可以说前面都是在为镜像做准备工作,现在重新配置镜像,具体操作查看我上一篇blog:SQLServer数据库镜像部署 ,依然用sa连接备机,但在输入账户名称的地方改为刚刚创建的‘host_A_login’、‘host_B_login’、‘host_C_login’。如下图




其他步骤不变,最后点击‘开始镜像’,应该就不会报1418错误了
4.这是在我第二次作镜像部署测试时遇到的错误。主服务器上日志和“3”的一样,只是备机上变成了这样




这个问题很简单,在SQLServer中找到sa账户,右键属性,取消选择其中的‘强制实施密码策略’复选框




我所了解的问题就这些了,其他问题也许在以后的部署中会发现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: