原文出处:http://blog.csdn.net/dba_huangzj/article/details/26846203
要优化,首先要监控,看看是否有性能问题,如果有,在哪里。才能开始真正的优化,所以本文以监控为入口,在上一篇已经略微提供了一些监控方面的信息
针对监控部分,本文将介绍以下内容:
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开始数据库会话是自动创建,但是可以使用下面的系统存储过程自定义作业,详细内容可以查看联机丛书:
如果你使用过镜像监视器,会发现有一个警告选项,如图:
留意右下角的说明,通过阈值,可以设置一系列的应对措施,下面简要说明一下各个阈值:
阈值的使用在本文的【结合其他工具进行监控】和【关于镜像的系统存储过程】部分详细介绍。
可以通过下面方式打开镜像监视器:
如果配置好镜像,打开监视器之后就有一些相关信息,但是由于某些原因要配置镜像库的信息,可以使用注册镜像数据库的功能,如图:
然后进行注册:
默认情况下,SQL Server会优先以Windows 身份验证链接,点击确定之后,就完成添加工作。
镜像监视器是很好的监控镜像性能的工具,使用这个工具,我们首先要看镜像状态,一般出现【已同步】或者短时间的【正在同步】是允许的,但是其他状态下,就需要检查是否有问题。监控窗口没30秒刷新一次,如果你不是sysadmin角色而是dbm_monitor数据库角色,需要等待镜像监控作业自己更新。如果是sysadmin可以手动刷新。
通过点击【历史记录】可以查看镜像的传输的历史信息。
我们可以尝试看看变动,在主体服务器中写一个死循环不停插入数据,然后看看监视器的结果,记得在查看之后停止死循环:
可以看到插入过程的确产生了日志传输。
前面略微提到过一些系统存储过程,实际上,镜像甚至其他高可用技术都提供了一系列系统存储过程来实现几乎甚至全部的GUI功能,作为DBA,会用系统存储过程是非常必要的。下面介绍主要的一些系统存储过程,更详细的信息请自行查看联机丛书:
在这个结果中,有些列要说明一下:
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
USE msdb GO EXEC sp_dbmmonitorchangealert @database_name = N'AdventureWorks2008R2', @alert_id = 1, @threshold = 20, @enabled = 1
USE msdb GO EXEC sp_dbmmonitorhelpalert @database_name = N'AdventureWorks2008R2', @alert_id = 1
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 | 在上一秒钟内从镜像日志缓存中获得的重做日志字节数。 |
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)。 |
Log Send Flow Control Time (ms) | 日志流消息在上一秒钟内等待发送流控制的时间(毫秒)。 |
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%'
通过上面介绍的方法,对数据库镜像进行状态、阈值等方面的监控,可以尽可能快地响应镜像出现的问题。