SQL Server 数据误删的恢复

news2024/9/22 21:24:09

在日常的数据库管理中,数据的误删操作是难以避免的。为了确保数据的安全性和完整性,我们必须采取一些措施来进行数据的备份和恢复。本文将详细介绍如何在 SQL Server 中进行数据的备份和恢复操作,特别是在发生数据误删的情况下。假设我们已经开启了全量备份,并且在误操作之前有一个全量备份文件。


一、模拟误删

1. 创建表并插入测试数据

首先,我们需要创建一个名为 “Test” 的数据库,并在其中创建一个名为 “Student” 的表。该表将包含一些测试数据。

SSMS 连接本地 SQL Server。

在这里插入图片描述

创建新数据库 “Test”。

【图002】

创建数据库 “Test”,并在该库内创建数据表 “Student”

-- 创建数据库
CREATE DATABASE Test;

-- 使用 Test 数据库
USE Test;

-- 创建 Student 表
CREATE TABLE Student (
    id INT IDENTITY(1,1) PRIMARY KEY,
    name NVARCHAR(255) NOT NULL,
    phone NVARCHAR(50) NOT NULL,
    gender NVARCHAR(10) NOT NULL,
    created_at DATETIME DEFAULT GETDATE()
);

-- 插入十条测试数据
INSERT INTO Student (name, phone, gender, created_at) VALUES 
('Alice', '1234567890', 'Female', GETDATE()),
('Bob', '0987654321', 'Male', GETDATE()),
('Cathy', '1231231234', 'Female', GETDATE()),
('David', '3213214321', 'Male', GETDATE()),
('Eva', '5556667777', 'Female', GETDATE()),
('Frank', '8889990000', 'Male', GETDATE()),
('Grace', '2223334444', 'Female', GETDATE()),
('Henry', '4445556666', 'Male', GETDATE()),
('Ivy', '1112223333', 'Female', GETDATE()),
('Jack', '7778889999', 'Male', GETDATE());

记录本次操作时间为:2024-07-23 17:30:45

在这里插入图片描述


2. 数据库全量备份

恢复的前提是数据库在误删前进行过一次全量备份。

全量备份流程:

右键 “Test” 数据库,点击备份(Back Up),备份文件命名为 “testDB.bak”,存储在自定义目录,我存储在 “D:\testDB.bak”。

在这里插入图片描述

在这里插入图片描述

备份成功。

在这里插入图片描述

记录本次操作时间为:2024-07-23 17:32:30


3. 未备份的新操作

如果我们的数据库全量备份之后没有任何操作,那这个还原是毫无难度的,草履虫也会。本篇重点讲如果全量备份之后,再有为备份的新操作该如何处理,这也符合实际应用中的场景。

-- 插入五条测试数据
INSERT INTO Student (name, phone, gender, created_at) VALUES 
('Lily', '1114447777', 'Female', GETDATE()),
('Mike', '2225558888', 'Male', GETDATE()),
('Nina', '3336669999', 'Female', GETDATE()),
('Oscar', '4447770000', 'Male', GETDATE()),
('Paul', '5558881111', 'Male', GETDATE());

在这里插入图片描述

记录本次操作时间为:2024-07-23 17:35:14


4. 模拟数据误删

为了模拟数据误删的情况,我们将进行一次全量更新操作,导致所有记录的手机号码(phone)字段丢失。

-- 模拟全量更新操作,导致手机号码丢失
UPDATE Student
SET phone = NULL;

在这里插入图片描述

执行上述 SQL 脚本后,Student 表中的所有记录的 phone 字段将被更新为 NULL,模拟了数据误删的情况。

在这里插入图片描述

记录本次操作时间为:2024-07-23 17:35:41

这是数据维护中经常遇到的问题,因为某些原因导致 Where 条件的子项查询没有生效,导致全量更新,等同于某一列被直接删除。还有一些 Delete From / Drop Table 之类的情况,其实和这个的恢复方式一样。


二、数据恢复步骤

1. 备份日志

在误删发生后,我们需要备份当前的事务日志,以确保在恢复过程中不会丢失任何数据。

-- 备份当前的事务日志
BACKUP LOG Test TO DISK='d:\testLOG.bak' WITH FORMAT
GO

在这里插入图片描述

记录本次操作时间为:2024-07-23 17:37:16


2. 还原数据库到指定时间点

接下来,我们将还原数据库到误操作之前的状态。这个过程包括还原之前的全量备份和刚刚备份的事务日志(截至到误删前的部分)。

在 SQL Server Management Studio 中,右键单击要还原的数据库(Test),选择“任务” -> “还原” -> “数据库”

在“选项”标签中,勾选“关闭现有连接到目标数据库”,选择 之前的全量备份 和 刚刚备份的事务日志。

在这里插入图片描述

在这里插入图片描述

在通用里,选择一个还原到的具体时间点。这里的时间点如果记不清了,则需要我们去尽可能推算,因为生产数据时刻在变化,尽可能恢复到误删前的前一刻的数据可以避免更多的损失。

在这里插入图片描述

这里我们的误删操作发生在:2024-07-23 17:35:41。

因此,我们选择还原到这个时间的前一刻,我选择 2024-07-23 17:35:30。

在这里插入图片描述

点击“确定”开始还原。

在这里插入图片描述

还原成功。


3. 检验恢复结果

还原完成后,我们需要验证数据是否已经被成功恢复。

-- 查看 Student 表中的数据
SELECT TOP (1000) [id]
      ,[name]
      ,[phone]
      ,[gender]
      ,[created_at]
  FROM [Test].[dbo].[Student]

执行上述查询语句后,我们可以看到所有记录的 phone 字段已经被恢复到误操作之前的状态。

在这里插入图片描述


4. 恢复数据库可读写

从刚刚的截图上我们看到,虽然数据被恢复了,但是因为使用了日志事务,所以Test数据库变成了StandBy/ReadOnly状态。当前状态下,数据库是无法被写入的,我们需要解除这种状态。

-- 切换到 master 数据库
USE master;

-- 在主服务器上移除日志传送配置
EXEC master.dbo.sp_delete_log_shipping_primary_secondary
    @primary_database = 'Test',            -- 主数据库名称
    @secondary_server = '<SecondaryServerName>', -- 备用服务器名称
    @secondary_database = 'Test';          -- 备用数据库名称

-- 在主服务器上移除主数据库的日志传送配置
EXEC master.dbo.sp_delete_log_shipping_primary_database
    @database = 'Test';                    -- 主数据库名称

-- 在备用服务器上移除日志传送配置
EXEC master.dbo.sp_delete_log_shipping_secondary_database
    @secondary_database = 'Test';          -- 备用数据库名称

-- 恢复数据库
RESTORE DATABASE Test WITH RECOVERY;

-- 将数据库设置为读写模式
ALTER DATABASE Test SET READ_WRITE;

我们刷新数据库,看到数据库Test已经变为可写入的正常状态了。

在这里插入图片描述


三、SQL Server 数据误删总结

通过本文的介绍,我们学习了如何在 SQL Server 中进行数据的备份和恢复操作,特别是在数据误删的情况下。数据误删是数据库管理中一个常见而严重的问题,如果没有有效的备份和恢复策略,可能会导致无法挽回的损失。

1. 数据备份策略

定期备份是保障数据安全的最有效手段之一。SQL Server 提供了多种备份策略,包括:

  • 完全备份:备份整个数据库的所有数据。这种备份方式最为全面,但也最耗时和占用空间最多。
  • 差异备份:备份自上次完全备份以来所有更改的数据。它比完全备份更快,但仍然需要上次的完全备份来恢复数据。
  • 事务日志备份:备份自上次事务日志备份以来所有更改的事务日志。它允许我们恢复到特定的时间点,非常适合用于数据误删后的恢复。

2. 数据恢复操作

当数据被误删时,正确的恢复操作至关重要。通过以下步骤,我们可以有效地恢复数据:

  1. 识别误删数据的时间点:确定数据被误删的具体时间。
  2. 停止数据库的写操作:防止新的数据写入干扰恢复过程。
  3. 还原最近的完全备份
    RESTORE DATABASE [YourDatabase] FROM DISK = 'C:\Backup\YourDatabase_full.bak' WITH NORECOVERY;
    
  4. 还原最近的差异备份(如果有)
    RESTORE DATABASE [YourDatabase] FROM DISK = 'C:\Backup\YourDatabase_diff.bak' WITH NORECOVERY;
    
  5. 还原事务日志备份,直到误删数据的时间点
    RESTORE LOG [YourDatabase] FROM DISK = 'C:\Backup\YourDatabase_log.trn' WITH STOPAT = 'YYYY-MM-DDTHH:MM:SS', RECOVERY;
    

通过全量备份和事务日志备份,我们能够有效地恢复误删的数据,确保数据的完整性和安全性。希望本文对大家在日常的数据库管理工作中有所帮助。


3. 本文参考资料

  • SQL Server 官方文档
  • SQL Server Management Studio 使用手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1944765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果微信数据恢复的教程?3个方法,一学就会!

各位家人朋友们&#xff01;你是否有遇到过微信数据误删或者是找不到的窘况呢&#xff1f;是不是时常会发现时间较为久远的微信聊天记录或者是文件已经过期无法打开呢&#xff1f;这些生活上的小烦恼大家都会有&#xff0c;但是大部分人都不知道该如何解决微信数据恢复问题。今…

大厂面试官问我:Mysql B+树索引中B最后一层是双向链表还是单向链表?为什么这么设计?【后端八股文十四:Mysql索引八股文合集】

本文为【Mysql索引八股文合集】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏…

局部加全局视角遮挡人脸表情识别方法

一、摘要 实际场景中各种遮挡增加了表情识别难度。为此&#xff0c;提出一种滑块局部加权卷积注意力和全局注意力 池化的视觉 Transformer 结合的方法来解决遮挡问题。 利用主干网络提取表情特征图&#xff0c;将表情特征图裁剪成 多个区域块&#xff0c;利用局部 Patch 注意力…

Mem0 - 个人 AI 的内存层

文章目录 一、关于 Mem0核心功能&#x1f511;路线图 &#x1f5fa;️常见用例Mem0与RAG有何不同&#xff1f; 二、快速入门 &#x1f680;1、安装2、基本用法&#xff08;开源&#xff09;3、高级用法&#x1f527;4、大模型支持 三、MultiOn1、概览2、设置和配置4、将记忆添加…

【嵌入式开发之并发程序设计】守护进程的定义、特点、相关概念及创建

守护进程的定义 守护进程(Daemon Process)&#xff0c;又叫精灵进程、监控进程&#xff0c;是Linux三种进程类型之一&#xff0c;是 Linux 中的后台服务进程&#xff0c;是一个生存期较长的进程&#xff0c;通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事…

亚信安全与软银中国全资企业爱思比通信达成战略合作

近日&#xff0c;亚信安全携手软银集团旗下全资企业爱思比通信科技&#xff08;上海&#xff09;有限公司&#xff08;以下简称“爱思比通信”&#xff09; 共同宣布&#xff0c;双方正式签署战略合作协议。依托双方在技术、业务和资源三大层面的实力与优势&#xff0c;亚信安全…

2024-07-23 Unity AI行为树2 —— 项目介绍

文章目录 1 项目介绍2 AI 代码介绍2.1 BTBaseNode / BTControlNode2.2 动作/条件节点2.3 选择 / 顺序节点 3 怪物实现4 其他功能5 UML 类图 项目借鉴 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 项目介绍 ​ 本项目使用 Unity 2022.3.32f1c1&#xff0c;实现基…

韦东山嵌入式linux系列-查询方式的按键驱动程序_编写框架

1 LED 驱动回顾 对于 LED&#xff0c; APP 调用 open 函数导致驱动程序的 led_open 函数被调用。在里面&#xff0c;把 GPIO 配置为输出引脚。安装驱动程序后并不意味着会使用对应的硬件&#xff0c;而 APP 要使用对应的硬件&#xff0c;必须先调用 open 函数。所以建议在驱动…

算法-DFS搜索

题目一 解题思路 深度遍历剪枝优化 第r行&#xff0c;第i列能不能放棋子&#xff1a;用数组dg udg cor 分别表示&#xff1a;点对应的两个斜线以及列上是否有皇后。 边界问题&#xff1a; dg[i r] 表示 r行i列处&#xff0c;所在的对角线上有没有棋子 udg[n - i r]表示 r…

环信+亚马逊云科技服务:助力出海AI社交应用扬帆起航

随着大模型技术的飞速发展&#xff0c;AI智能体的社交体验得到了显著提升&#xff0c;AI社交类应用在全球范围内持续火热。尤其是年轻一代对新技术和新体验的热情&#xff0c;使得AI社交产品在海外市场迅速崛起。作为领先的即时通讯解决方案提供商&#xff0c;环信与亚马逊云科…

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题

前言&#xff1a; emmm&#xff0c;说起来这个问题整得还挺好笑的&#xff0c;本人在公司内&#xff0c;奋笔疾书写代码&#xff0c;愉快的提交测试的时候&#xff0c;测试跟我说&#xff0c;在苹果手机上你这个样式有bug&#xff0c;我倒是要看看&#xff0c;是什么bug。 安卓…

Golang | Leetcode Golang题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; func missingNumber(nums []int) int {n : len(nums)total : n * (n 1) / 2arrSum : 0for _, num : range nums {arrSum num}return total - arrSum }

5.9 结构化开发方法

大纲 系统分析与设计概述&#xff08;选择题 1 分&#xff09; 结构化开发方法 系统分析阶段的主要工作 系统设计基本原理 内聚&#xff08;主要考点&#xff09;

【HarmonyOS学习】用户文件访问

概述 文件所有者为登录到该终端设备的用户&#xff0c;包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为&#xff0c;需要提前获取用户授权&#xff0c;或由用户操作完成。 用户文件访问框架 是一套提供给开发者访问和管理用户文件的基础框…

深入Mysql-03-MySQL 表的约束与数据库设计

文章目录 数据库约束的概述约束种类主键约束唯一约束非空约束默认值外键约束 表与表之间的关系数据库设计 数据库约束的概述 对表中的数据进行限制&#xff0c;保证数据的正确性、有效性和完整性。一个表如果添加了约束&#xff0c;不正确的数据将无法插入到表中。 约束种类 …

java实现OCR图片识别,RapidOcr开源免费

先看一下识别效果&#xff08;自我感觉很牛逼&#xff09;&#xff0c;比Tess4J Tesseract省事&#xff0c;这个还需要训练&#xff0c;安装软件、下载语言包什么的 很费事&#xff0c;关键识别率不高 RapidOcr不管文字的横竖&#xff0c;还是斜的都能识别&#xff08;代码实现…

鸿蒙开发仓颉语言【在工程中使用Hyperion TCP框架】

3. 在工程中使用Hyperion TCP框架 3.1 导入Hyperion TCP框架的静态库 在工程的module.json中引入Hyperion TCP框架的静态库&#xff1a; "package_requires": {"package_option": {"hyperion_hyperion.buffer": "${path_to_hyperion_proj…

SpringBoot整合SSE技术详解

Hi &#x1f44b;, Im shy SpringBoot整合SSE技术详解 1. 引言 在现代Web应用中,实时通信变得越来越重要。Server-Sent Events (SSE)是一种允许服务器向客户端推送数据的技术,为实现实时更新提供了一种简单而有效的方法。本文将详细介绍如何在SpringBoot中整合SSE,并探讨S…

java之回合制游戏以及如何优化

public class Role {private String name;private int blood;//空参public Role() {}//包含全部参数的构造public Role(String name, int blood) {this.name name;this.blood blood;}public String getName() {return name;}public void setName(String name) {this.name na…

单细胞生物都能学会的树莓派4B实现路由器

本文参考自CSDN用户羟基氟化宇的畅玩树莓派4B&#xff08;二&#xff09;树莓派搭建无线路由器&#xff08;支持5GWIFI&#xff09; 本文补充其中的细节及遇到的问题。 本文提及的代码&#xff0c;均需在树莓派终端中运行。 〇、硬件准备 树莓派4B一个、网线一根。 &#xff…