Sql Server Take Offline Database Bi Treo

Đôi khi, bạn cần phải Take offline một Database vì một vài lý do (Backup, restore, bảo trì server hoặc bất cứ điều gì). Điều này khá đơn giản, cách thường làm là: mở SQL Server Management Studio, expand danh sách Databases, chọn Database cần Take offline, Click phải lên Database đó và chọn “Tasks / Take Offline” từ context menu.

Sẽ không có gì đánh nói nếu mọi chuyện xảy ra bình thường (database take offline và cửa sổ Take database offline đóng lại). Tuy nhiên, không phải lúc nào mọi chuyện cũng xảy ra như những gì ta muốn, đôi khi bạn sẽ thấy cửa sổ Take database offline treo mãi và không chịu đóng. Lý do là cơ sở dữ liệu của bạn vẫn còn đang được truy cập bởi một số người dùng hoặc ứng dụng từ client đến.

Để kiểm tra các kết nối đang hoạt động, mở New Query và chạy đoạn T-SQL sau:

SELECT db_name(dbid) as DB,
count(dbid) as Connections,
loginame as Login
FROM sys.sysprocesses
WHERE dbid = DB_ID('')
GROUP BY dbid, loginame
ORDER BY DB

Bạn sẽ nhìn thấy danh sách và số lượng user đang kết nối đến CSDL. Việc tiếp theo là bạn sẽ cần phải “kill” các kết nối này để làm tiếp việc của bạn.

-- Kill processes đang sử dụng
use master
DECLARE @SQL AS VARCHAR(20), @spid AS INT
SELECT @spid = MIN(spid) FROM master..sysprocesses WHERE dbid = db_id('TenDatabase') AND spid != @@spid

while (@spid IS NOT NULL)
BEGIN
    print 'Killing process ' + CAST(@spid AS VARCHAR) + ' ...'
    SET @SQL = 'kill ' + CAST(@spid AS VARCHAR)
    EXEC (@SQL)

    SELECT @spid = MIN(spid) FROM master..sysprocesses WHERE dbid = db_id('TenDatabase') AND spid != @@spid
END
GO