zoukankan      html  css  js  c++  java
  • Mirror--如何TSQL查看镜像状态和镜像相关存储过程

    --====================================================
    --查看镜像状态
    SELECT
    DB_NAME(database_id) AS DatabaseName,
    dm.mirroring_role AS MirroringRole,
    (CASE dm.mirroring_role
       WHEN 1 THEN '主体'
       WHEN 2 THEN '镜像'
       END) AS MirroringRoleDesc,
    dm.mirroring_partner_name AS MirroringPartnerName,
    (CASE WHEN dm.mirroring_witness_name IS NULL
       THEN '--'
       ELSE dm.mirroring_witness_name
    END)AS MirroringWitnessName,
    dm.mirroring_state AS MirroringState,
    (CASE dm.mirroring_state
       WHEN 0 THEN '已挂起'
       WHEN 1 THEN '与其他伙伴断开'
       WHEN 2 THEN '正在同步'
       WHEN 3 THEN '挂起故障转移'
       WHEN 4 THEN '已同步'
       WHEN 5 THEN '伙伴未同步'
       WHEN 6 THEN '伙伴已同步'
       WHEN NULL THEN '无镜像'
    END) AS MirroringStateDesc,
    dm.mirroring_safety_level AS MirroringSafetyLevel,
    (CASE dm.mirroring_safety_level
       WHEN 0 THEN '未知'
       WHEN 1 THEN '异步'
       WHEN 2 THEN '同步'
       WHEN NULL THEN '无镜像'
    END) AS MirroringSafetyLevelDesc,
    dm.mirroring_witness_state AS MirroringWitnessState,
    (CASE dm.mirroring_witness_state
       WHEN 0 THEN '见证未知'
       WHEN 1 THEN '见证连接'
       WHEN 2 THEN '见证断开'
       WHEN NULL THEN '无见证'
    END) AS MirroringWitnessStateDesc
    FROM sys.database_mirroring dm
    WHERE dm.mirroring_guid IS NOT NULL
     
    --============================================================
    --查看镜像的日志传送
    sp_dbmmonitorresults database_name
       , rows_to_return
        , update_status
     
    database_name
    指定返回其镜像状态的数据库。
    rows_to_return
    指定返回的行数:
    0 = 最后一行
    1 = 最后两小时的行
    2 = 最后四小时的行
    3 = 最后八小时的行
    4 = 最后一天的行
    5 = 最后两天的行
    6 = 最后 1007 = 最后 5008 = 最后 1,0009 = 最后 1,000,000 行
    update_status
    指定返回结果之前,过程:
    0 = 不更新数据库的状态。仅使用最后两行计算结果,其保留时间取决于何时刷新状态表。
    1 = 通过在计算结果之前调用 sp_dbmmonitorupdate
    来更新数据库的状态。但是,如果在前 15 秒内已更新状态表,或用户不是 sysadmin 固定服务器角色的成员,则 sp_dbmmonitorresults
    将运行,而不更新状态。
     
    --============================================================
    --创建数据库镜像监视器作业,该作业可定期更新服务器实例上每个镜像数据库的镜像状态。
    sp_dbmmonitoraddmonitoring [ update_period ]
    update_period:指定更新间隔(分钟)。此值可以是介于 1120 分钟之间的值。默认值为 1 分钟。
     
     
    --============================================================
    --自定义查询
    --sp_dbmmonitoraddmonitoring 数据来源于dbm_monitor_data
     
    WITH tmp AS( SELECT ROW_NUMBER()OVER(
    PARTITION BY dm.database_id
    ORDER BY dm.[local_time] DESC) AS RID,
     *
    FROM msdb.dbo.dbm_monitor_data dm)
    SELECT * FROM tmp WHERE RID=1
     
     
    --------------------------------------------------------------------------------
    --补充资料
    --============================================
    --MSDN: http://technet.microsoft.com/zh-cn/library/ms173768.aspx
    --sp_dbmmonitorupdate 会插入镜像相关数据,并将超过天的历史数据删除。
    --===================================================================
    --创建数据库镜像监视器作业,该作业可定期更新服务器实例上每个镜像数据库的镜像状态。
    --sp_dbmmonitoraddmonitoring [ update_period ]
    --update_period
    --指定更新间隔(分钟)。此值可以是介于1 到120 分钟之间的值。默认值为1 分钟。
    --要求具有sysadmin 固定服务器角色的成员身份运行,更新间隔过小会影响性能
     
    EXEC msdb.sys.sp_dbmmonitoraddmonitoring 3;
     
     
    --===================================================================
    --更改数据库镜像监视参数,设置监视器更新频率
    --sp_dbmmonitorchangemonitoring parameter, value
    --parameter
    --指定要更改的参数的标识符。当前,只有以下参数可用:
    --1 = 更新周期,数据库镜像状态表的更新间隔期的分钟数。默认间隔为1 分钟。
    --value
    --为正在更改的参数指定新值。范围在1 到120 的整数,用于指定新的更新周期(分钟)。
     
    exec msdb.sys.sp_dbmmonitorchangemonitoring 1,2
     
     
    --===================================================================
    --查看监视器更新频率
    --sp_dbmmonitorhelpmonitoring
     
    exec msdb.sys.sp_dbmmonitorhelpmonitoring
     
     
    --===================================================================
    --sp_dbmmonitorresults database_name , rows_to_return, update_status
     
    --database_name
    --指定返回其镜像状态的数据库。
     
    --rows_to_return
    --指定返回的行数:
    --0 = 最后一行
    --1 = 最后两小时的行
    --2 = 最后四小时的行
    --3 = 最后八小时的行
    --4 = 最后一天的行
    --5 = 最后两天的行
    --6 = 最后100 行
    --7 = 最后500 行
    --8 = 最后1,000 行
    --9 = 最后1,000,000 行
     
    --update_status
    --指定返回结果之前,过程:
    --0 = 不更新数据库的状态。仅使用最后两行计算结果,其保留时间取决于何时刷新状态表。
    --1 = 通过在计算结果之前调用sp_dbmmonitorupdate 来更新数据库的状态。
    --但是,如果在前15 秒内已更新状态表,或用户不是sysadmin 固定服务器角色的成员,
    --则sp_dbmmonitorresults 将运行,而不更新状态。
     
    EXEC msdb.sys.sp_dbmmonitorresults DB1, 2, 0;
     
     
     
    --===================================================================
    --停止并删除服务器实例上所有数据库的镜像监视器作业。
    --要求具有sysadmin 固定服务器角色的成员身份。
     
    EXEC msdb.sys.sp_dbmmonitordropmonitoring
     
    --===================================================================
    --检查dbm_monitor_data中数据是否有超过阀值数据,如果有,则报警
    --status: 数据库的状态:= 已挂起1 = 已断开2 = 正在同步3 = 挂起故障转移4 = 已同步
    --send_queue_size:在主体的发送队列中未发送日志的大小(KB)。
    --redo_queue_size:镜像中重做队列的大小(KB)。
    --role:服务器实例的当前镜像角色:= 主体1 = 镜像,
    --witness_status:见证状态:= 未知1 = 已连接2 = 已断开
     
    use msdb;
    GO
    IF (OBJECT_ID('tempdb.dbo.#MirrorResult') IS NOT NULL)
    BEGIN
    DROP TABLE #MirrorResult
    END
    GO
    WITH tmp AS(
    SELECT
    ROW_NUMBER()OVER(PARTITION BY Database_id ORDER BY local_time DESC) AS RID,
    *
    FROM msdb.dbo.dbm_monitor_data
    )
    SELECT * INTO #MirrorResult FROM tmp
    WHERE RID=1
    AND (
    ([status]<>2 AND [status]<>4)
    OR send_queue_size>30000
    OR redo_queue_size>30000)
     
    --如果表不为空,则镜像可能出现问题
    IF EXISTS(SELECT 1 FROM #MirrorResult)
    BEGIN
    DECLARE @databaseNames NVARCHAR(MAX);
    DECLARE @errorMessage NVARCHAR(MAX);
    SET @databaseNames='';
    SELECT @databaseNames=@databaseNames+DBS.name+'/' FROM #MirrorResult MR
    INNER JOIN master.sys.databases DBS
    ON MR.database_id=DBS.database_id
     
    set @errorMessage= '数据库:'+@databaseNames+' 镜像断开或者存在大量日志为发送或重做'
     
    --发送警告
    PRINT @errorMessage
     
    END
    --===================================================================
     
     
    --=============================================================================
    --查看当前挂起的镜像或有大量日志积压的镜像
    WITH tmp AS(
    SELECT
    ROW_NUMBER()OVER(PARTITION BY Database_id ORDER BY local_time DESC) AS RID,
    *
    FROM msdb.dbo.dbm_monitor_data
    )
    SELECT * INTO #MirrorResult FROM tmp
    WHERE RID=1
    AND (
    ([status]<>2 
    AND [status]<>4) 
    OR send_queue_size>30000 
    OR redo_queue_size>30000)
  • 相关阅读:
    使用postman时请求参数中包含特殊字符问题,如加号传到后台变成空格
    okhttp3报错:java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
    Eclipse的知识积累
    partition 取数据中相同字段数据中取时间最大的一个值 并只保留一条
    理解Session缓存机制 操纵持久化对象
    Hibernate的检索策略
    LINQ介绍
    .Net 一对一的双向关联Map写法
    Hibernate多态查询
    NHibernate实战[转 2012 gogogo]
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3521737.html
Copyright © 2011-2022 走看看