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('<tendb>')
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
alter database <tendb> set restricted_user with rollback immediate

Câu lệnh trên sẽ kết thúc các kết nối, rollbak các transaction của các user đó và chỉ cho phép user có đặc quyền truy cập tới database. Sau khi hoàn thành mọi việc, bạn trả về trạng thái đa người dùng cho Database bằng lệnh sau:

alter database <tendb> set multi_user

Một các khác đơn giản hơn để take offline database trong trường hợp này là chạy lệnh sau:

alter database <tendb> set offline with rollback immediate

Câu lệnh này sẽ đóng các kết nối, rollback các transaction và thực hiện việc take offline database.

Chúc các bạn thàng công!