笔记330 利用尾日志备份还原数据库数据到某个时间点 2013-7-23
1 --利用尾日志备份还原数据库数据到某个时间点 2013-7-23
2 /*
3 由于tempdb永远为简单恢复模式,所以不适合做案例。
4 这里使用我的测试机器里的数据库GPOSDB
5 */
6 USE [GPOSDB]
7 GO
8 IF OBJECT_ID('testRestore') IS NOT NULL
9 DROP TABLE testRestore
10 GO
11
12 CREATE TABLE testRestore
13 (
14 id INT IDENTITY(1, 1) ,
15 NAME VARCHAR(50)
16 );
17 --插入测试数据:
18 INSERT INTO testRestore(Name)
19 SELECT 'test1'
20 UNION ALL
21 SELECT 'test2'
22 UNION ALL
23 SELECT 'test3'
24 UNION ALL
25 SELECT 'test4'
26 UNION ALL
27 SELECT 'test5'
28 UNION ALL
29 SELECT 'test6'
30 UNION ALL
31 SELECT 'test7'
32 UNION ALL
33 SELECT 'test8'
34
35
36 SELECT * FROM testRestore
37
38 -------------------------------------------------
39 --在22:32的时候完整备份数据库
40 BACKUP DATABASE [GPOSDB]
41
42 TO DISK='D:\GPOSDB_FULLBACKUP2013-07-23.bak'
43
44 WITH INIT
45
46 go
47
48 -------------------------------------------------------------------
49
50 USE [GPOSDB]
51 GO
52 WAITFOR TIME '22:34'
53 DELETE FROM dbo.testRestore
54
55 --------------------------------------------------------
56
57 USE [GPOSDB]
58 GO
59 SELECT * FROM dbo.testRestore
60
61 -------------------------------------------------------------------------------
62 --删除了表中的数据之后最少要等3分钟才执行下面SQL语句,不然的话等一下还原事务日志的时候会报错
63
64 --必须断开所有与GPOSDB数据库的连接
65 USE master
66 GO
67 BACKUP LOG [GPOSDB] TO DISK = N'D:\GPOSDB_LOGBACKUP2013-07-23.bak' WITH NO_TRUNCATE , NOFORMAT, NAME = N'GPOSDB-事务日志备份', SKIP, NORECOVERY , STATS = 10, CHECKSUM
68 GO
69 DECLARE @backupSetId AS INT
70 SELECT @backupSetId = position
71
72 FROM msdb..backupset
73
74 WHERE database_name = N'GPOSDB' AND backup_set_id = ( SELECT
75
76 MAX(backup_set_id)
77
78 FROM msdb..backupset
79
80 WHERE database_name = N'GPOSDB'
81
82 )
83 IF @backupSetId IS NULL --这里是验证事务日志备份是否成功,如果没有断开与GPOSDB数据库的连接备份事务日志可能会失败
84
85 BEGIN
86
87 RAISERROR(N'验证失败。找不到数据库“GPOSDB”的备份信息。', 16, 1)
88
89 END
90 RESTORE VERIFYONLY FROM DISK = N'D:\GPOSDB_LOGBACKUP2013-07-23.bak' WITH FILE = @backupSetId
91 GO
92
93 --查询是否备份成功
94 SELECT TOP 10 * FROM msdb..backupset ORDER BY [backup_set_id] DESC
95 -----------------------------------------------------------------------------
96 --数据库处于正在还原状态
97 RESTORE DATABASE [GPOSDB] FROM DISK='D:\GPOSDB_FULLBACKUP2013-07-23.bak' WITH replace, NORECOVERY
98 --因为删除数据是在'22:34' 所以还原到22:33
99 RESTORE LOG [GPOSDB] FROM DISK='D:\GPOSDB_LOGBACKUP2013-07-23.bak' WITH RECOVERY ,STOPAT='2013-7-23 22:35'
100
101 USE [GPOSDB]
102 GO
103 SELECT * FROM dbo.testRestore
104
105 --如果你发现误操作以后还有很多人做了操作,那么你还原成功后,别人的操作就会冲掉,
106
107 --所以发生误操作后,要马上停止别人对数据库的操作。
108
109 --
110
111 -- 这个方法要对数据库独占,所以你想偷偷恢复是不行的了。勇敢承认错误吧