前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL Server 数据误删的恢复

SQL Server 数据误删的恢复

作者头像
Damon小智
发布2024-07-25 15:23:29
400
发布2024-07-25 15:23:29
举报
文章被收录于专栏:全栈文档库

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

一、模拟误删

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

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

SSMS 连接本地 SQL Server。

001 - SQL Server 数据误删的恢复
001 - SQL Server 数据误删的恢复

添加描述

命名数据库为 “Test”。

002 - SQL Server 数据误删的恢复
002 - SQL Server 数据误删的恢复

添加描述

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

代码语言:javascript
复制
-- 创建数据库
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());
003 1024x566 - SQL Server 数据误删的恢复
003 1024x566 - SQL Server 数据误删的恢复

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


2. 数据库全量备份

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

全量备份流程:

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

004 - SQL Server 数据误删的恢复
004 - SQL Server 数据误删的恢复
005 - SQL Server 数据误删的恢复
005 - SQL Server 数据误删的恢复

备份成功。

006 - SQL Server 数据误删的恢复
006 - SQL Server 数据误删的恢复

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


3. 未备份的新操作

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

代码语言:javascript
复制
-- 插入五条测试数据
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());
007 1024x591 - SQL Server 数据误删的恢复
007 1024x591 - SQL Server 数据误删的恢复

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


4. 模拟数据误删

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

代码语言:javascript
复制
-- 模拟全量更新操作,导致手机号码丢失
UPDATE Student
SET phone = NULL;
008 1024x553 - SQL Server 数据误删的恢复
008 1024x553 - SQL Server 数据误删的恢复

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

0081 - SQL Server 数据误删的恢复
0081 - SQL Server 数据误删的恢复

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

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


二、数据恢复步骤

1. 备份日志

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

代码语言:javascript
复制
-- 备份当前的事务日志
BACKUP LOG Test TO DISK='d:\testLOG.bak' WITH FORMAT
GO
009 - SQL Server 数据误删的恢复
009 - SQL Server 数据误删的恢复

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


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

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

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

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

011 - SQL Server 数据误删的恢复
011 - SQL Server 数据误删的恢复
010 - SQL Server 数据误删的恢复
010 - SQL Server 数据误删的恢复

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

013 - SQL Server 数据误删的恢复
013 - SQL Server 数据误删的恢复

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

012 - SQL Server 数据误删的恢复
012 - SQL Server 数据误删的恢复

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

点击“确定”开始还原。

014 - SQL Server 数据误删的恢复
014 - SQL Server 数据误删的恢复

还原成功。


3. 检验恢复结果

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

代码语言:javascript
复制
-- 查看 Student 表中的数据
SELECT TOP (1000) [id]
      ,[name]
      ,[phone]
      ,[gender]
      ,[created_at]
  FROM [Test].[dbo].[Student]
015 - SQL Server 数据误删的恢复
015 - SQL Server 数据误删的恢复

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


4. 恢复数据库可读写

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

代码语言:javascript
复制
-- 切换到 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;
016 - SQL Server 数据误删的恢复
016 - SQL Server 数据误删的恢复

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-7-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、模拟误删
    • 1. 创建表并插入测试数据
      • 2. 数据库全量备份
        • 3. 未备份的新操作
          • 4. 模拟数据误删
          • 二、数据恢复步骤
            • 1. 备份日志
              • 2. 还原数据库到指定时间点
                • 3. 检验恢复结果
                  • 4. 恢复数据库可读写
                  相关产品与服务
                  数据库
                  云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档