学习笔记(十五)——镜像的知识点与注意事项

一、基础知识

     1、SQL Server镜像只有两种模式:高安全模式和高性能模式。两种模式的主要区别在于在事务提交后的操作。

       在高性能模式下,主体服务器不需要等待镜像服务器响应即可提交事务。

  在高安全性模式,需要把事务同步到镜像并得到响应后才最终提交主体服务器的事务。

2、SQL Server镜像状态可能包含下面几种:

  • SYNCHRONIZING:正在同步,通常在第一次启用数据库镜像时出现,表示镜像服务器正在追上主体服务器的进度。
  • SYNCHRONIZED:已经同步完毕,大部分时间都是这种状态,一旦有爆发性的事务传输到镜像数据库,状态会从SYNCHRONIZED转变成SYNCHRONIZING。在高安全性模式下,这种状态通常不会导致数据丢失,仅表示镜像服务器正在同步,但是在高性能模式下,可能有数据丢失的风险。
  • SUSPENDED:挂起,当主体服务器不发送事务到镜像服务器时出现,在Failover发生后会出现这种状态(如果镜像环境依旧运行,仅使用Failover则不出现,但是如果镜像库断开连接,则会出现)。手动暂停镜像会话或者redo 日志发生错误时都会出现。
  • PENDING_FAILOVER:仅当主体服务器变成镜像服务器并且断开用户连接时,会在原主体服务器出现这种状态。在这种状态下,主体服务器和镜像服务器都会表现这种状态。但是见证服务器会出现:CONNECTED/DISCONNECTED/UNKNOWN的其中一种状态。
  • CONNECTED:代表见证服务器能连到其中一个伙伴,另外两种代表不能连到伙伴服务器,这种情况下,数据库会变成不可用,如果镜像环境使用了见证,而镜像服务器为DISCONNECTED,并且镜像服务器奔溃,那么数据库(即使在主体服务器上)都会变得无法访问。所以当见证为disconnected,可以关闭见证,从而禁用仲裁,使用ALTER DATABASE <DB> SET WITNESS OFF实现。
  • DISCONNECTED:当镜像环境中的伙伴均无法连接对方时出现。

  可以使用sys.database_mirroring目录视图查看镜像信息。

二、示例

1、分别在主体服务器、镜像服务器上创建端点



IF EXISTS

(SELECT 1

FROM sys.database_mirroring_endpoints AS E

DROP ENDPOINT ep_EduBase_Mirroring;

GO

CREATE ENDPOINT ep_EduBase_Mirroring

STATE=STARTED // 端点将立即启动

AS TCP(LISTENER_PORT=5022) //监听TCP端口

FOR DATABASE_MIRRORING

(AUTHENTICATION=WINDOWS NEGOTIATE      //身份验证方式设为Windows协商(即在NTLM和KERBEROS之间选择)

,ENCRYPTION=SUPPORTED      //若通信端点支持加密,则镜像过程使用加密

,ROLE=PARTNER);       PARTNER     //角色用于主体/镜像服务器;WITNESS角色用于见证服务器;



2、通过完整备份、日志备份(若有必要)、还原,将数据库从主体服务器复制到镜像服务器上



DECLARE @FullBkDesc VARCHAR(MAX);

SELECT

@FullBkDesc = 'Full backup on principal server for database mirroring at '+CONVERT(VARCHAR,GETDATE(),120)+'.';

BACKUP DATABASE EduBase2017

TO DISK='C:\EduBase2017\Mirroring\EduBase_FullBackup_ForMirroring.bak'

WITH

  INIT

,Name = 'EduBase_FullBackup'

,DESCRIPTION = @FullBkDesc; //完整备份

GO

  DECLARE @LogBkDesc VARCHAR(MAX);

SELECT

@LogBkDesc = 'Log backup on principal server for database mirroring at '+CONVERT(VARCHAR,GETDATE(),120)+'.';

BACKUP LOG EduBase2017

TO DISK='C:\EduBase2017\Mirroring\EduBase_LogBackup_ForMirroring.bak'

WITH

INIT

,Name = 'EduBase_LogBackup'

,DESCRIPTION = @LogBkDesc;

//日志备份:若在完整备份后,主体服务器的数据库发生更改,则需进一步备份、还原日志,以便保持日志链完整

 

//为便于镜像服务器访问主体服务器的备份文件,可在cmd控制台将备份文件所在位置设为共享。

RESTORE HEADERONLY

FROM DISK='\\WinSvr-1\EduBase2015Mirroring\EduBase2015_FullBackup_ForMirroring.bak'; 镜像服务器通过统一命名约定(UNC)地址访问主体服务器中的备份文件

RESTORE DATABASE EduBase2015

FROM DISK = '\\WinSvr-1\EduBase2015Mirroring\EduBase2015_FullBackup_ForMirroring.bak' WITH

FILE = 1

,REPLACE

,NORECOVERY; 从完整备份中还原

GO

RESTORE HEADERONLY

FROM DISK= '\\WinSvr-1\EduBase2015Mirroring\EduBase2015_LogBackup_ForMirroring.bak'; RESTORE DATABASE EduBase2015

FROM DISK='\\WinSvr-1\EduBase2015Mirroring\EduBase2015_LogBackup_ForMirroring.bak' WITH

FILE = 1

,NORECOVERY;
// 从日志备份中还原  最后一步备份务必指定非还原状态,以确保镜像服务器的数据库不可用

//镜像数据库已包含主体数据库中的数据库用户,但镜像服务器未包含映射至这些数据库用户的登录,故需另行创建



3、分别在镜像服务器、主体服务器的相应数据库上启动镜像会话



ALTER DATABASE EduBase2015

SET PARTNER='TCP://WINSVR-1.EDUBASE.COM:5022'; //在镜像服务器的数据库上,设置主体服务器的完整域名、监听端点

ALTER DATABASE EduBase2015

SET PARTNER='TCP://WINSVR-2.EDUBASE.COM:5022'; //在主体服务器的数据库上,设置镜像服务器的完整域名、监听端点

ALTER DATABASE EduBase2015 //在主体服务器中设置镜像安全性

SET SAFETY FULL; //完整安全性:主体服务器的数据库中的事务在提交前,必须同步写入镜像服务器的数据库若设为OFF,则允许异步写入,可能导致丢失

ALTER DATABASE EduBase2015 //在主体服务器中设置镜像安全性

SET SAFETY FULL;

//在客户端的ADO.Net的连接字符串中,增加Failover Partner=镜像服务器名,ADO.Net将自动重定向服务器



4、在主体服务器的数据库中修改数据



USE EduBase2015;

UPDATE Course  

 SET Name='计算机导论(1)'

 WHERE Name='计算机导论';

UPDATE Course  

 SET Name='C语言程序设计(2)'

 WHERE Name='C语言程序设计';

//亦可在客户端中进行操作



5、假设发生故障,此时在主体服务器上手动设置故障转移,从而切换主体服务器、镜像服务器的角色



ALTER DATABASE EduBase2015

SET PARTNER FAILOVER;



6、在当前的主体服务器(即先前的镜像服务器)的数据库中检查数据是否一致,随后修改数据



USE EduBase2015;

SELECT * FROM Course;

UPDATE Course  

 SET Name='VB语言程序设计(3)'

 WHERE Name='VB语言程序设计';

//亦可在客户端中进行操作



7、假设主体服务器的数据库遇到大量数据写入,此时挂起镜像会话,随后继续镜像会话



ALTER DATABASE EduBase2015

SET PARTNER SUSPEND;

ALTER DATABASE EduBase2015

SET PARTNER RESUME;



8、当前的镜像服务器(即先前的主体服务器)已排除故障,此时在当前的主体服务器(即先前的镜像服务器)上手动设置故障转移,从而切换主体服务器、镜像服务器的角色,随后检查数据是否一致



ALTER DATABASE EduBase2015

SET PARTNER FAILOVER;

USE EduBase2013;

SELECT * FROM tb_Course;



9、停止镜像会话



ALTER DATABASE EduBase2015

SET PARTNER OFF;