zoukankan      html  css  js  c++  java
  • SQLSERVER拯救某个时间点被误删除的数据

    SQLSERVER拯救某个时间点被误删除的数据

    转载自:http://blog.csdn.net/dba_huangzj/article/details/8491327

    要拯救某个时间点被误删除的数据,需要你在那个时间点之前有一个完整数据库备份。

    而且,需要你的数据库恢复模式为:“完整恢复模式”

    如何查看你的数据库恢复模式为完整恢复模式,运行下面SQL

    1 SELECT  recovery_model, recovery_model_desc
    2 FROM    sys.databases
    3 WHERE   name = 'GPOSDB'

    在创建完一个新数据库之后,强烈建议做一次数据库完整备份

    -------------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------

    先创建测试表

     1 /*
     2 由于tempdb永远为简单恢复模式,所以不适合做案例。
     3 这里使用我的测试机器里的数据库GPOSDB
     4 */
     5 USE [GPOSDB]
     6 GO
     7 IF OBJECT_ID('testRestore') IS NOT NULL 
     8     DROP TABLE testRestore
     9 GO
    10 CREATE TABLE testRestore
    11     (
    12       id INT IDENTITY(1, 1) ,
    13       NAME VARCHAR(50)
    14     );

    插入测试数据

     1 --插入测试数据:   
     2 INSERT INTO testRestore(Name)
     3 SELECT 'test1'
     4 UNION ALL 
     5 SELECT 'test2'
     6 UNION ALL 
     7 SELECT 'test3'
     8 UNION ALL 
     9 SELECT 'test4'
    10 UNION ALL 
    11 SELECT 'test5'
    12 UNION ALL 
    13 SELECT 'test6'
    14 UNION ALL 
    15 SELECT 'test7'
    16 UNION ALL 
    17 SELECT 'test8'
    1 SELECT * FROM testRestore

    先来一个数据库完整备份,在22:32的时候完整备份数据库

    1 BACKUP DATABASE [GPOSDB]
    2 TO DISK='D:GPOSDB_FULLBACKUP2013-07-23.bak'
    3 WITH INIT
    4 go

    模拟删除表数据,这里使用waitfor time,目的是使删除数据的时间准确一点,这里选择22:34的时候删除数据方便后面还原某个时间点之前的数据

    1 USE [GPOSDB]
    2 GO
    3 WAITFOR TIME '22:34'
    4 DELETE FROM dbo.testRestore


    查询一下数据是否删除

    1 USE [GPOSDB]
    2 GO
    3 SELECT * FROM dbo.testRestore

    断开与GPOSDB数据库的连接,如果还有连接就kill掉连接,然后执行事务日志备份,在22:36的时候执行事务日志备份

     1 --删除了表中的数据之后最少要等3分钟才执行下面SQL语句,不然的话等一下还原事务日志的时候会报错
     2 --必须断开所有与GPOSDB数据库的连接
     3 USE master
     4 GO
     5 BACKUP LOG [GPOSDB] TO  DISK = N'D:GPOSDB_LOGBACKUP2013-07-23.bak' WITH  NO_TRUNCATE , NOFORMAT,  NAME = N'GPOSDB-事务日志备份', SKIP,  NORECOVERY ,  STATS = 10, CHECKSUM
     6 GO
     7 DECLARE @backupSetId AS INT
     8 SELECT  @backupSetId = position
     9 FROM    msdb..backupset
    10 WHERE   database_name = N'GPOSDB' AND backup_set_id = ( SELECT
    11                                                               MAX(backup_set_id)
    12                                                         FROM  msdb..backupset
    13                                                         WHERE database_name = N'GPOSDB'
    14                                                       )
    15 IF @backupSetId IS NULL  --这里是验证事务日志备份是否成功,如果没有断开与GPOSDB数据库的连接备份事务日志可能会失败
    16     BEGIN
    17         RAISERROR(N'验证失败。找不到数据库“GPOSDB”的备份信息。', 16, 1)
    18     END
    19 RESTORE VERIFYONLY FROM  DISK = N'D:GPOSDB_LOGBACKUP2013-07-23.bak' WITH  FILE = @backupSetId
    20 GO

    1 --查询是否备份成功
    2 SELECT TOP 10 * FROM    msdb..backupset ORDER BY [backup_set_id] DESC 

    还原数据库完整备份

    1 --数据库处于正在还原状态
    2 RESTORE DATABASE [GPOSDB] FROM DISK='D:GPOSDB_FULLBACKUP2013-07-23.bak' WITH replace, NORECOVERY 

     还原事务日志

    1 --因为删除数据是在'22:34' 所以还原到22:33
    2 RESTORE LOG [GPOSDB] FROM DISK='D:GPOSDB_LOGBACKUP2013-07-23.bak' WITH RECOVERY ,STOPAT='2013-7-23 22:33'

    如果事务日志还原失败的话,可以使用GUI界面

    查看表中的数据

    1 USE [GPOSDB]
    2 GO
    3 SELECT * FROM dbo.testRestore

     -----------------------------------------------------------华丽的分割线--------------------------------------------

    要注意的两个地方

    (1)如果你发现误操作以后还有很多人做了操作,那么你还原成功后,别人的操作就会冲掉,所以发生误操作后,要马上停止别人对数据库的操作。

    (2)这个方法要对数据库独占

  • 相关阅读:
    Linux系统排查1——内存篇
    (原创)Python字符串系列(1)——str对象
    (原创)Python文件与文件系统系列(2)——os模块对文件、文件系统操作的支持
    (原创)Python文件与文件系统系列(5)——stat模块
    (原创)Python文件与文件系统系列(4)——文件描述字操作
    CenterOS7——使用yum命令报错Could not retrieve mirrorlist
    awk 查询某一列大于1900的值
    /bin/bash^M: bad interpreter: No such file or directory
    linux 设置时间同步
    CentOS7 服务器分析挖矿病毒,清理挖矿病毒 tor2web
  • 原文地址:https://www.cnblogs.com/lyhabc/p/3209530.html
Copyright © 2011-2022 走看看