笔记330 利用尾日志备份还原数据库数据到某个时间点 2013-7-23
笔记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 -- 这个方法要对数据库独占,所以你想偷偷恢复是不行的了。勇敢承认错误吧