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