设为首页 收藏本站
查看: 1455|回复: 0

[经验分享] SQL SERVER2008 镜像全攻略

[复制链接]

尚未签到

发表于 2017-7-14 18:22:17 | 显示全部楼层 |阅读模式
  --在非域控环境中创建数据库镜像, 我们必须使用证书来创建数据库镜像。 大致的步骤包括:
  
--在为数据库镜像配置的每个服务器实例上执行下列步骤:  
  
--在 master 数据库中,创建数据库主密钥。  
--在 master 数据库中,为服务器实例创建加密证书。  
--使用服务器实例的证书为该服务器实例创建端点。  
--将证书备份到文件,并将其安全地复制到其他系统。  
   
  
--然后,对为数据库镜像配置的每个伙伴执行这些步骤。在 master 数据库中:  
  
--为其他系统创建登录名。  
--创建一个使用该登录名的用户。  
--获取其他服务器实例的镜像端点的证书。  
--将该证书与在步骤 2 中创建的用户相关联。  
--授予对该镜像端点的登录名的 CONNECT 权限。  
   
  
/*查询所有当前数据库名  
select SERVERPROPERTY(N'servername')  
SELECT  
dtb.name AS [Name]  
FROM  
master.sys.databases AS dtb  
ORDER BY  
[Name] ASC  
*/  
-------------------------------------------------------前期准备  
-- 查看数据库版本  
   SELECT @@VERSION  
-----配置数据库镜像事务安全级别   
   ALTER DATABASE TestMirroring SET SAFETY FULL   
-----更改主数据库为使用完整恢复模式(如果非完整恢复模式则 可以使用下面SQL更改为 完整恢复模式)  
   USE master  
    ALTER DATABASE TestMirroring   
    SET RECOVERY FULL WITH no_wait  
  
/*跨数据库事务和分布式事务均不支持数据库镜像  
*/  
  
--主服务器 见证服务器 镜像服务器的数据库版本必须相同  
--备份主数据库(完整备份)  
   BACKUP DATABASE [TestMirroring] TO  DISK = N'C:/wenzhongfiles/TestMirror.bak' WITH NOFORMAT, NOINIT,   
   NAME = N'TestMirroring-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10  
--备份主数据库的完整日志文件  
   BACKUP LOG [TestMirroring] TO  DISK = N'C:/wenzhongfiles/TestMirrorlog.bak' WITH NOFORMAT, NOINIT,   
   NAME = N'TestMirroring-事务日志  备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10  
--在镜像服务器上还原(还原选项 norecovery(即不对数据库执行任何操作))  
   RESTORE DATABASE [TestMirroring] FROM  DISK = N'F:/TestMirror.bak' WITH  FILE = 1,  MOVE N'TestMirror'  
    TO N'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestMirroring.mdf',  MOVE N'TestMirror_log'  
    TO N'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestMirroring_1.ldf',  NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 10  
--将备份的完整日志文件在 镜像服务器上执行 日志文字间恢复(还原选项 norecovery(即不对数据库执行任何操作))  
   RESTORE LOG [TestMirroring] FROM  DISK = N'F:/TestMirrorlog.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 10  
  
  
--------------正式开始(代码仅仅是举例主服务器上的)  
  
--------------------------------------------------------------------------在 主、镜像、见证服务器上 分别执行:  
------创建数据库对称密钥  
  USE master;     
  --DROP MASTER KEY     
  CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'wenzhong';     
  GO   
------创建数据库证书(注意:证书失效日期)  
  --DROP CERTIFICATE host_A_cert     
  CREATE CERTIFICATE host_A_cert      
  WITH SUBJECT = 'host_A certificate',START_DATE = '01/01/2011',EXPIRY_DATE = '12/31/2099';   
  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     
------将证书分别备份出来,然后互换(即:主服务器上保证存在 镜像和见证服务器上创建的证书;镜像服务器上 存在 主服务器和见证服务器上创建的证书;  
--          见证服务器上存在 主服务器和镜像服务器上创建的证书)  
  BACKUP CERTIFICATE host_A_cert TO FILE = 'F:\Host_A_cert.cer'  
------在各自的服务器上为其他两个服务器分别创建一个登陆名  
  USE master;     
  --DROP LOGIN host_B_login     
  CREATE LOGIN host_B_login WITH PASSWORD = 'wenzhong'     
  GO   
  USE master;     
  --DROP LOGIN host_C_login     
  CREATE LOGIN host_C_login WITH PASSWORD = 'wenzhong'   
  GO   
------创建一个使用上面创建的登录名的用户  
  --DROP USER host_B_user     
  CREATE USER host_B_user FOR LOGIN host_B_login;     
  GO --DROP USER host_C_user     
  CREATE USER host_C_user FOR LOGIN host_C_login;     
  GO   
------使得证书和用户进行关联  
  --DROP CERTIFICATE host_B_cert     
  CREATE CERTIFICATE host_B_cert     
  AUTHORIZATION host_B_user     
  FROM FILE = 'F:/host_B.cer'   
  GO   
  --DROP CERTIFICATE host_C_cert     
  CREATE CERTIFICATE host_C_cert     
  AUTHORIZATION host_C_user     
  FROM FILE = 'F:/host_C.cer'   
  GO  
------将对远程镜像端点的连接(CONNECT)权限授予该登录名  
  GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_B_login]     
  GO  
  GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_C_login]   
  GO  
  
-----------------避免“孤立用户”。镜像服务器的缺点就是不能自动维护登录名,需要手动维护。  
-------在主服务器中查找相应的用户名和对应的SID号  
  USE master   
  select sid,name from syslogins  
-------在镜像服务器上(备机上)将对应的用户名和SID创建起来  
  USE master     
  exec sp_addlogin      
  @loginame = '<LoginName>',      
  @passwd = '<Password>',      
  @sid = <sid>   
-------可以在此时进行备份主数据库和日志并进行还原操作,也可以在正式开始前执行备份和还原操作(sql见前面)  
  
  
-----------------------------------------------------------------------------最后  
--------在镜像服务器上将主数据库设置为其伙伴(必须首先执行,顺序不能颠倒)  
  ALTER DATABASE TestMirroring     
  SET PARTNER = 'TCP://192.168.0.211:5022'     
  GO   
--------在主数据库服务器上将镜像服务器设置为其伙伴  
  ALTER DATABASE TestMirroring     
  SET PARTNER = 'TCP://192.168.0.111:5022'     
  GO   
--------在主数据库服务器上设置见证服务器。  
  ALTER DATABASE TestMirroring      
  SET WITNESS = 'TCP://192.168.0.192:5022'     
  GO   
  
-----------------------------------------------------------------------------对设置是否成功进行测试  
--------由于镜像 的缺点:在镜像服务器上无法查询数据。需要测试是否可以成功。(数据库复制功能则可以)  
--------通过在镜像数据库上创建数据库快照可以间接读取某一个时刻点的镜像数据库  
--------测试过程:  
--------主机上执行:  
USE master;     
  
ALTER DATABASE TestMirroring SET SAFETY FULL;-----切换到高安全模式否则执行手动切换会失败  
  
GO  
ALTER DATABASE TestMirroring SET PARTNER FAILOVER  ---手动进行主备切换  
------镜像服务器上执行:  
USE master;     
ALTER DATABASE TestMirroring SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS ---在镜像机上执行强制切换(当主服务器数据宕机时)  
  
  
-------如果原来的主服务器恢复,可以继续工作,需要重新设定镜像  
----备机(镜像服务器)上执行:  
--恢复镜像      
USE master;     
ALTER DATABASE TestMirroring SET PARTNER RESUME   
--切换主备  
ALTER DATABASE TestMirroring SET PARTNER FAILOVER   
------------------------删除数据库镜像  
  ALTER DATABASE TestMirroring SET PARTNER OFF  
-----------暂停数据库镜像会话  
   ALTER DATABASE TestMirroring SET PARTNER SUSPEND   
-----恢复数据库镜像会话  
   ALTER DATABASE TestMirroring SET PARTNER RESUME  
   ALTER DATABASE TestMirroring SET PARTNER SUSPEND   
-----关闭见证服务器  
   ALTER DATABASE TestMirroring SET WITNESS OFF  
  
   
  
   
  
/*  
  
默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。  
关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。  
*/  
--事务安全,同步模式   
USE master;     
ALTER DATABASE TestMirroring SET PARTNER SAFETY FULL   
--事务不安全,异步模式   
ALTER DATABASE TestMirroring SET PARTNER SAFETY OFF;  
  
--------在高性能模式下,见证服务器对可用性会有不利影响。如果见证服务器是针对数据库镜像会话而配置,则主体服务器必须至少连接到一个其他服务器实例,  
--  即镜像服务器或见证服务器,或者是连接到这两个服务器。否则,将无法使用数据库,并且不能进行强制服务(可能丢失数据)。  
--  因此,对于高性能模式,建议始终将见证服务器设置为 OFF。  
--  见证服务器的唯一角色是支持自动故障转移。并不能用于数据库,是 SQL Server 的可选实例。  
--     它能使高安全性模式会话中的镜像服务器识别出是否要启动自动故障转移(见证服务器的角色就是启动自动故障转移)。  
  ALTER DATABASE TestMirroring SET PARTNER OFF  
   
/*  
自动故障转移所需条件  
  
  A、数据库镜像会话必须在高安全性模式下运行,并且必须处理见证服务器。  
  B、镜像数据库必须已经同步。这将保证发送到镜像服务器的所有日志都已写入磁盘。  
  C、主体服务器已中断了与其余数据库镜像配置的通信,而镜像服务器和见证服务器将保留仲裁。但是,如果所有服务器实例都已中断通信,  
   而见证服务器和镜像服务器稍后重新建立通信,则不会发生自动故障转移。  
  D、镜像服务器已检测到丢失了主体服务器  
  E、镜像服务器检测主体服务器故障的方式取决于故障是硬故障还是软故障。  
  
自动故障转移原理  
  
  A、如果主体服务器仍在运行中,则将主体数据库的状态更改为 DISCONNECTED 并断开所有客户端与主体数据库的连接。  
  B、见证服务器和镜像服务器将主体服务器注册为不可用。  
  C、如果重做队列中有任何等待的日志,则镜像服务器将完成前滚镜像数据库的操作  
  D、前一个镜像数据库作为新的联机主体数据库,恢复通过尽快回滚未提交的事务将这些事务全部清除。锁将隔离这些事务。  
  E、当前一个主体服务器重新联接到会话时,它将认定其故障转移伙伴现在拥有主体角色。前一个主体服务器接管镜像角色,并将其数据库作为镜像数据库。  
   新的镜像服务器会尽快将新的镜像数据库与主体数据库同步。新的镜像服务器重新同步数据库后,就可以再次执行故障转移,但按反向执行。。  
*/  
  
--------------------外延  
-----使用ADO.NET或者SQL Native Client能够自动连接到故障转移后的伙伴,连接字符串如下所示:  
  ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;   
  
--如果没有镜像服务器的建设,或环境无法实现镜像服务器的建设。通过下面的代码一样可以实现类似镜像的功能   
  
-----C# code  
  
  
Imports System.Data.SqlClient   
Imports System.Data   
   
Public Class dbConn   
Private primaryServerLocation As String="SERVER=primaryAddress;DATABASE=yourDB;User id=youruserID;Password=yourPassword;"   
Private secondaryServerLocationAsString="SERVER=secondaryAddress;DATABASE=yourDB;User id=youruserID;Password=yourPassword;"   
   
   
Public sqlConnection AsSqlConnection   
Public cmd AsSqlCommand   
   
Public Sub primaryConnection()   
    Try   
        sqlConnection = New System.Data.SqlClient.SqlConnection(primaryServerLocation)   
        cmd = NewSystem.Data.SqlClient.SqlCommand()   
   
        'test connection   
        sqlConnection.Open()   
        sqlConnection.Close()   
    Catch ex As Exception   
        secondaryConnection()   
    End Try   
End Sub   
   
Public Sub secondaryConnection()   
    'Used as the failover secondary serverif primaryis down.   
    Try   
        sqlConnection = New System.Data.SqlClient.SqlConnection(secondaryServerLocation)   
        cmd = NewSystem.Data.SqlClient.SqlCommand()   
   
        'test connection   
        sqlConnection.Open()   
        sqlConnection.Close()   
    Catch ex As Exception   
    End Try   
End Sub   
  
  
-----C# code  
  --=================查看数据库镜像的配置状态=================   
  
-- 1.通过Management studio 对象资源管理器,查看主体数据库、镜像数据库状态   
-- 2.通过Management studio 对象资源管理器中的数据库属性查看状态   
-- 3.通过系统目录视图查看数据库镜像配置情况   
  
use master   
  go   
  SELECT * FROM sys.database_mirroring_endpoints   
  SELECT * FROM sys.database_mirroring   
  WHERE database_id =(SELECT database_id FROM sys.databases   
          WHERE name = 'TestMirroring')  
  SELECT * FROM sys.database_mirroring_witnesses  
   
  
  
  
   
  
镜像的运行模式有三种:  
  
1、 高性能(异步):先提交主服务器上的更改,然后将其传输到镜像服务器上。  
  
2、不带自动故障转移功能的高安全(同步): 过程始终提交主服务和镜像服务器上的更改。  
  
3、带自动故障转移功能的高安全(同步):需要见证服务器实例。如果主服务器和镜像服务器都可用,则提交在它们上面所做的更改并镜像。如果主服务器不可用,则见证服务器就会控制自动故障转移到镜像服务器上。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393943-1-1.html 上篇帖子: mybatis查询时间段sql语句 下篇帖子: spark结构化数据处理:Spark SQL、DataFrame和Dataset
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表