
Trong phần 1, tôi đã giới thiệu cách dùng DBCC CHECKDB để kiểm tra và sửa những lỗi tồn tại của một Database, trong phần 2 này là những kiến thức bổ sung thêm về câu lệnh này mà tôi tìm hiểu từ nhiều nguồn trên Internet.
- DBCC CHECKDB phát hiện và sửa các lỗi của Database. Nhưng không phải lỗi nào DBCC CHECKDB cũng có thể sửa được.
- Mỗi Database chứa một tập hợp các metadata table mô tả nơi các đối tượng Database được lưu trữ trên đĩa. Nếu các clustered index của những table trong hệ thống bị hư hỏng, SQL Server không thể biết các user table được lưu trữ ở đâu. Và việc sửa lỗi nằm ngoài khả năng của DBCC CHECKDB.
- Trong trường hợp như trên, giải pháp duy nhất là phục hồi lại Database từ bản Backup. Nếu Database có một bản Full Backup được thực hiện gần đây và các bản Transaction Log Backup đến thời điểm Database phát hiện sự cố, DBA có thể phục hồi Database trở lại trạng thái tốt nhất, và lượng dữ liệu bị mất là ít nhất.
- Nếu Transaction Log Backup không được thực hiện, nếu Database không ở chế độ Full Recovery, hay sự hư hỏng tổn tại trong cả các file Backup, thì chỉ còn giải pháp là export dữ liệu sang một Database khác.
- Việc export sang một Database khác bao gồm dữ liệu và các đối tượng trong Database hiện tại. Trong suốt quá trình export, SQL Server sẽ gặp các lỗi đang tồn tại trong Database, nên ta cần thực hiện export từng đối tượng một.
- Khi chạy xong DBCC CHECKDB, bạn có thể thấy kết quả được trả về như sau:
- Nhìn kết quả trên, ta thấy có 1 trang dữ liệu bị lỗi, đó là trang có mã 1:94299. Ta có thể phục hồi lại Database với yêu cầu chỉ phục hồi lại trang mà ta chỉ định, ta làm như sau:
RESTORE DATABASE mydb PAGE = '1:94299'
FROM DISK = 'C:\mydatabase.bak'
WITH NORECOVERY
- Chú ý dòng màu đỏ trong kết quả trả về khi dùng DBCC CHECKDB, đó là các cấp độ sửa chữa mà DBCC CHECKDB gợi ý cho ta thực hiện tiếp theo, bao gồm:
- REPAIR_REBUILD: nếu đây là cấp độ yêu cầu, ta đã gặp may, sự cố có thể được khắc phục mà ta không mất dữ liệu.
Cú pháp: DBCC CHECKDB (‘DB Name’, REPAIR_REBUILD)
-
- REPAIR_ALLOW_DATA_LOSS: tùy chọn này cố gắng sửa các lỗi. Như tên gọi của nó, quá trình này có thể khiến bạn bị mất dữ liệu. Ta chỉ chọn cấp độ này khi ta không có file Backup và chấp nhận mất dữ liệu.
Cú pháp: DBCC CHECKDB (‘DB Name’, REPAIR_ALLOW_DATA_LOSS)
- Tóm lại: để bảo vệ Database, ta cần biết những điều sau:
- Thường xuyên chạy câu lệnh DBCC CHECKDB để phát hiện và sửa chữa kịp thời các lỗi của Database.
- Nếu DBCC CHECKDB phát hiện lỗi, cần khắc phục ngay, sau đó thực hiện Backup cho Database.
- Nếu DBCC CHECKDB phát hiện lỗi và không thể khắc phục, ta cần phục hồi lại Database từ các bản Backup trước đó.
- Ngoài việc dùng DBCC CHECKDB để phát hiện lỗi, cần thừơng xuyên kiểm tra các file khác như Windows EventLogs, SQL Errorlogs để phát hiện kịp thời các sự cố gây nguy hại đến Database.
Quang Vinh
mai.quangvinh@sqlvn.com
0 comments:
Post a Comment