第5章〓数据库的备份与还原、导入与导出
计算机系统中硬件故障、软件错误、操作员失误以及恶意破坏是不可避免的,这些故障轻则造成运行事务非正常中断,影响数据库的正确性,重则破坏数据库,使数据库部分或全部数据丢失。DBMS必须具有把数据库从错误状态恢复到某一已知的正确状态的功能,这就是数据库的恢复。恢复子系统是DBMS的一个重要组成部分,保证故障发生后能把数据库中的数据从错误状态恢复到某一已知的正确状态,保证事务ACID。恢复技术是衡量系统优劣的重要指标。备份和恢复还可以用作其他用途。例如,将一台服务器上的数据库备份下来,再恢复到其他服务器上,实现快捷地移动数据库。

由于数据库在物理上由数据文件、控制文件等构成,在逻辑上由表空间、表、索引等组成,因此数据丢失可分为物理丢失和逻辑丢失两类。相应地,SQL Server能够通过数据库备份和导入/导出实现物理数据备份与逻辑数据备份,可以单独使用,也可以集成使用。


5.1SQL Server数据库的备份
5.1.1实验目的

理解数据库备份的原理,掌握备份数据库的方法和验证备份文件,并学会制订合适的备份计划。

5.1.2原理解析

数据库中的数据对于用户来说是非常宝贵的资产,但数据库并非绝对安全,潜在的可能造成数据库故障的因素有很多,如系统故障、事务故障、存储介质故障和自然灾害等。进行数据库恢复的重要基础,就是要存在数据库的各种备份。数据库的备份是数据库结构、对象和数据的“副本”,是在数据库灾难发生时的最后一道防线,使得数据库系统在发生故障后能还原和恢复数据库中的数据。数据库备份是一项重要的日常工作。

1. 恢复模式

恢复模式是数据库的一个属性,用于控制数据库备份和还原操作的基本行为。例如,恢复模式控制了将事务记录在日志中的方式、事务日志是否需要备份以用于还原操作等。备份和还原操作都是在一定的恢复模式下进行的。

在SQL Server数据库管理系统中,提供了以下3种恢复模式。

(1) 简单恢复模式: 简略地记录大多数事务日志,事务日志被自动截断,不能使用日志文件进行恢复。

(2) 完整恢复模式: 完整地记录了所有事务,并保留所有的事务日志记录,直到将其备份。

(3) 大容量日志恢复模式: 简略地记录大多数大容量操作(如索引创建、大容量加载等),完整地记录其他事务日志。大容量日志恢复模式是兼顾了简单恢复模式和完整恢复模式两者的优点所做出的一种平衡,如表5.1.1所示。


表5.1.1SQL Server的恢复模式

恢 复 模 式可选择的备份类型优点数据丢失情况恢复到即时点


简单恢复模式完全备份、差异备份允许高性能、大容量复制操作。最小的日志空间占用
数据库备份后所做的更改丢失只能恢复到备份时刻

完全恢复模式完全备份、差异备份、事务日志备份、文件或文件组备份最小的数据丢失可能,恢复到即时点
日志不损坏将不丢失任何数据可以恢复到任何即时点
大容量日志恢复模式完全备份、差异备份、事务日志备份、文件或文件组备份
允许高性能、大容量复制操作。较小的日志空间占用会丢失备份后大容量操作的数据可以恢复到任何备份的结尾处


2. 备份设备

备份存放在物理备份介质上,备份介质可以是磁带,也可以是本地或网络上的磁盘。备份设备代表备份介质,用来指明备份的存储位置。用于数据库备份的设备有许多类型,如磁盘备份设备、磁带备份设备和命名管道备份设备等。

(1) 磁盘备份设备通常是硬盘或其他磁盘类存储介质,可以定义在数据库服务器的本地磁盘上,也可以定义在通过网络连接的远程磁盘上。如果磁盘备份设备定义在网络上的远程设备上,则应使用统一命名方式(UNC)来引用该文件,例如\\Servername\Sharename\Path\File。

(2) 磁带备份设备必须直接物理连接在SQL Server服务器所在的计算机上。

(3) 命名管道备份设备为使用第三方的备份软件和设备提供了一个灵活的、功能强大的通道。

SQL Server使用逻辑设备或物理设备两种方式来标识备份设备。

(1) 物理备份设备名主要用于供操作系统对备份设备进行引用和管理,例如D:\Backup\School\Full.bak。

(2) 逻辑备份设备是物理备份设备的别名,通常比物理备份设备名更直观、有效地描述备份设备的特征,主要用于供用户或用户程序对备份设备进行操作。使用逻辑备份设备名的好处在于可以使用一种相对简单的方式来实现对物理备份设备的引用。例如,可以使用逻辑备份设备名SchoolBackup来引用上述物理备份设备。

在执行数据库的备份或恢复操作过程中,既可以使用逻辑备份设备名也可以使用物理备份设备名。

注意: 实际应用中不会把数据库备份至数据库服务器所在的磁盘,以避免出现介质故障时损失数据库原文件和备份文件。

3. 备份类型

(1) 完整备份是完整地备份整个数据库。备份操作时,SQL Server把所有完成的事务写到磁盘上,然后开始复制数据库。没有完成或者备份开始时没有发生的事务,将不被复制。这种备份需要较大的存储空间和较长的存储时间,因此创建完整备份的频率往往较低。

完整数据库备份为差异备份、事务日志备份创建基准数据库备份,其他所有备份类型都依赖于完整备份。

(2) 差异备份(又称为增量备份)记录自从做完上一个完整备份以来数据库中已发生的所有变化。同样不处理没有完成或者备份开始时没有发生的事务,只提供将数据库恢复到差异数据库创建时的能力,但不具备恢复到失效点的能力。由于仅仅备份上一次完整备份以来数据库中发生的所有变化,因此备份数据量比完整备份要小,而且备份速度也要快,便于经常性的备份任务。

(3) 事务日志备份将对上一次完整备份、差异备份或者事务日志备份以来数据库中所有发生并已完成的事务日志进行记录。事务日志备份还可以截断事务日志的非活动部分。

(4) 文件或文件组备份针对大型数据库,可以分别备份和还原数据库中的个别文件或文件组,每次只从数据库中备份一部分,主要应用于系统没有足够的时间进行完整备份、差异备份的情形。

上述几种备份类型都属于物理备份。备份了数据文件、控制文件和归档日志等。如果发生物理数据库丢失或崩溃,利用物理备份能将数据丢失减少到最小甚至完全恢复。物理备份是不可移植的,仅能应用于以下两种情况的恢复。

(1) 应用于相同的机器、相同的SQL Server版本以及实例上的恢复。

(2) 当两种机器是相同的体系结构、相同的操作系统版本以及SQL Server版本时,把数据从一个系统完全移植到另一个系统。

4. 影响备份计划的因素

数据备份策略是基于数据恢复的需要而制定的,备份的频率和范围依赖于应用和业务的要求。使用哪种备份方案或计划最好没有一个固定的样式,应视具体情况而定。为了保证数据库的安全,需要制订良好的数据库备份计划。影响备份计划的因素包括数据库的规模、备份的介质、数据库的可用性、可接受的停工时间和可接受的数据损失等。

5.1.3实验内容

(1) 将school数据库的恢复模式设置为“完整”。

(2) 为school数据库创建一个新的备份设备。

(3) 为school数据库分别创建一个完整备份、差异备份和事务日志备份。

5.1.4实验步骤

(1) 使用SQL Server Management Studio查看、设置或更改数据库的恢复模式。步骤如下: 

① 从“开始”→“程序”→Microsoft SQL Server 2019→SQL Server Management Studio进入SQL Server 2019的图形化界面,进行数据库的管理和维护。

② 连接到相应的服务器后,在“对象资源管理器”中展开“数据库”,右击school数据库,在弹出的快捷菜单中选择“属性”选项,如图5.1.1所示。

③ 在“数据库属性school”对话框中的左侧的“选择页”窗格中单击“选项”,此时可以在对话框右侧看到“恢复模式”列表框,在该列表框中有完整、大容量日志和简单三项选择,选择“完整”,单击“确定”按钮完成恢复模式的设置,如图5.1.2所示。

也可以使用TransactSQL设置数据库恢复模式以及使用DATABASE语句的RECOVERY子句设置恢复模式。

例如,将school数据库设置为完全恢复模式,可以使用如下语句: 

ALTER DATABASE school SET RECOVERY FULL

(2) 在SQL Server 2019中可以使用SSMS创建备份设备。

步骤如下: 

① 在“对象管理器”中展开“服务器”,然后展开“服务器对象”。

② 右击“服务器对象”子菜单下的“备份设备”,在弹出的快捷菜单中选择“新建备份设备”选项,如图5.1.3所示。



图5.1.1




图5.1.2




图5.1.3


③ 在“备份设备SchoolBackup”对话框中的“设备名称”文本框中输入SchoolBackup,在“文件”文本框中输入或定位备份设备文件的物理地址,如图5.1.4所示。



图5.1.4


④ 单击“确定”按钮,完成备份设备的创建。

(3) 使用数据库的3种备份类型对数据库进行备份。

① 通过完整备份可以生成备份完成时数据库的一致性快照。

SQL Server在备份开始时记录日志序列号LSN。写入日志的每个记录指定一个LSN,用于跟踪变化,同时复制数据库的页组。值得指出的是,因为完整备份是一个动态备份过程,为了保证得到完全一致快照,SQL Server在备份页组时,再次记录LSN,备份第一个LSN和最后一个LSN之间的日志部分,添加到备份中。为了节省备份时间,通常在数据库活动较少的时间进行完整备份。

数据库的完整备份,可以用两种不同的方式进行。

一种是使用SSMS进行完整备份,在SSMS中,可以通过向导在图形界面环境下备份数据库,步骤如下。 

第1步,进入SSMS,右击“对象资源管理器”中school数据库,在弹出的快捷菜单中选择“任务”→“备份”选项,如图5.1.5所示。



图5.1.5


第2步,在如图5.1.6所示的“备份数据库school”对话框的“常规”选择页进行如下操作。 

在“源”选项区域中,在“数据库”下拉列表框中选择所要备份的school数据库; 由于此前已设置恢复模式为“完全”,此时“恢复模式”文本框中为灰色且不可修改的Full(Full是命令中设置完整备份的关键字,意为“完整”); 在“备份类型”下拉列表框中选择“完整”。

在“备份集”选项区域中,在“名称”文本框中输入备份集名称,如“school完整 数据库 备份”; 在“说明”文本框中输入对备份集的描述(可选),如图5.1.7所示。

在“目标”选项区域中,在“备份到”下拉列表框中选择“磁盘”或URL,选择“磁带”或“磁盘”单选按钮,指定备份的目标。如果没有出现备份目标,则单击“添加”按钮添加现有的目标或创建新的目标,也可以是前面创建的备份设备,如图5.1.8所示。



图5.1.6 




图5.1.7




图5.1.8 


第3步,在如图5.1.9所示的“备份数据库school”对话框的“介质选项”选择页下,可进行如下操作: 在“可靠性”选项区域中,如果选择“完成后验证备份”复选框,则在备份完成后将对备份进行验证以确保备份与数据库的一致性; 如果选择“写入介质前检查校验和”复选框,则在备份前将检查所要备份数据的检验和,确保其正确性。



图5.1.9 


在“备份选项”选择页中,在“名称”文本框中输入备份集名称,如“school完整 数据库 备份”; 在“说明”文本框中输入对备份集的描述(可选)。

第4步,完成以上完整备份选项设置后,单击“确定”按钮,开始创建数据库的完整备份。

当成功创建备份后,将出现如图5.1.10所示的提示框。



图5.1.10 


另一种完整备份的方式是使用TransactSQL的BACKUP命令进行。

TransactSQL提供了BACKUP DATABASE语句对数据库进行备份,其语法格式如下: 

BACKUP DATABASE database_name TO{DISK|TAPE}='name'

其中,参数database_name指定要备份的数据库; TO{DISK|TAPE}说明备份到磁盘或磁带; name指定备份使用的物理文件名或备份设备名。

例如,为school数据库执行完整备份到前面创建的备份设备SchoolBackup,可以使用代码5.1.1: 

BACKUP DATABASE school TO SchoolBackup





代码5.1.1

② 数据库差异备份是备份自上次完整备份以来数据库中所有已发生变化的页组。与完整备份相比,具有速度快、占用空间小等优点。但是要利用数据库差异备份来正确恢复数据库,数据库的完整备份是必要前提。假设在星期一对数据库school进行了完整备份,以后每天晚上进行一次差异备份。当数据库在星期六发生故障后,则只需要还原数据库的完整备份和最后一个差异备份,就可以将数据库恢复到最近的正确状态。

数据库的差异备份,也可以用以上两种方式进行。

利用SSMS进行数据库的差异备份的步骤和完整备份差不多,只要在如图5.1.9所示的“备份数据库school”对话框的“常规”选择页中“源”选项区域,将“备份类型”设为“差异”即可(见图5.1.11)。



图5.1.11


同样也可以使用TransactSQL的BACKUP命令对数据库进行差异备份,其语法格式如下: 

BACKUP DATABASE database_name TO{DISK|TAPE}='name' WITH DIFFERENTIAL

其中,参数WITH DIFFERENTIAL表示差异备份。

例如,为school数据库执行差异备份到前面创建的备份设备SchoolBackup,可以使用如下语句: 

BACKUP DATABASE school TO SchoolBackup WITH DIFFERENTIAL

③ 数据库事务日志备份用于复制数据库事务日志中的事务,然后删除活动部分以外的所有日志,释放空间。事务日志是上次日志备份以来所有事务的顺序记录,利用事务日志可以将数据库恢复到出故障的时刻。备份日志后,可以将事务日志截断,即从日志中清除非活动事务,为新事务腾出空间,防止日志填满或在日志设置为自动扩大文件时变得太大。

事务日志备份也可以使用以上两种方式。利用SSMS进行数据库的差异备份的步骤和完整备份差不多,只要在如图5.1.9所示的“备份数据库school”对话框的“常规”选择页中“源”选项区域,将“备份类型”设为“事务日志”即可。

也可以使用TransactSQL的BACKUP命令对数据库进行差异备份,其语法格式如下: 

BACKUP LOG database_name TO{DISK|TAPE}= 'name'

其中,参数LOG表示事务日志。

例如,为school数据库执行事务日志备份到此前创建的备份设备SchoolBackup,可以使用代码5.1.2: 

BACKUP LOG school TO SchoolBackup





代码5.1.2

注意: 简单恢复模式不允许各份事务日志文件。

5.1.5自我实践

对AdventureWorks数据库分别进行完整备份、差异备份和事务日志备份。

5.2SQL Server数据库的还原
5.2.1实验目的

理解数据库还原原理,掌握数据库还原的策略与方法。

5.2.2原理解析

数据库的还原是数据库备份的逆操作,将数据库恢复到备份前的状态。数据库还原过程分为3个阶段。

(1) 数据复制阶段,从数据库做好备份将所有数据、日志和索引页复制到数据库文件中。

(2) 重做(Redo)/前滚(Roll Forward)阶段,将记录的事务应用到从备份复制的数据,以将这些数据前滚到恢复点。

(3) 撤销(Undo)/回滚(Roll Back)阶段,回滚所有未提交的事务并使用户可以使用此数据库。

在还原数据库之前,要注意以下两点。

(1) 检查备份设备或文件。在还原数据库之前,首先找到要还原的备份文件或备份设备,并检查备份文件或备份设备里的备份集是否正确无误,例如使用RESTORE VERIFYONLY语句。

(2) 查看数据库的使用状态。在还原数据库之前,要先查看数据库是否还有其他人在使用,如果还有其他人在使用,将无法还原数据库。

5.2.3实验内容

(1) 根据school数据库的完整数据库备份进行数据库恢复。

(2) 根据school数据库的差异备份进行数据库恢复。

(3) 根据school数据库的事务日志备份进行数据库恢复。

(4) 对school数据库进行即时点还原。

5.2.4实验步骤

根据不同的备份策略,有不同的还原方法。具体来说有以下几种。 

1. 根据完整数据库备份进行恢复

根据完整数据库备份进行恢复,可以用两种不同的方式进行。

一种是使用SSMS进行还原,在SSMS中,可以通过向导在图形界面环境下还原数据库,步骤如下。 

(1) 打开SSMS,右击“对象资源管理器”中的school数据库,在弹出的快捷菜单中选择“任务”→“还原”→“数据库”选项,如图5.2.1所示。

(2) 在“还原数据库school”对话框的“常规”选择页中,选择“目标数据库”为school,选择“要还原的备份集”类型为“完整”的“school完整 数据库 备份”选项,如图5.2.2所示。

(3) 在“还原数据库school”对话框的“选项”选择页中,在“还原选项”选项区域中选择“覆盖现有数据库”复选框,单击“确定”按钮,完成对数据库的还原操作,如图5.2.3所示。

还可以使用TransactSQL的RESTORE命令进行数据库的恢复。

TransactSQL提供了RESTORE DATABASE语句对数据库进行还原,其语法格式如下: 

RESTORE DATABASE database_name FORM{DISK|TAPE}='name'

[WITH[NORECOVERY|][REPLACE]]

其中,参数NORECOVERY表示还原操作不撤销备份中任何未提交的事务; RECOVERY表示还原操作撤销备份中任何未提交的事务; REPLACE表示即使存在另一个具有相同名称的数据库,也创建指定的数据库及相关文件,即覆盖现有数据库。

注意: 在数据库恢复后就使用数据库,应选用RECOVERY。



图5.2.1




图5.2.2 





图5.2.3 


例如,利用此前创建的数据库完整备份为school数据库进行数据库恢复,可以使用代码5.2.1: 

RESTORE DATABASE school FROM schoolBackup WITH NORECOVERY





代码5.2.1

2. 根据差异备份进行恢复

利用SSMS进行还原数据库的差异备份的步骤和还原完整备份相似,只是在上述第(2)步中图5.2.2所示的“还原数据库school”对话框的“常规”选择页中选择“要还原的备份集”栏中类型为“差异”的差异备份集。选择差异备份集后,完整备份集会自动被选中,如图5.2.4所示。



图5.2.4


3. 根据事务日志备份进行恢复

采用事务日志备份进行数据库恢复,SQL Server将只恢复事务日志中所做的事务更改。


利用SSMS进行还原数据库的事务日志备份的步骤和还原完整备份相似,只是在图5.2.2所示的“还原数据库school”对话框的“常规”选择页中选择“要还原的备份集”栏中类型为“事务日志”的事务日志备份集。选中事务日志备份集后,完整备份集和差异备份集会自动被选中。

使用TransactSQL的RESTORE命令进行数据库的恢复。

TransactSQL提供了RESTORE DATABASE语句对数据库进行还原,其语法格式如下: 

RESTORE LOG database_name FORM{DISK|TAPE}='name'[WITH [NORECOVERY|RECOVERY]

[STOPAT=date_time|STOPATMARK='mark_name'[AFTER date_time]

ISTOPBEF0REMARK ='mark_name'[AFTER date_time]]


其中,参数STOPAT表示数据库恢复到指定日期时间,STOPATMARK表示数据库恢复到指定标记的状态。所有中间恢复都用NORECOVERY,最后一个则不用。

4. 即时点恢复

在完全恢复模式下,所有数据库完整备份和差异备份均包含日志记录,使得数据库也能像事务日志一样实现即时点还原,将数据库恢复到备份前的任意时间点。

利用SSMS进行即时点还原的步骤与一般的还原操作步骤相似,只是在上述第2步中图5.2.2所示的“还原数据库school”对话框的“常规”选择页中,单击“目标”选项区域的“还原到”文本框后的定位按钮“时间线”,弹出如图5.2.5所示的“备份时间线school”对话框。



图5.2.5 


在“备份时间线school”对话框的“还原到”选项区域中,选择“特定日期和时间”单选按钮,在“日期”和“时间”列表框中选择或输入所要还原到的目标时间,单击“确定”按钮完成即时点还原的设置。


5.2.5自我实践

对AdventureWorks数据库执行插入、删除或更新操作,再利用AdventureWorks数据库的备份进行还原,对比还原前和还原后的数据库状态。

5.3SQL Server数据库的导入与导出
5.3.1实验目的

理解数据库的导入与导出原理,学会将SQL Server数据库中的数据导出以及将其他类型数据导入至SQL Server数据库操作。

5.3.2原理解析

数据库的逻辑备份是针对表空间、索引和表记录等数据库逻辑组件的丢失进行的,如果丢失了逻辑组件,用逻辑备份恢复最快。同时,逻辑备份是可移植的,当需要在不同的系统结构、操作系统版本或SQL Server版本之间复制一个实例的全部数据时也要使用逻辑备份系统。SQL Server逻辑备份是通过“导入/导出”操作实现的。“导入”是将数据从数据文件中加载到SQL Server数据库中; “导出”是将数据从数据库中复制到数据文件中。通过导入与导出操作可以实现SQL Server和其他不同类型数据源(如Oracle、Access等数据库)之间自由地移动和使用多种不同格式的数据。

5.3.3实验内容

(1) 从school数据库中的STUDENTS表中的数据导出到文本文件Learner中。

(2) 将文本文件Learner中的数据导入school数据库中的STUDENTS表中。

5.3.4实验步骤
1. 数据库表数据的导出

利用SSMS中的“SQL Server导入和导出向导”将SQL Server数据库中的表数据导出,步骤如下。 

(1) 进入SSMS,右击“对象资源管理器”中的school数据库,在弹出的快捷菜单中选择“任务”→“导出数据”选项,如图5.1.5所示。

(2) 在“SQL Server导入和导出向导”对话框的“选择数据源”页中,选择要从中复制数据的数据源,单击Next按钮,如图5.3.1所示。



图5.3.1


(3) 在“SQL Server导入和导出向导”对话框“选择目标”页的“目标”下拉列表框中选择导出数据的目标,即指定将SQL Server数据库中的数据复制到何处。如果选择Microsoft Access选项,则将SQL Server数据库的数据复制到Access数据库中; 如果选择SQL Native Client选项,则将本地的SQL Server数据库的数据复制到其他SQL Server服务器中。

在“目标”下拉列表框中选择“平面文件目标”( Flat File Destination)选项,再指定相应文件名,然后单击Next按钮,如图5.3.2所示。

(4) 在“SQL Server导入和导出向导”对话框的“指定表复制或查询”页中,指定所要复制的对象类型是从数据源复制一个或多个表和视图,还是从数据源复制查询结果。选择“复制一个或多个表或视图的数据”单选按钮,再单击Next按钮,如图5.3.3所示。

(5) 在“SQL Server导入和导出向导”对话框的“配置平面文件目标”页中选择要复制的数据库源表或视图,在“源表或源视图”下拉列表框中选择[dbo].[STUDENTS]选项,选择相应的分隔符,单击Next按钮,如图5.3.4所示。

(6) 在“SQL Server导入和导出向导”对话框“保存并执行包”页中,选择“立即执行”复选框,单击Next按钮。

(7) 在“SQL Server导入和导出向导”对话框“完成该向导”页中单击Finish按钮,开始导出。

(8) 成功完成导出操作后,弹出“执行成功”对话框,并反馈相关状态信息,单击Close按钮退出导出操作,如图5.3.5所示。



图5.3.2 




图5.3.3 






图5.3.4 




图5.3.5 


2. 数据库表数据的导入

利用SSMS中的“SQL Server导入和导出向导”将文本数据导入SQL Server数据库中的表,步骤如下。

(1) 进入SSMS,右击“对象资源管理器”中的school数据库,在弹出的快捷菜单中选择“任务”→“导入数据”选项,如图5.1.5所示。

(2) 在“SQL Server导入和导出向导”对话框的“选择数据源”页中,选择要从中复制数据的数据源。在“数据源”下拉列表框中选择“平面文件源”(Flat File Source)选项,在“文件名”文本框中指定导入数据的文件名,单击Next按钮,如图5.3.6所示。



图5.3.6 


(3) 在“SQL Server导入和导出向导”对话框的“选择目标”页中指定导出数据的目标类型。在“目标”下拉列表框中选择SQL Native Client选项指定将源数据复制到SQL Server服务器中,在“数据库”下拉列表框中选择school选项指定将源数据复制到school数据库中,如图5.3.7所示。

(4) 在“SQL Server导入和导出向导”对话框的“选择源表和源视图”页中设置要复制的表到目标数据库的映射,单击“编辑映射”按钮,如图5.3.8所示。

(5) 在弹出的“列映射”对话框中设置目标数据库中表的各列的属性,可以根据需要修改各个列的名称和数据类型,完成列设置后单击“确定”按钮,如图5.3.9所示。

(6) 在“SQL Server导入和导出向导”对话框的“保存并执行包”页中,选择“立即执行”复选框,单击Next按钮。



图5.3.7 




图5.3.8 




图5.3.9 



(7) 在“SQL Server导入和导出向导”对话框的“完成该向导”页中,单击Finish按钮,开始导入。

(8) 成功完成导出操作后,弹出“执行成功”对话框,并反馈相关状态信息,单击Close按钮退出导入操作,如图5.3.5所示。

注意: 将其他异类数据源数据导入SQL Server中,可能会出现数据不兼容的情况。此时,SQL Server DBMS会自动进行数据转换,自动将不识别的数据类型转换为SQL Server中相似的数据类型。如果数据取值不能识别,则赋以空值。

5.3.5自我实践

(1) 将AdventureWorks数据库中的Address表导出为Excel文件。

(2) 建立一个班级通讯录的Excel文件,将该文件导入AdventureWorks数据库中。

5.4综合案例
1. 综合案例1

假如你是school数据库的DBA,那么对school数据库的备份是日常必不可少的工作。因此,对该数据库的备份,应该考虑哪些方面的因素?

通常对数据库备份需要考虑如下因素。 

(1) 数据本身的重要程度。 

(2) 数据的更新和改变频繁程度。 

(3) 备份硬件的配置。 

(4) 备份过程中所需要的时间以及对服务器资源占用的实际需求情况。 

(5) 数据库备份方案中,还需要考虑对业务处理的影响尽可能地小,把需要长时间完成的备份过程放在业务处理的空闲时间进行。对于重要的数据,要保证在极端情况下的损失都可以正常恢复。对备份硬件的使用要合理,既不盲目地浪费备份硬件,也不让备份硬件空闲。

2. 综合案例2

以下对school数据库的简要描述。 

(1) school数据库应用部门的工作时间是星期一到星期五的8:00—17:00,工作时间数据库必须可用。 

(2) 通常在学期初,学生要选修课程; 在学期末,教师要根据学生的学习情况最终评分,这两段时期内school数据库数据更新量较大,而平时数据更新量相对较小。 

(3) 要求保证数据库的数据的安全,在发生故障时要求尽可能以最快的速度恢复。 

(4) 在需要的情况下,可以恢复到1个月以前的数据。

根据以上描述,为school数据库设计一个备份方案。

参考方案: 

这是一个典型的企业数据库备份与恢复问题。根据用户的需求和实际环境,设计了如下备份方案。

(1) 恢复模式可采用完整恢复模式。 

(2) 采取多种备份类型组合备份的方式进行备份,在平时可以: 

① 每星期六8:00执行一次完全数据库备份,完全数据库备份保存2个月。 

② 每星期一至星期五的18:00执行一次差异数据库备份,差异备份保存2个月。 

③ 每星期一至星期五的8:00—17:00,每小时执行一次事务日志备份,事务日志备份保存2个月。 

④ 在学期初和学期末数据更新量比较大时,加大备份密度以尽可能避免数据库故障时的数据损失,每星期一至星期五的8:00—17:00,每30分钟执行一次事务日志备份。

(4) 删除2个月前的备份,以清理硬盘空间。 

(5) 此外,在数据库结构变化后应及时对系统数据库进行备份。

具体实现步骤如下。 

(1) 要实现维护计划功能,需要将SQL Server升级至企业版。

升级教程参见https://wenku.baidu.com/view/6e64f02351ea551810a6f524ccbff121dd36c5f9.html。

(2) 使用代码5.4.1设置恢复模式为完整恢复模式。

ALTER DATABASE school SET RECOVERY FULL





代码5.4.1

(3) 利用SSMS中的“维护计划”自动地实现备份与维护。

① 用“维护计划”实现每星期六8:00执行一次完全数据库备份,步骤如下。 

进入SSMS,右击“对象资源管理器”中“管理”中的“维护计划”选项,在弹出的快捷菜单中选择“维护计划向导”选项。在“选择计划属性”对话框中选择所要维护的服务器,并命名该维护计划。选择“每项任务单独计划”单选按钮,设置完毕后单击“下一步”按钮。在“选择维护任务”对话框中选择所要进行的维护操作,选择“备份数据库(完整)”复选框,设置完毕后单击“下一步”按钮,如图5.4.1和图5.4.2所示。在“选择维护任务顺序”中,单击“下一步”按钮。



图5.4.1




图5.4.2 


在“定义‘备份数据库(完整)’任务”对话框中,在“常规”选项卡中选择school数据库(见图5.4.3),在“目标”选项卡中选择备份到本地的SchoolBackup备份设备上(见图5.4.4),在“选项”选项卡中选择“验证备份完整性”复选框(见图5.4.5)。设置完毕后单击“下一步”按钮。



图5.4.3 




图5.4.4 




图5.4.5


在“定义‘备份数据库(完整)’任务”底部“计划”部分单击“更改”按钮,在弹出的“新建作业计划”对话框中设置备份数据库的时间及频率(见图5.4.6)。设置完毕后单击“确定”按钮,返回“选择计划属性”对话框。单击“下一步”按钮继续。



图5.4.6 


在“选择报告选项”对话框中选择如何管理维护计划报告,可以将其写入文本文件中,也可以通过电子邮件发送给数据库管理员(见图5.4.7)。设置完毕后单击“下一步”按钮。



图5.4.7 


在“完成向导”对话框中,单击“完成”按钮完成维护计划创建操作(见图5.4.8),出现如图5.4.9所示的提示框。



图5.4.8 


② 同样可以用类似于上述“维护计划”实现每星期一至星期五的18:00执行一次差异数据库备份、每星期一至星期五的8:00—17:00每小时执行一次事务日志备份以及清理过期备份。

③ 在数据库结构变化后,可用于对系统数据库进行备份。



图5.4.9


3. 综合案例3

还原是数据库恢复的有效手段。在还原数据库前,应当做哪些准备?

(1) 通过代码5.4.2尽快建立一个事务日志备份,以便保存之前的所有事务信息。

BACKUP LOG school TO SchoolBackup WITH NORECOVERY





代码5.4.2

(2) 尝试使用DBCC CHECKDB或DBCC CHECKTABLE命令检测和修复数据库和表,如代码5.4.3所示。

DBCC CHECKDB(school) WITH ALL_ERRORMSGS





代码5.4.3

(3) 使用代码5.4.4删除故障数据库,以便删除对故障硬件的任何引用。

DROP DATABASE school





代码5.4.4

(4) 验证数据库备份的有效性,检查备份文件或备份设备里的备份集是否正确无误,使用“RESTORE VERIFYONLY”语句,如代码5.4.5所示。

RESTORE VERIFYONLY FROM SchoolBackup





代码5.4.5

4. 综合案例4

2022年8月2日(星期二)下午两点多,school数据库不可用,登录SSMS发现school变成灰色,而且显示为置疑,分析问题原因并将school数据库恢复到正常状态。

数据库置疑的原因有很多种,通常是由于数据文件或日志文件的损坏造成的。被置疑的数据库无法进行正常的备份与还原操作,可尝试用以下步骤恢复。

方案1: 修复法。

(1) 将school数据库文件复制到其他位置备用。

(2) 删除置疑的school数据库。

(3) 新建同名的数据库(数据库文件名也要相同)。

(4) 停止数据库服务。运行services.msc,启动“服务”窗口,右击该窗口中名称为SQL Server代理(SQLEXPRESS)的服务,如图5.4.10所示,在弹出的快捷菜单中单击“停止”按钮。



图5.4.10 


(5) 用第(1)步中备份的数据库文件覆盖新school数据库的同名文件。

(6) 启动数据库服务。

(7) 运行代码5.4.6就可以恢复数据库。

ALTER DATABASE school SET EMERGENCY	   

USE master

ALTER DATABASE school SET single_user   

DBCC CHECKDB(school, REPAIR_ALLOW_DATA_LOSS)

DBCC CHECKDB(school, REPAIR_REBUILD)

ALTER DATABASE school SET multi_user





代码5.4.6

方案2: 还原法。

(1) 删除置疑的school数据库。

DROP DATABASE school





代码5.4.7

(2) 还原数据库基准备份。

RESTORE DATABASE school FROM SchoolBackup WITH REPLACE





代码5.4.8

(3) 用事务日志备份将数据库恢复到最近的正常状态。

RESTORE LOG school FROM SchoolBachup WITH STOPAT ='2022-8-2 14:00:00'





代码5.4.9

5. 综合案例5

CHOICES表是school数据库中的一个重要组件,但现在其中数据少了几千行,应该采取什么步骤确定何时和如何从数据库中删除这些数据?应该如何恢复丢失的数据并尽可能地避免数据丢失?

(1) 查看数据库的事务日志,在新建查询中输入代码5.4.10,用来查询school数据库的事务日志。

SELECT

[CURRENT LSN],

[OPERATION],

[CONTEXT],

[TRANSACTION ID],

[BEGIN TIME],

[END TIME],

[LOG RECORD LENGTH],

[AllocUnitName],

[Description]

FROM fn_dblog(NULL, NULL)





代码5.4.10

在查询结果中翻找删除记录,其中在operation栏中,可以看到具体删除操作LOP_DELETE_ROWS。找到最早进行删除的日志,然后再找到在这个删除开始之前最近的时间,如图5.4.11所示。



图5.4.11 


图中最近的时间是事务开始的时间,LOP_BEGIN_XACT这条事务日志是开始事务的意思,在数据库里面即使不用BEGIN TRANSACTION也能开始一个隐形的事务,例如一个DELETE命令,这个命令没有在一个事务中,如果这个命令一次删除多条记录,DBMS会把这个删除的过程作为一个事务,这个命令中的删除动作要么全都成功,要么全都不成功。

(2) 如果是误删除或恶意删除,且此后没有对数据库进行更新操作,可以通过“时点还原”,将数据库还原至删除前的时间点。

先建立一个事务日志备份: 

BACKUP LOG school TO SchoolBackup WITH NO_TRUNCATE

查看备份设备中介质内容(见图5.4.12),将数据库还原到删除CHOICES表之前的时间点。 



图5.4.12 


在系统数据库master中运行代码5.4.11进行还原: 

RESTORE DATABASE school FROM SchoolBackup WITH FILE = 18 , NORECOVERY, NOUNLOAD, STATS = 10

GO

RESTORE DATABASE school FROM SchoolBackup WITH FILE = 19 , NORECOVERY, NOUNLOAD, STATS = 10

GO

RESTORE DATABASE school FROM SchoolBackup WITH FILE = 20 , NORECOVERY, NOUNLOAD, STATS = 10

GO





代码5.4.11

注意,上述SQL语句中FILE=18,FILE=19,FILE=20,18是备份设备SchoolBackup中想要进行还原的时间的数据库完整备份在备份集中的位置、19是数据库差异备份在备份集中的位置、20是事务日志备份文件在备份集中的位置。

6. 综合案例6

在备份或还原school数据库过程中发生中断(如电源故障等)时,如何处理?

如果备份或还原操作被中断,可以从中断点重新开始备份或还原操作。这对于数据库,尤其是大型数据库的备份与恢复是很有帮助的。如果备份或还原操作在即将结束时被中断,可以尝试从中断点重新开始,而不必从起点开始整个操作。

(1) 备份被中断后的数据库文件,重新启动备份进程的处理语句如代码5.4.12所示。

BACKUP DATABASE school

TO SchoolBackup

WITH RESTART





代码5.4.12

(2) 还原被中断后的数据库文件,重新启动还原进程的处理语句如代码5.4.13所示。 

RESTORE DATABASE school

FROM SchoolBackup

WITH RESTART





代码5.4.13

7. 综合案例7

2022年8月2日(星期二)上午11:00,school数据库由于服务器的介质故障(如磁盘坏道、磁盘崩溃等)不能使用,怎样恢复school数据库的正常运行?

当服务器的介质发生故障,school数据库不能使用时,采用如下办法。 

(1) 如果服务器还能正常使用,只是破坏了school数据库的数据及其在服务器上的备份,那么可以用保存在客户机上的备份进行恢复。

从备份设备SchoolBackup中依次还原8月1日的数据库完整备份、数据库差异备份以及故障前的事务日志备份。

方案1: 使用SSMS恢复。

在SSMS的“对象资源管理器”中,右击school数据库,在弹出的快捷菜单中选择“任务”→“还原”→“数据库”选项。

在“还原数据库school”对话框中,将“源设备”指定为SchoolBackup,在“要还原的备份集”列表框中选择8月1日下午3点的“school完整 数据库 备份” “school差异 数据库 备份”以及8月1日及故障发生前school数据库的“事务日志”备份文件,如图5.4.13所示,单击“确定”按钮执行还原操作。

执行完上述操作,数据库将恢复至8月2日上午10点的状态。自动重做至故障前之间已执行的事务,将数据库恢复至故障前状态。

方案2: 使用TransactSQL语句恢复,如代码5.4.14所示。

RESTORE DATABASE school FROM SchoolBackup WITH FILE = 18,NORECOVERY,NOUNLOAD,STATS = 10

GO

RESTORE DATABASE school FROM SchoolBackup WITH FILE =19,NORECOVERY,NOUNLOAD,STATS = 10






GO

RESTORE LOG school FROM SchoolBackup WITH FILE = 20,NOUNLOAD,STATS = 10

GO

RESTORE LOG school FROM SchoolBackup WITH FILE = 25,NOUNLOAD,STATS = 10

GO





代码5.4.14 



图5.4.13 


注意: 上述SQL语句中FILE=18,FILE=19,FILE=20,FILE=25分别是备份设备SchoolBackup中8月1日的数据库完整备份、数据库差异备份以及8月1日及故障前事务日志备份文件,如图5.4.14所示。



图5.4.14 


执行完上述操作,数据库将恢复至8月2日上午10点的状态。自动重做至故障前之间已执行的事务,将数据库恢复至故障前状态。

(2) 如果由于磁盘崩溃而导致服务器不能运行,则涉及以下操作。

① 更换并配置磁盘; 

② 重新安装操作系统、驱动程序及应用软件,或用异地的系统备份还原至新的磁盘; 

① 用上面所说的方法从客户机的备份设备恢复school数据库至服务器。

5.5本章自我实践参考答案
略。