Dò data và Fix data SQL Suspect

Lệnh dò tìm các Data bị Suspect

SELECT sys.databases.name, msdb..suspect_pages.event_type, msdb..suspect_pages.database_id,msdb..suspect_pages.file_id,msdb..suspect_pages.page_id
FROM msdb..suspect_pages  
INNER JOIN sys.databases  ON msdb.dbo.suspect_pages.database_id = sys.databases.database_id
ORDER BY sys.databases.database_id

--DELETE FROM msdb..suspect_pages  
--   WHERE (event_type = 4 OR event_type = 5 OR event_type = 7);  
--GO  

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

ALTER DATABASE [DBName] SET EMERGENCY;
GO
ALTER DATABASE [DBName] set single_user
GO
DBCC CHECKDB ([DBName], REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS;
GO
ALTER DATABASE [DBName] set multi_user
GO
Tham khảo tại
https://www.stellarinfo.com/blog/fix-sql-database-recovery-pending-state-issue/

Dò tìm page_id thuộc bảng nào

DBCC TRACEON (3604);
DBCC PAGE (50, 1, 739301, 0);
DBCC TRACEOFF (3604);
GO


SELECT OBJECT_NAME (0);
GO

Trong đó 50 là database_id, 1 là file_id, 739301 là page_id

Tham khảo tại link: https://www.sqlskills.com/blogs/paul/finding-table-name-page-id/

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');GOSQL 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];GOCREATE DATABASE [DemoSuspect];GOUSE [DemoSuspect];GOCREATE TABLE [Employees] ([FirstName]   VARCHAR (20),[LastName]    VARCHAR (20),[YearlyBonus] INT);GOINSERT 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 transactionBEGIN TRAN;UPDATE[Employees]SET[YearlyBonus] = 0WHERE[LastName] = 'Tripp';GO -- Force the update to diskCHECKPOINT;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-

Last updated

Was this helpful?