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