1. 程式人生 > >SqlServer 監控釋出中未分發的命令數

SqlServer 監控釋出中未分發的命令數

對於檢視未分發的命令數,我們通常這樣檢視。


然而當伺服器有很多釋出時,一個個開啟檢視就很麻煩


當然,如果想用指令碼檢視就更方便了,執行下面的語句

--檢視各發布訂閱未分發的命令數和估計時間
SELECT  'EXEC distribution.sys.sp_replmonitorsubscriptionpendingcmds @publisher = N'''
        + a.publisher + ''', @publisher_db = N''' + a.publisher_db
        + ''', @publication = N''' + a.publication + ''', @subscriber = N'''
        + c.name + ''', @subscriber_db = N''' + b.subscriber_db
        + ''', @subscription_type =' + CAST(b.subscription_type AS VARCHAR)
FROM    distribution.dbo.MSreplication_monitordata a ( NOLOCK )
INNER JOIN (
	SELECT   publication_id ,subscriber_id ,subscriber_db ,subscription_type
	FROM     distribution.dbo.MSsubscriptions (NOLOCK)
	GROUP BY publication_id ,subscriber_id ,subscriber_db ,subscription_type
) b ON a.publication_id = b.publication_id
INNER JOIN sys.servers c ( NOLOCK ) ON b.subscriber_id = c.server_id
WHERE   a.agent_type = 1

上面自動生成各個釋出 未分發的命令的儲存過程,執行就能檢視各個釋出等待分發的命令和估計時間:


EXEC distribution.sys.sp_replmonitorsubscriptionpendingcmds 
@publisher = N'釋出伺服器'
, @publisher_db = N'釋出資料庫'
, @publication = N'釋出名稱'
, @subscriber = N'訂閱伺服器'
, @subscriber_db = N'訂閱資料庫'
, @subscription_type =0


/***************************************************************************/
/***************************************************************************/


但是,由於監控需要,只想統計所有釋出未分發的命令數“ pendingcmdcount”的總和,

本來想用下面這個方法把各個儲存過程的返回值插入到臨時表,但是沒有這種方法!!

CREATE TABLE #countab(pendingcmdcount int,estimatedprocesstime int)

INSERT INTO #countab(pendingcmdcount,estimatedprocesstime)
EXEC distribution.sys.sp_replmonitorsubscriptionpendingcmds 
@publisher = N'釋出伺服器'
, @publisher_db = N'釋出資料庫'
, @publication = N'釋出名稱'
, @subscriber = N'訂閱伺服器'
, @subscriber_db = N'訂閱資料庫'
, @subscription_type =0

上面這個方法也可行,但是隻在本地的測試可行。就是建立連結伺服器,加到資料庫distribution前面。

實際伺服器有本地的連結伺服器,但是沒顯示出來,也用不了。雖然可以建立其他命名的,但不想建立太多連結伺服器。

於是想到更改系統的儲存過程!!~錯了,是參考系統儲存過程建立一個幾乎一樣定義的儲存過程。

即不需要distribution.sys.sp_replmonitorsubscriptionpendingcmds ,建立類似的dbo.sp_getsubscriptionpendingcmds ,如下

create procedure dbo.sp_getsubscriptionpendingcmds   
(  
    @publisher sysname -- cannot be null  
    ,@publisher_db sysname -- cannot be null  
    ,@publication sysname -- cannot be null  
    ,@subscriber sysname -- cannot be null  
    ,@subscriber_db sysname -- cannot be null  
    ,@subscription_type int
    ,@pendingcmdcount int output 
)  
as  
begin  
    set nocount on  
	declare @retcode int  
	,@agent_id int  
	,@publisher_id int  
	,@subscriber_id int  
	,@lastrunts timestamp  
	,@xact_seqno varbinary(16)  
	
	,@inactive int = 1  
	,@virtual int = -1  
 
    select @publisher_id = server_id from sys.servers where upper(name) = upper(@publisher)  
    select @subscriber_id = server_id from sys.servers where upper(name) = upper(@subscriber)  
    
    select @agent_id = id  
    from distribution.dbo.MSdistribution_agents   
    where publisher_id = @publisher_id   
        and publisher_db = @publisher_db  
        and publication in (@publication, 'ALL')  
        and subscriber_id = @subscriber_id  
        and subscriber_db = @subscriber_db  
        and subscription_type = @subscription_type  


    ;with dist_sessions (start_time, runstatus, timestamp)  
    as(  
        select start_time, max(runstatus), max(timestamp)   
        from distribution.dbo.MSdistribution_history  
        where agent_id = @agent_id  
        group by start_time   
    )  
    select @lastrunts = max(timestamp) from dist_sessions where runstatus in (2,3,4);  
    
    if (@lastrunts is null)  
    begin  
        if exists (
			select * from distribution.dbo.MSpublications p 
			inner join distribution.dbo.MSsubscriptions s on p.publication_id = s.publication_id  
			where p.publisher_id = @publisher_id   
			and p.publisher_db = @publisher_db  
			and p.publication = @publication  
			and p.immediate_sync = 1  
			and s.status = @inactive and s.subscriber_id = @virtual)   
        begin  
			select 'pendingcmdcount' = 0, N'estimatedprocesstime' = 0  
			return 0  
		end  
        
        select @lastrunts = max(timestamp) from distribution.dbo.MSdistribution_history where agent_id = @agent_id  
    end  

    select @xact_seqno = xact_seqno from distribution.dbo.MSdistribution_history where agent_id = @agent_id  and timestamp = @lastrunts  

    select @xact_seqno = isnull(@xact_seqno, 0x0)  


    DECLARE @countab TABLE ( pendingcmdcount int ) 
    insert into @countab (pendingcmdcount)  
        exec @retcode = distribution.sys.sp_MSget_repl_commands   
                                    @agent_id = @agent_id  
                                    ,@last_xact_seqno = @xact_seqno  
                                    ,@get_count = 2  
                                    ,@compatibility_level = 9000000  
    if (@retcode != 0 or @@error != 0)  
        return 1  

    select @pendingcmdcount=pendingcmdcount from @countab  

    return @pendingcmdcount
end  


上面的儲存過程主要更改3個地方,然後在其他一個數據庫執行,頁可在distribution執行。

1. 多一個返回引數,@pendingcmdcount int output ,返回未分發的命令數

2. 估計時間不需要,去掉

3. 查詢的每個表或內部儲存過程加資料庫字首distribution

接下來再用一個儲存過程把所有值加起來,給計數器!


新建一個作業,定時每分鐘執行,觀察效能計數器統計情況。


這樣也可以再cacti捕獲了!~


相關推薦

SqlServer 監控釋出分發命令

對於檢視未分發的命令數,我們通常這樣檢視。 然而當伺服器有很多釋出時,一個個開啟檢視就很麻煩 當然,如果想用指令碼檢視就更方便了,執行下面的語句 --檢視各發布訂閱未分發的命令數和估計時間 SELECT 'EXEC distribution.sys.sp_repl

SqlServer執行Insert命令同時判斷目標表是否存在目標

sql命令 存在 ins exist 執行 not mar val column 針對於已查詢出數據結果, 且在程序中執行Sql命令, 而非數據庫中的存儲過程 INSERT INTO TableName (Column1, Column2, Column3, Column4

【轉】如何在命令行腳本啟動帶參的Windows服務

服務控制 代碼 需要 () 而不是 gen 備註 詳細介紹 namespace 我們有一個自己編寫的Windows服務,我們希望該服務在啟動時可以根據用戶輸入的參數實現不同的功能。 要實現這樣的需求並不是很難,下面這個例子我用來示範如何編寫該服務 1 using

4)在url加上a分發,用來選哪一個函

doc mpat str rds utf8 class control cnblogs tab 文件關系目錄展示:      然後代碼改動部分展示:     zixun.controller.class.php        1 <?php 2

算法總結之 出現的最小正整數

urn log 既然 color 一起 style 時間復雜度 復雜度 最終 給定一個無序整型數組arr,找到數組中未出現的最小正整數 解題思路非常好,需要好好學習一下,很邏輯 如果arr長度為N, 最優解可以做到時間復雜度O(N) 額外空間復雜度O(1) 1、

MySQL據庫查詢的特殊命令

nload des bin 數據庫軟件 direct desc mysql命令 版本 分享 第一: MySQL的安裝 下載MySQL軟件,修改安裝路徑之後 安裝數據庫MySQL5.7.18   第一步:數據庫MySQL5.7.18可以在官網上下載對應的版本,下載地址:h

在Windows Server 2008 R2 Server,連接其他服務器的據庫遇到“啟用當前據庫的 SQL Server Service Broker,因此查詢通知不受支持。如果希望使用通知,請為此據庫啟用 Service Broker ”

lba pos 數據庫名 nbsp bsp enable 輸入 images logs 項目代碼和數據庫部署在不同的Windows Server 2008 R2 Server中,錯誤日誌顯示如下: "未啟用當前數據庫的 SQL Server Service Broker,因

尋找一個數組出現的最小正整數(組元素可重復)

個數 pre doesn inf tput swe return 分享圖片 針對 題目描述 Description Given nn non-negative integers, please find the least non-negative integer that

Linux命令之find命令的-mtime參

linux find mtime 有關find -mtime這個參數的使用有比較多的坑,今天把這個問題在這裏記錄下來: mtime參數的理解應該如下: -mtime n 按照文件的更改時間來找文件,n為整數。 n 表示文件更改時間距離為n天 -n 表示文件更改時間距離在n天以內 +n 表

關於在zabbix監測腳本使用ps命令監控進程CPU使用率和內存使用率,獲得數據為0的情況描述

zabbix shell linux 前提:想自己編寫zabbix監測腳本,然後通過配置模板的方式,實現對資源(cpu和內存)使用率高的進程進行監控。 過程描述:zabbix版本為2.21,被監控主機操作系統為CentOS 6.4。腳本中主要命令如下:percent=0; #通過腳本輸入參數pro

Javaeclipse與命令行向main函傳遞參

src 輸入 入口 for str 分割 ati void 之間   我們知道main函數是java程序的入口,main函數的參數類型是String[]。 1.Eclipse中向main方法傳遞參數 例如: public class Mytest {

據庫SQL部分命令的區別

系統回滾段 安全 插入數據 約束 where條件 釋放 自帶 rom mysql 一、SQL關於刪除的三個語句:DROP、TRUNCATE、 DELETE 的區別 DROP: DROP test;刪除表test,並釋放空間,將test刪除的一幹二凈。 TRUNCATE: T

從壹開始微服務 [ DDD ] 之十 ║領域驅動【實戰篇·】:命令匯流排Bus分發(一)

烽火 哈嘍大家好,老張又見面了,這兩天被各個平臺的“雞湯貼”差點亂了心神,部落格園如此,簡書亦如此,還好群裡小夥伴及時提醒,路還很長,這些小事兒就隨風而去吧,這周本不打算更了,但是被群裡小夥伴“催稿”了,至少也是對我的一個肯定吧,又開始熬夜中,請@初久小夥伴留言,我不知道你的地址,就不放連結了。 收住,言

pyspider安裝的問題,pyspider: 找到命令如何解決呀

Collecting pyspiderCollecting click>=3.3 (from pyspider)  Using cached click-6.7-py2.py3-none-any.whlCollecting wsgidav (from pyspider)  Using cached Ws

Docker指定掛載點容器間volume卷的據共享

data med 實驗 ive 容器間數據共享 同時 wan 創建文件 lai 一 背景 在實際使用過程中,我們可能會經常遇到容器間數據共享的情況,怎麽處理呢?通過 docker 命令中的一些選項,我們即可完成容器間的數據共享。 二 實驗步驟 2.1 創建容器 容器一:gy

linuxwget找到命令

在裝資料庫的時候發現無法使用wget命令,提示未找到命令,如圖所示那是因為沒有安裝wget,輸入命令:yum -y install wget 如下圖所示,wget及其依賴將會被安裝安裝完成後就可以使用wget命令啦

Python3.7爬蟲 大量爬取某小說網站小說並寫入mysql(持續完善...) 解決問題:mysql長時間新增超過百萬條據表鎖甚至崩潰

oot req val page src sele 爬蟲 use uwa 練手之作 代碼中還有很多問題 持續完善中 渣渣阿裏T5 99包郵服務器只開了6個進程 #encoding:utf-8 import requests # 請求 from lxml import

SMProxy 1.2.9 釋出 ! 新增狀態命令監控面板功能

Swoole MySQL Proxy 一個基於 MySQL 協議,Swoole 開發的MySQL資料庫連線池。 原理 將資料庫連線

[Linux] Linux 的基本命令與目錄結構(初稿)

展開 src 文件名 auto 使用 bin target editor 提示符 Linux 中的基本命令與目錄結構 目錄 一、Linux 基本目錄結構 二、基本命令 三、瀏覽目錄 四、中間命令 五、更改密碼 六、環境變量和 shell 變量 七、命令路

[Linux] Linux 的基本命令與目錄結構(待移除)

head 命令 存在 壓縮 下載 創建文件 name 批處理 targe 簡化 Linux 中的基本命令與目錄結構 目錄 一、Linux 基本目錄結構 二、基本命令 三、瀏覽目錄 四、中間命令 五、更改密碼 六、環境變量和 shell 變量 七、命令路徑