新添加了一台服务器,做原来服务器的备份机,用交叉线+双网卡配置了内网。
系统环境:Windows 2008 R2
数据库:SQL2005 SP3
设置镜像可以用证书和域两种情况,不过域设置的权限比较复杂,而且需要改动现在的设置,所以决定用证书来设置,中间出现了各种问题,一一记录。
搭建的步骤,有不少,前期都是一致的:
前期的设置参照这篇blog:http://blog.csdn.net/wangqi0079/article/details/8602399
不过没有用见证服务器。
一、首先要确保数据库的版本为标准版、企业版或者开发版,坚持版本可以用命令:
-
1 select@@version;
二、把数据库回复模式改为完整模式:
1 USE master; 2 ALTER DATABASE <DatabaeName> //<DatabaeName>既为需要配置镜像的数据库名 3 SET RECOVERY FULL;
或者:
如果是简单模式,在简历镜像的时候会报错:无法启用数据库镜像,因为'DataName'数据库在两个伙伴上都不处于完全恢复模式
三、在镜像服务器上建立空库。
在镜像服务器上建立和主服务器上名称一样的空数据库,为的是配置用户。
四、在镜像服务器上建立和主服务器上一样的用户,并赋予数据库
4.1、在主服务器上执行命令:
1 USE master; 2 select sid,name from syslogins;
出现如上图的结果。
4.2、在镜像服务器上安装这个表建立用户,大部分都是系统用户不用管,只建立我们自定义的用户。
1 USE master; 2 exec sp_addlogin 3 @loginame='<LoginName>', 4 @passwd='<Password>', 5 @sid=<sid>;
sid就是上面查询结果中的sid,复制过来。
4.3、把新建的用户付给对应数据库。
登录数据库→安全性→登录名→【对应用户名】上右键。
在弹出的窗体中,左侧找到用户映射,然后在右侧选中对应的数据库,如下图:
在右下方的“数据库角色成员身份”中,选择db_owner和public。
五、开始创建证书环境。
5.1、创建证书。
主机执行:
1 USE master; 2 CREATE MASTER KEY ENCRYPTION BY PASSWORD ='证书的密码'; 3 CREATE CERTIFICATE HOST_A_cert WITH SUBJECT ='HOST_A certificate', 4 START_DATE ='08/21/2014';
备机执行:
1 USE master; 2 CREATE MASTER KEY ENCRYPTION BY PASSWORD ='证书的密码'; 3 CREATE CERTIFICATE HOST_B_cert WITH SUBJECT ='HOST_B certificate', 4 START_DATE ='08/21/2014';
如果提示证书已存在,则可先删除证书:
1 DROP CERTIFICATE HOST_A_cert 2 drop master key
5.2、创建连接的端点:
主机执行:
1 CREATE ENDPOINT Endpoint_Mirroring 2 STATE = STARTED 3 AS 4 TCP ( LISTENER_PORT=5022, LISTENER_IP = ALL ) 5 FOR 6 DATABASE_MIRRORING 7 ( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
备机执行:
1 CREATE ENDPOINT Endpoint_Mirroring 2 STATE = STARTED 3 AS 4 TCP ( LISTENER_PORT=5022, LISTENER_IP = ALL ) 5 FOR 6 DATABASE_MIRRORING 7 ( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
5.3、备份证书
先建立一个目录:D:SQLBackup,目录名可任意。
主机执行:
-
BACKUP CERTIFICATE HOST_A_cert TO FILE ='D:SQLBackupHOST_A_cert.cer';
-
BACKUP CERTIFICATE HOST_B_cert TO FILE ='D:SQLBackupHOST_B_cert.cer';
5.4、互换证书
把主机中的HOST_A_cert.cer拷贝到备机的D:SQLBackup(5.3中建立的目录)目录中
把备机中的HOST_B_cert.cer拷贝到主机的D:SQLBackup目录中
5.5、添加登录名、用户
主机执行:
CREATE LOGIN HOST_B_login WITH PASSWORD ='证书的密码'; CREATE USER HOST_B_user FOR LOGIN HOST_B_login; CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE ='D:SQLBackupHOST_B_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
备机执行:
CREATE LOGIN HOST_A_login WITH PASSWORD ='证书的密码'; CREATE USER HOST_A_user FOR LOGIN HOST_A_login; CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE ='D:SQLBackupHOST_A_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
执行成功后再主机中的登录名中会看到:
对应的备机中也有一个用户:HOST_A_login
到此证书环境建立完毕,就是一堆命令,其实并不太复杂。
六、建立镜像
6.1、备份主机中的数据库。
找到要建立镜像的数据库→右键任务→备份,备份类型现在“完整”。
把备份文件复制到备机中备用。
在备机中建立的空数据库上右键任务→还原→数据库
选项中一定要选择:不对数据库执行任何操作,不会滚未提交的事物。
点击确定,备机的数据库会显示:
这时候前期准备就已经完成,可以建立镜像了。
七、建立镜像
先在备机中执行:
ALTER DATABASE NewDB SET PARTNER = N'TCP://hostA:5022'-- boat主机名 GO
然后在主机中执行:
ALTER DATABASE NewDB SET PARTNER = N'TCP://hostB:5022'-- boat主机名 GO
执行成功后会如下图所示(图片来自上文提到的blog中):
八、可能遇到的问题。
镜像一路顺风其实很快,但是各种各样的 问题都会出现,记录下我遇到的问题。
8.1、 在,执行步骤七的时候,主机执行语句的时候报错:
无法启用数据库镜像,因为'NewDB'数据库在两个伙伴上都不处于完全恢复模式
这个上文已经提到过,把数据库的恢复模式设为完整即可。
8.2、依然是步骤七
-
-
镜像数据库"pqsys_config"包含的事务日志数据不足,无法保留主体数据库的日志备份链。如果没有从主体数据库进行日志备份或者没有在镜像数据库上还原日志备份,则可能会出现这种情况。
-
这个是步骤6.1中备份完数据库后,主机数据库要有了新的操作,这时候重新备份一下,再还原即可。一般是在主机中备份事务日志而不是完整。
在备机上还原的时候也选择还原事务日志。
注:如果备机的数据库的状态不是“正在还原”,还原的时候“事务日志”不可选,所以要保证备机的数据库的状态,一次不成功多试几次。这个错话最有可能遇到。
8.3、在第七步的时候,如果主机和备机的执行顺序反了,也会报一个错,大意是镜像服务器为准备好之类的。
PS:再次鄙视网络少无意义的复制转载。查找问题时搜索的帖子或blog,相当大一部分都是各种转来转去,代码的样式都丢了,排版惨不忍睹,而且错误不加验证,为转而转浪费大家时间。