02/10/2018, 00:39

Khôi phục dữ liệu trước thời điểm xóa nhầm sqlserver 2008

Hôm nay, mình xin hướng dẫn các bạn khôi phục dữ liệu lại trước thời điểm khi các bạn xóa nhầm một hay nhiều bảng nào đó trong cơ sở dữ liệu. Làm việc với database là công việc thường xuyên đối với coder, nhưng một này nào đó, các bạn lỡ tay viết câu ...

Hôm nay, mình xin hướng dẫn các bạn khôi phục dữ liệu lại trước thời điểm khi các bạn xóa nhầm một hay nhiều bảng nào đó trong cơ sở dữ liệu.

Làm việc với database là công việc thường xuyên đối với coder, nhưng một này nào đó, các bạn lỡ tay viết câu truy vấn delete thiếu điều kiện hay nhầm bảng table, lúc đó, dữ liệu mất sạch.

Dữ liệu hiện tại thì chỉ có backup ngày hôm qua, Bây giờ, các người sử dụng phần mềm bạn chắc chắn sẽ không truy cập được. Bây giờ, chắc chắn bạn đang rất lo lắng, chẳng biết xử lý như thế nào. Sếp mà biết được thì xong, chuẩn bị nhận lương rồi ra về :) hii.

Mình cũng đã từng trải qua, cái cảm giác này rồi, bị thằng bạn càm ràm cả ngày, nào là chầu nhậu, chầu nước... kính thưa các thứ. :)))

Bây giờ, mình sẽ làm một ví dụ để các bạn dễ hình dung.

- Đầu tiên mình sẽ tạo database tên SINHVIEN, và bảng table tbl_sinhvien(masv, tensv).

USE master
GO
IF DB_ID('SINHVIEN') IS NOT NULL DROP DATABASE SINHVIEN
GO
CREATE DATABASE SINHVIEN
GO
USE SINHVIEN
GO
CREATE TABLE dbo.tbl_sinhvien(masv INT IDENTITY, tensv NVARCHAR(50) )
GO
INSERT INTO dbo.tbl_sinhvien(tensv)
SELECT N'Nguyễn Thảo' UNION ALL
SELECT N'Cái Trí Minh' UNION ALL
SELECT N'Trần Đình Hoàng' UNION ALL
SELECT N'Võ Sơn Băng'

- Bây giờ, mình sẽ tiến hành backup toàn bộ database SINHVIEN.

BACKUP DATABASE SINHVIEN TO DISK='D:SINHVIEN.BAK' WITH INIT

- Mình tiếp tục tiến hành thêm dữ liệu mới, sau khi backup .

INSERT INTO TBL_SINHVIEN(TENSV) VALUES(N'Trần Đình Thành') 
GO
INSERT INTO TBL_SINHVIEN(TENSV) VALUES(N'Đoàn Chính Thuần') 
GO
INSERT INTO TBL_SINHVIEN(TENSV) VALUES(N'Trương Phi') 

- Sau đó, do sơ xuất mình chạy nhầm câu lệnh sql delete

DELETE FROM TBL_SINHVIEN

- Đến đây, là dữ liệu của bạn đã mất sạch, giờ nếu mình khôi phục dữ liệu vừa backup vào thì ba dòng dữ liệu mình mới thêm vào sẽ không có. Các bạn đừng lo lắng, bây giờ mình cần làm đầu tiên là đóng database lại, để không cho ai có thể cập nhật dữ liệu vào.  Bằng cách là chuyển sang chế độ SINGLE_USER.

ALTER DATABASE SINHVIEN SET SINGLE_USER WITH ROLLBACK IMMEDIATE

- Tiếp đến mình cần ghi lại thời điểm chính xác trước khi chạy câu lệnh xóa dữ liệu.

SELECT GETDATE()

- ví dụ, khi mình chạy nhầm câu lệnh xóa là thời điểm 2016-03-18 20:27:16.473, vậy mình cần khôi phục lại dữ liệu trước thời điểm đó. ví dụ: 2016-03-18 20:25:16.473

- Bây giờ mình tiếp tục backup log lại như sau:

BACKUP LOG SINHVIEN TO DISK='D:SINHVIEN.TRN' WITH INIT

+ Bây giờ, mình tiến hành khôi phục dữ liệu full backup 

USER MASTER
GO
RESTORE DATABASE SINHVIEN FROM DISK='D:SINHVIEN.BAK' WITH NORECOVERY

- Tiến hành khôi phục lại backup log

RESTORE DATABASE SINHVIEN FROM DISK='D:SINHVIEN.TRN' WITH STOPAT='2016-03-18 20:25:16.473'

- Đến đây, là mình đã thành công.

Nhưng hiện tại database mình đang ở chế độ SINGLE_USER bây giờ mình sẽ chuyển lại sang chế độ MULTI_USER để mọi người có thể truy cập lại và cập nhật dữ liệu.

ALTER DATABSE SINHVIEN SET MULTI_USER

Các bạn có thể tham khảo video hướng dẫn:

Cám ơn các bạn đã xem bài viết. Hãy like and share giúp mình nha các bạn.

Các bạn có thể Đăng ký kênh Youtube của mình ở góc phải bên trên màn hình.

Mọi thắc mắc về bài viết các bạn có thể hỏi ở http://hoidap.laptrinhvb.net để được support. heart

Tags:
0