Làm thế nào để xử lý lỗi suspect database trên MS SQL – Gia Duy Nguyễn

Vào một ngày không được đẹp trời cho lắm, dữ liệu của bạn bị gắn cho cái thẻ suspect và bạn không thể nào kết nối được với dữ liệu đó. Cho dù sử dụng phần mềm hay sử dụng trực tiếp SQL để kết nối cũng không thể kết nối được.

Một số nguyên nhân

  • Cơ sở dữ liệu có thể đã bị hỏng
  • Dung lượng ổ cứng không đủ trống để SQL Server khôi phục cơ sở dữ liệu sau khi khởi động.
  • Không thể mở được cơ sở dữ liệu do các file không cho phép hệ thống truy cập vào hoặc bộ nhớ và dung lượng trống trên ổ đĩa không đủ.
  • Các file database đang được lưu giữ và sử dụng bởi hệ điều hành hoặc một phần mềm thứ ba nào đó đang tương tác…
  • Các lỗi phát sinh không mong muốn khi tắt SQL Server hoặc mất nguồn hoặc lỗi phần cứng.

Giải pháp xử lý sự cố

A. Với dữ liệu đã được kết nối sẵn với SQL

  • Bạn mở Microsoft SQL Server Management Studio và login vào SQL
  • Click “New Query”
  • Copy và dán đoạn script SQL bên dưới vào SQLQuery…sql.

Lưu ý: Bạn phải thay “DatabaseName” thành tên database bị gán cờ suspect bạn cần sửa.

-- sp_resetstatus tắt cờ “suspect”trên cơ sở dữ liệu
EXEC sp_resetstatus [DatabaseName]

--Đánh dấu cơ sở dữ liệu là READ_ONLY, 
--Tắt ghi Log và chỉ giới hạn quyền truy cập cho quyền xử lý hệ thống sysadmin
ALTER DATABASE [DatabaseName] SET EMERGENCY

--Kiểm tra tính logic và vật lý của tất cả các đối tượng trong cơ sở dữ liệu cần xử lý
DBCC checkdb([DatabaseName])

--Câu truy vấn này sẽ xử lý và khôi phục các giao dịch đang hoạt động trên database.
--Đưa CSDL SQL ở chế độ một người sử dụng.
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ([DatabaseName], REPAIR_ALLOW_DATA_LOSS)

--Thiết lập lại CSDL cho về trạng thái ban đầu, cho phép login lại bình thường.
ALTER DATABASE [DatabaseName] SET MULTI_USER

B. Re-attach lại suspect database

Trường hợp này xảy ra khi bạn đã lỡ detach… database bị suspect ra khỏi SQL Server. Khi đó bạn sẽ không thể attach vào lại như cách bình thường được.

Giả sử database bị suspect có tên là db_test, bạn có thể xử lý như sau:

  • Copy dữ liệu đã bị suspect vào một folder khác
  • Tạo mới 1 database, đặt trùng tên với database đang bị suspect

CREATE DATABASE [db_test];
GO

  • Chuyển database vừa tạo ra sang trạng thái offline

ALTER DATABASE [db_test] SET OFFLINE;
GO

  • Copy database đang bị suspect dán đè lên database mới tạo.
  • Đưa database bị suspect trở lại online

ALTER DATABASE [DemoSuspect] SET ONLINE;
GO

SELECT DATABASEPROPERTYEX (N’ db_test ‘, N’STATUS’);
GO

SQL báo lỗi, kệ nó. Bạn đã attach thành công.

Sau đó bạn xử lý lỗi suspect như mục A.

Làm thế nào để xử lý lỗi suspect database trên MS SQL