ฉันจะดูการเชื่อมต่อ SQL Server ที่ใช้งานอยู่ได้อย่างไร


298

ฉันใช้ SQL Server 2008 Enterprise ฉันต้องการดูการเชื่อมต่อ SQL Server ที่ใช้งานอยู่และข้อมูลที่เกี่ยวข้องของการเชื่อมต่อทั้งหมดเช่นจากที่อยู่ IP ใดเชื่อมต่อกับฐานข้อมูลใดหรืออะไร

มีคำสั่งที่มีอยู่เพื่อแก้ไขปัญหานี้หรือไม่?


ตรวจสอบ: stackoverflow.com/a/23397001/1747983
Tilo

sys.dm_exec_sessions, รหัสเซสชันเพื่อตรวจสอบ> 50
Shiwangini

คำตอบ:


354

คุณสามารถใช้sp_whoกระบวนงานที่เก็บไว้

จัดเตรียมข้อมูลเกี่ยวกับผู้ใช้เซสชันและกระบวนการปัจจุบันในอินสแตนซ์ของ Microsoft SQL Server Database Engine ข้อมูลสามารถถูกกรองเพื่อส่งกลับเฉพาะกระบวนการที่ไม่ได้ใช้งานซึ่งเป็นของผู้ใช้ที่ระบุหรือที่อยู่ในเซสชันที่ระบุ


9
เมื่อคุณต้องกรองสำหรับการเลือกฐานข้อมูลเฉพาะจาก sys.sys กระบวนการจะดีกว่า
Iman

ฉันจะเพิ่มตัวกรองสำหรับฐานข้อมูลเฉพาะได้อย่างไร WHERE dbname = 'ชื่อฐานข้อมูล' ?? ฉันลองสิ่งนี้และฉันพบข้อผิดพลาด
NULL.Dude

1
@ Geo.Dude, Iman Abidi หมายถึงการกำหนดคิวรีแบบเลือกของคุณเองจาก sys.sysprocesses และเพิ่มตำแหน่งให้กับคิวรีนั้น คุณจะต้องกรอง dbid คุณสามารถค้นหา id ของฐานข้อมูลใน sys.database (หรือคุณสามารถเข้าร่วมทั้งสองได้)
bvgheluwe

342
SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid, loginame
;

ดูเพิ่มเติมเอกสารของ Microsoft สำหรับsys.sysprocesses


5
เมื่อทำสิ่งต่าง ๆ อัตโนมัติแบบสอบถามนี้อาจมีประโยชน์มากกว่า sp_who ซึ่งมุ่งเน้นไปที่การแสดง
โคลิ

นี่เป็นวิธีที่ฉันชอบ แต่ก็ไม่ตอบคำถามของ OP อย่างเต็มที่ แนะนำให้เพิ่มhostnameไปSELECTและGROUP BYคำสั่งที่จะเห็นสิ่งที่ลูกค้ามีการเชื่อมต่อ นอกจากนี้ฉันเพิ่งรู้ว่าพิมพ์ผิด Msft สำหรับloginame- เป็นสิ่งประดิษฐ์จากเมื่อชื่อคอลัมน์ถูก จำกัด ไว้ที่ 8 ตัวอักษร? ฮ่า ๆ
nothingisnecessary

13
sys.sysprocesses ถูกเลิกใช้ใน SQL Server รุ่นที่ใหม่กว่า มันแม็พกับมุมมองการจัดการทั้งสามนี้: sys.dm_exec_connections, sys.dm_exec_sessions และ sys.dm_exec_requests
Mike Catrill 'Cat Recall'

ฉันชอบORDER BY 1, 2 DESC, 3
slartidan

56

นอกจากsp_whoนี้คุณยังสามารถใช้sp_who2ขั้นตอนการจัดเก็บระบบที่ไม่มีเอกสารซึ่งให้ข้อมูลรายละเอียดเพิ่มเติมแก่คุณ ดูความแตกต่างระหว่าง sp_who และ sp_who2


16
ใครเชื่อมต่อกับ dbo.First?
Carl G

44

คลิกที่ไอคอน "การตรวจสอบกิจกรรม" ในแถบเครื่องมือ ...

จากความคิดเห็นของ Thorsten:

ใน Studio จัดการ SQL Server, คลิกขวาบนเซิร์ฟเวอร์เลือก "ตรวจสอบกิจกรรม" จากเมนูบริบทหรือทางลัดการใช้งานแป้นพิมพ์Ctrl+ +AltA


12
ใน SQL Server Management Studio คลิกขวาที่เซิร์ฟเวอร์เลือก "การตรวจสอบกิจกรรม" จากเมนูบริบท - หรือ - ใช้แป้นพิมพ์ลัด Ctrl + Alt + A
Thorsten Hüglin

ตัวเลือกที่ดี แต่ต้องการสิทธิ์มากกว่าการแยก DB_NAME (dbid) จาก sys.sys กระบวนการ
Der Zinger

25

ด้านล่างเป็นสคริปต์ของฉันเพื่อค้นหาเซสชันทั้งหมดที่เชื่อมต่อกับฐานข้อมูลและคุณสามารถตรวจสอบว่าเซสชันเหล่านั้นกำลังทำ I / O ใด ๆ และมีตัวเลือกในการฆ่าพวกเขา

สคริปต์จะแสดงสถานะของแต่ละเซสชันด้วย

ดูด้านล่าง

--==============================================================================
-- See who is connected to the database.
-- Analyse what each spid is doing, reads and writes.
-- If safe you can copy and paste the killcommand - last column.
-- Marcelo Miorelli
-- 18-july-2017 - London (UK)
-- Tested on SQL Server 2016.
--==============================================================================
USE master
go
SELECT
     sdes.session_id
    ,sdes.login_time
    ,sdes.last_request_start_time
    ,sdes.last_request_end_time
    ,sdes.is_user_process
    ,sdes.host_name
    ,sdes.program_name
    ,sdes.login_name
    ,sdes.status

    ,sdec.num_reads
    ,sdec.num_writes
    ,sdec.last_read
    ,sdec.last_write
    ,sdes.reads
    ,sdes.logical_reads
    ,sdes.writes

    ,sdest.DatabaseName
    ,sdest.ObjName
    ,sdes.client_interface_name
    ,sdes.nt_domain
    ,sdes.nt_user_name
    ,sdec.client_net_address
    ,sdec.local_net_address
    ,sdest.Query
    ,KillCommand  = 'Kill '+ CAST(sdes.session_id  AS VARCHAR)
FROM sys.dm_exec_sessions AS sdes

INNER JOIN sys.dm_exec_connections AS sdec
        ON sdec.session_id = sdes.session_id

CROSS APPLY (

    SELECT DB_NAME(dbid) AS DatabaseName
        ,OBJECT_NAME(objectid) AS ObjName
        ,COALESCE((
            SELECT TEXT AS [processing-instruction(definition)]
            FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)
            FOR XML PATH('')
                ,TYPE
            ), '') AS Query

    FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)

) sdest
WHERE sdes.session_id <> @@SPID
  AND sdest.DatabaseName ='yourdatabasename'
--ORDER BY sdes.last_request_start_time DESC

--==============================================================================

13

ฉันโยนสิ่งนี้เข้าด้วยกันเพื่อที่คุณจะสามารถสืบค้นผลลัพธ์ได้

Declare @dbName varchar(150)
set @dbName = '[YOURDATABASENAME]'

--Total machine connections
--SELECT  COUNT(dbid) as TotalConnections FROM sys.sysprocesses WHERE dbid > 0

--Available connections
DECLARE @SPWHO1 TABLE (DBName VARCHAR(1000) NULL, NoOfAvailableConnections VARCHAR(1000) NULL, LoginName VARCHAR(1000) NULL)
INSERT INTO @SPWHO1 
    SELECT db_name(dbid), count(dbid), loginame FROM sys.sysprocesses WHERE dbid > 0 GROUP BY dbid, loginame
SELECT * FROM @SPWHO1 WHERE DBName = @dbName

--Running connections
DECLARE @SPWHO2 TABLE (SPID VARCHAR(1000), [Status] VARCHAR(1000) NULL, [Login] VARCHAR(1000) NULL, HostName VARCHAR(1000) NULL, BlkBy VARCHAR(1000) NULL, DBName VARCHAR(1000) NULL, Command VARCHAR(1000) NULL, CPUTime VARCHAR(1000) NULL, DiskIO VARCHAR(1000) NULL, LastBatch VARCHAR(1000) NULL, ProgramName VARCHAR(1000) NULL, SPID2 VARCHAR(1000) NULL, Request VARCHAR(1000) NULL)
INSERT INTO @SPWHO2 
    EXEC sp_who2 'Active'
SELECT * FROM @SPWHO2 WHERE DBName = @dbName

sys.sysprocesses เลิกใช้แล้ว
Marcello Miorelli

5

ข้อความค้นหาของ MS ที่อธิบายการใช้KILLคำสั่งนั้นค่อนข้างมีประโยชน์หากให้ข้อมูลการเชื่อมต่อ:

SELECT conn.session_id, host_name, program_name,
    nt_domain, login_name, connect_time, last_request_end_time 
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
   ON sess.session_id = conn.session_id;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.