Làm cách nào để xem kết nối SQL Server đang hoạt động?


298

Tôi đang sử dụng SQL Server 2008 Enterprise. Tôi muốn xem bất kỳ kết nối SQL Server hoạt động nào và thông tin liên quan của tất cả các kết nối, như từ địa chỉ IP nào, kết nối với cơ sở dữ liệu nào hoặc một cái gì đó.

Có các lệnh hiện có để giải quyết vấn đề này?



sys.dm_exec_simes, id phiên để kiểm tra> 50
Shiwangini

Câu trả lời:


354

Bạn có thể sử dụng các sp_whothủ tục được lưu trữ.

Cung cấp thông tin về người dùng, phiên và quy trình hiện tại trong một phiên bản của Công cụ cơ sở dữ liệu Microsoft SQL Server. Thông tin có thể được lọc để chỉ trả về những quy trình không ở chế độ chờ, thuộc về một người dùng cụ thể hoặc thuộc về một phiên cụ thể.


9
khi bạn phải lọc để chọn db cụ thể từ sys.sys Processes thì tốt hơn
Iman

Làm cách nào để thêm bộ lọc cho cơ sở dữ liệu cụ thể? WHERE dbname = 'tên cơ sở dữ liệu' ?? Tôi đã thử điều này và tôi đã gặp một lỗi
NULL.Dude

1
@ Geo.Dude, Iman Abidi có nghĩa là tạo ra truy vấn chọn của riêng bạn từ sys.sys Processes và thêm mệnh đề where vào truy vấn đó. Bạn sẽ phải lọc trên dbid. Bạn có thể tìm thấy id cơ sở dữ liệu trong sys.database (hoặc bạn có thể tham gia hai cơ sở dữ liệu đó).
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
;

Xem thêm tài liệu Microsoft cho sys.sys Processes .


5
Khi tự động hóa mọi thứ, truy vấn này có thể hữu ích hơn sp_who được định hướng nhiều hơn để hiển thị.
Colin

Đây là phương pháp ưa thích của tôi, nhưng nó không trả lời đầy đủ câu hỏi của OP. Đề nghị thêm hostnamevào SELECTGROUP BYcác mệnh đề để xem khách hàng nào được kết nối. Ngoài ra tôi mới nhận ra lỗi đánh máy Msft cho loginame- đó có phải là một tạo tác từ khi tên cột được giới hạn trong 8 ký tự không? lol
gì cần thiết

13
sys.sys Processes không được dùng trong các phiên bản SQL Server gần đây. Nó ánh xạ tới ba chế độ xem quản lý này : sys.dm_exec_connections, sys.dm_exec_simes và sys.dm_exec numquests.
Mike Sherrill 'Nhớ lại mèo'

Tôi thíchORDER BY 1, 2 DESC, 3
slartidan


44

Nhấp vào biểu tượng "màn hình hoạt động" trên thanh công cụ ...

Từ ý kiến ​​của Thorsten:

Trong SQL Server Management Studio, nhấp chuột phải vào Máy chủ, chọn "Trình giám sát hoạt động" từ menu ngữ cảnh - hoặc sử dụng phím tắt Ctrl+ Alt+ A.


12
Trong SQL Server Management Studio, nhấp chuột phải vào Máy chủ, chọn "Trình giám sát hoạt động" từ menu ngữ cảnh - hoặc sử dụng phím tắt Ctrl + Alt + A
Thorsten Hüglin

Tùy chọn tốt, nhưng nó đòi hỏi nhiều đặc quyền hơn so với trích xuất DB_NAME (dbid) từ sys.sys Processes.
Der Zinger

25

Dưới đây là tập lệnh của tôi để tìm tất cả các phiên được kết nối với cơ sở dữ liệu và bạn có thể kiểm tra xem các phiên đó có thực hiện bất kỳ I / O nào không và có tùy chọn để giết chúng.

Kịch bản cũng hiển thị trạng thái của mỗi phiên.

Có một cái nhìn dưới đây.

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

Tôi đã ném cái này với nhau để bạn có thể thực hiện một số truy vấn về kết quả

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.sys Processes không được dùng nữa
Marcello Miorelli

5

Truy vấn của MS giải thích việc sử dụng KILLlệnh khá hữu ích khi cung cấp thông tin của kết nối:

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;

4

Bạn có thể thực hiện lệnh T-SQL sau:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.