一、镜像简介
1.1 简介
数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个SQL Server数据库中。镜像不能直接访问;它只用在错误恢复的情况下才可以被访问。
要进行数据库镜像所需的最小需求包括了两个不同的SQL Server运行环境。主服务器被称为“主机”,第二个服务器被称作“备机”。主机数据库就是你实际用着的数据库,镜像数据库就是你的数据库的备用拷贝。当事务写入你的基本服务器的时候,他们也同样被传送到并写入你的镜像数据库中。
除了基本和镜像之外,你还可以引入另一个可选的组件,名为“见证”。见证服务器是第三个SQL Server 2005运行实例,它是在判断什么时候进行错误恢复的时候,用于基本和镜像之间内部交流。只有当你想实现自动错误恢复的时候用到这个选项。它实现了2比1投票的能力,当我的一个组件不可达,并因此需要进行错误恢复的时候。见证服务器只有在你想实现自动错误恢复的时候才需要用到。
1.2、 优点
下表是SQL Server可用性官方解决方案的一个对照表,通常来说“热备份”比“冷备份”的可用性更高,恢复更快。如果不从成本考虑的话,“热备份”中的“故障转移群集”的可用性是最高的,但是故障转移群集需要借助磁盘阵列而且建设本身复杂性较高。数据库镜像的建立并没有太多的硬件要求,最起码没有像“故障转移群集”需要共享存储这么高的要求。
1.3、 缺点
(1)由于SQL Server是一个实例多个数据库的产品,数据库镜像技术是基于数据库级别的,因此每次主数据库新增数据库都必须为备机增加数据库并且为新增的数据库建立镜像关系。
(2)数据库的登录名和用户是存储在master数据库,master数据库是不能做镜像的,所以每次操作数据库的登录名和用户也是需要多维护一份,
(3)数据库作业不能得到相应的维护。
(4)微软号称镜像可以让客户端对故障透明,但是实际测试中发现只有满足特定的条件才能实现透明化,而且透明化得客户端支持才可行(.net Framework 2.0以上,Microsoft jdbc驱动 1.1以上)。
(5)跨数据库事务和分布式事务均不支持数据库镜像。
纵观以上几种方式,仅有“热备份”的“故障转移群集”没有这些问题。
二、安装环境要求
2.1、说明:
DB_Mirror:本例中我们测试用的数据库名
(A)192.168.0.2:主机
(B)192.168.0.3:备机
(C)192.168.0.4:见证
三、配置主备机
3.1、 物理连接
主、备、见证机须相互连通。考虑日志传输的快速性 ,建议三台机器放在同一局域网内,如有条件可考虑主机和备机用交叉线直连,以利于日志文件的传输。
3.2、 检查SQL Server 2005数据库版本
只有SQL Server 2005 标准版、企业版和开发版才可以建立数据镜像。其他版本即Express只能作为见证服务器。如果实在不清楚什么版本,执行如下语句查看:
select @@version;
3.3、建立要做镜像的数据库
-- 建立镜像主体数据库
-- 此操作主体服务器上执行
CREATE DATABASE DB_Mirror
ON( NAME = DB_Mirror_DATA,FILENAME = N'C:\DB_Mirror.mdf')
LOG ON( NAME = DB_Mirror_LOG,FILENAME = N'C:\DB_Mirror.ldf')
ALTER DATABASE DB_Mirror SET RECOVERY FULL –设置为完整恢复模式
--界面操作:在数据库属性的 选项中恢复模式 修改 数据库的恢复模式 作用同上
--若要对此数据库进行数据库镜像,必须将它更改为使用完整恢复模式
GO
3.4、完全备份数据库 用于在备机上还原数据库
-- 完全备份
BACKUP DATABASE DB_Mirror
TO DISK = N'C:\DB_Mirror.bak'
WITH FORMAT
GO
3.5、在备机上还原镜像数据库 注意使用 WITH NORECOVERY 选项还原数据库
-- 初始化镜像主体数据库
-- 此操作镜像服务器上执行
-- 假设主体数据库的完全备份已经复制到c:\DB_Mirror.bak
RESTORE DATABASE DB_Mirror FROM DISK = N'C:\DB_Mirror.bak'
WITH REPLACE, NORECOVERY
-- 如果镜像数据库文件要放在指定位置, 则启用下面的Move 选项
-- , MOVE 'DB_Mirror_DATA' TO N'C:\DB_Mirror.mdf'
-- , MOVE 'DB_Mirror_LOG' TO N'C:\DB_Mirror.ldf'
GO
四、主、备、见证、互通实例
实现互通可以使用域或证书来实现,考虑实现的简单,以下选取证书的方式实现。注意:实现“主备数据库实例互通”的操作只需要做一次,例如为了将两个SQL Server 2005的实例中的5个数据库建成镜像关系,则只需要做一次以下操作就可以了;或者这样理解:每一对主备实例(不是数据库)做一次互通。
4.1、作流程描述
1、 在 主机、备机、见证机上分别创建数据库主密钥(用于加密证书)
2、 在 主机、备机、见证机上分别创建 证书(用于建立端点和登录用户)
3、 在 主机、备机、见证机上分别创建 端点(用于主、备、见证机的镜像连接)
4、 在 主机、备机、见证机上分别 备份 各自的证书
5、 在 主机、备机、见证机上分别创建 登录用户
创建原则如下:
主机:分别用 备机和见证机的证书 创建 主机 的证书 然后用 该证书创建 登录 用户。 最后分别 授予 对主机数据库镜像端点的connect 权限
备机:分别用 主机和见证机的证书 创建 主机 的证书 然后用 该证书创建 登录 用户。 最后分别 授予 对主机数据库镜像端点的connect 权限
见证机:分别用 备机和主机的证书 创建 主机 的证书 然后用 该证书创建 登录 用户。 最后分别 授予 对主机数据库镜像端点的connect 权限
1、 在 主机、备机上 分别建立 镜像:
主机: 启用到 备机和见证机的 数据库镜像
备机: 启用到 主机 的 数据库镜像
4.2、创建证书(主、备、见证可并行执行)
--主机执行:
--DROP MASTER KEY --删除密钥
--DROP CERTIFICATE HOST_A_cert --删除证书
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'baijunlin' --创建密钥
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A_certificate',START_DATE = '04/09/2009' '创建证书
-- baijunlin 加密密钥字符串。HOST_A_cert 主机证书名称,START_DATE 开始生效日期,必须小于当前系统时间
--备机执行:
--DROP MASTER KEY --删除密钥
--DROP CERTIFICATE HOST_A_cert --删除证书
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'baijunlin' --创建密钥
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B_certificate',START_DATE = '04/09/2009' '创建证书
-- baijunlin 加密密钥字符串。HOST_A_cert 主机证书名称,START_DATE 开始生效日-期,必须小于当前系统时间
--见证机执行:
--DROP MASTER KEY --删除密钥
--DROP CERTIFICATE HOST_A_cert --删除证书
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'baijunlin' --创建密钥
CREATE CERTIFICATE HOST_C_cert WITH SUBJECT = 'HOST_C_certificate',START_DATE = '04/09/2009' '创建证书
-- baijunlin 加密密钥字符串。HOST_A_cert证书名称,START_DATE 开始生效日期,必须小于当前系统时间
4.3、创建连接的端点(主、备、见证 可并行执行)
主机和备机的端点名称可以相同 也可不同(建议相同)
--主机执行:
--DROP ENDPOINT Endpoint_Name –删除端点
create ENDPOINT Endpoint_Name –端点 名称 Endpoint_Name
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL)
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL )
-- Endpoint_Name 端点名称 LISTENER_PORT 指定TCP连接的端口号 LISTENER_IP---连接的IP 此处设置任意IP均可连接
--备机执行:
--DROP ENDPOINT Endpoint_Name
create ENDPOINT Endpoint_Name
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL)
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL )
-- Endpoint_Name 端点名称 LISTENER_PORT 指定TCP连接的端口号 LISTENER_IP--连接的IP 此处任意IP均可连接
--见证机执行:
--DROP ENDPOINT Endpoint_Name
create ENDPOINT Endpoint_Name
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL)
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_C_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL )
-- Endpoint_Name 端点名称 LISTENER_PORT 指定TCP连接的端口号 LISTENER_IP--连接的IP 此处任意IP均可连接
以上用各自证书建立各自的镜像端点
4.4、备份证书以备建立互联(主备可并行执行)
--主机执行:
BACKUP CERTIFICATE HOST_A_cert TO FILE = 'D:\HOST_A_cert.cer';
--备机执行:
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'D:\HOST_B_cert.cer';
--见证机执行:
BACKUP CERTIFICATE HOST_C_cert TO FILE = 'D:\HOST_C_cert.cer';
4.5、互换证书
将备份到D:\的证书进行互换,即
HOST_A_cert.cer复制到备机的D:\
HOST_A_cert.cer复制到见证机的D:\
HOST_B_cert.cer复制到主机的D:\
HOST_B_cert.cer复制到见证机的D:\
HOST_C_cert.cer复制到主机的D:\
HOST_C_cert.cer复制到备机的D:\
注意保存该三份证书 存放目录可任意修改
4.6、添加登陆名、用户(主、备、见证、可并行执行)
以下操作只能通过命令行运行,通过图形界面无法完成。(截至文档编写结束,SQL Server2005的不定号为SP2)
主机执行:
--在主体服务器上完成镜像服务器数据库镜像端点的传输安全模式配置
--建立 备机 登录 用户
CREATE LOGIN HOST_B_login WITH PASSWORD = 'baijunlin';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE =
'D:\HOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT:: Endpoint_Name TO [HOST_B_login];
--给HOST_B_login 用户 赋予 数据库镜像端点connect 权限
--建立 见证机 登录 用
CREATE LOGIN HOST_C_login WITH PASSWORD = 'baijunlin';
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE =
'D:\HOST_C_cert.cer';
GRANT CONNECT ON ENDPOINT:: Endpoint_Name TO [HOST_C_login];
--给HOST_B_login 用户 赋予 数据库镜像端点connect 权限
备机执行:
--在备机服务器上完成镜像服务器数据库镜像端点的传输安全模式配置
--建立 主机 登录 用户
CREATE LOGIN HOST_A_login WITH PASSWORD = 'baijunlin';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE =
'D:\HOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT:: Endpoint_Name_B TO [HOST_A_login];
--给HOST_B_login 用户赋予 数据库镜像端点connect 权限
--建立见证机 登录 用
CREATE LOGIN HOST_C_login WITH PASSWORD = 'baijunlin';
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE =
'D:\HOST_C_cert.cer';
GRANT CONNECT ON ENDPOINT:: Endpoint_Name TO [HOST_C_login];
--给HOST_B_login 用户赋予 数据库镜像端点connect 权限
见证 机执行:
--在见证机服务器上完成镜像服务器数据库镜像端点的传输安全模式配置
--建立 主机 登录 用户
CREATE LOGIN HOST_B_login WITH PASSWORD = 'baijunlin';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE =
'D:\HOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT:: Endpoint_Name_B TO [HOST_B_login];
--给HOST_B_login 用户赋予 数据库镜像端点connect 权限
--建立见证机 登录 用
CREATE LOGIN HOST_A_login WITH PASSWORD = 'baijunlin';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE =
'D:\HOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT:: Endpoint_Name TO [HOST_A_login];
--给HOST_B_login 用户赋予 数据库镜像端点connect 权限
到此为止可以认为备机数据库的环境已经与主机同步了,还差数据库内的数据未同步。
4.7、 建立镜像
--主机执行:
ALTER DATABASE DB_Mirror SET PARTNER = 'TCP://192.168.0.3:5022';
--建立与备机的镜像
--备机执行:
ALTER DATABASE DB_Mirror SET PARTNER = 'TCP://192.168.0.2:5022';
--建立与主机的镜像
如果建立失败,提示类似数据库事务日志未同步,则说主备数据库的数据(日志)未同步,为保证主备数据库内的数据一致,应在主数据库中实施一次“事务日志”备份,并还原到备数据库上。备份“事务日志”如图所示:
还原事务日志时需在选项中选择“restore with norecovery”,如图所示:
成功还原以后再次执行建立镜像的SQL语句。
ALTER DATABASE DB_Mirror SET PARTNER = 'TCP://192.168.0.2:5022';
五、测试操作
5.1、主备互换
--主机执行:
1USE master;
2alter DATABASE SET PARTNER FAILOVER;
3
5.2、主服务器Down掉,备机紧急启动并且开始服务
--备机执行:
1USE master;
2alter DATABASE SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;
5.3、原来的主服务器恢复,可以继续工作,需要重新设定镜像
1--备机执行:
2USE master;
3alter DATABASE SET PARTNER RESUME; --恢复镜像
4alter DATABASE SET PARTNER FAILOVER; --切换主备
5.4、原来的主服务器恢复,可以继续工作
--默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。
--关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。
1USE master;
2alter DATABASE SET PARTNER SAFETY FULL; --事务安全,同步模式
3alter DATABASE SET PARTNER SAFETY OFF; --事务不安全,异步模式