这是一篇实施笔记,讲述了本文作者在公司的一个项目中,如何实际操作SQL Server2008数据库镜像,以及虚拟机环境下部署的情况。

开端在为公司规划SQL Server数据库镜像的时分,首要考虑的是高可用性(三台计算机,一台见证服务器,一台做主数据库,一台做镜像)

SQL Server2008数据库镜像施行笔记(sql server 数据库镜像)  Server2008 镜像 实施 第1张

在虚拟机环境下布置成功,一切都是那么的完美。 毛病搬运3秒之内就可以顺利完成。

1.高可用性的施行代码:

主体数据库

/********************************************************
此脚本在主体服务器履行
********************************************************/
--镜像只支撑彻底康复形式,在备份数据库之前查看康复的形式
--对要镜像的数据库进行完好备份后,复制到镜像数据库以NORECOVERNY选项进行康复
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
GO
--为此服务器实例制造一个证书。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_cert
WITH SUBJECT = 'HOST_A certificate',START_DATE = '01/01/2009';
GO
--运用该证书为服务器实例创立一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
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 = PARTNER
);
GO

--备份 HOST_A 证书,并将其复制到其他机器,将 C:\HOST_A_cert.cer 复制到 HOST_B\HOST_C。
BACKUP CERTIFICATE HOST_A_cert TO FILE = 'e:\HOST_A_cert.cer';
GO
--为入站衔接装备 Host_A
--在 HOST_A 上为 HOST_B 创立一个登录名。
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
GO

--创立一个运用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
GO
--使证书与该用户相关。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_cert
AUTHORIZATION HOST_B_user
FROM FILE = 'e:\HOST_B_cert.cer'
GO

--颁发对长途镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO

--在 HOST_A 上为 HOST_C 创立一个登录名。
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
GO

--创立一个运用该登录名的用户。
--DROP USER HOST_C_user
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
GO
--使证书与该用户相关。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_cert
AUTHORIZATION HOST_C_user
FROM FILE = 'e:\HOST_C_cert.cer'
GO

--颁发对长途镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
GO

USE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
GO
--创立一个运用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR CERTIFICATE HOST_A_cert;
GO
--颁发对长途镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO

--有必要要在镜像数据库中先设置好同伴后,才能在主体服务器履行
--在 HOST_A 的主体服务器实例上,将 HOST_B 上的服务器实例设置为同伴(使其成为初始镜像服务器实例)。
ALTER DATABASE crm
SET PARTNER = 'TCP://192.168.1.205:5022';
GO

--设置见证服务器
ALTER DATABASE crm SET WITNESS = N'TCP://192.168.1.204:5022';
GO


镜像数据库

/***********************************************
在镜像服务器履行此脚本
***********************************************/
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
GO
--为 HOST_B 服务器实例制造一个证书。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_cert
WITH SUBJECT = 'HOST_B certificate for database mirroring',START_DATE = '01/01/2009';
GO
--在 HOST_B 中为服务器实例创立一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE HOST_B_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = PARTNER
);
GO
--备份 HOST_B 证书,将 C:\HOST_B_cert.cer 复制到 HOST_A\HOST_C。
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'e:\HOST_B_cert.cer';
GO

--为入站衔接装备 Host_B
--在 HOST_B 上为 HOST_A 创立一个登录名。
USE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
GO
--创立一个运用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
GO
--使证书与该用户相关。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_cert
AUTHORIZATION HOST_A_user
FROM FILE = 'e:\HOST_A_cert.cer'
GO

--颁发对长途镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO

--在 HOST_B 上为 HOST_C 创立一个登录名。
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
GO

--创立一个运用该登录名的用户。
--DROP USER HOST_C_user
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
GO
--使证书与该用户相关。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_cert
AUTHORIZATION HOST_C_user
FROM FILE = 'e:\HOST_C_cert.cer'
GO

--颁发对长途镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
GO

--在 HOST_B 上为 HOST_B 创立一个登录名。
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
GO
--创立一个运用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR CERTIFICATE HOST_B_cert;
GO
--颁发对长途镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO
--在 HOST_B 的镜像服务器实例上,将 HOST_A 上的服务器实例设置为同伴(使其成为初始主体服务器实例)。
ALTER DATABASE crm
SET PARTNER = 'TCP://192.168.1.203:5022';
GO

见证服务器


/****************************

见证服务器履行

*****************************/

--ALTER DATABASE MirrorDB SET PARTNER OFF
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
GO


--为此服务器实例制造一个证书。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_cert
WITH SUBJECT = 'HOST_C certificate',START_DATE = '01/01/2009';
GO

--运用该证书为服务器实例创立一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE HOST_C_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = WITNESS
);
GO

--备份 HOST_C 证书,并将其复制到其他体系,即 HOST_B\HOST_A。
BACKUP CERTIFICATE HOST_C_cert TO FILE = 'e:\HOST_C_cert.cer';
GO

--为入站衔接装备 Host_C
--在 HOST_C 上为 HOST_B 创立一个登录名。
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
GO

--创立一个运用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
GO
--使证书与该用户相关。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_cert
AUTHORIZATION HOST_B_user
FROM FILE = 'e:\HOST_B_cert.cer'
GO

--颁发对长途镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO

--在 HOST_C 上为 HOST_A 创立一个登录名。
USE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
GO
--创立一个运用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
GO
--使证书与该用户相关。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_cert
AUTHORIZATION HOST_A_user
FROM FILE = 'e:\HOST_A_cert.cer'
GO

--颁发对长途镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO

--在 HOST_C 上为 HOST_C 创立一个登录名。
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
GO
--创立一个运用该登录名的用户。
--DROP USER HOST_C_user
CREATE USER HOST_C_user FOR CERTIFICATE HOST_C_cert;
GO

可能有朋友们会比较有疑问,你一下搞两个数据库出来,他们的ip地址都不相同,到时分数据库切换过去了,我的数据库的衔接字符串可怎么是好?莫非还得在代码中去操控是衔接哪个数据库吗?

其实这个问题是这样的,运用ADO.NET或许SQL Native Client可以主动衔接到毛病搬运后的同伴,衔接字符串如下所示:

ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;" DataSource= A;

2.高等级保护形式

在昨天晚上加班做施行的时分,才发现我的规划现已被修正了,因为曾经的项目有java写的也有c#写的,全主动的毛病搬运不可以完成 。换句话说,因为老项目中的前史遗留问题,以及特别模块的耦合性过高,无法解耦,只能在高等级保护形式或高性能形式中挑选一种了。那么这两者有什么差异呢?

简略一点来说,差异就在与业务安全形式上跟运用场景上。

高等级保护形式选用的是同步镜像, SAFETY FULL。运用场景:通常在局域网中或对数据要求比较高的场景中。

高性能保护形式选用的是异步镜像, SAFETY OFF。运用场景:通常在广域网或对数据要求不太高,丢掉几条数据是答应的,可是有必要确保它不中止服务。

在微软的SQL Server2005的课程上是这么说的。如果是高等级保护形式的话,主、从数据库只需有一台不能正常确保服务,数据库就不可以对外进行服务了,我在开端的时分就没有计划选用这种形式,因为部门经理说了,丢掉一两条数据是可以承受的,何况咱们公司是做运营的,依照起先微软的课程的理论,高等级保护形式是不太合适咱们公司的运用场景的,万一有一台数据库出问题了,整个服务就被中止,这是不能让人承受的。再说了,公司对数据要求不太严苛,两台服务器都有内网线衔接,因为内网传输速度十分的快,即便选用高性能形式,一般来说也是不会丢掉数据的。所以我计划选用高性能形式来做数据库的镜像。因为公司服务器没有域环境,所以我就选用了证书验证来做SQL Server镜像。

意外收成:

两台服务器悉数都安装了SQL Server2008,在设置业务安全形式的时分,才发现SQL Server2008不支撑异步形式。提示大约如下:此SQL Server版别不支撑修正业务安全形式,alter database失利。 我其时汗都出来了,忙活了一晚上,到最终居然是这个成果。

因为是服务器保护时刻,我斗胆的把镜像服务器中止了,成果却让我大吃一惊,主数据库仍旧可以正常作业,正常对外供给服务。也便是说,起先微软的课程讲的常识是过错的,两台数据库做镜像,不管是哪台数据库出了问题,别的的一台数据库都可以确保正常对外供给服务。所以我重复试验重复切换了一下,成果依然是这样。

因为高等级保护形式与高性能形式代码差不太多,只是在业务安全形式的设置上有些小差异,前面现已说到,这儿就不再多解说了。施行的代码如下:

主体服务器

USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
START_DATE = '01/01/2009';


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 );


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


CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'e:\HOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];


ALTER DATABASE crm SET PARTNER = 'TCP://10.10.10.8:5022';

镜像数据库

USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
START_DATE = '01/01/2009';
CREATE ENDPOINT Endpoint_Mirroring
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 = 'e:\HOST_B_cert.cer';


CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'e:\HOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];


ALTER DATABASE crm SET PARTNER = 'TCP://10.10.10.6:5022';


可能有朋友会比较古怪,你这儿也没有运用ALTER DATABASE crm SET SAFETY FULL; 按理应该是高性能形式才对呀? 其实这个问题是这样的,我的这个SQL Server2008默许现已是将业务安全形式设置为full了,即便是手动设置也相同,而且我施行的时分SQL Server2008不支撑将业务安全形式设置为OFF。

OK,一切都设置好了,那么就可以模仿服务器真的down机时分的操作了,后续的作业我也把代码做了总结,详细代码如下:

手动毛病搬运代码

--主备交换

--主机履行:

ALTER DATABASE crm SET PARTNER FAILOVER

--主服务器Down掉,备机紧迫发动而且开端服务
ALTER DATABASE crm SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS

本来的主服务器康复,可以持续作业,需求从头设定镜像
--备机履行:
USE master
ALTER DATABASE crm SET PARTNER RESUME --康复镜像

ALTER DATABASE crm SET PARTNER FAILOVER; --切换主备

3.监督数据库镜像

SQL Server供给了一些视图,可以供查询镜像的各种状况,到时分可以依据这个做一个监督,一旦产生毛病搬运群集,发邮件给体系管理员,好让体系管理员及时的知道数据库服务器产生了什么问题,即便的做毛病剖析、排查。有关这方面材料,MSDN上现已供给太多材料了。感爱好的朋友可以去查这方面的材料。

在文章的最终提出一个有争议的问题:SQL Server(2008)高等级保护形式,只需有一台数据库可以确保正常运转,就可以正常对外供给服务。我的试验成果是这样的,这确实跟以往的理论常识有些收支。

还等什么,从速搭环境着手试验一下吧,体会一下SQL Server镜像带来的快感。 期望有爱好的朋友们一同学习讨论。

【修改引荐】

  1. 浅谈SQL Server数据库并发测验办法
  2. 微软发布SQL Server 2008 SP1(附下载链接)
  3. 浅谈怎么优化SQL Server服务器
转载请说明出处
知优网 » SQL Server2008数据库镜像施行笔记(sql server 数据库镜像)

发表评论

您需要后才能发表评论