Fork me on GitHub
.net求学者

解析SQL SERVER数据库镜像原理和实现

数据库镜像属于热备技术或温备技术,是故障转移群集、日志传送的一种替代方案,可大大提高数据库可用性。数据库镜像只适用于数据库的完整恢复模式,对简单恢复模式与大容量恢复模式不支持,且不能镜像系统数据库。
  1 数据库镜像原理
  企业环境中,客户端连接使用的服务器实例,即“主服务器”,可能在不同区域不同计算机上,企业为了能快速进行故障转移,常在另一台其它服务器上再备份数据库的另一个副本。该文以镜像数据库来讲述备份的那个数据库副本,做数据库镜像的机器称为“镜像服务器”。
  镜像数据库的基本原理是,对主服务器上的主体数据库执行的增、删、改、查操作以日志的方法在镜像服务器的镜像数据库中重做。主体服务将自身的生产数据库中每个提交的事务写入日志,且同时给镜像服务器提交此事务,镜像服务器在自己的日志中记录此事务。
  主体服务器和镜像服务器在给定的任何时间里各自扮演各自的角色,但两服务器扮演的角色是互补的且两服务器的角色是可以互换的。若主体服务器出现故障或其它原因要转入离线状态或转为镜像服务器,镜像服务器可在角色切换中转换为主体服务器。有三种角色切换形式,分别为:
  1) 自动故障切换,要求主服务器与镜像服务器同步数据库,且由见证服务器将主服务器与镜像服务器连接。
  2) 手动故障切换,不需要见证服务器,只要主服务器与镜像服务器连通,且主服务器与镜像服务器同步数据库即可。
  3) 强制故障切换,造成数据丢失的情况可能会出现,主服务器与镜像服务器的数据库可同步也可异步。
  2 数据镜像模式
  数据库镜像操作有两方式,即:同步镜像操作与异步镜像操作。
  同步镜像操作:在事务传送中,主服务器必须等待镜像服务器返回成功接收日志的消息后,主服务器才继续下一事务日志到磁盘的写入与提交到镜像服务器。这种镜像不会造成数据丢失,但是存在镜像操作的事务延迟。
  异步镜像操作:在事务传送中,主服务器不等待镜像服务器返回日志的接收情况,继续写下一事务日志到物理磁盘并提交给镜像服务器,这种镜像操作性能较高,但是可能造成数据丢失。
  SQL SERVER 2008支持两种镜像模式:同步操作的高安全模式;异步操作的高性能模式,此模式是牺牲了高可用性,且高性模式仅支持强制服务器切换形式。
  3 数据库镜像配置
  因数据库镜像操作相当复杂,本案例以教学探讨为主,选不含见证服务器,只涉及使用主服务器与镜像服务配置数据库镜像。
  实例中的主服务器A与镜像服务器B单独存在于互联网,且没加入域。
  数据库镜像配置前的环境:
  在虚拟机中安装两台服务器,即主服务器与镜像服务器,然后分别配置;
  主服务器A:Windows Server 2008 R2,SQL SERVER 2008 Enterprise,服务器名:LXL1,IP为:172.16.28.6;
  镜像服务器B:Windows Server 2008 R2,SQL SERVER 2008 Enterprise,服务器名:LXL2,IP为:172.16.28.12。
  具体的数据库镜像配置操作如下:
  1)在主服务器A的主数据库上建立证书MIR_CER_A,因A服务器没加入域。
  usemaster;
  go
  createmasterkeyencryptionbypassword='your password'
  go
  createcertificateMIR_CER_A
  withsubject='MIR_CER_A certificate for database mirroring',
  start_date='2009-9-9',
  expiry_date='2020-9-9'
  go
  2)为主数据库A建立镜像端点MIR_ ENDPOINT_A,依据前面建立的证书MIR_CER_A。且可在SSMS中查看建立的镜像端点。
  usemaster;
  go
  createendpointMIR_ ENDPOINT_A
  state=started
  astcp(listener_port=5024
  ,listener_ip=all)
  fordatabase_mirroring(authentication=certificateMIR_CER_A
  ,encryption=requiredalgorithmrc4
  ,role=all);
  3)将主服务器A 的证书MIR_CER_A备份且复制到镜像服务器B,MIR_CER_A就是主服务器A同镜像服务器B通信的有效凭证。
  usemaster;
  go
  backupcertificateMIR_CER_A
  tofile='d:\ MIR_CER_A.cer';   4)在镜像服务器B上建立证书MIR_CER_B,并依据此证书为镜像服务器B建立镜像端点MIR_ENDPOINT_B,同时备份、复制证书MIR_CER_B。
  —以下为在镜像服务器B上建立证书MIR_CER_B
  usemaster;
  go
  createmasterkeyencryptionbypassword='your password'
  go
  createcertificateMIR_CER_B
  withsubject='MIR_CER_B certificate for database mirroring',
  start_date='2009-9-9',
  expiry_date='2020-9-9'
  go
  —以下为依据此证书为镜像服务器B建立镜像端点MIR_ENDPOINT_B
  usemaster;
  go
  createendpointMIR_ENDPOINT_B
  state=started
  astcp(listener_port=5024
  ,listener_ip=all)
  fordatabase_mirroring(authentication=certificatemir_b_cert
  ,encryption=requiredalgorithmrc4
  ,role=all);
  Go
  —以下为备份、复制证书MIR_CER_B
  usemaster;
  go
  backupcertificateMIR_CER_Btofile='d:\MIR_CER_B.cer';
  5)主服务器A为了连接镜像服务器B进行通信,在主服务器A上必须建立通信的登录名MIR_LOGIN_B与用户名MIR_USER_B。
  usemaster
  go
  createloginMIR_LOGIN_Bwithpassword='your password'; go
  createuserMIR_USER_BforloginMIR_LOGIN_B;
  6)在主服务器A上还原镜像服务器B上建立的证书MIR_CER_B,并给才建立的用户MIR_USER_B授予证书MIR_CER_B的使用权。这样主服务器A与镜像服务器B可通过安全验证通信。
  CREATECERTIFICATEMIR_CER_B
  AUTHORIZATIONMIR_USER_BFROMFILE='d:\ MIR_CER_B.cer'
  7)授予登录名MIR_LOGIN_B主服务器A的镜像端点MIR_ ENDPOINT_A,授权后主服务器A同镜像服务器B可使用该用户MIR_USER_B,因MIR_USER_B具有镜像服务器B的证书授权,从而保证主服务器A与镜像服务器B通信安全。
  grantconnectonendpoint::MIR_ ENDPOINT_A MIR_LOGIN_B;
   8)依据以上方法在镜像服务器B上建立登录名MIR_LOGIN_A,用户MIR_USER_A,且在镜像服务器B上还原主服务器A证书 MIR_CER_A,并将证书MIR_CER_A的使用权授予用户MIR_USER_A,同时授予登录名MIR_LOGIN_A镜像服务器B的镜像端点 MIR_ENDPOINT_B。
  usemaster
  go
  createloginMIR_LOGIN_Awithpassword='your password';
  go
  createuserMIR_USER_AforloginMIR_LOGIN_A;
  go
  CREATECERTIFICATEMIR_CER_A
  AUTHORIZATIONMIR_USER_AFROMFILE='d:\ MIR_CER_A.cer'
  go
  grantconnectonendpoint:: MIR_ENDPOINT_B MIR_LOGIN_A;
  go
  9)在镜像服务器B上还原主服务器A上完全备份的数据库,达到初始化镜像数据库。
  —主服务器A
  BACKUPDATABASECREDITtodisk='d:\credit.bak'
  —镜像服务器B
  RESTOREDATABASECREDIT
  fromdisk='d:\credit.bak'withnorecovery
  10)在主服务器A和镜像服务器B上分别配置为镜像伙伴,且必须先配置镜像服务器B。这样主服务器A与镜像服务器B就完成了镜像功能。用户可连接到主服务器A进行数据操作。
  ALTERDATABASECREDIT
  SETPARINER='TCP:// LXL1:5024';—镜像伙伴设置
  Go
  ALTERDATABASECREDIT
  SETPARINER='TCP:// LXL2:5024';—镜像伙伴设置
  11)以下是主服务器A同镜像服务器B镜像角色的切换。
  USEmaster;
  ALTERDATABASECREDITSETPARINERFALLOVER
  4 结束语
   数据库镜像目的是避免主服务器数据库故障影响数据库的可用性,同时也增强了数据库的保护功能, 甚至即使主服务器数据库不出现故障,镜像服务器还可提供并发操作。以上实例只能通过手动切换镜像服务器与主服务器的角色,若想角色间的切换自动,必须要引 入见证服务器。见证服务器的配置同前。

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------

SQL Server 2005 镜像构建

 

一、镜像简介

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 WITNESS = 'TCP:// 192.168.0.4: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.3:5022';

五、疑难解答
创建数据库主密钥:

语法:CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'    --DROP MASTER KEY '删除密钥

数据库主密钥是指用于保护证书私钥的对称密钥以及数据库中存在的非对称密钥。当创建主密钥时,会使用 Triple DES 算法以及用户提供的密码对其进行加密。若要启用主密钥的自动解密功能,请使用服务主密钥对该主密钥的副本进行加密,并将副本存储在数据库和 master 中。通常,每当主密钥更改时,便会在不进行提示的情况下更新存储在 master 中的副本。可以使用 ALTER MASTER KEY 的 DROP ENCRYPTION BY SERVICE MASTER KEY 选项对该默认行为进行更改。必须使用 OPEN MASTER KEY 语句和密码打开未使用服务主密钥进行加密的主密钥。

master 中 sys.databases 目录视图的 is_master_key_encrypted_by_server 列指示是否使用服务主密钥对数据库主密钥进行加密。

可以在 sys.symmetric_keys 目录视图中查看有关数据库主密钥的信息。

重要事项:

您应该使用 BACKUP MASTER KEY 备份主密钥,并将备份存储于另外一个安全的位置中

参数:PASSWORD = 'password' 用于对数据库中主密钥进行加密的密码。

创建证书:CREATE CERTIFICATE

证书是一个数据库级别的安全对象,它遵循 X.509 标准并支持 X.509 V1 字段。CREATE CERTIFICATE 可以通过文件或程序集加载证书。该语句也可生成密钥对并创建自我签名的证书。

SQL Server 生成的私钥的长度为 1024 位。从外部源导入的私钥的最小长度为 384 位,最大长度为 3,456 位。导入的私钥的长度必须是 64 位的整数倍。

私钥必须与 certificate_name 指定的公钥相对应。

当您通过容器创建证书时,可选择是否加载私钥。但是当 SQL Server 生成自我签名的证书时,始终会创建私钥。默认情况下,私钥使用数据库主密钥进行加密。如果数据库主密钥不存在并且未指定密码,则该语句将失败。

当使用数据库主密钥对私钥进行加密时,不需要 ENCRYPTION BY PASSWORD 选项。只有在使用密码对私钥进行加密时,才使用该选项。如果未指定密码,则使用数据库主密钥对证书的私钥进行加密。如果数据库主密钥无法打开,则省略该子句会导致错误。

如果使用数据库主密钥对私钥进行加密,则不一定必须指定解密密码。

1、 端点:参见 sql server 2005 联机丛书 CREATE ENDPOINT 语句 祥解

5.1为什么用set witness连接见证服务器时总报1416或1456的错误?
答:请检查你参与镜像的三台服务器上用作镜像功能的网卡配置,比如DNS属性页上的DNS后缀选项、WINS属性页的启用LMHOSTS查找以及默认NETBIOS等这些最好都开启。第二个问题我后来进一步验证了一下,只需要开启TCPIP上的NETBIOS就可以了。
检查一下开启NETBIOS的网卡IP是否是指定的IP,和你的ENDPOINT上指定的IP是否相同。
在主体服务器上telnet见证服务器的5022是否能连接上。
尝试用机器名指定见证,如:'TCP://机器名:5022'

 

5.2、    么用set partner连接伙伴时总是报1418的错误?
答:在配置时,特别是在工作组环境下最好使用证书,否则伙伴之间无法进行连接,域环境下用windows验证方式或证书验证方式均可。

 

5.3、附件1:(只包含主机和备机的数据库镜像)
主机端执行的sql 语句

--sql server 2005 需要安装sp2 补丁

 

--创建证书

 

--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' --创建证书

 

--创建连接的端点

--DROP ENDPOINT Endpoint_Mirroring

create ENDPOINT Endpoint_NAME_A

STATE = STARTED

AS

TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )

FOR

DATABASE_MIRRORING

( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL )

 

-- 备份证书

BACKUP CERTIFICATE HOST_A_cert TO FILE = 'D:\HOST_A_cert.cer';  

 

-- 添加登陆名、用户(主备可并行执行)

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_B_cert.cer';

GRANT CONNECT ON ENDPOINT::Endpoint_NAME_A TO [HOST_A_login];

 

--建立镜像

ALTER DATABASE SJDD SET PARTNER = 'TCP://192.168.0.2:5022'

 

-- 查询密钥对和证书

select * from sys.symmetric_keys

SELECT * FROM sys.certificates;

SELECT name, role_desc, state_desc, connection_auth_desc, encryption_algorithm_desc FROM sys.database_mirroring_endpoints;

BACKUP CERTIFICATE PARTNER TO FILE = 'C:\HOST_A_cert.cer';

delete sys.symmetric_keys where symmetric_Key_ID ='101'

备机端执行的sql 语句

--创建证书

 

--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' --创建证书

 

--创建连接的端点

--DROP ENDPOINT Endpoint_Mirroring

create ENDPOINT Endpoint_NAME_B

STATE = STARTED

AS

TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )

FOR

DATABASE_MIRRORING

( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL )

 

-- 备份证书

BACKUP CERTIFICATE HOST_B_cert TO FILE = 'D:\HOST_B_cert.cer';

  

--添加登陆名、用户(主备可并行执行)

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_A_cert.cer';

GRANT CONNECT ON ENDPOINT::Endpoint_NAME_B TO [HOST_B_login];

 

--建立镜像

ALTER DATABASE SJDD SET PARTNER = 'TCP://192.168.0.3:5022'

 

--restore database SJDD from disk='d:\SJDD' with NORECOVERY ,

--MOVE 'SJDD' to 'C:\砂浆系统\数据库\SJDD.mdf',

--Move 'SJDD_log' to 'C:\砂浆系统\数据库\SJDD_log.mdf'

5.4、附件2:(包含主机、备机、见证机的数据库镜像)
-- ===========================================

-- 无论是主体服务器、镜像服务器, 还是见证服务器

-- 除特别说明外,均需要保证下面的操作在master库中执行

USE master

GO

-- ===========================================

--() 建立镜像主体数据库

-- 此操作主体服务器上执行

-- a. 建立测试数据库

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

-- b. 完全备份

BACKUP DATABASE DB_Mirror

TO DISK = N'C:\DB_Mirror.bak'

WITH FORMAT

GO

-- ===========================================

--() 主体服务器上的数据库镜像端点及身份验证用的证书

-- 此操作主体服务器上执行

-- a. 用于数据库镜像端点身份验证的证书

IF NOT EXISTS( -- 使用数据库主密钥加密证书

SELECT * FROM sys.symmetric_keys

WHERE name = N'##MS_DatabaseMasterKey##')

CREATE MASTER KEY

ENCRYPTION BY PASSWORD = N'baijunlin'

 

CREATE CERTIFICATE HOST_A_cert --证书

WITH

SUBJECT = N'HOST_A_cert',

START_DATE = '20090101', --证书开始日期

EXPIRY_DATE = '99991231' --证书结束日期

GO

 

-- b. 备份证书, 以便在与此端点通信的另一端建立此证书

BACKUP CERTIFICATE HOST_A_cert

TO FILE = 'D:\JXZS\HOST_A_cert.cer'

GO

 

-- c. 数据库镜像端点

CREATE ENDPOINT EDP_Mirror --EDP_Mirror 证书名称(和其它两台服务器可以不同,但端点名最好相同)

STATE = STARTED

AS TCP(

LISTENER_PORT = 6000, -- 镜像端点使用的通信端口

LISTENER_IP = ALL)     -- 侦听的IP地址

    FOR DATABASE_MIRRORING(

AUTHENTICATION = CERTIFICATE HOST_A_cert, -- 证书身份验证

ENCRYPTION = DISABLED,                       -- 不对传输的数据加密,如果需要加密,可以配置为SUPPORTED 或REQUIRED, 并可选择加密算法

ROLE = ALL)                                  -- 端点支持所有的数据库镜像角色, 也可以设置为WITNESS(仅见证服务器),或PARTNER(仅镜像伙伴)

GO

 

--############

--以下部分在见证机和备机执行完创建证书后执行

-- ===========================================

--() 在主体服务器上完成镜像服务器数据库镜像端点的传输安全模式配置

-- 此操作主体服务器上执行

 

-- a. 建立主体服务器上的证书(假设镜像服务器上备份的证书已经复制到C:\CT_Mirror_SrvB.cer)

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:\JXZS\HOST_B_cert.cer'; --建立主体服务器上的证书

GRANT CONNECT ON ENDPOINT::EDP_Mirror TO [HOST_B_login];

go

 

-- ===========================================

--() 在主体服务器上完成见证服务器数据库镜像端点的传输安全模式配置

-- 此操作主体服务器上执行

-- a. 建立见证服务器上的证书(假设见证服务器上备份的证书已经复制到C:\CT_Mirror_SrvWitness.cer)

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:\JXZS\HOST_C_cert.cer'; --建立主体服务器上的证书

GRANT CONNECT ON ENDPOINT::EDP_Mirror TO [HOST_C_login];

go

 

--############

--以下部分在见证机和备机执行完传输安全模式配置后执行

--() 在主体服务器上启用数据库镜像(默认为高安全性模式,所以不用进行模式设置)

-- 此操作主体服务器上执行

ALTER DATABASE DB_Mirror SET

PARTNER = 'TCP://ntserver8bak:6001'

GO

 

-- ===========================================

--() 在主体服务器上为数据库镜像启用见证服务器

-- 此操作主体服务器上执行

ALTER DATABASE DB_Mirror SET WITNESS = 'TCP://192.168.0.3:6002'

GO

 

 

 

 

--####################################

--以下部分在备机执行

--####################################

 

-- ===========================================

--() 初始化镜像主体数据库

-- 此操作镜像服务器上执行

-- 假设主体数据库的完全备份已经复制到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'D:\jxzs\DB_Mirror.mdf'

, MOVE 'DB_Mirror_LOG' TO N'D:\jxzs\DB_Mirror.ldf'

GO

 

-- ===========================================

--() 镜像服务器上的数据库镜像端点及身份验证用的证书

-- 此操作镜像服务器上执行

-- a. 用于数据库镜像端点身份验证的证书

IF NOT EXISTS( -- 使用数据库主密钥加密证书

SELECT * FROM sys.symmetric_keys

WHERE name = N'##MS_DatabaseMasterKey##')

CREATE MASTER KEY

ENCRYPTION BY PASSWORD = N'baijunlin'

 

CREATE CERTIFICATE HOST_B_cert

WITH

SUBJECT = N'HOST_B_cert',

START_DATE = '20090101',

EXPIRY_DATE = '99991231'

GO

 

-- b. 备份证书, 以便在与此端点通信的另一端建立此证书

BACKUP CERTIFICATE HOST_B_cert

TO FILE = 'D:\JXZS\HOST_B_cert.cer'

GO

 

-- c. 数据库镜像端点

CREATE ENDPOINT EDP_Mirror

STATE = STARTED    --端点创建时的状态 STARTED 表示端点已启动并在积极地侦听连接

AS TCP(

LISTENER_PORT = 6001, -- 镜像端点使用的通信端口

LISTENER_IP = ALL)     -- 侦听的IP地址

    FOR DATABASE_MIRRORING(

AUTHENTICATION = CERTIFICATE HOST_B_cert, -- 证书身份验证

ENCRYPTION = DISABLED,                       -- 不对传输的数据加密,如果需要加密,可以配置为SUPPORTED 或REQUIRED, 并可选择加密算法

ROLE = ALL)                                  -- 端点支持所有的数据库镜像角色, 也可以设置为WITNESS(仅见证服务器),或PARTNER(仅镜像伙伴)

GO

 

--############

--以下部分在见证机和主机执行完创建证书后执行

-- ===========================================

--() 在镜像服务器上完成主体服务器数据库镜像端点的传输安全模式配置

-- 此操作镜像服务器上执行

-- a. 建立主体服务器上的证书(假设主体服务器上备份的证书已经复制到D:\JXZS\HOST_A_cert.cer)

-- b. 完成主体服务器上数据库镜像端点的传输安全模式配置

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:\JXZS\HOST_A_cert.cer'; --建立主体服务器上的证书

GRANT CONNECT ON ENDPOINT::EDP_Mirror TO [HOST_A_login];

go

 

-- ===========================================

--() 在镜像服务器上完成见证服务器数据库镜像端点的传输安全模式配置

-- 此操作镜像服务器上执行

-- a. 建立见证服务器上的证书(假设见证服务器上备份的证书已经复制到C:\CT_Mirror_SrvWitness.cer)

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:\JXZS\HOST_C_cert.cer'; --建立主体服务器上的证书

GRANT CONNECT ON ENDPOINT::EDP_Mirror TO [HOST_C_login];

GO

 

--############

--以下部分在主机执行完传输安全模式配置后执行

-- ===========================================

--() 在镜像服务器上启用数据库镜像

-- 此操作镜像服务器上执行

ALTER DATABASE DB_Mirror SET

PARTNER = 'TCP://192.168.0.3:6000'

GO

 

 

 

--####################################

--以下部分在见证机执行

--#####################################

-- ===========================================

--() 配置见证服务器

-- 此操作在见证服务器上执行

-- a. 完成见证服务器上数据库镜像端点的传输安全模式配置

 

-- (a). 用于数据库镜像端点身份验证的证书

IF NOT EXISTS( -- 使用数据库主密钥加密证书

SELECT * FROM sys.symmetric_keys

WHERE name = N'##MS_DatabaseMasterKey##')

CREATE MASTER KEY

ENCRYPTION BY PASSWORD = N'baijunlin'

 

CREATE CERTIFICATE HOST_C_cert

WITH

SUBJECT = N'HOST_C_cert',

START_DATE = '20090101',

EXPIRY_DATE = '99991231'

GO

 

-- (b). 备份证书, 以便在与此端点通信的另一端建立此证书

BACKUP CERTIFICATE HOST_C_cert

TO FILE = 'D:\JXZS\HOST_C_cert.cer'

GO

 

-- (c). 数据库镜像端点

CREATE ENDPOINT EDP_Mirror

STATE = STARTED

AS TCP(

LISTENER_PORT = 6002, -- 镜像端点使用的通信端口

LISTENER_IP = ALL)    -- 侦听的IP地址

    FOR DATABASE_MIRRORING(

AUTHENTICATION = CERTIFICATE HOST_C_cert, -- 证书身份验证

ENCRYPTION = DISABLED,                            -- 不对传输的数据加密,如果需要加密,可以配置为SUPPORTED 或REQUIRED, 并可选择加密算法

ROLE = ALL)                                        -- 端点支持所有的数据库镜像角色, 也可以设置为WITNESS(仅见证服务器),或PARTNER(仅镜像伙伴)

GO

 

--############

--以下部分在主机和备机执行完创建证书后执行

-- b. 完成主体服务器上数据库镜像端点的传输安全模式配置

-- (a). (假设主体服务器上备份的证书已经复制到C:\CT_Mirror_SrvA.cer)

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:\JXZS\HOST_A_cert.cer'; --建立主体服务器上的证书

GRANT CONNECT ON ENDPOINT::EDP_Mirror TO [HOST_A_login];

go

 

-- c. 完成镜像服务器上数据库镜像端点的传输安全模式配置

-- (a). 建立镜像服务器上的证书(假设镜像服务器上备份的证书已经复制到C:\CT_Mirror_SrvB.cer)

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:\JXZS\HOST_B_cert.cer';

GRANT CONNECT ON ENDPOINT::EDP_Mirror TO [HOST_B_login];

GO

 

5.5、附件3(删除数据库镜像)
-- ===========================================

-- 下面的操作可用于确定同步

-- 1. 查询数据库状态

-- 下面的脚本可以在主体服务器和镜像服务器上执行,执行结果为镜像的状态

SELECT

mirroring_role_desc,          -- 数据库在镜像会话中当前的角色

mirroring_state_desc,          -- 镜像当前状态

mirroring_safety_level_desc, -- 镜像运行模式

mirroring_witness_state_desc -- 与见证服务器的连接情况

FROM sys.database_mirroring

WHERE database_id = DB_ID(N'DB_Mirror')

GO

 

-- 2. 数据测试

-- b. 主体服务器上执行下面的语句以建立测试表

CREATE TABLE DB_Mirror.dbo.tb(

id int)

WAITFOR DELAY '00:00:01'

GO

 

-- b. 镜像服务器上, 建立镜像数据库的快昭数据库,以便可以查询当前的数据

CREATE DATABASE SNP_DB_Mirror

ON(

NAME = DB_Mirror_DATA,

FILENAME = N'C:\SNP_DB_Mirror.mdf')

AS SNAPSHOT OF DB_Mirror

GO

 

-- c. 从快照数据库中查询测试表是否已经同步

SELECT * FROM SNP_DB_Mirror.dbo.tb

GO

 

-- d. 删除测试建立的快照数据库

DROP DATABASE SNP_DB_Mirror

GO

 

-- ===========================================

-- 下面的操作用于删除此示例配置的镜像对象

-- 证书和数据库的备份需要在操作系统的资源管理器中删除

-- 1. 主体服务器上执行的操作

-- a. 停止镜像和删除主体数据库

USE master

GO

 

ALTER DATABASE DB_Mirror SET

PARTNER OFF

DROP DATABASE DB_Mirror

GO

 

-- b. 删除镜像端点

DROP ENDPOINT EDP_Mirror

GO

 

-- c. 删除登录及证书

DROP LOGIN LOGIN_Mirror_SrvB

DROP LOGIN LOGIN_Mirror_SrvWitness

DROP CERTIFICATE CT_Mirror_SrvA

DROP CERTIFICATE CT_Mirror_SrvB

DROP CERTIFICATE CT_Mirror_SrvWitness

GO

 

-- 2. 镜像服务器上执行的操作

-- a. 删除镜像数据库

USE master

GO

 

DROP DATABASE DB_Mirror

GO

 

-- b. 删除镜像端点

DROP ENDPOINT EDP_Mirror

GO

 

-- c. 删除登录及证书

DROP LOGIN LOGIN_Mirror_SrvA

DROP LOGIN LOGIN_Mirror_SrvWitness

DROP CERTIFICATE CT_Mirror_SrvA

DROP CERTIFICATE CT_Mirror_SrvB

DROP CERTIFICATE CT_Mirror_SrvWitness

GO

 

-- 3. 见证服务器上执行的操作

-- a. 删除端点

DROP ENDPOINT EDP_Mirror

GO

 

-- b. 删除登录及证书

DROP LOGIN LOGIN_Mirror_SrvA

DROP LOGIN LOGIN_Mirror_SrvB

DROP CERTIFICATE CT_Mirror_SrvA

DROP CERTIFICATE CT_Mirror_SrvB

DROP CERTIFICATE CT_Mirror_SrvWitness

GO

5.6、sql server 2005 服务启动帐户 :
进入 服务 管理界面中 选择SQL Server (MSSQLSERVER) 服务 右键属性中 选择 登录 项,输入刚才创建的用户名和密码,保存后重新启动该服务


六、测试操作
6.1、主备互换
--主机执行:

USE master;
ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER;

 

6.2、主服务器Down掉,备机紧急启动并且开始服务
--备机执行:

USE master;
ALTER DATABASE <DatabaseName> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;

6.3、原来的主服务器恢复,可以继续工作,需要重新设定镜像
--备机执行:
USE master;
ALTER DATABASE <DatabaseName> SET PARTNER RESUME; --恢复镜像
ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --切换主备

6.4、原来的主服务器恢复,可以继续工作
--默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。

--关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。

USE master;
ALTER DATABASE <DatabaseName> SET PARTNER SAFETY FULL;--事务安全,同步式
ALTER DATABASE <DatabaseName> SET PARTNER SAFETY OFF;--事务不安全,异步模式

七、在程序的配置文件中修改数据库连接串
代码范例:
(192.168.0.2和192.168.0.3分别为主体和镜像服务器的IP地址,顺序不分先后)

ConnString = "Data Source=192.168.0.2;Failover Partner=192.168.0.3;Initial Catalog=SJDD;User ID=sa;pwd=gps192168096";

如连接同一台服务器上的不同实例则如下:

ConnString = "Data Source=192.168.0.3\\ZJ;Failover Partner=192.168.0.3\\BJ;Initial Catalog=DB_Mirror;User ID=sa;pwd=123456";

此时 需要在服务器开启 SQL Server Browser 服务器 设置为 自启动

posted @ 2014-07-18 09:42  hy31337  阅读(1537)  评论(0编辑  收藏  举报
.net求学者