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

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

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

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 备份与恢复的全流程,熟悉了不同备份类型的操作细节及常见问题处理。未来需进一步结合实际场景,优化备份策略,确保数据库在故障情况下能够快速、完整地恢复,保障数据安全与业务连续性。

http://www.xdnf.cn/news/7629.html

相关文章:

  • 【普及−】洛谷P1862 ——输油管道问题
  • 【latex】文本颜色修改
  • 【QT】QTableWidget获取width为100,与真实值不符问题解决
  • C++ 网络编程(9)字节序处理和消息队列的控制
  • 缺乏进度跟踪机制,如何掌握项目状态?
  • MyBatis常用方法
  • 零售EDI:Belk Stores EDI需求分析
  • 阅读笔记---城市计算中用于预测学习的时空图神经网络研究综述
  • 《从零开始构建高可用MySQL架构:全流程实战指南》
  • 无人机避障——深蓝学院浙大Fast-planner学习部分(轨迹生成B-Spline部分)
  • Spring是如何实现scope作用域支持
  • 家用和类似用途电器的安全 第1部分:通用要求 与2005版差异(6)
  • pmap中的mode列,脏页,写时复制
  • 公路水运安全员C证用途及重要性
  • 测试工程师要如何开展单元测试
  • JavaSenderMail发送邮件(QQ及OFFICE365)
  • 如何使用通义灵码玩转Python - AI编程助手提升效率
  • 【工具变量】地级市健康城市试点政策数据集(2007-2024年)
  • 香港科技大学广州香港科技大学硕博士研究生学位项目宣讲会(智能制造硕博士物理学硕士)—深圳大学专场
  • 大模型从基础到入门 记录
  • 测试W5500的第3步_使用ioLibrary库创建TCPServer
  • [特殊字符] jQuery 响应式瀑布流布局插件推荐!
  • 2025年JIII SCI1区TOP,多策略霜冰优化算法IRIME+无人机路径规划,深度解析+性能实测
  • [创业之路-370]:企业战略管理案例分析-10-战略制定-差距分析的案例之小米
  • AI大模型从0到1记录学习 大模型技术之数学基础 day26
  • AR0144CSSC20SUKA0-CRBR——1/4英寸 1.0 MP 高性能CMOS图像传感器解析
  • 多路视频直播用在线云导播切换的效果测试
  • [春秋云镜] Spoofing仿真场景
  • 软考软件测评师——系统安全设计(防火墙技术)
  • 每日一题:1、虚拟IPv4地址转换为32位整数(JS)