一、准备工作:
3台服务器同版本,硬盘分区大小相同,安装相同版本数据库软件。
host中分别标注3台服务器IP和主机名称.
主体服务器上创建数据库,并进行完整备份数据库和数据库事务。
拷贝备份文件给镜像服务器进行还原,还原覆盖原有数据库、不对事务进行任何操作。
搭建成功后使用网站进行测试其可用性。(数据库在创建好数据库镜像后添加的话:先创建数据库、然后将数据库文件覆盖创建的数据库文件,使用脱机方式覆盖,创建连接数据库账户先删除原来账号再创建。)
二、镜像服务器不能为连接数据库账号自动管理,需要在镜像服务器上执行:
USE master ;
exec sp_addlogin
@loginame = 'sql_2_login', //网站连接数据库账号
@passwd = 'qzmcc@139.com', //网站连接数据库密码
@sid = 0xC28F0312BAFBE84AB553C40CFAD2A32A; //主体服务器上配置的网站连接数据库账号SID号
主体服务器上:
USE master;
select sid,name from syslogins; //查看登录账户
主体服务器上执行的语句:
USE master;
create master key encryption by password = 'qzmcc@139.com';
create certificate sql_1_cert with subject ='sql_1 certificate',start_date='08/20/2014',Expiry_date ='08/20/3000';
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP ( LISTENER_PORT=10000,LISTENER_IP = ALL )
FOR DATABASE_MIRRORING (
AUTHENTICATION = certificate sql_1_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = partner
)
backup certificate sql_1_cert to file='d:\sql_1_cert.cer';
USE master;
create login sql_2_login with password='qzmcc@139.com';
USE master;
create login sql_3_login with password='qzmcc@139.com';
create user sql_2_user for login sql_2_login;
create user sql_3_user for login sql_3_login;
create certificate sql_2_cert authorization sql_2_user from file='d:\sql_2_cert.cer';
create certificate sql_3_cert authorization sql_3_user from file='d:\sql_3_cert.cer';
grant connect on endpoint::Endpoint_Mirroring to sql_2_login;
grant connect on endpoint::Endpoint_Mirroring to sql_3_login;
USE master;
select sid,name from syslogins; //查看登录账户
ALTER DATABASE mydb SET SAFETY FULL
Alter database mydb set partner='TCP://SQL-2:10000'; //在镜像服务器执行后再执行
Alter database mydb set witness='TCP://SQL-3:10000'; //执行上面的语句后执行
镜像服务器执行的语句:
USE master;
create master key encryption by password = 'qzmcc@139.com';
create certificate sql_2_cert with subject ='sql_2 certificate',start_date='08/20/2014',Expiry_date ='08/20/3000';
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP ( LISTENER_PORT=10000,LISTENER_IP = ALL )
FOR DATABASE_MIRRORING (
AUTHENTICATION = certificate sql_2_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = partner
)
backup certificate sql_2_cert to file='d:\sql_2_cert.cer';
USE master;
create login sql_1_login with password='qzmcc@139.com';
USE master;
create login sql_3_login with password='qzmcc@139.com';
create user sql_1_user for login sql_1_login;
create user sql_3_user for login sql_3_login;
create certificate sql_1_cert authorization sql_1_user from file='d:\sql_1_cert.cer';
create certificate sql_3_cert authorization sql_3_user from file='d:\sql_3_cert.cer';
grant connect on endpoint::Endpoint_Mirroring to sql_1_login;
grant connect on endpoint::Endpoint_Mirroring to sql_3_login;
USE master ;
exec sp_addlogin
@loginame = 'sql_2_login', //网站连接数据库账号
@passwd = 'qzmcc@139.com', //网站连接数据库密码
@sid = 0xC28F0312BAFBE84AB553C40CFAD2A32A; //主体服务器上配置的网站连接数据库账号SID号
Alter database mydb set partner='TCP://SQL-1:10000';
ALTER DATABASE mydb SET SAFETY FULL
见证服务器上执行的语句:
USE master;
create master key encryption by password = 'qzmcc@139.com';
create certificate sql_3_cert with subject ='sql_3 certificate',start_date='08/20/2014',Expiry_date ='08/20/3000';
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP ( LISTENER_PORT=10000,LISTENER_IP = ALL )
FOR DATABASE_MIRRORING (
AUTHENTICATION = certificate sql_3_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = WITNESS
)
backup certificate sql_3_cert to file='d:\sql_3_cert.cer';
USE master;
create login sql_1_login with password='qzmcc@139.com';
USE master;
create login sql_2_login with password='qzmcc@139.com';
create user sql_1_user for login sql_1_login;
create user sql_2_user for login sql_2_login;
create certificate sql_1_cert authorization sql_1_user from file='d:\sql_1_cert.cer';
create certificate sql_2_cert authorization sql_2_user from file='d:\sql_2_cert.cer';
grant connect on endpoint::Endpoint_Mirroring to sql_1_login;
grant connect on endpoint::Endpoint_Mirroring to sql_2_login;
有人会说,两个数据库,IP地址都不一样,怎么写连接代码呢?难道出现故障后要手动更改代码吗?其实使用ADO.NET或者SQL Native Client能够自动连接到故障转移后的伙伴,连接字符串如下所示:
ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;" DataSource= A;
这样设置之后,客户端就可以自动切换数据库了
至此SQL Server 2008 的镜像高可用配置实例全部完成。
<connectionStrings>
<add name="DefaultDB" connectionString="Data Source=192.168.1.104;Failover Partner=192.168.1.106;Initial Catalog=ImageTest;User ID=sa;Password=1234;" providerName="System.Data.SqlClient"/>
</connectionStrings>
192.168.1.104是主,192.168.1.106是镜像。
-------------------------测试------------------------------
--1、主备互换
--主机停掉SQL服务
--2、主服务器Down掉,备机紧急启动并且开始服务
--备机执行:
USE master;
ALTER DATABASE S_C_SC SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;
ALTER DATABASE S_C_SC SET ONLINE
--3、开启主机的SQL服务,原来的主服务器恢复,可以继续工作,需要重新设定镜像
--备机执行:
USE master;
ALTER DATABASE S_C_SC SET PARTNER RESUME; --恢复镜像
ALTER DATABASE S_C_SC SET PARTNER FAILOVER; --切换到主机
--4、原来的主服务器恢复,可以继续工作
对设置是否成功进行测试
--------由于镜像 的缺点:在镜像服务器上无法查询数据。需要测试是否可以成功。(数据库复制功能则可以)
--------通过在镜像数据库上创建数据库快照可以间接读取某一个时刻点的镜像数据库
--------测试过程:
--------主机上执行:
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、带自动故障转移功能的高安全(同步):需要见证服务器实例。如果主服务器和镜像服务器都可用,则提交在它们上面所做的更改并镜像。如果主服务器不可用,则见证服务器就会控制自动故障转移到镜像服务器上。
- SQL SERVER 基于数据库镜像的主从同步(数据库镜像实践汇总)
SQL SERVER 基于数据库镜像的主从同步 Author:chaoqun.guo createtime:2019-03-26 目录 SQL SERVER 基于数据库镜像的主从同步... 1 ...
- 28-SQLServer带见证服务器的镜像搭建
一.注意点 1.数据库的模式要是完整模式. 2.要对数据库完整备份和事务日志备份,分别还原到镜像库上,使用NORECOVERY模式. 3.镜像数据库是不允许删除和操作,即便查看属性也不行. 4.先删除 ...
- 如何配置数据库镜像<一>
一.简介 “数据库镜像”是Sql Server 2005推出的一个主要用于提高数据库可用率的软件解决方案.镜像是基于每个数据库执行的,仅适用于使用完整恢复模式的数据库.简单恢复模式和大容量日志恢复模式 ...
- 【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)
写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 服务器规划 IP 主机名 节点 操作 ...
- SQL Server数据库镜像的页面自动修复原理
SQL Server数据库镜像的页面自动修复原理 主库页面损坏 镜像库页面损坏 LSN用来保证事务的时序 LSN保存在每个数据页面的页头 在同一台机器,内存中的数据页和磁盘中的数据页保持同步依靠的是数 ...
- SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题
SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题 基于物理块变化的复制,没有并行也是很快的. 逻辑复制的日志是按事务结束的时间排序的,而物理复制是与事务无关的, ...
- SQL Server 数据库镜像
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/镜像 概述 本章内容主要讲述数据库镜像的安装,安装环境是在域环境下进行安装. 环境:SQL Server 2008 r2 企业版 ...
- SQL Server 2008 R2数据库镜像部署
概述 “数据库镜像”是一种针对数据库高可用性的基于软件的解决方案.其维护着一个数据库的两个相同的副本,这两个副本分别放置在不同的SQL Server数据库实例中.建议使用不同位置的两台服务器来承载.在 ...
- 在SQL2008配置数据库镜像1418错误的处理
在SQL2008配置数据库镜像错误一般都由以下原因造成 1.主体.镜像服务器SQL SERVER选择本账号切保持一致 2.在数据库镜像配置向导中的“服务账号”选项中请选择需要同步数据库的登陆名,例如数 ...
随机推荐
- Fast Matrix Calculation 矩阵快速幂
One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learni ...
- JavaSE学习笔记--Item1 注解Annotation
从 JDK 5.0 開始, Java 添加了对元数据(MetaData) 的支持, 也就是 Annotation(注解). 什么是Annotation,以及注解的作用? 三个主要的 Annotatio ...
- STL源代码剖析(二) - 迭代器与traits技法
提要 先看一段用迭代器的代码: int a[] = {1, 2, 3, 4, 5}; vector<int> v1( a, a+5); vector<int>::iterato ...
- TomCatserver的安装,环境的配置,服务的启动以及验证---ShinePans
首先下载 TomCat 6: http://yunpan.cn/cg5icf3dha4k3 提取码 34c5 然后配置环境变量: 电脑>>>属性>>>高级系统设置 ...
- Android View measure (三) 经常用法
ViewGroup.measureChildren() ViewGroup.measureChild() ViewGroup.measureChildWithMargins() /** * Ask o ...
- 【转】MySQL随机字符串生成
DROP FUNCTION IF EXISTS rand_string; DELIMITER $$ CREATE FUNCTION rand_string(str_length TINYINT UNS ...
- Linux下Java线程具体监控和其dump的分析使用----分析Java性能瓶颈[张振华-Jack]
作者:张振华(Jack) 这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结: linux环境下,当发现java进程占用CPU资源非常高,且又要想更进一步查出哪一 ...
- 利用jQuery Ajax技术实现每隔5秒向某页面传值
有时候我们须要每隔一段时间向某页面传值,比方说聊天室,每隔几秒就像数据库处理页面传值并取回,然后显示在聊天窗体.又或者是每隔一段时间就查询用户最后发言时间到如今是否间隔2分钟.假设是则将用户退出. 这 ...
- AngularJS入门学习
初识: {{}} 这种双层花括号的语法称之为:插值语法:也可以说是 标识符:AngularJS 主要就是使用这种方法进行数据绑定 ng-module="name" 在ng的 ...
- Android简单开发之 通用Adapter ViewHolder
我们寻常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { private List<Busba ...