第三篇——第二部分——第六文 监控SQL Server镜像

第三篇——第二部分——第六文 监控SQL Server镜像
原文: 第三篇——第二部分——第六文 监控SQL Server镜像

 

原文出处:http://blog.csdn.net/dba_huangzj/article/details/26846203

 

要优化,首先要监控,看看是否有性能问题,如果有,在哪里。才能开始真正的优化,所以本文以监控为入口,在上一篇已经略微提供了一些监控方面的信息

针对监控部分,本文将介绍以下内容:

  1. 监控组件
  2. 警告阈值
  3. 数据库镜像监视器
  4. 关于镜像的系统存储过程
  5. 性能计数器

 

1.1. 监控组件:

  • 数据库镜像状态表:

数据库镜像状态存储在MSDB中的dbm_monitor_data表中,每当数据库镜像状态更改时,会通过sp_dbmmonitorupdate系统存储过程创建这个表。比如在前面的域环境搭建镜像中,可以看到下面的结果:

首先按照http://blog.csdn.net/dba_huangzj/article/details/27652857 中step 6的方式把两台机器加入注册管理器中:

 


 

然后执行下面语句,可以看到有一些有价值的信息:

SELECT  * 
FROM    msdb.dbo.dbm_monitor_data 
ORDER BY local_time DESC



其中比较有价值的是role、各种rate等。

  • 数据库镜像状态作业:

默认情况下,每分钟运行一次,用于更新数据库镜像状态表。运行间隔从1分钟到120分钟。这个作业实际上是调用sp_dbmmonitorupdate系统存储过程。如果SQL Server Agent没有启用,那么这个作业也不能运行,这回导致前面说到的镜像状态表的数据变得过时。


这个作业在使用SSMS开始数据库会话是自动创建,但是可以使用下面的系统存储过程自定义作业,详细内容可以查看联机丛书:

    • sp_dbmmonitoraddmonitoring:创建数据库镜像监视器作业,该作业可定期更新服务器实例上每个镜像库的镜像状态。注意,如果周期太低客户端的响应时间可能会增加。比如把周期设为1分钟:EXEC sp_dbmmonitoraddmonitoring 1
    • sp_dbmmonitorchangemonitoring:更改数据库镜像监视参数的值,比如把更新周期更改为5分钟:EXEC sp_dbmmonitorchangemonitoring 1,5;
    • sp_dbmmonitordropmonitoring:停止并删除服务器实例上所有数据库镜像监视器作业。

警告阈值:

如果你使用过镜像监视器,会发现有一个警告选项,如图:

 


留意右下角的说明,通过阈值,可以设置一系列的应对措施,下面简要说明一下各个阈值:

  • 未发送日志(unsent log):错误号32042,在主体服务器上设置,在高性能模式下非常重要,如果数据库镜像被暂停,即使是高安全模式下也可以用这个阈值。
  • 未还原日志(unrestored log):错误号32043,在镜像服务器上设置,过量的未还原日志意味着镜像服务器的I/O子系统可能存在性能问题导致镜像服务器无法跟上主体服务器的进度。
  • 最早未发送事务(Oldest Unsent transaction):错误号32040,在主体服务器上设置,在高性能模式下尤其重要。
  • 镜像提交开销(Mirro commit overhead):错误号32044,在镜像服务器上配置,设置平均事务延时提交的毫秒数。这个值是主体服务器等待镜像服务器确认已经redo的时间。这个时间在高安全模式下才有意义,因为高性能模式下主体服务器不需要等待镜像服务器的确认信息。

阈值的使用在本文的【结合其他工具进行监控】和【关于镜像的系统存储过程】部分详细介绍。

 

数据库镜像监视器:

打开数据库镜像监视器:

可以通过下面方式打开镜像监视器:


注册镜像数据库:

如果配置好镜像,打开监视器之后就有一些相关信息,但是由于某些原因要配置镜像库的信息,可以使用注册镜像数据库的功能,如图:


然后进行注册:


默认情况下,SQL Server会优先以Windows 身份验证链接,点击确定之后,就完成添加工作。

使用监视器进行性能检查:

镜像监视器是很好的监控镜像性能的工具,使用这个工具,我们首先要看镜像状态,一般出现【已同步】或者短时间的【正在同步】是允许的,但是其他状态下,就需要检查是否有问题。监控窗口没30秒刷新一次,如果你不是sysadmin角色而是dbm_monitor数据库角色,需要等待镜像监控作业自己更新。如果是sysadmin可以手动刷新。

通过点击【历史记录】可以查看镜像的传输的历史信息。

 

 

我们可以尝试看看变动,在主体服务器中写一个死循环不停插入数据,然后看看监视器的结果,记得在查看之后停止死循环:


 

 

可以看到插入过程的确产生了日志传输。

 

关于镜像的系统存储过程:

前面略微提到过一些系统存储过程,实际上,镜像甚至其他高可用技术都提供了一系列系统存储过程来实现几乎甚至全部的GUI功能,作为DBA,会用系统存储过程是非常必要的。下面介绍主要的一些系统存储过程,更详细的信息请自行查看联机丛书:

 

  • sp_dbmmonitorresults:通过返回数据库镜像状态表的信息监控,必须在MSDB库中执行。

 

在这个结果中,有些列要说明一下:

role

• 1: Principal
• 2: Mirror

mirroring_state

• 0: Suspended
• 1: Disconnected
• 2: Synchronizing
• 3: Pending Failover
• 4: Synchronized

witness_state

• 0: Unknown
• 1: Connected
• 2: Disconnected
  • sp_dbmmonitorchangealert:用于添加或修改特定的警告阈值。下面语句是创建一个阈值,当AdventureWorks2008R2库中【最早未发送事务】超过20分钟即发出警告。

    USE msdb 
    GO 
    EXEC sp_dbmmonitorchangealert  @database_name = N'AdventureWorks2008R2', @alert_id = 1, @threshold = 20, @enabled = 1


  • sp_dbmmonitorhelpalert:返回特定库中的阈值信息。如:

    USE msdb 
    GO 
    EXEC sp_dbmmonitorhelpalert  @database_name = N'AdventureWorks2008R2', @alert_id = 1


  • sp_dbmmonitordropalert:通过把阈值设为NULL来移除警告阈值,如:

    USE msdb 
    GO 
    EXEC sp_dbmmonitordropalert  @database_name = N'AdventureWorks2008R2', @alert_id = 1 


 

性能计数器

性能计数器在可见的将来(个人估计也有2020年之前)都是很重要的监控工具,并且依托强大的功能,可以进行性能分析、警告发送等等,别大量DBA用于日常管理。关于数据库镜像,计数器主要集中在:SQLServer:Database Mirroring 对象中,下面列出一些常用的计数器:

 

计数器名称解释

Bytes Received/sec

每秒收到的字节数。
Bytes Sent/sec每秒发送的字节数。
Log Bytes Received/sec每秒收到的日志字节数。
Log Bytes Redone from Cache/sec

在上一秒钟内从镜像日志缓存中获得的重做日志字节数。
此计数器只在镜像服务器上使用。 在主体服务器上此值始终是 0。

Log Bytes Sent from Cache/sec在上一秒钟内从镜像日志缓存中获得的发送日志字节数。
此计数器只在主体服务器上使用。 在镜像服务器上此值始终是 0。
Log Bytes Sent/sec每秒发送的日志字节数。
Log Compressed Bytes Rcvd/sec在上一秒钟内所接收日志的压缩字节数。
Log Compressed Bytes Sent/sec在上一秒钟内所发送日志的压缩字节数。
Log Harden Time (ms)日志块在上一秒钟内等待强制写入磁盘的时间(毫秒)。
Log Remaining for Undo KB在故障转移之后等待由新的镜像服务器扫描的日志总字节数 (KB)。
此计数器仅可在撤消阶段在镜像服务器上使用。 撤销阶段完成后,计数器会重置为 0。 在主体服务器上此值始终是 0。
Log Scanned for Undo KB 

自故障转移开始已由新的镜像服务器扫描的日志总字节数 (KB)。
此计数器仅可在撤消阶段在镜像服务器上使用。 撤销阶段完成后,计数器会重置为 0。 在主体服务器上此值始终是 0。

Log Send Flow Control Time (ms) 

日志流消息在上一秒钟内等待发送流控制的时间(毫秒)。
在数据库镜像中,将日志数据和元数据发送到镜像伙伴是数据量最密集的操作,并可能独占数据库镜像和 Service Broker 发送缓冲区。 使用此计数器可监视数据库镜像会话使用此缓冲区的情况。

Log Send Queue KB尚未发送到镜像服务器的日志总字节数 (KB)。
Mirrored Write Transactions/sec

在上一秒钟内写入镜像数据库并等待日志发送到镜像数据库以进行提交的事务数。
仅当主体服务器正在向镜像服务器发送日志记录时,此计数器才会增加。

Pages Sent/sec每秒发送的页数。
Receives/sec每秒收到的镜像消息数。
Redo Bytes/sec每秒在镜像数据库中前滚的日志字节数。
Redo Queue KB当前仍应用于镜像数据库以进行前滚操作的镜像日志的总字节数 (KB)。 此数据将从镜像数据库发送到主体数据库。
Send/Receive Ack Time

在上一秒钟内消息等待伙伴确认的时间(毫秒)。
在解决可能由网络瓶颈导致的问题(例如莫名其妙的故障转移、发送队列很大或事务滞后时间较长)时,此计数器非常有用。 在这些情况下,可以分析此计数器的值来确定是否是由于网络而导致出现上述问题。

Sends/sec每秒发送的镜像消息数。
Transaction Delay等待未终止的提交确认的延迟时间。

 

也可以在SSMS中通过sys.dm_os_performance_counters 这个DMV查询,如:

SELECT object_name, counter_name, instance_name, cntr_value 
FROM sys.dm_os_performance_counters 
WHERE object_name like '%mirror%'



通过上面介绍的方法,对数据库镜像进行状态、阈值等方面的监控,可以尽可能快地响应镜像出现的问题。

posted on 2015-03-07 09:45 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4319787.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1386):多人管理项目6骨架

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path);//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是什么 app.set(view engine…

前端学习(1387):多人管理项目7登录 数据库连接

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path); require(./model/connect)//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是…

mysql教程丿it教程网_MySQL整体

整体大纲数据库实现数据持久化使用完整的管理系统统一管理,易于查询数据库的相关概念DB:数据库(database):存储数据的“仓库”。它保存了一系列有组织的数据。DBMS数据库管理系统(Database Management System)。数据库是通过DBMS创建和操作的…

前端学习(1364):学生档案信息管理6

service.js //引入http模块 const http require(http); //创建网站服务器 const app http.createServer();const template require(art-template); const path require(path); const serveStatic require(serve-static);//静态资源服务 const serve serveStatic(path.jo…

前端学习(1389):多人管理项目9登录功能具体实现

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path); require(./model/connect)//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是…

java弹出提示窗口_Java实现弹窗效果的基本操作(2)

本文为大家分享了Java实现弹窗效果的实现代码,供大家参考,具体内容如下1、任务简介我在5月23日写过一篇文章为《Java弹窗操作》,从目前来看浏览量不错,故我将之前省略了的两个程序分享出来,同时也将更多的方法分享出来…

前端学习(1390):多人管理项目10服务器认证

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path); require(./model/connect)//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是…

前端学习(1391):多人管理项目11邮箱地址查询信息

blog.js //管理页面 //展示页面 const express require(express);const admin express.Router();admin.get(/login, (req, res) > {res.render(admin/login) }); admin.get(/user, (req, res) > {res.render(admin/user) }); admin.post(/login, async(req, res) >…

java tea属于红茶吗_什么茶属于红茶类

茶叶在中国的历史已经非常悠久了。相信很多人都喝过红茶,红茶种类还是比较多的,那么知道什么茶属于红茶类吗?平时买回来的红茶该怎么保存比较好呢?什么茶属于红茶类 1、中国的红茶种类还是比较多的。其中滇红,祁红&…

前端学习(1392):多人管理项目12加密

blog.js //管理页面 //展示页面 const express require(express);const admin express.Router();admin.get(/login, (req, res) > {res.render(admin/login) }); admin.get(/user, (req, res) > {res.render(admin/user) }); admin.post(/login, async(req, res) >…

java 注入 循环_spring依赖注入——循环依赖

上一篇博客简单地分析了下依赖注入。但是对于依赖注入的很多细节,都没有深入的分析。这一篇博客会继续分析spring的依赖注入。这篇博客会解决分析getBean缓存时候遗留下来的循环依赖问题。循环依赖分析首先明确下,只有单例情况下,spring才会试…

前端学习(1393):多人管理项目13加密实现

blog.js //管理页面 //展示页面 const express require(express);const admin express.Router();admin.get(/login, (req, res) > {res.render(admin/login) }); admin.get(/user, (req, res) > {res.render(admin/user) }); admin.post(/login, async(req, res) >…

java提高篇四_(转)java提高篇(四)-----理解java的三大特性之多态

面向对象编程有三大特性:封装、继承、多态。封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。继承是为了重用父类代码。…

前端学习(1397):项目包含的知识点cookie和session2

const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path); //引入 const bodyPaser require(body-parser);const session require(express-session); require(./model/connect)//处理post app.use(bodyPase…

前端学习(1401):多人管理21新增用户

const { User } require(../../model/user);module.exports async (req, res) > {// 获取到地址栏中的id参数const { message, id } req.query;// 如果当前传递了id参数if (id) {// 修改操作let user await User.findOne({_id: id});// 渲染用户编辑页面(修改)res.rende…

C# 添加类库依赖

转载于:https://www.cnblogs.com/dekevin/p/4350049.html

前端学习(1402):多人管理22验证joi

// 引入joi模块 const Joi require(joi);// 定义对象的验证规则 const schema {username: Joi.string().min(2).max(5).required().error(new Error(username属性没有通过验证)),birth: Joi.number().min(1900).max(2020).error(new Error(birth没有通过验证)) };async funct…

win2003+IIS6+PHP5.3.8+MSSQL2008的安装配置

转载于:https://www.cnblogs.com/nxping/p/4351033.html