当前位置: 首页 > news >正文

SQL Server 数据误删的恢复

在日常的数据库管理中,数据的误删操作是难以避免的。为了确保数据的安全性和完整性,我们必须采取一些措施来进行数据的备份和恢复。本文将详细介绍如何在 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 使用手册

相关文章:

SQL Server 数据误删的恢复

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

墨烯的C语言技术栈-C语言基础-018

char c; //1byte字节 8bit比特位 int main() { int a 10; //向内存申请四个字节,存储10 &a; //取地址操作符 return 0; } 每个字节都有地址 而a的地址就是它第一个字节的地址 要先开始调试才可以查看监控和查看内存 左边是地址 中间是内存中的数据 最后面的是…...

C端与B端 - 第一弹 - 理解和区分C端与B端软件开发

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 在软件开发领域…...

穿越多元宇宙的.NET:一场跨平台的星际旅行

概述 在软件开发的浩瀚宇宙中&#xff0c;.NET无疑是一颗耀眼的恒星&#xff0c;散发着多平台开发的光芒。从单一的.NET Framework出发&#xff0c;我们如今已拥有一个多元化的.NET宇宙&#xff0c;每个变体都是一个独特的星球&#xff0c;拥有自己的生态系统和生存法则。本文将…...

Python自学第五天

# 嵌套 字典嵌套字典 # 字典列表 now {pet:cat,color:black} now1 {pet:cat,color:pipe} wq [now,now1] # 这里是中括号 不是花括号 花括号打印不出来 for ff in wq:print(ff) # 创建20个外星人 打印前三个 并且显示一共创建了多少个外星人 now [] for wq in range(20):# 这…...

Cookie-Monster:一款针对Web浏览器的安全分析与数据提取工具

关于Cookie-Monster Cookie-Monster是一款针对常见Web浏览器的安全分析与数据提取工具&#xff0c;该工具可以帮助广大研究人员提取并分析Edge、Chrome和Firefox浏览器中的Cookie数据。 Cookie-Monster适用于红队和蓝队成员&#xff0c;能够提取WebKit主密钥&#xff0c;找到具…...

C语言的结构体

结构体定义 结构体指针...

C语言 写一个函数days,实现某日在本年中是第几天计算。

写一个函数days, 【定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题&#xff08;即将闰年情况包含在内&#xff09;】 由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。 ​#include <stdio.h>typedef struct {int yea…...

2-50 基于matlab的遗传模拟退火算法的聚类算法

基于matlab的遗传模拟退火算法的聚类算法&#xff0c;以模糊K-均值聚类算法为基础&#xff0c;对各样本的聚类中心进行优化&#xff0c;输出聚类可视化结果。聚类类别数可自由输入。程序已调通&#xff0c;可直接运行。 2-50 遗传模拟退火算法的聚类算法 - 小红书 (xiaohongshu…...

电脑屏幕录制软件,分享4款(2024最新)

在今天&#xff0c;我们的电脑屏幕成为了一个多彩多姿的窗口。通过它我们可以浏览网页、观看视频、处理文档、进行游戏……有时&#xff0c;我们想要记录下这些精彩瞬间&#xff0c;与朋友分享&#xff0c;或者作为教程留存&#xff0c;这时&#xff0c;电脑屏幕录制就显得尤为…...

机械学习—零基础学习日志(高数16——函数极限性质)

零基础为了学人工智能&#xff0c;真的开始复习高数 这里我们继续学习函数极限的性质。 局部有界性 充分条件与必要条件 极限存在是函数局部有界的充分条件。什么是充分条件&#xff0c;什么是必要条件呢&#xff1f;我这里做了一点小思考&#xff0c;和大家分享&#xff0c…...

初识c++——list

一、list 1、list结构 c中list为双向带头循环列表&#xff1a; 二、list接口 1、构造 using namespace std; #include<iostream> #include<list> #include<vector> int main() {list<int> lt; //构造空的listlist<int> lt1(10, 1); //构造的l…...

angular入门基础教程(八)表单之双向绑定

绑定表单数据 为了让表单使用 Angular 的特性实现数据绑定&#xff0c;需要导入 FormsModule。 这个比 vue 要繁琐点&#xff0c;不复杂&#xff0c;但是比 react 的自己手动实现要方便&#xff0c;ng 帮我们实现了双向绑定 import { Component } from "angular/core&qu…...

【C++】C++中的find方法介绍

目录 一.find方法基本用法 1.查找字符 2.查找子字符串 3.查找子字符串&#xff08;从指定位置开始&#xff09; 4.查找字符范围 5.查找不包含特定字符的范围 二.使用string::npos返回无效位置 三.总结 在C中&#xff0c; std::string 类的 find 成员函数用于查找子字…...

JVM—HotSpot虚拟机对象探秘

1、对象的创建 对象只是普通对象&#xff0c;不包括数组和Class对象 类加载检查&#xff1a;当虚拟机遇到字节码New指令时&#xff0c;先检查这个指令的参数是否可以在常量池定位到一个类的符号引用&#xff0c;并且加载这个符号引用代表的类是否被加载、解析、验证、初始化过。…...

AI测试:人工智能模型的核心测试指标,分类判别、目标检测、图像分割、定量计算分别有哪些指标?

在前面的人工智能测试技术系列文章中&#xff0c;我们详细介绍了人工智能测试的技术方法和实践流程。在了解人工智能测试方法后&#xff0c;我们需要进一步学习和研究如何衡量这些方法的有效性&#xff0c;即人工智能模型测试指标的选择。测试指标的选择主要取决于模型的类型和…...

探索LLM世界:新手小白的学习路线图

随着人工智能的发展&#xff0c;语言模型&#xff08;Language Models, LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域的应用越来越广泛。对于新手小白来说&#xff0c;学习LLM不仅能提升技术水平&#xff0c;还能为职业发展带来巨大的机遇。那么&#xff0c;…...

Linux基础命令大全 持续更新中......

最近重新学习了linux基础知识&#xff0c;并整理出了以下内容&#xff0c;以供参考 最近几日后续会持续更新内容哦 用户管理 加括号的代表可以不写 useradd &#xff08;参数选项&#xff09; 用户名 添加新用户 passwd &#xff08;参数选项&#xff09; 用户名 用…...

CPU的起源与发展历程

CPU的起源与发展历程 文章目录 CPU的起源与发展历程前言指令概念电子管&#xff08;真空管&#xff09;体系结构冯诺依曼架构哈佛架构 晶体管集成电路指令集与微架构微处理器x86架构CISC与RISC的提出MIPS架构ARM架构RISC-V架构FPGA 总结 前言 ​ 从古至今&#xff0c;人类为了…...

【C语言】 二叉树创建(结构体,先序遍历,中序遍历,后续遍历)

二叉树的创建&#xff1a;首先先定义一个结构体&#xff0c;里面包含数据&#xff08;data&#xff09;&#xff0c;指向左子树的指针&#xff08;L&#xff09;&#xff0c;指向右子树的指针&#xff08;R&#xff09;三个部分 在创建树的函数中&#xff0c;首先先输入…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...