首页 > 数据库 >SQL Server 数据误删的恢复

SQL Server 数据误删的恢复

时间:2024-08-04 22:29:12浏览次数:15  
标签:-- 备份 Server SQL Test 误删 数据库 GETDATE

在日常的数据库管理中,数据的误删操作是难以避免的。为了确保数据的安全性和完整性,我们必须采取一些措施来进行数据的备份和恢复。本文将详细介绍如何在 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());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

记录本次操作时间为: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());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

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


4. 模拟数据误删

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

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

在这里插入图片描述

执行上述 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
  • 1
  • 2
  • 3

在这里插入图片描述

记录本次操作时间为: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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行上述查询语句后,我们可以看到所有记录的 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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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

在这里插入图片描述


三、SQL Server 数据误删总结

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

1. 数据备份策略

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

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

2. 数据恢复操作

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

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

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


3. 本文参考资料

 

2024-08-04 22:21:09【出处】:https://damon.blog.csdn.net/article/details/140652798

=======================================================================================

标签:--,备份,Server,SQL,Test,误删,数据库,GETDATE
From: https://www.cnblogs.com/mq0036/p/18342317

相关文章

  • Spring Cloud微服务项目集成MySQL
            在现代微服务架构中,数据持久化是至关重要的一环。SpringCloud是一个广泛使用的微服务框架,它提供了一整套解决方案来简化微服务的开发和管理。而MySQL作为一个开源的关系型数据库系统,在微服务项目中也发挥着重要作用。本文博主将介绍如何在SpringCloud微服务......
  • 深入探讨MySQL索引的设计原则及优化策略
    深入探讨MySQL索引的设计原则及优化策略大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在数据库系统中,索引是提升查询性能的关键工具。合理的索引设计可以显著提高数据访问的速度,而不当的索引配置则可能导致性能问题。本文将深入探讨MySQL索引的设计......
  • MySQL基础知识分享(二)
    写在前面大家好,不知道前面的20题大家写的怎么样,前面分享的20题是SQL中查询的基础题型,这部分被称为DQL部分,是每个学习MySQL必须要学会的部分,下面就让我来介绍MySQL中的TCL部分,也就是事务部分。ACID四大特性事务的概述事务的ACID特性可以确保银行不会弄丢你的钱。而在应用逻辑中......
  • 守护数据堡垒:SQL Server数据库自定义备份审计实现指南
    标题:守护数据堡垒:SQLServer数据库自定义备份审计实现指南引言数据库备份是确保数据安全和业务连续性的关键措施。SQLServer提供了多种备份策略,但有时候,为了满足特定的合规性要求或业务需求,我们需要实现更细粒度的自定义数据备份审计。本文将详细介绍如何在SQLServer中......
  • mysql 两种重要的日志
    前言这个不用多说,两种重要的日志分别是redolog和binlog,这两种,下面分别来结束。正文先来redolog,redolog是innodb引擎特有的,运用了一种wal技术,全称是:write-aheadlogging.它的关键点就是先写日志,再写磁盘,也就是先写粉板,等不忙的时候再写账本。简单来说就是先写内存......
  • 索引的艺术:SQL Server数据库性能优化的索引设计策略
    索引的艺术:SQLServer数据库性能优化的索引设计策略在SQLServer数据库的浩瀚世界中,索引是提升查询性能的一把利剑。然而,索引的设计和使用并非一蹴而就,而是需要深思熟虑的策略。本文将深入探讨SQLServer中数据库性能优化时需要考虑的索引设计因素,带你领略索引设计的智慧。......
  • 数据安全堡垒:构建SQL Server自定义数据安全策略
    数据安全堡垒:构建SQLServer自定义数据安全策略在数字化时代,数据安全是企业的生命线。SQLServer作为企业级数据库解决方案,提供了丰富的安全特性来保护数据。然而,面对复杂的业务需求和不断演变的安全威胁,自定义数据安全策略显得尤为重要。本文将详细探讨如何在SQLServer中......
  • 深入剖析:Apache Flink的Table API与SQL API之差异
    在当今的大数据处理领域,ApacheFlink以其卓越的流处理能力而广受关注。Flink提供了多种API来满足不同场景下的数据流处理需求,其中TableAPI和SQLAPI是两种非常关键的接口。本文将深入探讨这两种API的特点、使用场景以及它们之间的主要区别,并通过少量示例代码来展示它们的应......
  • Java代码审计-SQL注入
    Java代码审计-SQL注入前言一、SQL注入简介二、Java主要执行SQL语句的方式三、JDBC方式产生的漏洞1.Statement方式2.PreparedStatement方式四、MyBatis方式产生的漏洞1.两种参数符号造成的SQL注入2.orderby、like、in引发注入五、Hibernate方式产生的漏洞1.简介2.原理......
  • navicat-mysql重置密码
    目录navicat-mysql重置密码1.Mysql8.0以下2.navicatformysql出现如下问题1.问题描述2.查看用户信息3.问题原因4.解决问题navicat-mysql重置密码1.Mysql8.0以下搜索命令提示符,以管理员身份进入。输入scquerymysql找到Mysql服务名称,然后输入netsotpmysql80(这个是sc......