笔记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 -- 这个方法要对数据库独占,所以你想偷偷恢复是不行的了。勇敢承认错误吧

 

posted @ 2013-08-04 21:59 桦仔 阅读(...) 评论(...) 编辑 收藏