Bagaimana cara melihat koneksi SQL Server aktif?

298

Saya menggunakan SQL Server 2008 Enterprise. Saya ingin melihat koneksi SQL Server aktif, dan informasi terkait semua koneksi, seperti dari alamat IP mana, terhubung ke basis data atau sesuatu.

Apakah ada perintah yang ada untuk mengatasi masalah ini?

George2
sumber
sys.dm_exec_sessions, sesi id untuk memeriksa> 50
Shiwangini

Jawaban:

354

Anda dapat menggunakan sp_whoprosedur tersimpan.

Memberikan informasi tentang pengguna, sesi, dan proses saat ini dalam mesin Microsoft SQL Server Database. Informasi dapat disaring untuk mengembalikan hanya proses-proses yang tidak menganggur, milik pengguna tertentu, atau milik sesi tertentu.

Mehrdad Afshari
sumber
9
ketika Anda harus memfilter untuk memilih db tertentu dari sys.sysprocesses lebih baik
Iman
bagaimana cara menambahkan filter hanya untuk basis data tertentu? WHERE dbname = 'nama database' ?? Saya mencoba ini dan saya mendapat kesalahan
NULL.Dude
1
@ Geo.Dude, Iman Abidi berarti menyusun kueri pemilihan Anda sendiri dari sys.sysprocesses dan menambahkan klausa where ke kueri itu. Anda harus memfilter pada dbid. Anda dapat menemukan id database di sys.databases (atau Anda dapat bergabung dengan keduanya).
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
;

Lihat juga dokumentasi Microsoft untuk proses sys.sys .

Syed Umar Ahmed
sumber
5
Saat mengotomatisasi sesuatu, kueri ini mungkin lebih berguna daripada sp_who yang lebih berorientasi pada tampilan.
Colin
Ini adalah metode yang saya sukai, tetapi tidak sepenuhnya menjawab pertanyaan OP. Sarankan menambahkan hostnameke SELECTdan GROUP BYklausa untuk melihat apa yang terhubung klien. Juga saya baru menyadari kesalahan ketik Msft untuk loginame- apakah itu artefak sejak nama kolom dibatasi hingga 8 karakter? lol
nothingisnecessary
13
sys.sysprocesses tidak digunakan lagi dalam versi terbaru dari SQL Server. Ini peta ke tiga pandangan manajemen ini : sys.dm_exec_connections, sys.dm_exec_sessions, dan sys.dm_exec_requests.
Mike Sherrill 'Cat Recall'
Saya sukaORDER BY 1, 2 DESC, 3
slartidan
56

Selain itu sp_who, Anda juga dapat menggunakan sp_who2prosedur tersimpan sistem "tidak berdokumen" yang memberi Anda informasi lebih rinci. Lihat Perbedaan antara sp_who dan sp_who2 .

Sklivvz
sumber
16
siapa yang terhubung ke dbo.First?
Carl G
44

Klik ikon "monitor aktivitas" di bilah alat ...

Dari komentar Thorsten:

Di SQL Server Management Studio, klik kanan pada Server, pilih "Monitor Aktivitas" dari menu konteks -atau- gunakan pintasan keyboard Ctrl+ Alt+ A.

Fernando Santos
sumber
12
Di SQL Server Management Studio, klik kanan pada Server, pilih "Monitor Aktivitas" dari menu konteks -atau- gunakan pintasan keyboard Ctrl + Alt + A
Thorsten Hüglin
Opsi yang bagus, tetapi membutuhkan lebih banyak hak istimewa daripada ekstraksi DB_NAME (dbid) dari sys.sysprocesses.
Der Zinger
25

Di bawah ini adalah skrip saya untuk menemukan semua sesi yang terhubung ke database dan Anda dapat memeriksa apakah sesi itu melakukan I / O dan ada opsi untuk mematikannya.

Script juga menunjukkan status setiap sesi.

Lihat di bawah.

--==============================================================================
-- 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

--==============================================================================
Marcello Miorelli
sumber
13

Saya melemparkan ini bersama-sama sehingga Anda bisa melakukan beberapa pertanyaan pada hasilnya

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
Don Rolling
sumber
proses sys.sys sudah ditinggalkan
Marcello Miorelli
5

Permintaan MS yang menjelaskan penggunaan KILLperintah ini cukup berguna memberikan informasi koneksi:

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;
Zalakain
sumber
4

Anda dapat melakukan perintah T-SQL berikut:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
sinkmanu
sumber