模拟镜像服务器磁盘问题的两个测试【转】

目前数据库镜像提供两种配置的方式:高安全模式和高性能模式。

我们知道在高安全模式下,在主服务器上提交的事务必须同时在镜像服务器上提交成功,否则该事务无法在主数据库上提交。

 

在上面的图中,一个事务在主数据库上提交的步骤包含:

  1. 客户端程序将事务发送给主数据库服务器SQLServer
  2. 主数据库服务器 SQL Server为这个事务写日志文件

2.1         主数据库服务器将这个事务的日志内容传递给镜像服务器的SQL Server

  1. 镜像数据库服务器SQL Server将收到的日志内容写入到日志文件。
  2. 镜像服务器回复主服务器写日志的动作完成。
  3. 主服务器SQL Server回复客户端程序该事务提交成功。

>2.主数据库服务器SQL Server在检查点时将该事务修改的数据页从内存中写入数据文件。

>3.镜像数据库服务器SQL Server将日志对于的数据页在文件上做变更。

 

从这样的顺序中,我们提出一个问题,如果镜像服务器的SQL Server在那个时候不能完成步骤3,是否这时主数据库服务器对于的数据库就不能正常的提交事务了呢?本文介绍的两个测试就是模拟日志文件和数据库不可用时候的测试结果

测试一:数据库有多个数据文件和日志文件,分布在不同的磁盘上,在镜像数据库联机的情况下删除一个磁盘,即一个数据文件和日志文件不可能的测试:

  1. 1.    创建数据库test,添加四个文件。注意为第一个日志文件设置较小的大小并禁止自动增长:

test               C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\DATA\test.mdf

test_log           C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\DATA\test_log.ldf

test1              E:\test1.ndf

testlog1           E:\testlog1.ldf

  1. 2.    配置数据库镜像高安全模式,主服务器为SQL1,镜像数据库为SQL2.

 

  1. 3.    创建两张测试表 testtest1, 插入超过 1,000,000 行数据到test表中.  由于第一个日志文件较小且不能自动增长,因此SQL Server开始使用第二个日志文件testlog1.检查数据库镜像的状态:

 

结果:主数据库显示已principal/sychronized

  1. 4.    执行下面的脚本,开始事务,这个事务会执行超过10分钟:

begin tran

insert into test  select * from test

insert into test  select * from test

commit

  1. 当事务开始执行1分钟以后,暂停数据库镜像 1分钟,然后在手工恢复数据库镜像的同步:

结果: 主数据库状态显示principal/synchronizing.

访问test1表,可以返回数据。

6. 手工将E盘从镜像数据库服务上拔出:.

结果: 主数据库状态立即变更为 (principal/suspend)。

测试访问主数据库并查询test1表

镜像数据库状态变更为: (mirrored, suspend/restoring)

7. 检查事务的执行:

几分钟以后,这个事务显示在主数据库上提交成功。

.

8. 检查主数据库和镜像数据库的SQL Server错误日志:

 

 

主数据库:

Error: 1453, Severity: 16, State: 1.

‘TCP://LDUA2481460-2.DOM248146.COM:5023‘, the remote mirroring partner for database ‘test‘, encountered error 5159, status 1, severity 24. Database mirroring has been suspended.  Resolve the error on the remote server and resume mirroring, or remove mirroring and re-establish the mirror server instance.

镜像数据库:

‘TCP://LDUA2481460-2.DOM248146.COM:5023‘, the remote mirroring partner for database ‘test‘, encountered error 5159, status 1, severity 24. Database mirroring has been suspended.  Resolve the error on the remote server and resume mirroring, or remove mirroring and re-establish the mirror server instance.

Operating system error 2(The system cannot find the file specified.) on file "E:\test_3.ldf" during RestoreFileHdr.

Test 2: 在执行并同步一个大事务的时候将镜像数据库删除

1.    创建数据库test,包含一个数据文件一个日志文件。

test1            E:\test1.mdf

test1_log        E:\test1_log.ldf

2. 配置数据库镜像高安全模式,主服务器为SQL1,镜像数据库为SQL2.

 

3. 创建两张测试表 testtest1, 插入超过 1,000,000 行数据到test表中.  由于第一个日志文件较小且不能自动增长,因此SQL Server开始使用第二个日志文件testlog1.检查数据库镜像的状态:

 

结果:主数据库显示已principal/sychronized

4. 执行下面的脚本,开始事务,这个事务会执行超过10分钟:

begin tran

insert into test select * from test

insert into test select * from test

commit

5. 当事务开始执行1分钟以后,暂停数据库镜像 1分钟,然后在手工恢复数据库镜像的同步:

结果: 主数据库状态显示principal/synchronizing.

访问test1表,可以返回数据。

6. 手工将E盘从镜像数据库服务上拔出:

结果: 主数据库状态立即变更为 (principal/ disconnected)。

测试访问主数据库并查询test1表

镜像数据库不存在。

7. 检查事务的执行:

几分钟以后,这个事务显示在主数据库上提交成功。

8. 检查主数据库和镜像数据库的SQL Server错误日志:

主数据库:

1453, Severity: 16, State: 1

‘TCP://LDUA2481460-2.DOM248146.COM:5023‘, the remote mirroring partner for database ‘test1‘, encountered error 5149, status 1, severity 16. Database mirroring has been suspended.  Resolve the error on the remote server and resume mirroring, or remove mirroring and re-establish the mirror server instance..

镜像数据库:

Error: 17053<c/> Severity: 16<c/> State: 1

RestoreFileHdr: Operating system error 2(The system cannot find the file specified.) encountered.

Error: 5159<c/> Severity: 24<c/> State: 1

Operating system error 2(The system cannot find the file specified.) on file "E:\test1_1.ldf" during RestoreFileHdr.

Error: 823<c/> Severity: 24<c/> State: 3.

The operating system returned error 21(The device is not ready.) to SQL Server during a write at offset 0x00000000012000 in file ‘E:\test1.mdf‘. Additional messages in the SQL Server error log and system event log may provide more detail. This is a severe system-level error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information<c/> see SQL Server Books Online.

Error: 1454<c/> Severity: 16<c/> State: 1.

While acting as a mirroring partner for database ‘test1‘<c/> server instance ‘LDUA2481460-1\MSSQLSERVER1‘ encountered error 823<c/> status 3<c/> severity 24. Database mirroring will be suspended.  Try to resolve the error and resume mirroring.

测试结果:

主数据库在这两种情况下依然可以访问并且成功提交事务

转自:http://blogs.msdn.com/b/apgcdsd/archive/2012/03/09/10280123.aspx

时间: 2024-10-13 13:59:18

模拟镜像服务器磁盘问题的两个测试【转】的相关文章

SQL Server 服务器磁盘测试之SQLIO篇(二)

上次放出了一篇文章,针对磁盘卷簇大小默认4KB和自定义64KB进行了测试,测试内容为随机和顺序读写,大小为8KB和64KB,有人觉得这并没有照顾到SQL Server所有的IO使用情景.这篇测试文章,我们就来尽可能模拟一下SQL Server IO的行为,全方位对簇大小4KB.8KB和64KB做一次验证,注意:本次我们增加了簇为8KB的大小. 重点说明:本测试使用的是两块SSD组成的RAID1 首先,我们先来分析SQL Server的IO行为,参考网址:Choosing what SQLIO t

搭建本地Ubuntu 镜像服务器

一.需求分析能不能在局域网搭建一个Ubuntu 镜像服务器,这样作的好处是可以节省Ubuntu某些常用工具的安装时间. 二.部署过程 2.1 测试环境目前在公司内有一台能连接到外网的Ubuntu机器, IP : 192.168.8.173 ,Ubuntu版本为Ubuntu 9.04 i686. 2.2 搭建步骤为了创建Ubuntu mirror 服务器,最少需要60G硬盘空间,Ubuntu每个版本都有32 bit和64 bit两个版本,有两组deb包.当然可以创建Ubuntu一个版本的32 bi

shell 脚本实战笔记(5)--搭建资源的镜像服务器

背景: 由于访问国外站点资源, 有时特别慢. 偶尔一次下载, 肯定还能忍受, 对于多次使用或者小团队内部使用, 搭建一个镜像站点, 无疑是个明智的决定. 这边以搭建CDH5的yum源镜像, 作为例子, 具体阐述如何借助apache2搭建一个目录镜像服务, 以及如何复制站点资源. 1) 搭建apache2服务器*) 安装apache2yum install httpdyum info httpd *) 确认配置项/etc/httpd/conf/httpd.conf DocumentRoot "/v

Jenkins服务器磁盘空间管理策略

Jenkins在帮助我们自动化构建服务的同时也在消耗服务器的磁盘空间,试想如果构建的项目个数很多,而Jenkins 服务器磁盘空间又不是非常大的话,每隔一段时间磁盘空间就会爆满导致Jenkins出现磁盘空间不足无法构建的后果.这时候我们就需要进行一定的手工干预才能恢复Jenkins的正常运作.本文基于Windows操作系统,结合Jenkins 的相关特性解决上述问题. 一.手工删除构建记录 这是最基本的一种操作方法,通过直接物理删除构建记录进行磁盘空间管理.手工删除构建记录方式如下: 进入Jen

docker系列之镜像服务器

docker 的镜像服务器 docker-registry 是 docker 项目的组成部分. 前面在谈 docker 的命令时, 它的 pull/push 命令就是和镜像服务器打交道. 并且, docker 的设计之中, 服务器地址不是单独配置的, 而是作为镜像名称的一部分. 镜像的完整名称是: 127.0.0.1:5000/zephyr/common:latest 各部分的意思: 127.0.0.1:5000 就是服务器地址 zephyr 是名字空间 common 是镜像名 latest 是

如何使用fiddler模拟接口服务器

1.案例描述案例:我们的APP使用了某天气预报接口,其接口描述如下:接口名称:根据城市名查询天气接口地址:http://v.juhe.cn/weather/index返回格式:json/xml请求方式:get请求示例:http://v.juhe.cn/weather/index?cityname=%E8%8B%8F%E5%B7%9E&key=您申请的KEY请求参数说明:名称必填类型说明citynameYstring城市名,如:"苏州",需要utf8 urlencodedtype

Android SDK 在线更新镜像服务器资源

Android SDK 在线更新镜像服务器资源: 大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 北京化工大学镜像服务器地址: IPv4: http://ubuntu.buct.edu.cn/ 端口:80 IPv4: http://ubuntu.buct.cn/ 端口:80 IPv6: http://ubuntu.buct6.edu.cn/ 端口:80 上海GDG镜像服务器地址: http://sdk.gdgshanghai.com 端口

C# Socket 模拟http服务器帮助类

0x01 写在前面 0x02 Http协议 0x03 TCP/IP 0x04 看代码 0x05 总结 0x01 写在前面 由于工作中,经常需要在服务器之间,或者进程之间进行通信,分配任务等.用Socket操作,太麻烦了,需要建立连接,处理消息.所以 准备创建一个Socket模拟Http服务器的帮助类,来直接通过WebClient进行调用. 0x02 Http协议 我的理解:http协议,其实就是依托于tcp/ip的一个协议,也是可以通过socket发送消息,只是说.发送的内容格式满足http的条

java模拟web服务器代码

为了更好地理解web服务器(如tomcat)的运行原理,现用java代码模拟了一个web服务器: 1 import java.io.*; 2 import java.net.*; 3 public class MyWebServer 4 { 5 /*模拟web服务器*/ 6 public static void main(String[] args) throws Exception 7 { 8 ServerSocket ss = new ServerSocket(9999);//占用9999端