SQLServer数据库误操作恢复的方法

目录
  • 前言
  • 一、恢复数据实例
    • 1.创建初始数据
    • 2.保证数据恢复的前提条件
    • 3.模拟不小心误操作
    • 4.开始恢复
  • 二、恢复数据原理
    • 1.数据库文件类型
    • 2.使用bak恢复数据原理
  • 总结
  • 参考

前言

在日常开发工作中,有可能会存在数据库的误操作,比如不小心删除了一个表或者删除了一堆数据,这个时候我们就需要将数据库进行恢复,恢复到误操作以前的状态,而这篇文章就是主要如何在误操作之后,恢复数据库的数据。

一、恢复数据实例

1.创建初始数据

use master
if exists (select * from sys.databases where name='test')
drop database test;

create database test;

use test
create table UserInfo
(
id int,
name varchar(50),
nickname varchar(50),
);
go

insert into UserInfo values (1,'张三','小张');
insert into UserInfo values (2,'张三2','小张');
insert into UserInfo values (3,'李四','小李');
insert into UserInfo values (4,'王五','小王');
insert into UserInfo values (5,'赵六','小赵');

select * from UserInfo;

2.保证数据恢复的前提条件

前提1 - 数据库创建时便已设置恢复模式为完整

对于任何环境下,新建数据库后,我们都需要先检查数据库的恢复模式,确认数据库的恢复模式是【完整恢复模式】,这是数据库数据得以恢复的基础。如果等到出问题,再想到这个就为时已晚了。
修改恢复模式如下图所示:

选中数据库,然后右键菜单=》选择【属性】=》属性页选择【选项】=》恢复模式哪一项,选择【完整】=》点击【确定】

数据库一般默认恢复模式就是【完整】恢复模式。

脚本检查恢复模式:SELECT recovery_model,recovery_model_desc FROM sys.databases WHERE name ='test';

如果查询结果如下,则表示数据恢复模式配置没有问题。

前提2 - 至少做过一次完整的备份

数据库数据恢复是需要基于数据的完整备份上进行的,如果没有一次完整的数据备份,那么数据备份无从谈起,所以,创建完一次数据库后,需强制性做一次完整的备份。

数据完整备份操作如下图所示:

选中数据库=》右键菜单,选择【任务】=》选择【备份】=》备份类型,选择【完整】=》确定

扩展内容:可以通过一下sql查询所有的数据库备份信息

SELECT database_name,recovery_model,name, backup_finish_date,type FROM msdb.dbo.backupset

如:本人刚才操作了两次数据完整备份和一次事务日志备份,查询结果如下,
type为D表示数据备份,L表示事务日志备份:

3.模拟不小心误操作

再次强调:数据恢复的前提条件中修改备份模式以及强制做一次完整的数据和事务日志备份,是我们在出现问题之前必须做过的操作,否则就没有什么恢复可言了。
现在我们模拟做一下误操作:

--模拟误操作 2022-11-23 14.25 开始的误操作,记一下误操作事件,以便后续演示数据恢复
--本意删除张三2的,但是条件不当,将不该删除的数据也删除了
delete from UserInfo where nickname='小张';
insert into UserInfo values (110,'错误数据','小错误');

--不小心新建了一个表格
select * into UserInfo2 from UserInfo;

现在我们比对一下误操作前后数据

4.开始恢复

出现误操作之后,具体恢复步骤如下:

1、首先将数据库限制为单个用户访问

出现误操作后,我们需要切断其他用户对数据库在进行操作产生数据,造成更大的问题,因此需要先将数据库限制为单个用户访问,与外界隔绝开。
具体操作如下:

当我们将限制访问设置为【SINGLE_USER】后,我们会发现 数据库后面会附加上【单个用户】标志。

2、做一次事务日志备份(备份日志尾部)

  • 首先选择数据库,右键菜单,选择【任务】=》选择【备份】
  • 进入备份界面,
  • 在【常规】这一项设置中 ,将备份类型选择【事务日志】
  • 在【介质选项】这一项设置中,按照下图操作步骤进行勾选和操作
  • 最后点击【确定】,此时我们会发现数据库出现了【正在还原…】的标志
  • 具体操作步骤如下图所示:

如果无法备份,则查询一下谁在占用:

SELECT * FROM sys.sysprocesses WHERE dbid=DB_ID('test')

然后使用kill 语句将占用者清除即可,如 kill 56,56代表占用者的spid
完成以上操作后,继续进行备份。

3、还原完整数据备份

完成上述事务日志的备份后,我们就需要将数据进行还原。

  • 首先选择数据库,右键菜单=》选择【任务】=》选择【还原】=》选择【文件和文件组】
  • 进入【还原文件和文件组】界面
  • 【常规】这一项中 在备份集列表中 选择 文件类型为【行数据的】并且类型为【完整】,备份的完成时间距离误操作最近的一次备份。
  • 【选项】这一项中 选择【不对数据库执行任何操作,不回滚未提交的事务】这一项
  • 最后点击【确定】即可
  • 具体操作如下图所示:

4、还原事务日志备份

还原完完整数据备份后,我们需要还原事务日志,因为数据库最终需要根据事务日志与完整备份的数据进行比对后进行数据的恢复操作。

  • 首先选择数据库,右键菜单=》选择【任务】=》选择【还原】=》选择【事务日志】
  • 进入还原事务日志界面
  • 【常规】这一项设置中,选择需要还原的事务日志备份(选择误操作后备份的那个事务日志)
  • 然后点击时间点后面的按钮,打开时间还原窗口,设置需要还原的时间点
  • 设置完还原的时间点后,在【选项】这一项设置中,设置恢复状态为回滚未提供事务,使用数据库处于可以使用的状态
  • 最后点击【确定】即可
  • 具体操作如下图所示:

至此,数据已经恢复成功。

5、最后恢复数据库的限制访问设置

将限制访问,从【SINGLE_USER】修改为【MULTI_USER】即可

到此这个数据恢复的完整流程结束。

二、恢复数据原理

1.数据库文件类型

数据库中的文件类型:

类型 作用
mdf (primary data file) 主要数据文件,数据库系统的可实时操作/读取的数据文件,也可作为物理备份文件使用
ndf (secondary data files) 次要数据文件
ldf (Log data files) 事务日志文件,用于记录数据库的事务日志信息
bak 数据库备份文件
  • 以上有mdf,ndf,ldf 以及bak 四种文件类型,其中一般我们创建的数据库都会包含mdf 和ldf 两个文件,不需要手动创建,这两个是一套数据,可以通过分离的方式拷贝出来作为备份,还原的时候通过数据库的“附加”功能即可还原。
  • bak自成一套,bak文件是通过使用数据库的“备份”功能而备份出来的文件,里面包含了数据和日志文件,并且备份时做了压缩,所以同一个数据库的bak文件比在运行的mdf数据文件+ldf日志文件要小。

2.使用bak恢复数据原理

首先我们要了解 事务日志中,记录了数据库自创建之初数据库所有的操作日志。

例如:

  • 2022-10-10 创建了数据库,此时我们第一次做了完整备份bak(包含数据+日志)
  • 2022-10-11 我们又做了一次完整备份bak(包含数据+日志)
  • 2022-10-12
  • 12:00 做了误操作,此时还不知晓,
  • 12:05 我们发现自己误操作了,马上设置访问权限,进行事务日志备份(这很关键),此时我们就有了2022-10-11所有的完整数据,以及到2022-10-12 12:05所有的事务日志。那么我们就可以根据2022-10-11的完整数据以及2022-10-12 12:05 的事务日志去反推12:00的数据。因此我们需要做的第一个操作先还原2022-10-11的完整数据备份,然后还原2022-10-12 12:05事务日志备份,并且设置还原的时间点。最后数据库系统会根据完整数据以及事务日志备份和设置的还原时间点去恢复数据。

总结

到此这篇关于SQLServer数据库误操作恢复的方法的文章就介绍到这了,更多相关SQLServer数据库恢复内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

参考

SQLServer 2008以上误操作数据库恢复方法——日志尾部备份
数据库误操作恢复实现原理

(0)

相关推荐

  • 设置密码保护的SqlServer数据库备份文件与恢复文件的方法

    设置密码保护SqlServer数据库备份文件! 备份SqlServer数据库 Backup Database [数据库] To disk='c:\mysql'+ replace(replace(replace(replace(CONVERT(varchar, getdate(), 121),'-',''),' ',''),':',''),'.','') +'.bak' With Password = '123',init; 恢复SqlServer数据库 Restore Database [数据库

  • sqlserver数据库加密后无法使用MDF,LDF,log文件名称被修改的数据恢复

    ​故障:​ 2个SQL server数据库被加密,无法使用. 数据库MDF.LDF.log日志文件名字被修改, 如下图: 数据库备份被加密,文件名字被修改.管理员联系北亚数据恢复中心进行数据修复. ​数据恢复过程:​ 1.备份数据库.为防止数据恢复过程中对原始数据库造成二次破坏,北亚数据恢复工程师为每个库做了备份.所有恢复数据的操作都在备份上进行, 避免了对原始数据造成损坏的可能. 2.使用北亚自研的数据恢复软件打开被加密的SQL server数据库,发现数据库的头部已被破坏. 3.经过检查,北

  • asp 在线备份与恢复sqlserver数据库的代码

    asp在线备份sql server数据库: 1.备份sqlserver 复制代码 代码如下: <% SQL="backup database 数据库名 to disk='"&Server.MapPath("backup")&"\"&"backuptext.dat"&"'" set cnn=Server.createobject("adodb.connectio

  • SQLServer2005 没有日志文件(*.ldf) 只有数据文件(*.mdf) 恢复数据库的方法

    复制代码 代码如下: exec sp_attach_db exun,'d:\exun2.mdf' 一句话就可以了. 网上看了那些比较繁琐的,都是sql server 2000版本的. (可能执行一次不能成功,测试了下,有时候需要执行2次以上命令才行) 执行了之后,记得刷新数据库,不然是不会显示的

  • 如何强制删除或恢复SQLServer正在使用的数据库

    通常情况睛,SQLServer2000正在使用的数据库(有数据库连接),是不能删除或被恢复的,可以将数据库设置为单用户模式,即可删除: ALTER DATABASE IpaddrDB SET SINGLE_USER with ROLLBACK IMMEDIATE GO DROP DATABASE IpaddrDB

  • 数据库备份 SQLServer的备份和灾难恢复

    各大服务器硬件厂商(IBM,HP等)提供有很好的数据保护策略(硬件或软件).如大家熟知的RAID磁盘阵列(Redundant Array of Independent Disks)就是很好的数据保护方法.就SQL Server而言,通过维护计划可以制定详细的数据备份计划. 数据备份策略(full backup, differential backup and  transaction log backup) 数据备份是为数据恢复服务的,所以建立数据备份计划之前,应先考虑是否能利用该备份有效的恢复

  • sqlserver 数据库日志备份和恢复步骤

    --创建测试数据库 CREATE DATABASE Db GO --对数据库进行备份 BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT GO --创建测试表 CREATE TABLE Db.dbo.TB_test(ID int) --延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败) WAITFOR DELAY '00:00:01' GO --假设我们现在误操作删

  • SQLServer数据库处于恢复挂起状态的解决办法

    一.总结 如果数据库处于一个恢复挂起的状态,并且对数据库做脱机和分离的操作,报出数据库文件不可访问的错误,可能是因为数据库的数据文件和日志文件在数据库正常连接的情况下,文件所在的磁盘脱机了,导致数据库在一段时间内找不到数据库的文件,就把数据库置于一个恢复挂起的状态了,所以磁盘联机后,重启数据库服务,重新去找数据文件和日志文件找到了,数据库就可用了. 二.处理步骤 1.数据库恢复挂起截图 2.出现恢复挂起的原因 我这里的数据库出现这种原因,是因为我的数据库数据文件和日志文件是在存储上放着的,当时存

  • 删除sqlserver数据库日志和没有日志的数据库恢复办法

    一.删除数据库日志文件的方法 你曾经有在执行SQL的时候,数据库报事务日志已满,然后执行报错.然后纠结于怎么删除数据库日志,捣鼓半天吗,现在就提供两种删除日志文件的方法,希望能够帮到你! 方法一:手工操作1.数据库->右键->属性->选项-恢复模式->由完成切换成简单2.数据库->右键->任务->收缩-文件->由完成切换成简单->文件类型->日志->将文件收缩到 方法二:存储过程代替手工操作 复制代码 代码如下: --日志文件收缩至多少M 

  • SQLServer数据库误操作恢复的方法

    目录 前言 一.恢复数据实例 1.创建初始数据 2.保证数据恢复的前提条件 3.模拟不小心误操作 4.开始恢复 二.恢复数据原理 1.数据库文件类型 2.使用bak恢复数据原理 总结 参考 前言 在日常开发工作中,有可能会存在数据库的误操作,比如不小心删除了一个表或者删除了一堆数据,这个时候我们就需要将数据库进行恢复,恢复到误操作以前的状态,而这篇文章就是主要如何在误操作之后,恢复数据库的数据. 一.恢复数据实例 1.创建初始数据 use master if exists (select * f

  • MySQL数据库误操作后快速回滚的方法

    基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了.误操作后,能快速回滚数据是非常重要的. binlog2sql快速回滚 首先,确认你的MySQL server开启了binlog,设置了以下参数: [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_siz

  • sqlserver数据库最大Id冲突问题解决方法之一

    复制代码 代码如下: CREATE TABLE [dbo].[TbGuidTable]( [TableName] [varchar](50) NOT NULL, [KeyName] [varchar](20) NOT NULL, [KeyValue] [varchar](100) NOT NULL ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'PCreateGuid') and O

  • MySQL数据库防止人为误操作的实例讲解

    有不少开发人员在操作MySQL数据库的时候都遇到过误操作的情况,例如更新数据库的时候update语句忘记加上where条件,就会造成极为悲剧的结果.本文就针对防止MySQL数据库误操作的方法做出如下详解: 1.mysql帮助说明 # mysql --help|grep dummy -U, --i-am-a-dummy Synonym for option --safe-updates, -U. i-am-a-dummy FALSE 在mysql命令加上选项-U后,当发出没有WHERE或LIMIT

  • SQLServer数据库的各种管理方法

    本文适用范围:全面阐述SQLServer数据库的各种操作,分虚拟主机和服务器两种情况. 这篇文章比较长,请使用下面的提纲访问. 提纲 一.虚拟主机 1.安装在线企业管理器     2.注册远程企业管理器(SQL2000)     3.注册远程企业管理器(SQL2005/2008)    4.使用管理面板备份还原 二.服务器或VPS 1.新建数据库     2.附加数据库     3.备份数据库     4.还原数据库 虚拟主机 这种情况下,我们只有空间商提供的数据库IP地址.用户名和密码(有的空

  • 清除SQL Server数据库日志(ldf文件)的方法汇总

    目录 解决方案1 - 直接删除本地ldf日志文件:(比较靠谱方案!) 解决方案2 -收缩数据库日志文件(最靠谱方案!) 解决方案3 - 采用SQL脚本删除. 清除SQL Server数据库日志(ldf文件)的几种方法 随着系统运行时间的推移,数据库日志文件会变得越来越大,这时我们需要对日志文件进行备份或清理. 解决方案1 - 直接删除本地ldf日志文件:(比较靠谱方案!) 1. 在SQL管理器分离数据库. 2. 对数据库日志文件进行压缩备份(rar, zip) 3. 直接删除ldf文件. 附加数

  • Mysql误操作后利用binlog2sql快速回滚的方法详解

    前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2sql快速回滚的方法,话不多说,来一起看看详细的介绍: 一.总体解释: DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL(data definition la

  • VB语言使用ADO连接、操作SQLServer数据库教程

    几年前学过的VB几乎忘光了,这几天复习了下.VB连接ADO数据库并不是非常难. 连接第一步(要仔细看) 对于小白来讲,这里的教程最详细,连接ADO数据库第一步,要添加什么部件呢?全称是Microsoft ADO Data Control 6.0 (SP6) (OLEDB) 部件. 在Microsoft ADO Data Control 6.0 (SP6) (OLEDB)部件里有一个名叫:Adodc数据控件,要将它添加.在Adodc数据控件数据位置中找到ACCES. 控件引用的方法(值指的是姓名)

  • MySQL误操作后快速恢复数据的方法

    摘要: 利用binlog闪回误操作数据. 基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了.误操作后,能快速回滚数据是非常重要的. 传统解法 用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态.然后跳过误操作的SQL,再继续应用binlog.此法费时费力,不值得再推荐. 利用binlog2sql快速闪回 首先,确认你的MySQ

随机推荐