SQL सर्वर पर चल रहे प्रश्नों को सूचीबद्ध करें


200

क्या उन प्रश्नों को सूचीबद्ध करने का एक तरीका है जो वर्तमान में एमएस SQL ​​सर्वर (या तो एंटरप्राइज़ मैनेजर या SQL के माध्यम से) और / या कौन जुड़ा है?

मुझे लगता है कि मुझे एक बहुत लंबे समय तक चलने वाली क्वेरी मिली है, जो मेरे एक डेटाबेस सर्वर पर चल रही है और मैं इसे ट्रैक करना चाहूंगा और इसे बंद कर दूंगा (या जो व्यक्ति इसे शुरू करता है)।

जवाबों:


203

यह आपको SQL 2000 या SQL 2005 सर्वर पर सबसे लंबे समय तक चलने वाले SPID दिखाएगा:

select
    P.spid
,   right(convert(varchar, 
            dateadd(ms, datediff(ms, P.last_batch, getdate()), '1900-01-01'), 
            121), 12) as 'batch_duration'
,   P.program_name
,   P.hostname
,   P.loginame
from master.dbo.sysprocesses P
where P.spid > 50
and      P.status not in ('background', 'sleeping')
and      P.cmd not in ('AWAITING COMMAND'
                    ,'MIRROR HANDLER'
                    ,'LAZY WRITER'
                    ,'CHECKPOINT SLEEP'
                    ,'RA MANAGER')
order by batch_duration desc

यदि आपको परिणाम से दिए गए स्पिड के लिए SQL को देखने की आवश्यकता है, तो कुछ इस तरह का उपयोग करें:

declare
    @spid int
,   @stmt_start int
,   @stmt_end int
,   @sql_handle binary(20)

set @spid = XXX -- Fill this in

select  top 1
    @sql_handle = sql_handle
,   @stmt_start = case stmt_start when 0 then 0 else stmt_start / 2 end
,   @stmt_end = case stmt_end when -1 then -1 else stmt_end / 2 end
from    sys.sysprocesses
where   spid = @spid
order by ecid

SELECT
    SUBSTRING(  text,
            COALESCE(NULLIF(@stmt_start, 0), 1),
            CASE @stmt_end
                WHEN -1
                    THEN DATALENGTH(text)
                ELSE
                    (@stmt_end - @stmt_start)
                END
        )
FROM ::fn_get_sql(@sql_handle)

3
आप इसे मास्टर, जैसे संदर्भों को हटाकर SQL v12 + (यानी। Azure) के साथ काम करने के लिए संशोधित कर सकते हैं। 'Master.dbo.sysprocesses' को 'dbo.sysprocesses' से बदलें
केविन

मैं सुझाव दूंगा कि msमात्रा का प्रतिस्थापन किसके साथ होगा s। एक संभावित अतिप्रवाह हो सकता है (मेरे लिए हुआ)।
ज्वेरेव

Azure के लिए आपको "sys.sysprocesses" के साथ "master.dbo.sysprocesses" बदलने की आवश्यकता हो सकती है
Danton Heuer

93

यदि आप SQL Server 2005 या 2008 चला रहे हैं, तो आप इसे खोजने के लिए DMV का उपयोग कर सकते हैं ...

SELECT  *
FROM    sys.dm_exec_requests  
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)  

1
यदि वर्तमान डेटाबेस संगतता स्तर 90 से कम है, तो यह क्वेरी SQL Server 2005 के अंतर्गत काम नहीं कर रही है। यदि आपकी वर्तमान डेटाबेस संगतता कम है, तो इस क्वेरी को चलाने के लिए मास्टर db पर स्विच करें।
अलेक्जेंडर प्रवीण

31

आप सभी मौजूदा उपयोगकर्ताओं, सत्रों और प्रक्रियाओं की सूची प्राप्त करने के लिए sp_who कमांड चला सकते हैं । फिर आप किसी भी स्पाइड पर KILL कमांड चला सकते हैं जो दूसरों को ब्लॉक कर रही है।


3
यह हमेशा मददगार नहीं होता है। कभी-कभी प्रश्न बच्चे के स्पिड को फैलाने के लिए प्रतीत होते हैं, खासकर तब जब OPENQUERY या लिंक किए गए सर्वर का उपयोग किया जा रहा हो। यह बताना मुश्किल हो सकता है कि sp_who से मूल प्रश्न क्या है।
नाथन

17

मैं सुझाव देना चाहूंगा कि sysविचारों पर विचार करें। के समान कुछ

SELECT * 
FROM 
   sys.dm_exec_sessions s
   LEFT  JOIN sys.dm_exec_connections c
        ON  s.session_id = c.session_id
   LEFT JOIN sys.dm_db_task_space_usage tsu
        ON  tsu.session_id = s.session_id
   LEFT JOIN sys.dm_os_tasks t
        ON  t.session_id = tsu.session_id
        AND t.request_id = tsu.request_id
   LEFT JOIN sys.dm_exec_requests r
        ON  r.session_id = tsu.session_id
        AND r.request_id = tsu.request_id
   OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) TSQL

इस तरह से आप प्राप्त कर सकते हैं TotalPagesAllocatedजो आपको यह पता लगाने में मदद कर सकता है spidकि सभी सर्वर संसाधनों को ले रहा है। कई बार ऐसा होता है जब मैं गतिविधि की निगरानी भी नहीं कर सकता और इन sysविचारों का उपयोग करके देख सकता हूं कि क्या हो रहा है।

मैं आपको निम्नलिखित लेख पढ़ने की सलाह दूंगा। मुझे यह संदर्भ यहाँ से मिला


1
हम क्वेस्ट डीबी प्रदर्शन विश्लेषण का भी उपयोग करते हैं जो सर्वर में चल रहे व्हाट्स का बहुत अच्छा दृश्य चित्र देता है। इसके बारे में बुरी चीजों में से एक यह है कि यह बताता है कि कौन पीड़ित है लेकिन यह पता लगाना मुश्किल है कि संसाधनों का उपभोग कौन कर रहा है। हालांकि यह मदद करेगा।
धी

16

उत्पाद में निर्मित विभिन्न प्रबंधन विचार हैं। SQL 2000 पर आप sysprocesses का उपयोग करेंगे । SQL 2K5 पर sysinos_exec_connections , sysinos_exec_session और sysinos_exec_requests जैसे दृश्य अधिक हैं ।

Sp_who जैसी प्रक्रियाएं भी हैं जो इन विचारों का लाभ उठाती हैं। 2K5 प्रबंधन स्टूडियो में आपको एक्टिविटी मॉनिटर भी मिलता है।

और अंतिम लेकिन कम से कम नहीं आदम मैकानिक द्वारा हू इज एक्टिव जैसी सामुदायिक योगदान वाली स्क्रिप्ट हैं ।


11

दरअसल, EXEC sp_who2क्वेरी एनालाइजर / मैनेजमेंट स्टूडियो में चलने से ज्यादा जानकारी मिलती है sp_who

इससे परे कि आप SQL Profiler को सर्वर के अंदर और बाहर सभी ट्रैफ़िक देखने के लिए सेट कर सकते हैं। प्रोफाइलर भी आपको वही दिखाते हैं जो आप देख रहे हैं।

SQL सर्वर 2008 के लिए:

START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler

ध्यान रखें कि प्रोफाइलर वास्तव में एक लॉगिंग और देखने वाला ऐप है। जब तक यह चल रहा है तब तक यह लॉग और वॉच करता रहेगा। यह पाठ फ़ाइलों या डेटाबेस या हार्ड ड्राइव को भर सकता है, इसलिए सावधान रहें कि आपके पास यह क्या है और कितने समय तक है।


1
SQL Server Profiler वह जगह है जहाँ सभी को शुरू करना चाहिए, निश्चित रूप से!
शेन

11
SELECT
    p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, r.command,
    p.program_name, text 
FROM
    sys.dm_exec_requests AS r,
    master.dbo.sysprocesses AS p 
    CROSS APPLY sys.dm_exec_sql_text(p.sql_handle)
WHERE
    p.status NOT IN ('sleeping', 'background') 
AND r.session_id = p.spid

11

नोट के रूप में, SQL Server 2008 के लिए SQL सर्वर गतिविधि मॉनिटर आपके वर्तमान सर्वर पर राइट क्लिक करके और संदर्भ मेनू में "गतिविधि मॉनिटर" पर जाकर मिल सकता है। मैंने पाया कि यदि आप SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर रहे हैं तो प्रक्रियाओं को मारने का यह सबसे आसान तरीका है।


यह एक टिप्पणी होनी चाहिए थी, लेकिन, हाँ, यह बहुत उपयोगी है और इसे उत्तर के रूप में अधिक दृश्यता मिलती है :-) और इससे मुझे अभी मदद मिली। धन्यवाद
Loudenvier

9

ऑब्जेक्ट एक्सप्लोरर में, ड्रिल-डाउन टू: सर्वर -> प्रबंधन -> गतिविधि मॉनिटर। यह आपको वर्तमान सर्वर पर सभी कनेक्शन देखने की अनुमति देगा।


1
मुझे SQL 2008 पर प्रबंधन के तहत एक्टिविटी मॉनिटर नामक कुछ भी दिखाई नहीं देता है।
जेपीरसन

5

यहाँ एक क्वेरी है जो किसी भी क्वेरी को ब्लॉक कर रही है। मुझे पूरी तरह से यकीन नहीं है कि यह सिर्फ धीमी क्वेरी दिखाएगा:

SELECT p.spid
,convert(char(12), d.name) db_name
, program_name
, convert(char(12), l.name) login_name
, convert(char(12), hostname) hostname
, cmd
, p.status
, p.blocked
, login_time
, last_batch
, p.spid
FROM      master..sysprocesses p
JOIN      master..sysdatabases d ON p.dbid =  d.dbid
JOIN      master..syslogins l ON p.sid = l.sid
WHERE     p.blocked = 0
AND       EXISTS (  SELECT 1
          FROM      master..sysprocesses p2
          WHERE     p2.blocked = p.spid )

5

सही स्क्रिप्ट इस तरह होगी:

select 
p.spid, p.status,p.hostname,p.loginame,p.cpu,r.start_time, t.text
    from sys.dm_exec_requests as r, sys.sysprocesses p 
    cross apply sys.dm_exec_sql_text(p.sql_handle) t
    where p.status not in ('sleeping', 'background')
    and r.session_id=p.spid

5

अंतिम अनुरोध चलाने के लिए आप नीचे क्वेरी का उपयोग कर सकते हैं:

SELECT
    der.session_id
    ,est.TEXT AS QueryText
    ,der.status
    ,der.blocking_session_id
    ,der.cpu_time
    ,der.total_elapsed_time
FROM sys.dm_exec_requests AS der
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS est

नीचे स्क्रिप्ट का उपयोग करके आप प्रति डेटाबेस कनेक्शन की संख्या भी पा सकते हैं:

SELECT 
    DB_NAME(DBID) AS DataBaseName
    ,COUNT(DBID) AS NumberOfConnections
    ,LogiName 
FROM sys.sysprocesses
WHERE DBID > 0
GROUP BY DBID, LogiName

अधिक जानकारी के लिए कृपया देखें: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/


4

2005 में आप एक डेटाबेस पर राइट क्लिक कर सकते हैं, रिपोर्ट पर जा सकते हैं और संक्रमण और ताले आदि पर रिपोर्ट की पूरी सूची है ...


4

इसके साथ प्रयास करें:

यह आपको सभी उपयोगकर्ता प्रश्न प्रदान करेगा। 50 तक स्पिड, यह सभी sql सर्वर आंतरिक प्रक्रिया सत्र हैं। लेकिन, यदि आप चाहें तो आप क्लॉज को हटा सकते हैं:

select
r.session_id,
r.start_time,
s.login_name,
c.client_net_address,
s.host_name,
s.program_name,
st.text
from sys.dm_exec_requests r
inner join sys.dm_exec_sessions s
on r.session_id = s.session_id
left join sys.dm_exec_connections c
on r.session_id = c.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) st where r.session_id  > 50

2
SELECT 
    p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, t.text
FROM
    sys.dm_exec_requests as r,
    master.dbo.sysprocesses as p
    CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) t
WHERE
    p.status NOT IN ('sleeping', 'background')
AND r.session_id = p.spid

तथा

KILL @spid

2
क्या यह ठीक रहेगा .. !! और अगर मैं थूक से मारता हूं। क्या यह केवल एक प्रश्न को मार देगा? मेरा संदेह स्पिड है और session_is प्रत्येक क्वेरी के लिए अद्वितीय है जो उस सत्र या सर्वर में चल रही है?
बटोव्स्की

1

क्वेरी निष्पादित करने की निगरानी करने के लिए Sql Server Profiler (टूल मेनू) का उपयोग करें और प्रबंधन स्टूडियो में गतिविधि मॉनिटर का उपयोग करके देखें कि कैसे जुड़ा हुआ है और यदि उनका कनेक्शन अन्य कनेक्शनों को अवरुद्ध कर रहा है।


1

आपको बहुत उपयोगी प्रक्रिया की कोशिश करनी चाहिए sp_whoIsActiveजो यहां पाई जा सकती है: http://whoisactive.com और यह मुफ़्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.