theo dõi

Gần nhất :

Thống kê câu hỏi

Chuyên mục : Lập trình
Topic : Sql Server
Hỏi lúc:
Lượt xem: 19,948

Làm thế nào để khắc phục sự cố Suspect Database?

Tạ Vĩnh Tâm Tạ Vĩnh Tâm
 02  01  00
02 bình chọn hữu ích bởi Dương Hoàng Sương Trịnh Hải Quân
19,948 xem 06 theo dõi 02 hữu ích hỏi –

Bạn biết ai đó có thể trả lời câu hỏi này?. Bạn có thể giúp đỡ bằng cách tìm những người giỏi nhất:

user user user user user

Đặng Trúc Vy Đặng Trúc Vy
 03  00  01
03 bình chọn hữu ích bởi Bùi Minh Châu, Hoàng Đức Bảo Bùi Trầm Hương

Cách khắc phục Database bị suspect

Nguyên nhân:

  • Cơ sở dữ liệu có thể đã bị lỗi.
  • Dung lượng ổ cứng không có sẵn cho SQL Server để phục hồi cơ sở dữ liệu trong quá trình khởi động.
  • Cơ sở dữ liệu không thể mở được do các tập tin không thể truy cập hoặc không đủ bộ nhớ hoặc dung lượng ổ cứng
  • Bạn shutdown SQL Server bất ngờ, mất điện hoặc do lỗi phần cứng.

Cách khắc phục:

  • Mở Microsoft SQL Server Management Studio và kết nối cơ sở dữ liệu
  • Click "New Query button"
  • Dán đoạn script này vào, thay "Tên Database" bằng tên database cần sửa
EXEC sp_resetstatus [Tên Database];
ALTER DATABASE [Tên Database] SET EMERGENCY
DBCC checkdb([Tên Database])
ALTER DATABASE [Tên Database] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ([Tên Database], REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE [Tên Database] SET MULTI_USER

Click Execute sau đó bạn có thể truy cập lại database. Điều đầu tiên bạn cần phải làm liền là sao lưu lại database.

19,666 xem 03 hữu ích trả lời –
Dương Tố Uyên Dương Tố Uyên
 02  00  01
02 bình chọn hữu ích bởi Lê Quốc Hòa Huỳnh Lục Bình

Dùng câu lệnh sau để set ONLINE cho database bị SUSPECT

ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE  
GO  
DBCC CHECKDB ([DatabaseName], REPAIR_ALLOW_DATA_LOSS)  
GO  
ALTER DATABASE [DatabaseName] SET MULTI_USER WITH ROLLBACK IMMEDIATE  
GO  
ALTER DATABASE [DatabaseName] SET ONLINE
GO 
19,679 xem 02 hữu ích trả lời –
Lý Khánh Vân Lý Khánh Vân
 02  00  02

1. Sửa lỗi Suspect Database: Gặp lỗi này bạn chỉ cần chạy đoạn script sau:

(DatabaseName là tên database bị suspect của bạn)

-- sp_resetstatus turns off the "suspect" flag on a database
EXEC sp_resetstatus [DatabaseName]

-- Marking database READ_ONLY, disable logging,
-- and limiting access only to members of the sysadmin fixed server role
ALTER DATABASE [DatabaseName] SET EMERGENCY

-- Checks the logical and physical integrity of all the objects in the specified database
DBCC checkdb([DatabaseName])

-- This query will rollback any transaction which is running on that database
-- and bring SQL Server database in a "single user" mode
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ([DatabaseName], REPAIR_ALLOW_DATA_LOSS)

-- Set database accessibility to it's original state, allowing all logins
ALTER DATABASE [DatabaseName] SET MULTI_USER

2. Re-Attach lại suspect database: Trong trường hợp bạn đã chót Detach database bị suspect thì bạn không thể attach lại theo cách bình thường. Chỉ còn cách là bạn phải hack. Giả sử database bị suspect có tên là DemoSuspect

B1: Copy lại database bị suspect của bạn ra 1 folder khác

B2: Tạo mới 1 database trùng tên với database bị suspect

CREATE DATABASE [DemoSuspect];
GO

B3: Chuyển database vừa tạo sang offline

-- Check the files are there...
ALTER DATABASE [DemoSuspect] SET OFFLINE;
GO

B4: Copy database bị suspect của bạn đè lên database mới tạo

B5: Đưa database bị suspect trở lại online

ALTER DATABASE [DemoSuspect] SET ONLINE;
GO

SELECT DATABASEPROPERTYEX (N'DemoSuspect', N'STATUS');
GO
SQL server sẽ báo lỗi. Tuy nhiên như vậy là đã thành công

B6: Sửa lỗi database bị suspect (như ở mục 1)

3. Detach suspect database: Để detach suspect database bạn thực hiện 3 bước

B1: Chuyển database sang offline

ALTER DATABASE [DemoSuspect] SET OFFLINE;
GO

B2: Copy lại file database (file .mdf, .ldf)

B3: Xóa database này đi

DROP DATABASE [DemoSuspect];
GO

4. Tạo suspect database

B1: Khởi tạo database và dữ liệu demo

USE [master];
GO
CREATE DATABASE [DemoSuspect];
GO
USE [DemoSuspect];
GO
CREATE TABLE [Employees] (
[FirstName]   VARCHAR (20),
[LastName]    VARCHAR (20),
[YearlyBonus] INT);
GO
INSERT INTO [Employees] VALUES ('Paul', 'Randal', 10000);
INSERT INTO [Employees] VALUES ('Kimberly', 'Tripp', 10000);
GO

 B2: Thực hiện update không chuẩn

-- Simulate an in-flight transaction
BEGIN TRAN;
UPDATE
[Employees]
SET
[YearlyBonus] = 0
WHERE
[LastName] = 'Tripp';
GO

-- Force the update to disk
CHECKPOINT;
GO

B3: Ở một cửa sổ khác, giả lập lỗi

SHUTDOWN WITH NOWAIT;
GO

B4: khởi động lại SQL server

B5: Xem trạng thái databse

SELECT DATABASEPROPERTYEX (N'DemoSuspect', N'STATUS') AS N'Status';
GO

-Tham khảo từ blog Sqlskills-

19,656 xem 00 hữu ích trả lời –