镜像简介
一、 简介
sql SERVER 2005镜像基于日志同步,可良好实现故障转移。每个数据库镜像配置均包含一个主体服务器(包含主体数据库)、一个镜像服务器(包含镜像数据库)和一个见证服务器(可选)。
主体服务器和镜像服务器要求是独立的服务器实例。
主体服务器和镜像服务器的角色是相对的,可以自动或者手动地将主体服务器与镜像服务器的角色互换。
与主体服务器和镜像服务器不同的是,见证服务器并不能用于数据库。见证服务器监视主体服务器和镜像服务器,确保在给定的时间内这两个故障转移服务器中有且只有一个作为主体服务器,从而支持自动故障转移。
如果存在见证服务器,同步会话将以“高可用性模式”运行,如果主体服务器出现故障,可以实现故障自动转移。
如果见证服务器不存在,同步会话将以“高级别保护模式”运行,出现故障需要手动故障转移,并且有可能丢失数据。
二、优点
下表是sql Server可用性官方解决方案的一个对照表,现时我中心使用的恢复模式是“冷备份”中的“备份/恢复”,通常来说“热备份”比“冷备份”的可用性更高,恢复更快,更适合我中心现时的实际情况。如果不从成本考虑的话,“热备份”中的“故障转移群集”的可用性是最高的,但是故障转移群集需要借助磁盘阵列而且建设本身复杂性较高。数据库镜像的建立并没有太多的硬件要求,最起码没有像“故障转移群集”需要共享存储这么高的要求。
三、 缺点
(1)由于sql Server是一个实例多个数据库的产品,数据库镜像技术是基于数据库级别的,因此每次主数据库新增数据库都必须为备机增加数据库并且为新增的数据库建立镜像关系。
(2)数据库的登录名和用户是存储在master数据库,master数据库是不能做镜像的,所以每次操作数据库的登录名和用户也是需要多维护一份,
(3)数据库作业不能得到相应的维护。
(4)微软号称镜像可以让客户端对故障透明,但是实际测试中发现只有满足特定的条件才能实现透明化,而且透明化得客户端支持才可行(.net Framework 2.0以上,Microsoft jdbc驱动 1.1以上)。
纵观其他几种方式,仅有“热备份”的“故障转移群集”没有这些问题。
四、基本模式:
同步:已提交的事务将在伙伴双方上提交
异步:事务不需要等待镜像服务器将日志写入磁盘便可提交
五、镜像运行模式:
高安全性模式
支持同步操作。 在高安全性模式下,当会话开始时,镜像服务器将使镜像数据库尽快与主体数据库同步。 在同步数据库之后,已提交的事务将在伙伴双方上提交,但会延长事务滞后时间。 具有自动故障转移功能的高安全性模式要求使用第三个服务器实例,称为“见证服务器”。 与这两个伙伴不同的是,见证服务器并不能用于数据库。 见证服务器通过验证主体服务器是否已启用并运行来仅支持自动故障转移。 只有在镜像服务器和见证服务器与主体服务器断开连接之后而保持相互连接时,镜像服务器才启动自动故障转移。
高性能模式
异步运行。 将事务安全设置为 OFF 时,数据库镜像会话便会异步运行。镜像服务器尝试与主体服务器发送的日志记录保持同步。 虽然镜像数据库可能稍微滞后于主体数据库,但这两个数据库之间的时间间隔通常很小。 但是,如果主体服务器的工作负荷过高或镜像服务器系统的负荷过高,则时间间隔会增大。
六、方法
1、单机多实例
适用于单台机器的多个实例间做数据同步测试
2、同网段(域环境)
适用于域环境中,相对证书方式,配置相对简单,省去了建立密钥、证书及多次为用户授权的过程
3、同网段(非域):证书方式
配置相对较繁琐,基本步骤:
1.各服务器生成主密钥(MASTER KEY)
2.各服务器生成服务证书(CERTIFICATE)
3.使用服务证书生成端点(ENDPOINT)
4.将证书备份为文件,并复制到其他服务器
5.各服务器对其他服务器生成访问授权
1) 生成登陆
3) 绑定证书到用户
4) 授予相关用户对ENDPOINT 的连接访问权
8.为镜像机配置镜像伙伴
9.为主机配置镜像伙伴和见证服务器
配置步骤(证书认证方式)
注意:下文sql语句中的红字部分请根据自己的的实际情况做出修改!
一、配置主备机及见证服务器
1、 服务器基本信息
主机名称为:HOST_A,IP地址为:192.168.100.100
备机名称为:HOST_B,IP地址为:192.168.100.101
见证名称为:HOST_C,IP地址为:192.168.100.102
只有sql Server 2005 标准版、企业版和开发版才可以建立数据镜像。其他版本即Express只能作为见证服务器。如果实在不清楚什么版本,执行如下语句查看:
- select @@version;
若要对此数据库进行数据库镜像,必须将它更改为使用完整恢复模式。若要用 Transact-sql 实现此目的,请使用 ALTER DATABASE 语句:
- USE master;
- ALTER DATABASE <DatabaeName> //<DatabaeName>既为需要配置镜像的数据库名
- SET RECOVERY FULL;
二、主备实例互通
实现互通可以使用域或证书来实现,考虑实现的简单,以下选取证书的方式实现。注意:实现“主备数据库实例互通”的操作只需要做一次,例如为了将两个sql Server 2005的实例中的5个数据库建成镜像关系,则只需要做一次以下操作就可以了;或者这样理解:每一对主备实例(不是数据库)做一次互通。
1、创建证书(主备可并行执行)
--主机执行:
- USE master;
- CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'www.asymt.com';
- CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
- START_DATE = '2012-08-02',
- EXPIRY_DATE = '2099-08-02';
--备机执行:
- USE master;
- CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'www.asymt.com';
- CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
- EXPIRY_DATE = '2099-08-02';
--见证执行:
- USE master;
- CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'www.asymt.com';
- CREATE CERTIFICATE HOST_C_cert WITH SUBJECT = 'HOST_C certificate',
- START_DATE = '2012-08-02',
- EXPIRY_DATE = '2099-08-02';
2、创建连接的端点(主备可并行执行)
--主机执行:
- 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 , ROLE = ALL );
--见证执行:
- CREATE ENDPOINT Endpoint_Mirroring
- STATE = STARTED
- AS
- TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
- FOR
- DATABASE_MIRRORING
- ( AUTHENTICATION = CERTIFICATE HOST_C_cert , ROLE = WITnesS );
3、备份证书以备建立互联(主备可并行执行)
--主机执行:
- 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';
--见证执行
- BACKUP CERTIFICATE HOST_C_cert TO FILE = 'D:\sqlBackup\HOST_C_cert.cer';
4、互换证书
将备份到D:\sqlBackup\的证书进行互换,即HOST_A_cert.cer复制到备机的D:\sqlBackup\和见证机的D:\sqlBackup\。HOST_B_cert.cer复制到主机的D:\sqlBackup\和见证机的D:\sqlBackup\。HOST_C_cert.cer复制到主机的D:\sqlBackup\和备机的D:\sqlBackup\。
以下操作只能通过命令行运行,通过图形界面无法完成。(截至sql Server2005的补丁号为SP2)
--主机执行:
- CREATE LOGIN HOST_B_login WITH PASSWORD = 'www.asymt.com';
- 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_C_login WITH PASSWORD = 'www.asymt.com';
- CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
- CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE = 'D:\sqlBackup\HOST_C_cert.cer';
- GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
--备机执行:
- CREATE LOGIN HOST_A_login WITH PASSWORD = 'www.asymt.com';
- 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];
- CREATE LOGIN HOST_C_login WITH PASSWORD = 'www.asymt.com';
- CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
- CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE = 'D:\sqlBackup\HOST_C_cert.cer';
- GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
--见证执行
- CREATE LOGIN HOST_A_login WITH PASSWORD = 'www.asymt.com';
- 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];
- CREATE LOGIN HOST_B_login WITH PASSWORD = 'www.asymt.com';
- 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];
三、建立镜像关系
以下步骤是针对每个数据库进行的,例如:现有主机中有5个数据库以下过程就要执行5次。
1、 手工同步登录名和密码
在上文中提到数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录。
通常来说数据库都将会有若干个用户作为访问数据库的用户,并且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,例如某业务系统使用’myuser’作为登录名访问数据库,但是在备机中没有’myuser’这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为"孤立用户"
在主数据库中执行如下语句:
- USE master;
- select sid,name from syslogins;
查找出相应的用户名和sid,例如:上述的’myuser’
在备数据库中执行如下语句:
- USE master;
- exec sp_addlogin
- @loginame = '<LoginName>',
- @passwd = '<Password>',
- @sid = <sid> ;
这里的’LoginName’即主数据库中的登录名,sid即是上述通过sql语句查找出的sid。
例如,查询得到的sid和name如下所示。
- sid name
- ---------------------------------- -----------------
- 0x074477739DCA0E499C29394FFFC4ADE4 cz_account
- USE master;
- exec sp_addlogin
- @loginame = 'cz_account',
- @passwd = 'password',
- @sid = 0x074477739DCA0E499C29394FFFC4ADE4;
到此为止可以认为备机数据库的环境已经与主机同步了,还差数据库内的数据未同步。
2、 准备备机数据库
使用主机的全备文件进行还原,在还原数据的时候需要使用选上“with non recover”。如图所示:
如果执行成功数据库将会变成这个样子:
3、 建立镜像
--主机执行:
- ALTER DATABASE shishan SET PARTNER = 'TCP://192.168.100.101:5022';
- ALTER DATABASE shishan SET WITnesS = 'TCP://192.168.100.102:5022';
--如果主体执行不成功,尝试在备机中执行如下语句:
- ALTER DATABASE shishan SET PARTNER = 'TCP://192.168.100.100:5022';
如果执行成功,则主备数据库将会呈现如上图所示的图标。
如果建立失败,提示类似数据库事务日志未同步,则说主备数据库的数据(日志)未同步,为保证主备数据库内的数据一致,应在主数据库中实施一次“事务日志”备份,并还原到备数据库上。备份“事务日志”如图所示:
还原事务日志时需在选项中选择“restore with norecovery”,如图所示:
成功还原以后再执行建立镜像的sql语句。
4、配置完所有后,需要重启见证服务器才能生效。
如果不需要故障自动转移可以不设置见证服务器,既和见证服务器相关的操作可以不做,手动转移操作如下
四、测试操作
1、主备互换
--主机执行:
- USE master;
- ALTER DATABASE <DatabaseName> SET PARTNER FAIlovER;
2、主服务器Down掉,备机紧急启动并且开始服务
--备机执行:
- USE master;
- ALTER DATABASE <DatabaseName> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;
3、原来的主服务器恢复,可以继续工作,需要重新设定镜像
--备机执行:
- USE master;
- ALTER DATABASE <DatabaseName> SET PARTNER RESUME; --恢复镜像
- ALTER DATABASE <DatabaseName> SET PARTNER FAIlovER; --切换主备
4、原来的主服务器恢复,可以继续工作
--默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且sql Server 2005 标准版只支持同步模式。
--关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。
- USE master;
- ALTER DATABASE <DatabaseName> SET PARTNER SAFETY FULL; --事务安全,同步模式
- ALTER DATABASE <DatabaseName> SET PARTNER SAFETY OFF; --事务不安全,异步模式
总结
要进行以上sql server 2005的镜像设置一定要使用sql server 的配置管理器开启TCP/IP协议,如下图
如果没有启用TCP/IP协议则只能在同一个网段内的机器配置镜像,前面的配置步骤里面所用到的IP地址要换成对应的实例名。同一个网段配置并使用镜像的时实性、传输速率更高,适用于大数据量的同步,跨网段或者跨公网的sql server 2005镜像一般适用于数据量小,时实性要求不高的数据同步,而且数据库在公网上同步也不安全。