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

数据库实验——备份与恢复

一、目的(本次实验所涉及并要求掌握的知识点)

1.掌握SQL server的备份与恢复

二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析)

验证性实验

实验1:在资源管理器中建立备份设备实验

第一步:在SQL Server管理平台的【对象资源管理器】窗口中展开【服务器对象】的子节点【备份设备】上单击鼠标右键,弹出快捷菜单,如右图所示。

第二步:单击新建备份设备选项,打开【备份设备】对话框。在【设备名称】文件框中输入“db_school_bakdevice”;在不存在磁带机的情况下,【目标】目标选项自动选中【文件】单选项,在【文件】选项对应的文本框中输入文件路径和名称“C:\back\school_back.bak”,如下图所示。

实验2:在资源管理器中删除备份设备实验

在SQL Server管理平台的【对象资源管理器】窗口中展开【服务器对象】的子节点【备份设备】。在节点【db_school_bakdevice】上单击鼠标右键,弹出快捷菜单中删除该设备,如下图所示。

实验3:通过命令方式建立和删除备份设备实验

1.  建立备份设备

我们可以通过执行系统存储过程sp_addumpdevice的形式,建立一个磁盘备份设备,基本语法是:

EXEC sp_addumpdevice  'device_type' , 'logical_name'  , 'physical_name',

其中各个参数的含义是:

device_type:设备类型,‘disk|tape’, “disk”表示磁盘,“tape”表示磁带。

logical_name:逻辑磁盘备份设备名。

physical_name:物理磁盘备份设备名。

--例1:使用T-SQL语句的存储过程sp_addumpdevice命令行创建磁盘备份设备的物理备份设备名为“E:\backup\student_bak”,逻辑备份设备名为“db_student_bakdevice”。

exec sp_addumpdevice 'disk','db_student_bakdevice','E:\backup\student_bak'

2.删除备份设备

删除一个磁盘备份设备的基本语法是:

EXEC sp_dropdevice  'logical_name'  , ‘delfile'

其中各个参数的含义是:

logical_name:逻辑磁盘备份设备名。

delfile:表示是否同时删除磁盘备份物理设备名。

--例2:使用T-SQL语句的存储过程sp_dropdevice命令行删除前面刚创建的磁盘备份设备。

exec sp_dropdevice 'db_student_bakdevice',delfile'

实验1:在资源管理器中进行完全数据备份实验

第一步:打开资源管理器,鼠标右击school数据库,在展开的菜单中选择任务中的备份项。

第二步:在展开的备份数据库界面中,选择备份类型为“完整”,备份组件为数据库,在备份目标为备份到磁盘,选择添加磁盘的具体的路径及备份文件名为C:\school_fullback.bak,如图所示。点击确定后完成完全数据备份的工作,所生成的C:\school_fullback.bak文件将在后面数据库恢复中被重新应用。

实验2:通过命令行进行完全数据备份实验

第一步:sp_addumpdevice 是系统存储过程,用于创建磁盘备份文件,其基本命令行如下所示:

sp_addumpdevice [@devtype=]'device_type',[@logicalname=]'logical_name',[ @physicalname = ] 'physical_name'[,{[@cntrltype = ] controller_type|[@devstatus=]'device_status' }]

use master--首先,进入master数据库。

Go

--下面,在C盘下建立文件夹back,然后分别执行下面的三个磁盘备份文件。

exec sp_addumpdevice 'disk','backup_file1','c:\back\backup_file1.bak'

exec sp_addumpdevice 'disk','backup_file2','c:\back\backup_file2.bak'

exec sp_addumpdevice 'disk','backup_log','c:\back\backup_log.bak'

实验2:通过命令行进行完全数据备份实验

第二步:将school数据库备份到第一步建立的磁盘备份文件中。

BACKUP DATABASE{database_name|@database_name_var} <file_or_filegroup> [ ,...f ]

TO <backup_device> [ ,...n ]  ..[[,]{INIT|NOINIT}]

backup database school to backup_file1 with noinit

backup database school to backup_file2 with init

--请反复执行这两句话,那么我们可以很快从磁盘文件的空间变化中发现init和no init的区别:

--可见,init由于重新建立磁盘备份,因此文件并没有增长;而由于noinit是追加备份,因此磁盘文件增长非常明显。当然,我们也可以不需要使用磁盘备份文件,而通过直接指定磁盘路径的方式实现对数据库文件进行备份。

BACKUP DATABASE school  TO  DISK='D:\ Mydiffbackup.bak'

实验1:通过命令行进行差异数据备份实验

BACKUP DATABASE school  TO  DISK='D:\school_back.bak'  WITH DIFFERENTIAL

  --或者

  backup database school to backup_file2  WITH DIFFERENTIAL

实验2:在管理平台中进行差异数据备份实验

打开备份向导。在“备份数据库”窗口中,选择备份类型为“差异”。在备份的目标中,指定备份到的磁盘文件位置(本例中为C:\back\school.bak文件),如图所示。然后单击“确定”按钮。备份完成后,可以找到C:\back\school.bak文件。差异备份文件要比完全备份文件小得多,因为它仅备份自上次完整备份后更改过的数据。

实验1:在管理平台中进行日志文件备份实验

打开备份向导。在“备份数据库”窗口中,选择备份类型为“事务日志”。在备份的目标中,指定备份到的磁盘文件位置(本例中为c:\back\backup_log.bak文件),如图所示。然后单击“确定”按钮。备份完成后,可以找到c:\back\backup_log.bak文件。

实验2:通过命令行进行日志文件备份实验

--备份事务日志,追加到现有日志文件

backup log school to disk='d:\school_log.bak'  WITH NOINIT

--清空日志文件

backup log school with no_log

--备份事务日志,重写现有日志文件,并尽可能的将所有发生的操作信息到日志文件中

BACKUP LOG school  TO DISK='c:\school_log.bak'  WITH INIT,NO_TRUNCATE

--如果不想要日志或者是日志已没有什么作用时,可以考虑以下的实现方案:

 backup log DBNAME with [no_log|truncate_only][no_truncate]

实验1:在管理平台中利用完全数据备份还原数据库实验

第一步:首先新建一个空的school数据库,而后用鼠标右键单击“对象资源管理器”中的“school”数据库对象。在弹出的快捷菜单中选择“任务”→“还原” →“数据库”选项,如图所示

第二步:在“还原数据库”窗口中,选择还原的数据库为“school”,选择用于还原的备份集为在备份操作中备份的完整数据集,如图所示

在“还原数据库”窗口中选择选项,在还原选项中选“覆盖现有数据库”复选框,如图所示,按“确定”按钮。还原操作完成后,打开“school”数据库,可以看到其中的数据进行了还原。在school中看不到进行完整备份后新增加的school数据,因为还原过程进行了完整备份的还原。

实验2:在管理平台中中利用差异数据备份还原数据库实验

第一步:在实验1的基础上,将school数据库的student表中插入一条学生记录后(假设姓名是关羽,如图所示),选择一次差异数据备份,备份至backup_file2.bak文件中。如图所示。

第二步:删除school数据库,而后先进性一次完全数据备份,但是过程和实验1却不完全一致。在还原数据库的常规选项中的操作过程相同,但是在“选项”中,必须设置其恢复状态为“不对数据库进行任何操作,不回滚未提交事务”,如图所示。即将数据库临时“挂起”,处于恢复状态。

三、实验使用环境(本次实验所使用的平台和相关软件)

  Win11,Sql server 2022

四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)

(一)验证性实验

实验1:在资源管理器中建立备份设备实验

第一步:在SQL Server管理平台的【对象资源管理器】窗口中展开【服务器对象】的子节点【备份设备】上单击鼠标右键,弹出快捷菜单,如右图所示。

第二步:单击新建备份设备选项,打开【备份设备】对话框。在【设备名称】文件框中输入“db_school_bakdevice”;在不存在磁带机的情况下,【目标】目标选项自动选中【文件】单选项,在【文件】选项对应的文本框中输入文件路径和名称“C:\back\school_back.bak”,如下图所示。

实验2:在资源管理器中删除备份设备实验

在SQL Server管理平台的【对象资源管理器】窗口中展开【服务器对象】的子节点【备份设备】。在节点【db_school_bakdevice】上单击鼠标右键,弹出快捷菜单中删除该设备,如下图所示。

实验3:通过命令方式建立和删除备份设备实验

1.  建立备份设备

我们可以通过执行系统存储过程sp_addumpdevice的形式,建立一个磁盘备份设备,基本语法是:

EXEC sp_addumpdevice  'device_type' , 'logical_name'  , 'physical_name',

其中各个参数的含义是:

device_type:设备类型,‘disk|tape’, “disk”表示磁盘,“tape”表示磁带。

logical_name:逻辑磁盘备份设备名。

physical_name:物理磁盘备份设备名。

--例1:使用T-SQL语句的存储过程sp_addumpdevice命令行创建磁盘备份设备的物理备份设备名为“E:\backup\student_bak”,逻辑备份设备名为“db_student_bakdevice”。

exec sp_addumpdevice 'disk','db_student_bakdevice','E:\backup\student_bak'

2.删除备份设备

删除一个磁盘备份设备的基本语法是:

EXEC sp_dropdevice  'logical_name'  , ‘delfile'

其中各个参数的含义是:

logical_name:逻辑磁盘备份设备名。

delfile:表示是否同时删除磁盘备份物理设备名。

--例2:使用T-SQL语句的存储过程sp_dropdevice命令行删除前面刚创建的磁盘备份设备。

exec sp_dropdevice 'db_student_bakdevice',delfile'

实验1:在资源管理器中进行完全数据备份实验

第一步:打开资源管理器,鼠标右击school数据库,在展开的菜单中选择任务中的备份项。

第二步:在展开的备份数据库界面中,选择备份类型为“完整”,备份组件为数据库,在备份目标为备份到磁盘,选择添加磁盘的具体的路径及备份文件名为C:\school_fullback.bak,如图所示。点击确定后完成完全数据备份的工作,所生成的C:\school_fullback.bak文件将在后面数据库恢复中被重新应用。

第一步:sp_addumpdevice 是系统存储过程,用于创建磁盘备份文件,其基本命令行如下所示:

sp_addumpdevice [@devtype=]'device_type',[@logicalname=]'logical_name',[ @physicalname = ] 'physical_name'[,{[@cntrltype = ] controller_type|[@devstatus=]'device_status' }]

use master--首先,进入master数据库。

Go

--下面,在C盘下建立文件夹back,然后分别执行下面的三个磁盘备份文件。

exec sp_addumpdevice 'disk','backup_file1','c:\back\backup_file1.bak'

exec sp_addumpdevice 'disk','backup_file2','c:\back\backup_file2.bak'

exec sp_addumpdevice 'disk','backup_log','c:\back\backup_log.bak'

实验2:通过命令行进行完全数据备份实验

第二步:将school数据库备份到第一步建立的磁盘备份文件中。

BACKUP DATABASE{database_name|@database_name_var} <file_or_filegroup> [ ,...f ]

TO <backup_device> [ ,...n ]  ..[[,]{INIT|NOINIT}]

backup database school to backup_file1 with noinit

backup database school to backup_file2 with init

--请反复执行这两句话,那么我们可以很快从磁盘文件的空间变化中发现init和no init的区别:

--可见,init由于重新建立磁盘备份,因此文件并没有增长;而由于noinit是追加备份,因此磁盘文件增长非常明显。当然,我们也可以不需要使用磁盘备份文件,而通过直接指定磁盘路径的方式实现对数据库文件进行备份。

BACKUP DATABASE school  TO  DISK='D:\ Mydiffbackup.bak'

实验1:通过命令行进行差异数据备份实验

BACKUP DATABASE school  TO  DISK='D:\school_back.bak'  WITH DIFFERENTIAL

  --或者

  backup database school to backup_file2  WITH DIFFERENTIAL

打开备份向导。在“备份数据库”窗口中,选择备份类型为“差异”。在备份的目标中,指定备份到的磁盘文件位置(本例中为C:\back\school.bak文),如图所示。然后单击“确定”按钮。备份完成后,可以找到C:\back\school.bak文件。差异备份文件要比完全备份文件小得多,因为它仅备份自上次完整备份后更改过的数据。

实验1:在管理平台中进行日志文件备份实验

打开备份向导。在“备份数据库”窗口中,选择备份类型为“事务日志”。在备份的目标中,指定备份到的磁盘文件位置(本例中为c:\back\backup_log.bak文件),如图所示。然后单击“确定”按钮。备份完成后,可以找到c:\back\backup_log.bak文件。

实验2:通过命令行进行日志文件备份实验

--备份事务日志,追加到现有日志文件

backup log school to disk='d:\school_log.bak'  WITH NOINIT

--清空日志文件

backup log school with no_log

--备份事务日志,重写现有日志文件,并尽可能的将所有发生的操作信息到日志文件中

BACKUP LOG school  TO DISK='c:\school_log.bak'  WITH INIT,NO_TRUNCATE

--如果不想要日志或者是日志已没有什么作用时,可以考虑以下的实现方案:

 backup log DBNAME with [no_log|truncate_only][no_truncate]

实验1:在管理平台中利用完全数据备份还原数据库实验

第一步:首先新建一个空的school数据库,而后用鼠标右键单击“对象资源管理器”中的“school”数据库对象。在弹出的快捷菜单中选择“任务”→“还原” →“数据库”选项,如图所示

第二步:在“还原数据库”窗口中,选择还原的数据库为“school”,选择用于还原的备份集为在备份操作中备份的完整数据集,如图所示

在“还原数据库”窗口中选择选项,在还原选项中选“覆盖现有数据库”复选框,如图所示,按“确定”按钮。还原操作完成后,打开“school”数据库,可以看到其中的数据进行了还原。在school中看不到进行完整备份后新增加的school数据,因为还原过程进行了完整备份的还原。

实验2:在管理平台中中利用差异数据备份还原数据库实验

第一步:在实验1的基础上,将school数据库的student表中插入一条学生记录后(假设姓名是关羽,如图所示),选择一次差异数据备份,备份至backup_file2.bak文件中。如图所示。

第二步:删除school数据库,而后先进性一次完全数据备份,但是过程和实验1却不完全一致。在还原数据库的常规选项中的操作过程相同,但是在“选项”中,必须设置其恢复状态为“不对数据库进行任何操作,不回滚未提交事务”,如图所示。即将数据库临时“挂起”,处于恢复状态。

综合实训 SQL Server备份方法实训

--实验1:首先开始进行完全数据备份

backup database d1 to bak1 with init

backup database d1 to bak1 with noinit

--注意,参数init和noinit的差异性

use master

go

-- 创建名为bak1的磁盘备份设备,指定实际存储路径,这里假设路径为D:\backup\bak1.bak,需根据实际情况调整

exec sp_addumpdevice 'disk', 'bak1', 'D:\backup\bak1.bak'

go

-- 第一次备份使用INIT参数,创建新的备份集并覆盖现有备份

backup database d1 to bak1 with init

-- 后续备份使用NOINIT参数,追加到现有备份集

backup database d1 to bak1 with noinit

--实验2:下面开始进行差异备份,第一次备份时应做完全备份 ★ ★ ★

backup database d2 to bak2 with init,name='d2_full'

--建立表b1                                                                               R1

create table b1(c1 int not null,c2 char(10) not null)

--每次插入更新的数据后,都进行差异数据备份                                   R2

backup database d2 to bak2 with differential,name='d2_diff1'

insert b1 values(1,'a')

backup database d2 to bak2 with differential,name='d2_diff2‘                                 R3

insert b1 values(2,'b')

backup database d2 to bak2 with differential,name='d2_diff3‘                                 R4

insert b1 values(3,'c')

backup database d2 to bak2 with differential,name='d2_diff4‘                          R5

restore headeronly from bak2

use master

go

-- 创建磁盘类型的备份设备bak2,指定实际存储路径,这里假设路径为D:\backup\bak2.bak,需根据实际情况调整

exec sp_addumpdevice 'disk', 'bak2', 'D:\backup\bak2.bak'

go

-- 首先进行完全备份,使用INIT创建新备份集

backup database d2 to bak2 with init,name='d2_full' 

-- 创建测试表

create table b1(c1 int not null,c2 char(10) not null)

-- 每次数据变更后进行差异备份

backup database d2 to bak2 with differential,name='d2_diff1'

insert b1 values(1,'a')

backup database d2 to bak2 with differential,name='d2_diff2'

insert b1 values(2,'b')

backup database d2 to bak2 with differential,name='d2_diff3'

insert b1 values(3,'c')

backup database d2 to bak2 with differential,name='d2_diff4'

-- 查看备份集信息

restore headeronly from bak2

  

五、实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)

1.“无法打开备份设备 'bak1 (D:\backup\bak1.bak)' 。出现操作系统错误 3 (系统找不到指定的路径。)” 说明指定的备份文件存储路径 D:\backup 不存在。

解决办法:

手动创建路径:打开文件资源管理器,在 D: 盘下手动创建名为 backup 的文件夹。同时,要确保 SQL Server 服务账户(一般是 NT Service\MSSQLSERVER )对该文件夹有读写权限。可以通过文件夹属性 - 安全选项卡来检查和设置权限。

2.

该错误提示表明在执行备份操作时,指定的备份设备bak1不存在。

解决办法:

使用存储过程创建备份设备,可以通过sp_addumpdevice存储过程来创建备份设备。

3.逻辑设备已存在的冲突

执行sp_addumpdevice时提示 “逻辑设备‘bak1’已存在”。因为目标逻辑设备名称已被占用。

解决方法:直接使用已存在的设备名称进行备份,无需重复创建。

4.简单恢复模式下无法备份日志的错误

执行BACKUP LOG时提示 “当恢复模式为 SIMPLE 时,不允许使用 BACKUP LOG 语句”。数据库恢复模式为 “简单”,不支持事务日志备份。

解决方法:将数据库恢复模式改为 “完整” 或 “大容量日志”

实验体会和收获

熟练掌握了 SQL Server 中备份设备的创建与删除(通过 SSMS 图形界面和sp_addumpdevice/sp_dropdevice命令)。

理解了完全备份、差异备份和日志备份的区别与应用场景:

完全备份:完整复制数据库,占用空间大,用于初始备份。

差异备份:仅备份自上次完全备份后的变更,依赖完全备份。

日志备份:记录事务日志,需配合完整恢复模式使用,用于数据点恢复。

学会使用RESTORE HEADERONLY/FILELISTONLY等命令查询备份集信息,辅助恢复操作。

本次实验通过理论与实践结合,系统学习了 SQL Server 备份与恢复的全流程,熟悉了不同备份类型的操作细节及常见问题处理。未来需进一步结合实际场景,优化备份策略,确保数据库在故障情况下能够快速、完整地恢复,保障数据安全与业务连续性。

相关文章:

  • JavaScript 深拷贝:从基础到实践的全面指南
  • 2025年- H38-Lc146 --142.环形链表(快慢指针,快2慢1,快1慢1)--Java版
  • 前端流行框架Vue3教程:21. 插槽(3)
  • C语言| 指针变量的初始化
  • 如何测试北斗卫星通讯终端的性能?
  • DEBUG:Lombok 失效
  • C++类与对象--6 特性二:继承
  • std::vector<>.emplace_back
  • flutter设置最大高度,超过最大高度时滑动显示
  • 使用frp内网穿透本地的虚拟机
  • spring event事件(四)内部事件(1)ApplicationReadyEvent
  • 介绍Buildroot
  • 2025ICPC南昌邀请赛题解
  • 记录学习的第三十六天
  • ZYNQ Cache一致性问题解析与实战:从原理到创新优化
  • PEFT简介及微调大模型DeepSeek-R1-Distill-Qwen-1.5B
  • mysql不能聚合之数据清洗逗号
  • 第7天-Python+PyEcharts实现股票分时图实战教程
  • OD 算法题 B卷 【需要打开多少监视器】
  • 算法打卡第一天
  • 11次战斗起飞应对外军挑衅,逼退外军直升机细节曝光
  • 存款利率、LPR同日下调,机构称对银行的影响偏正面
  • 财政部:鼓励政策性银行对符合条件的城市更新项目提供支持
  • 推动粒子治疗更加可及可享!龚正调研上海市质子重离子医院
  • 网络直播间销售玩具盲盒被指侵权,法院以侵犯著作权罪追责
  • 取得金奖西瓜品种独家使用权的上海金山,为何要到异地“试种”?