加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer 数据库镜像+复制切换方案

发布时间:2020-12-12 13:55:07 所属栏目:MsSql教程 来源:网络整理
导读:目标: ? ? ? 主机做了 Mirror 和 Replication ,当主机出现问题时, Replication 和 Mirror 实现自动的故障转移( Mirror ? 和 Replication 都切换到备机,而当主机 ? ? ? ?重新启动后,自动充当备机的角色)。 ? 环境: ?????????? 五台虚拟机,配置均为 W

目标:

? ? ? 主机做了MirrorReplication,当主机出现问题时,ReplicationMirror实现自动的故障转移(Mirror?Replication都切换到备机,而当主机

? ? ? ?重新启动后,自动充当备机的角色)。

?

环境:

??????????五台虚拟机,配置均为Windows2008?Enterprise + SQLServer2008R2 Enterprise

????????? 08R201Mirror?见证机(WITNESS) ? ? ? ? ? IP:192.168.56.101

????????? 08R202:主机(Rep+Mirror? ? ? ? ? ? ? ? ? IP:192.168.56.102

????????? 08R203Rep分发机?????????????????????????????? IP:192.168.56.103

????????? 08R204Rep订阅机?????????????????????????????? IP:192.168.56.104

????????? 08R205:镜像机(Mirror? ? ? ? ? ? ? ? ? ? ? ?IP:192.168.56.105

?

步骤:

配置有见证服务器的镜像

  1. 创建证书和Endpoint

? ? ?08R202(Master)?上运行下面的脚本:

复制代码

 --主机执行:
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123456abc';
    CREATE CERTIFICATE HOST_A_cert WITH SUBJECT HOST_A certificate',START_DATE 11/08/2010',EXPIRY_DATE 10/31/2099';

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 D:HOST_A_cert.cer';    

复制代码

? ? ? 08R205(Mirror)?上运行下面的脚本:

复制代码

备机执行:
    CREATE CERTIFICATE HOST_B_cert HOST_B certificate= CERTIFICATE HOST_B_cert,255)">BACKUP CERTIFICATE HOST_B_cert D:HOST_B_cert.cer';
? ? ? 08R201(WITNESS)?上运行下面的脚本:

见证机执行
USE master; '; CREATE CERTIFICATE HOST_W_cert HOST_W certificateCREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORTALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_W_cert,255)">BACKUP CERTIFICATE HOST_W_cert D:HOST_W_cert.cer

复制代码

  1. 交换证书

? ? ?将HOST_B_cert.cerHOST_W_cert.cer拷贝到?08R202?机器的”D:Cert目录;

? ? ?将HOST_A_cert.cerHOST_W_cert.cer拷贝到?08R205?机器的”D:Cert目录;

? ? ?将HOST_A_cert.cerHOST_B_cert.cer拷贝到?08R201?机器的”D:Cert目录;

?

Master CREATE LOGIN HOST_B_login WITH PASSWORD 123abc!@#CREATE USER HOST_B_user FOR LOGIN HOST_B_login; AUTHORIZATION HOST_B_user FROM D:CertHOST_B_cert.cerGRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login]; CREATE LOGIN HOST_W_login USER HOST_W_user FOR LOGIN HOST_W_login; AUTHORIZATION HOST_W_user D:CertHOST_W_cert.cerHOST_W_login]; ? ? ?08R205(Mirror)?上运行下面的脚本:

Mirror CREATE LOGIN HOST_A_login USER HOST_A_user FOR LOGIN HOST_A_login; AUTHORIZATION HOST_A_user D:CertHOST_A_cert.cerHOST_A_login ? ? ?08R201(WITNESS)?上运行下面的脚本:

WITNESS
  • 备份还原数据库
  • ? ? ?08R202(Master)?上备份数据库:

      BACKUP DATABASE RepTest DISK=D:tempRepTest.bak'
      BACKUP LOG RepTest D:tempRepTest.trn'

    ? ? ?将备份文件拷贝到?08R205(Mirror)?上做还原(最好以SA帐号登录,使得数据库所有者为”SA“):

    复制代码

      RESTORE 
    RESTORE FROM  DISK = ND:RepTest.bak' 
    WITH  1,MOVE NRepTest' TO ND:DataRepTest.mdfRepTest_logD:DataRepTest_log.ldf10
    GO
    
    RESTORE D:RepTest.trnWITH NORECOVERY
  • 建立镜像
  • ? ? ? 在08R205(Mirror)?上执行:

    ALTER SET PARTNER TCP://192.168.56.102:5022';

    ? ? ?在?08R202(Master)上执行:

    TCP://192.168.56.105:5022
    SET WITNESS TCP://192.168.56.101:5022SET SAFETY FULL

    ? ? ?到此,镜像已经建立完成。

    配置Replication(事务型复制)

    ? ? ?Replicaiton不做具体的搭建过程,只做几点说明:

    ? ? ?1. ?08R20208R205都需要搭建到08R203Distribution

    ? ? ??

    ? ? ?2. ?08R20208R205上的发布库的所有者必须为“SA,否则切换会出现如下错误:The process could not execute 'sp_replcmds' on 'WIN-08R205'.

    ? ? ?3. ?08R203分发机上配置文件需要做如下修改(配置故障转移Partner):

    复制代码

        配置复制故障转移参数
        查看代理配置,在分发服务器运行
        exec sp_help_agent_profile
        Agent_Type含义
        1 = Snapshot Agent; 2 = Log Reader Agent; 3 = Distribution Agent; 
        4 = Merge Agent; 9 = Queue Reader Agent.
        对于事务复制,需查看Agent_Type=1,2的Profile_id
        
        对于事务复制,需要配置快照代理(Snapshot Agent)和日志读取代理(Log Reader Agent)
        exec sp_add_agent_parameter @profile_id @parameter_name -PublisherFailoverPartner@parameter_value WIN-08R205'镜像服务器名称
        
        2,128)">镜像服务器名称
    ? ? ? ?修改完成后,记得重启Agent服务,使之生效。

    ? ? ? 4. ?08R202创建到08R204的同步链。

    模拟故障转移并观察结果

    ? ? ?1. ?暂停08R202SQLServer服务;

    ? ? ?2. ?到08R205上观察镜像和同步链是否转移过去了;

    ? ? ??

    ? ? ? 3. ?如果同步链正常,修改某个表中的数据,看是否能同步到08R204上;

    ? ? ? 4. ?重新启动08R202SQLServer服务,看其是否成为了镜像机;

    ? ? ??


    C# 连结镜像服务器连结 Data Source=192.168.0.139;Failover Partner0.140DataBase=mydbUser ID=saPassword;

    1、 手工同步登录名和密码

    在第一章中提到数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录。

    通常来说数据库都将会有若干个用户作为访问数据库的用户,并且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,例如某业务系统使用’myuser’作为登录名访问数据库,但是在备机中没有’myuser’这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为"孤立用户"

    在主数据库中执行如下语句:

    1

    USE ?master;
    2

    select ?sid,name? from ?syslogins;
    3

    查找出相应的用户名和sid,例如:上述的’myuser’

    在备数据库中执行如下语句:

    exec ?sp_addlogin?
    @loginame ? = ? ' <LoginName> ' ,?
    4 @passwd <Password> 5 @sid < sid > ?;
    6 这里的’LoginName’即主数据库中的登录名,sid即是上述通过SQL语句查找出的sid。

    例如,查询得到的sid和name如下所示。

    ?

    ?

    sid?name


    -- --------------------------------?-----------------


    0x074477739DCA0E499C29394FFFC4ADE4 ?cz_account
    7
    则建立登录名的SQL语句:

    cz_account
    password ;
    到此为止可以认为备机数据库的环境已经与主机同步了,还差数据库内的数据未同步。

    1、主备互换
    
    
    --主机执行:
    
    
    [sql] view plaincopy
    USE master; ? ??
    ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; ? ?
    2、主服务器Down掉,备机紧急启动并且开始服务
    
    
    --备机执行:
    
    
    [sql] view plaincopy
    USE master; ? ??
    ALTER DATABASE <DatabaseName> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS; ? ?
    
    
    3、原来的主服务器恢复,可以继续工作,需要重新设定镜像
    
    
    --备机执行:
    
    
    [sql] view plaincopy
    USE master; ? ??
    ALTER DATABASE <DatabaseName> SET PARTNER RESUME; --恢复镜像 ? ??
    ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --切换主备 ? ?
    
    
    4、原来的主服务器恢复,可以继续工作
    
    
    --默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。
    
    
    --关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。
    
    
    [sql] view plaincopy
    USE master; ? ??
    ALTER DATABASE <DatabaseName> SET PARTNER SAFETY FULL; --事务安全,同步模式 ? ??
    ALTER DATABASE <DatabaseName> SET PARTNER SAFETY OFF; --事务不安全,异步模式 ??
    

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读