DUCVINH83 Administrator
Không ngừng học hỏi !
Ngày gia nhập: 01/11/2005 Giới tính: Đến từ: Vietnam
Trạng thái: Bài viết: 365 Tiền: 738$ Địa chỉ e-mail: Yahoo! IM: Sinh nhật: 17/02/1983 Cảnh cáo: (0%)
|
Ngày gửi: 12/12/2012 lúc 10:31 sáng | Đã khóa IP
|
|
|
Bạn đã bao giờ nhỡ tay xóa mất một bảng (DROP TABLE) hoặc xóa sạch dữ
liệu trong bảng (DELETE) của một database đang hoạt động rất nhộn nhịp,
để rồi giật mình nhận ra mình vừa phạm một lỗi tày đình? Mồ hôi vã ra
đầm đìa, nghe chuông điện thoại kêu mà giật mình thon thót, đầu óc quay
cuồng nghĩ cách ăn nói thế nào cho phải… Hì hì làm cho kịch tính tí,
nhưng quả thật những hoàn cảnh tương tự như vậy không phải hiếm. Đối với
các DBA thường xuyên phải làm việc trực tiếp trên dữ liệu, những sự cố
xảy ra do nhầm lẫn là không tránh khỏi. Rất may SQL Server đã tính đến
tình huống này, và cung cấp các phương tiện cần thiết để lấy lại dữ
liệu, với điều kiện database phải có những thiết lập đúng đắn từ trước.
Tuy nhiên bạn có thể thấy là vấn đề đã trở nên phức tạp hơn, câu lệnh
không thể ROLLBACK lại được nữa vì SQL Server để chế độ mặc định là AUTO
COMMIT. Khôi phục lại từ bản backup từ ngày hôm trước cũng không giải
quyết được, vì như thế dữ liệu vừa mới được cập nhật trong ngày cũng sẽ
mất tiêu luôn. Vấn đề đặt ra là cần lấy lại dữ liệu giống như thời điểm
ngay trước khi chạy lệnh DELETE, chứ không phải từ ngày hôm qua. Một gợi
ý cho bạn: log file luôn lưu lại tất cả các hành động diễn ra đối với
database, bao gồm cả lệnh DELETE vừa xong. Đây là dấu vết duy nhất và
cách làm của ta cũng là dựa vào đó để lần ngược lại.
Để có thể khôi phục lại được đòi hỏi ba điều kiện sau:
- database có chế độ RECOVERY MODE là FULL
- database đã từng được FULL BACKUP và bạn có trong tay file backup gần nhất
- log file chưa từng bị SHRINK kể từ sau lần full backup gần nhất.
Nếu một trong ba điều kiện trên bị vi phạm thì vấn đề kể như hết cách giải cứu.
Giả sử cả ba điều kiện trên được thỏa mãn và lần full backup gần đây
nhất là đêm hôm trước. Bạn có thể khôi phục thông qua các bước sau (xem
thêm script ở phần dưới):
1. Đóng lại tất cả các kết nối đến database để không tiếp nhận thêm dữ liệu
2. Ghi lại thời điểm xảy ra lệnh DELETE lỗi
3. Thực hiện BACKUP LOG cho database
4. Khôi phục lại database theo trình tự sau:
- RESTORE từ bản full backup đêm hôm trước
- RESTORE từ bản log backup với lựa chọn STOPAT = thời điểm ngay trước khi có sự cố
5. Và khi mọi việc đã hoàn tất, chuyển lại database sang chế độ hoạt
động bình thường để các ứng dụng lại có thể kết nối vào database.
http://www.sqlviet.com/blog/lay-lai-du-lieu-sau-khi-xoa
Được sửa bởi DUCVINH83 trên diễn đàn 12/12/2012 lúc 10:32 sáng
__________________
YM: DUCVINH83
0912 822334
|