前面已经演示了域环境下的镜像搭建,本文将使用非域环境来搭建镜像,同样,先按照不带见证服务器的高安全模式(同步)的方式搭建,然后 演示异步模式,最后会演示带有见证服务器的高安全模式。
服务器角色 | 机器名/实例名 | 版本 | IP |
主体服务器 | RepA | Windows Server 2008R2 英文x64 | 192.168.1.2 |
镜像服务器 | RepB | Windows Server 2008R2 英文x64 | 192.168.1.3 |
见证服务器 | Win7 | Win7 企业版 | 192.168.1.4 |
注:Rep是Replication(复制)的缩写,RepA和RepB一开始是搭建来做复制演示,本文借用这3台服务器。
均使用SQL Server 2008 R2 企业版 英文 X64
AdventureWorks2008R2
由于在非域环境内,所以需要做的检查相对来说多很多,下面按照演示环境,逐个测试下面的条件:
搭建镜像中,涉及Windows账号的主要是在共享文件夹中,非域环境下需要证书来搭建镜像,另外对于小库,一般使用备份还原的方式,也就是说,需要把主体数据库上的备份文件传输到镜像服务器上,这些都需要用到Windows账号操作共享文件夹。本文为了演示方便,使用了Administrator作为Windows的账号,作为最佳实践,建议真正搭建时使用专用的Windows账号,并且保证有足够的权限。
非单机下的高可用都严重依赖网络,网络不通,一切都白搭。所以首先要确保网络是能互访的。下面测试一下本例中使用的主体服务器和镜像服务器是否能互访:
在RepA上ping RepB(本例IP地址192.168.1.3)
在RepB上ping RepA(本例IP地址192.168.1.2)
可见是能ping通的,为了方便,本例已关闭防火墙,所以端口问题不需要检查,如果在生产环境,就需要和网络管理员确认端口是否已经开启。检查端口可以用Telnet命令。如果输入Telnet后出现下面的错误:中文:'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件。
可以在“开始”→“控制面板”→“程序”,“在程序和功能”找到并点击“打开或关闭Windows功能”进入Windows 功能设置对话框。找到并勾选“Telnet客户端”和“Telnet服务器”,最后“确定”。依据版本不同,开启方式也会不同,具体版本请自行查找搜索引擎的方案。
在正式环境中,往往不会只有一个磁盘,本例由于实体机的资源限制,所以只保留系统盘,即C盘做演示。下面先检查主体服务器(RepA)上演示库(AdventureWorks2008R2)的数据文件和日志文件所在的盘符和目录:
USE master go SELECT physical_name--物理文件路径 FROM sys.master_files WHERE database_id = DB_ID('AdventureWorks2008R2')
本例结果如下:
接下来到镜像服务器,也就是RepB上检查是否存在这个盘符和目录,如果不存在,要手动创建。下面是手动创建后的文件夹:
要注意,后续还原的时候,要检查还原时文件路径是否也指向相同的目录。文件名也要一致。
本例使用相同的安装文件,且均为2008R2(OS和SQL),并且没有联网更新,所以基本上可以确保版本和补丁一致。如果是正式环境,需要考虑,虽然从2005 SP1开始就支持镜像,但是真正完整支持镜像功能的还是从2005 SP2开始,另外除了SQL Server版本之外,Windows 的版本、补丁也要检查,虽然没有很确切指定OS也必须完全一致,但是一致的版本会比较少异常。
检查恢复模式和兼容级别,可以使用下面的语句实现:
USE master go SELECT name [数据库名] , recovery_model_desc [恢复模式] , CASE WHEN [compatibility_level] = 90 THEN '2005' WHEN [compatibility_level] = 100 THEN '2008' WHEN [compatibility_level] > 100 THEN '2008+' ELSE '2000 or lower version' END [兼容级别] FROM sys.databases WHERE name = 'AdventureWorks2008R2'
在本例中,演示库为简单模式,所以用SSMS或者命令修改:
USE [master] GO ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY FULL WITH NO_WAIT GO
本人建议使用T-SQL修改,因为在服务器比较繁忙的时候,使用图形化界面操作会很慢甚至超时。并且一个DBA应该会使用这些T-SQL命令。否则就太不专业了。
再次执行检查脚本,可见恢复模式已经变回了Full:
这一步就不做演示了,打开SQL Server Agent即可检查,另外搭建镜像的人应该具有会看是否有常规备份的能力。
在前面的第二步中,主要是检查OS的网络,但是OS能连通不代表SQL Server能连通,所以有必要检查SQL Server是否能互联。方法很简单,分别打开SSMS,并且输入伙伴服务器的SQL Server IP/实例名。本例先使用SA来检查:
前面说过,对非域环境下,需要使用证书来搭建镜像,另外需要对备份文件进行传输,这些都会使用到共享文件夹,当然可以用别的方式实现,不过共享文件夹可能是最为简单的方式。本例中,我将在主体服务器(RepA)上建立一个共享文件夹,以便RepB能访问。不过如果条件允许,我更建议在有容错能力的磁盘上(比如RAID、SAN等)创建共享文件夹,这样即使主体服务器崩溃,也不至于影响镜像服务器对共享文件夹的操作。
再次提醒,针对正式环境,强烈建议使用专用账号,并且适当控制权限,比如对文件夹在搭建过程中允许完全控制,但是在正式运行时只允许“读”操作等。
这一步可以在RepB中,输入UNC路径,如本例的:\\RepA\ShareFolders
到目前为止,准备工作已经完毕。下面开始第二步。
在这一步中,我们将做两件事,第一件是使用证书来配置镜像,第二件是备份还原数据库。在非域环境下,必须使用证书来搭建镜像,所以我把搭建证书放在第一步。有些资料上会把备份还原操作放在证书搭建之前,但是根据个人经验,当磁盘IO、网络性能不佳的时候,备份、传输、还原都会浪费大量的时间(个人操作过2个小时),并且期间服务器几乎不能操作。这种时候,我会选择先搭建好,再还原,然后马上进行同步。
如果服务器使用Local System作为SQL Server服务账号,就需要使用证书授权。证书授权同时也可以在你的服务器不能通过其他服务器的账号访问对方服务器或者你不想授权给Windows登录时使用。
使用证书搭建镜像的步骤如下:
主密钥的用处在这里是用于加密证书,当然主密钥不仅仅只有这个作用。对数据库主密钥的密码及存储保护要小心,这是实力级别的对象,影响面非常广。可以使用下面语句来创建:
USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd'; /* --删除主密钥 USE master; DROP MASTER KEY */
使用相同方式在镜像服务器创建数据库主密钥。
创建证书时,默认在创建日期开始一年后过期,所以针对证书的创建,要注意其过期时间。下面是在“主体服务器”上创建HOST_A_cert证书的创建
USE master GO CREATE CERTIFICATE Host_A_Cert WITH Subject = 'Host_A Certificate', Expiry_Date = '2015-1-1'; --过期日期 /* --删除证书 USE master; DROP CERTIFICATE HOST_A_cert */
使用相同的方法在镜像服务器上实现对HOST_B_cert证书的创建
可以使用下面的代码在主体服务器中创建端点,并且指定使用5022,端口,端口在镜像配置过程中不强制使用特定端口(被占用或者特定端口如1433除外)。
--使用Host_A_Cert证书创建端点 IF NOT EXISTS ( SELECT 1 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
在镜像服务器对证书名稍作修改,创建镜像服务器的端点。
备份证书的目的是发送到别的服务器并导入证书,以便别的服务器能通过证书访问这台服务器(主体服务器)。
BACKUP CERTIFICATE Host_A_Cert TO FILE = 'C:\ShareFolders\Host_A_Cert.cer';
同理,在镜像服务器上重复一次,注意证书名和路径。备份之后可以在目标文件夹上看到有一个cer文件:
这里有个建议,分别在RepA和RepB本地创建一个单独的文件夹Certifications,然后用来存储本服务器和伙伴服务器的证书,证书一直存放在共享文件夹并不合理。本例分别在本机的C盘上创建一个Certifications的文件夹并存放所有的证书,如图:
针对每个服务器单独创建一个服务器登录账号,这里只需要创建一个登录给镜像服务器即可:
CREATE LOGIN Host_B_Login WITH PASSWORD = 'Pa$$w0rd';
同理,在镜像服务器上创建Host_A_Login给主体服务器。
在主体服务器上运行:
CREATE USER Host_B_User For Login Host_B_Login;
同理在镜像服务器也创建。
创建一个新的证书,并使用从伙伴服务器中复制过来的证书导入,然后映射step 6中的账号到这个新证书上。
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];
到此为止,配置镜像的步骤已经完毕,后续会给出尽可能自动化的配置脚本。
这一步,把主体服务器(RepA)上的演示数据库备份并还原到RepB上进行初始化操作:
注意路径和还原的文件名:
同样以Nonrecovery方式还原:
前面两步主要是对镜像的配置准备,下面开始正式启动镜像:
注意顺序,先要在RepB上执行
ALTER DATABASE AdventureWorks2008R2 SET PARTNER = 'TCP://RepA:5022'; GO
ALTER DATABASE AdventureWorks2008R2 SET PARTNER = 'TCP://RepB:5022'; GO
执行后,可以看到RepA上的镜像配置:
Step 3~4中的搭建是使用高安全模式搭建,如果希望使用高性能模式(再次提醒,本例没有使用见证服务器,所以不能使用自动故障转移的高安全模式),可以使用下面脚本在RepA上实现:
ALTER DATABASE AdventureWorks2008R2 SET PARTNER SAFETY OFF GO
再次打开,可见运行模式已经是高性能模式:
Step 6:验证故障转移
下面再用语句来试一下是否能故障转移,先检查两个库的状态,这里用个小技巧,使用 【注册服务器】,如图:
然后新建注册:
同理把RepB也加进去:
然后打开一个查询窗口,用于一次性查询两个服务器,前提是要有足够的权限,本例用sa来连接:
注意下图的粉红色的部分,如果出现(1/2)这种情况,表示有一台服务器不能连接成功:
结果如下:我们只关注一小部分内容:
现在切换回RepA的查询窗口,然后输入:
ALTER DATABASE AdventureWorks2008R2 SET PARTNER FAILOVER;--在主体服务器上执行
然后到【注册管理器】中再查询,可以看到现在RepB已经是Principal,也就是主体服务器了:
读者可以用GUI界面操作,这里就不做过多演示。
下面演示如何把见证服务器加进镜像环境中,首先,我们保持前面的配置,即搭建好主体和镜像服务器,然后我们使用一个Win7的系统来做见证服务器,上面装有SQL Server 2008 R2企业版,可以使用Express或者工作组版来做见证服务器。
--创建主密钥 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd'; --演示所需,否则不要设置这么简单的密码 GO /* --删除主密钥 USE master; DROP MASTER KEY */ USE master; CREATE CERTIFICATE HOST_C_cert WITH SUBJECT = 'HOST_C certificate'--在Winess实例上创建证书,命名为HOST_C_cert,这个选项是描述证书 ,EXPIRY_DATE ='2015-6-5' ;--证书过期时间,可以适当设置长一点,具体按实际需要设置 GO /* --删除证书 USE master; DROP CERTIFICATE HOST_C_cert */ CREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORT=5022 --使用5022端口,这个端口可以改成未被使用的端口,但是镜像过程中的所有合作者都应该使用相同的端口 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_C_cert --使用证书来授权端点 , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL --表示这个端点可以作为任何角色,包括主服务器、镜像服务器、见证服务器。具体可看联机丛书。 ); GO /* --删除镜像端点 IF EXISTS (SELECT * FROM sys.endpoints e WHERE e.name = N'Endpoint_Mirroring') DROP ENDPOINT [Endpoint_Mirroring] GO */ BACKUP CERTIFICATE HOST_C_cert TO FILE = 'C:\Certifications\HOST_C_cert.cer'; GO
确保RepA、RepB、Win7这三台机上都有主体、镜像和见证所产生的3个证书。
在见证服务器上为主体、镜像服务器创建以证书为验证的账号、用户名及端点。
--在Witness实例上创建一个登录名给Principal实例 USE master; CREATE LOGIN HOST_A_login WITH PASSWORD = 'Pa$$w0rd'; GO --创建一个用于给这个登录名 CREATE USER HOST_A_user FOR LOGIN HOST_A_login; GO --让该帐号使用证书授权 CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'C:\Certifications\HOST_A_cert.cer' GO --授予这个新账号连接端点的权限 GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO HOST_A_login; GO /* --删除账号 DROP LOGIN HOST_A_user */ --在Witness实例上创建一个登录名给Mirror实例 USE master; CREATE LOGIN HOST_B_login WITH PASSWORD = 'Pa$$w0rd'; GO --创建一个用于给这个登录名 CREATE USER HOST_B_user FOR LOGIN HOST_B_login; GO --让该帐号使用证书授权 CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'C:\Certifications\HOST_B_cert.cer' GO --授予这个新账号连接端点的权限 GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO HOST_B_login; GO /* --删除账号 DROP LOGIN HOST_B_user */
分别在RepA和RepB中执行下面语句,为见证服务器创建连接端点的权限:
USE master; CREATE LOGIN HOST_C_login WITH PASSWORD = 'Pa$$w0rd'; GO --创建一个用于给这个登录名 CREATE USER HOST_C_user FOR LOGIN HOST_C_login; GO --让该帐号使用证书授权 CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE = 'C:\Certifications\HOST_C_cert.cer' GO --授予这个新账号连接端点的权限 GRANT CONNECT ON ENDPOINT::DatabaseMirroring TO HOST_C_login; GO
在RepB中应该存在这两个登录,而在RepA中应该存在Host_B_Login和Host_C_Login两个账户:
然后在主体服务器上执行下面语句,加入见证服务器:
ALTER DATABASE AdventureWorks2008R2 SET WITNESS = 'TCP://win7:5022'
完毕之后,打开RepA的镜像配置,可以见到见证服务器已经加入:
我们可以测试一下,把RepA的SQL Server服务关闭,实现主体服务器的“故障”,看是否RepB能自动切换:
可见已经切换过去,并且状态为Disconnected,注意,即使此时RepA再次联机,也不会自动切换成为主体服务器,需要手动切换,这部分读者可以自行测试。把RepA再次启动之后,可以对比镜像的状态,从Disconnected变成了Synchronized。
到处为止,非域环境下的镜像配置已经完毕。