SQL练习——创建和管理数据库

第1关:认识SQL Server数据库

任务描述

本关任务:掌握数据库系统介绍、SQL Server 数据库、 SQL Server 中的系统数据库和用户数据库的相关理论,完成相关选择题。

相关知识

为了完成本关任务,你需要掌握:

1.数据库系统的概念;

2.SQL Server 数据库。

数据库系统介绍

,这个名词在日常生活中我们经常会接触到。我们知道各种各样的库,例如仓库、书库、金库、血库等。我们发现这些库都具有一些同样的特点 —— 可以存放现实世界中的物品,这些物品是有条理地存放在库中的,库中的物品有专人来进行管理。

数据库(Database,DBS),顾名思义就是存储数据的地方,但它和我们前面讲的库有所不同,数据不是存放在空间中,而是存放在计算机的存储设备上,并且是有组织的存放的。对于这些数据的管理是通过数据库管理系统(DBMS)来完成的。

一般情况下,我们所讲的数据库系统,不单指存放在存储设备上的数据集合,也包括了管理他们的计算机软件。

数据库通常分为层次式数据库网络式数据库关系式数据库三种,不同的数据库是按不同的数据结构来联系和组织的。不过到目前为止,在世界范围内得到主流应用的还是经典的关系数据库系统,比如 Oracle、SQL Server、DB2、Sybase、Informix 等。

总的来说,使用数据库带来的好处主要体现在以下几个方面:

  1. 数据按照固定的结构化形式统一存放在一起,可以进行有效的检索和访问,并可以对数据进行集中控制;

  2. 可以减少数据的冗余度,只包含较少的重复数据,能够有效地保持数据信息的一致性、完整性;

  3. 实现数据共享和并发控制,数据可以被多个用户使用,可以同时存取数据库中的数据,可以通过不同的程序设计语言访问数据库,并在它们同时访问数据的时候,互相之间不受影响;

  4. 有助于维护数据独立性,数据的存储形式和逻辑结构的变化尽可能不导致对应用程序的修改;

  5. 加强对数据的保护,保证数据的正确性、有效性和一致性,对数据进行保密性控制以防止数据被非法使用,并提供适当的数据恢复能力。

问:数据库系统可以存储和管理数据,那么对用户来说,具体应该如何访问这些数据呢?

答:回顾我们学过的程序设计语言,我们用这些语言来指示计算机完成计算任务。而在这里,我们也需要一种定义良好的查询语言来与数据库系统交互,以数据库系统能理解、分析和执行的形式来对数据做出处理,这种语言就是“结构化查询语言(SQL)”。SQL 具有国际标准,大多数现代数据库系统都支持“Entry Leve; ANSI/SQL-92标准”,并对此标准进行了扩充。

SQL Server 数据库

目前,数据库的主流厂商及产品有 Oracle、Micrsoft SQL Server、IBM DB2、Sybase、Informix、MySQL 等。

SQL Server 作为微软在 Windows 系列平台上开发的关系数据库产品,一经推出就以其易用性得到了很多用户的青睐,相信大多数对 Windows 操作系统较熟悉的用户都会对它有相当的亲切感。

在 SQL Server 种使用的 SQL 语言并非标准的 SQL,而是标准 SQL 的一个修改版本,称为 Transact-SQL 或者 T-SQL。T-SQL 不仅是一种查询语言,还是一种涉及用于和关系数据库系统进行交互的编程语言。它也许不如处理程序化任务的其他编程语言那么高级,但在数据库处理方面,它的功能是相当全面的。T-SQL 采用的是一种复杂的、功能全面的语法,能有效地实现数据访问。

SQL Server 2012 下载和安装详细教程

SQL Server 安装到系统中之后,将作为一个服务由操作系统监控,而 SSMS 是作为一个单独的进程运行的,安装好 SQL Server 2012 之后,单击【开始】按钮,在所有程序中选择【Microsoft SQL Server 2012】→【SQL Server Management Studio】,打开 SQL Server 的【连接到服务器】对话框,填写安装时的信息进入 SSMS 可视化界面。

图1 连接到服务器对话框

SQL Server 中的系统数据库

SQL Server 服务器安装完成之后,打开 SSMS 工具,在【对象资源管理器】中的【数据库】节点下面的【系统数据库】节点,可以看到几个已经存在的数据库,这些数据库在 SQL Server 安装到系统中之后就创建好了,下面分别介绍这几个系统数据库的作用。

图2 系统数据库

master 数据库

master 是 SQL Server 2012 中最重要的数据库,是整个数据库服务器的核心。用户不能直接修改该数据库,如果损坏了 master 数据库,那么整个 SQL Server 服务器将不能工作。作为一个数据库管理员,应该定期备份 master 数据库。

该数据库中包含下面一些内容:所有用户的登录信息、用户所在的组、所有系统的配置选项、服务器中本地数据库名称和信息、SQL Server 的初始化方式等。

model 数据库

model 数据库是 SQL Server 2012 中创建数据库的模板,如果用户希望创建的数据库有相同的初始化文件大小,则可以在 model 数据库中保存文件大小的信息;希望所有的数据库中都有一个相同的数据表,同样也可以将该数据表在 model 数据库中。

因为将来创建的数据库以 model 数据库中的数据为模板,因此在修改 model 数据库之前要考虑到,任何对 model 数据库中数据的修改都将影响所有使用模板创建的数据库。

msdb 数据库

msdb 提供运行 SQL Server Agent 工作的信息。 SQL Server Agent 是 SQL Server 中的一个 Windows 服务,该服务用来运行制定的计划任务。计划任务是在 SQL Server 中定义的一个程序,该程序不需要干预即可自动开始执行。与 tempdb 和 model 数据库一样,各位用户在使用 SQL Server 时也不要直接修改,SQL Server 中的其他一些程序会自动使用该数据。例如,当用户对数据进行存储或者备份的时候,msdb 数据库会记录与执行这些任务相关的一些信息。

tempdb 数据库

tempdb 是 SQL Server 中的一个临时数据库,用于存放临时对象或中间结果,SQL Server 关闭后,该数据库中的内容被清空,每次重新启动服务器之后,tempdb 数据库将被重建。

用户数据库

用户数据库是指除系统数据库外,用户自行创建的数据库。

作答要求

根据相关知识,按照要求完成右侧选择题任务。作答完毕,通过点击“评测”,可以验证答案的正确性。


开始你的任务吧,祝你成功!

题解

第2关:创建和删除数据库

任务描述

本关任务:学习数据库的创建和删除,完成 student 数据库的创建。

相关知识

上一关已经学习了数据库的基本概念,本关我们将学习如何使用 SQL Server Management Studio(SSMS) 创建数据库,在学习创建数据库之前我们先来了解以下数据库的文件组成。

数据库文件和文件组

在 SQL Server 中,一个数据库至少包含两种文件 —— 数据库文件和事务日志文件。

数据库文件

数据库文件是存放数据库数据和数据库对象的文件,一个数据库可以有一个或多个数据库文件,一个数据库文件只属于一个数据库;当有多个数据库文件时,有一个文件被定义为主数据库文件(Primary Database File),扩展名为.mdf,它用来存储数据库的启动信息和部分或全部数据;一个数据库只能有一个主数据库文件,其他数据库文件被称为次数据库文件(Secondary Database File),扩展名为.ndf,用来存储主文件没有存储的其他数据。

采用多个数据库文件来存储数据的优点体现在如下两个方面:

  • 数据库文件可以不断扩充而不受操作系统文件大小的限制;

  • 可以将数据库文件存储在不同的硬盘中,这样可以同时对几个硬盘做数据存取,提高数据处理效率。

事务日志文件

事务日志文件是用来记录数据库更新情况的文件,扩展名为.ldf,对数据库及逆行的操作都会记录在此文件中。

文件组

文件组是将多个数据库文件集合起来形成的一个整体,每个文件组有一个组名。与数据库文件一样,文件组也分为主文件组和次文件组。主数据库文件必须放在主文件组中,次数据库文件可以放在次文件组。

注意:事务日志文件不属于任何文件组。

 

创建数据库

SQL Server 创建数据库有两种方式:一种是使用 SQL Server 企业管理器,另一种是使用 T-SQL 语言。

用 SSMS 创建数据库

SSMS(SQL Server Management Studio) 是 SQL Server 的企业管理器,是 Microsoft 公司专门提供给用户用于操作 SQL Server 数据库的图形化界面。想要对 SQL Server 数据库进行各种操作,都可以通过 SSMS 实现。

下面以创建 test 数据库为例,使用 SSMS 创建的步骤如下:

从开始菜单可以找到 SSMS 启动它,如图 1 所示:

图1

在 SSMS 中选择【数据库】,然后右击选择【新建数据库】菜单,如图 2 所示:

图2

在弹出的对话框中填写数据库名,修改相关设置信息(不修改则为系统默认),如文件名、初始容量及最大容量等。具体操作如图 3 所示:

图3

点击【确定】按钮完成创建,在左侧就能查看到数据库,如图 4 所示:

图4

用 T-SQL 语言创建数据库

T-SQL 是 Microsoft 公司在 SQL Server 中 SQL-3 标准的实现,是微软对 SQL 的扩展,具有 SQL 的主要特点。同时还增加了变量、运算符、函数、流程控制和注释等语言元素,使得其功能更加强大。T-SQL 对 SQL Server 十分重要,SQL Server 中使用图形界面,能够完成的所有功能,都可以用 T-SQL 来实现。

使用 T-SQL 中的 create 语句创建数据库,具体用法如下:

create database database_name
  [ on [primary]
[<filespec>[,...n]]
  ]
  [ log on
   [<filespec>[,...n]]
  ];

  <filespec>::=
   (
     name = logical_file_name
     [, fileName = {'os_file_name'|'fileStream_path'} ]
     [, size = size[ KB | MB | GB | TB] ]
     [, maxsize  = {maxsize [ KB | MB |GB |TB] | UNLIMITED} ]
     [, filegrowth  = growth_increment [ KB | MB |GB | TB | %] ]
    )

其中各参数的说明如下:

  • database_name:数据库名称,不能与 SQL SERVER 中现有的数据库实例名称相冲突,最多可包含 128 个字符。

  • on:用来指定存储数据库中的数据的磁盘文件。

  • primary:指定关联的<filespec>列表定义的主文件,在主文件组<filespec>项中指定第一个文件将生成主文件,一个数据库只能有一个主文件。如果没有指定 primary,那么 create database 语句中列出的第一个文件将成为主文件。

  • log on:指定用来存储数据库日志的日志文件。log on 后跟以逗号分隔的用以定义日志文件的<filespec>列表。如果没有指定log on,将自动创建一个日志文件,其大小为该数据库的所有文件大小总和的 25% 或 521 KB,取两者之中最大者。

  • name:这个选项用于指定定义的文件的名称,但只是一个逻辑名称即 SQL Server 在内部使用该名称引用该文件。当需要修改(扩充或缩小)数据库和/或文件的大小事,需要使用这个名称。

  • filename:指定创建文件时又操作系统使用的路径和文件名。执行 create database 语句前,指定路径必须存在。

  • size:指定数据库文件的初始大小,如果没有为主文件提供 size,数据库引擎使用 model 数据库中主文件的大小。

  • maxsize:指定文件可增大的最大大小。可使用 KB、MB、GB 和 TB 做后缀,默认值为 MB。maxsize 是整数值。如果不指定 maxsize,则文件将不断增长直至磁盘被占满(UNLIMITED 表示文件一直增长到磁盘装满)。

  • filegrowth:指定文件的自动增量。文件的 filegrowth 设置不能超过 maxsize 设置。该值可以 MB、KB、GB、TB 或百分比(%)为单位指定,默认值为 MB,如果指定 %,则增量大小为发生增长时文件大小的的指定百分比。值为 0 表明自动增长被设为关闭,不允许增加空间。

下面创建一个数据库 test_db 为例,该数据库的主数据文件逻辑名为 test_db ,物理文件名称为test_db.mdf,初始大小为5MB,最大尺寸为20MB,增长速度为2% ;数据库日志文件的逻辑名称为 test_log,保存日志文件的物理名称为test_log.ldf,初始大小为1MB,最大尺寸为6MB,增长速度为128KB。T-SQL 代码如下:

图5 T-SQL 创建数据库

点击 SSMS 中左上角执行按钮,就可以创建 test_db 数据库了,文件存储在 D 盘的 SQL Server文件下,如下图所示:

图6 数据库文件

删除数据库

数据库删除可以使用 SSMS 在指定数据库上右键删除,同样也可以使用 T-SQL 语言进行删除,语法如下:

  1. drop database database_name

在创建新数据库时,为了避免数据库已经存在,我们可以通过判断数据库是否已经存在,如果存在则删除。语句如下:

  1. if DB_ID('database_name')>0
  2. drop database test

编程要求

在右侧编辑器中的Begin-End之间补充代码,创建 student 数据库,具体要求如下:

  1. 主要数据文件:逻辑文件名为 studentdata1,实际文件名为studentdata1.mdf

  2. 非主要数据文件:逻辑文件名为 studentdata2,实际文件名为studentdata2.ndf

  3. 事务日志文件:逻辑文件名为 studentlog1,实际文件名为studentlog1.ldf

  4. 初始容量均为 5 MB ,最大容量均为 10 MB ,递增量均为 1 MB,所有文件请存放在/home目录下(平台运行环境为 Linux)。

测试说明

补充完代码后,点击测评,平台会对你编写的 SQL 进行测试,当你的结果与预期输出一致时,即为通过。

预期输出:

  1. name size max_size growth
  2. -------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- -----------
  3. studentdata1 1024 1280 128
  4. studentdata2 640 1280 128
  5. studentlog1 640 1280 128
  6. (3 rows affected)

开始你的任务吧,祝你成功!

解题代码

--********** Begin **********--
CREATE DATABASE student
on primary
(
    name = 'studentdata1',
    filename = 'D:\home\studentdata1.mdf',
    size = 5MB,
    maxsize = 10MB,
    filegrowth = 1MB
),

(
    name = 'studentdata2',
    filename = 'D:\home\studentdata2.ndf',
    size = 5MB,
    maxsize = 10MB,
    filegrowth = 1MB

)

log on
(
        name = 'studentlog1',
        filename = 'D:\home\studentlog1.ldf',
        size = 5MB,
        maxsize = 10MB,
        filegrowth = 1MB
)

--********** End **********--

第3关:数据库的备份 

任务描述

本关任务:学习数据库备份的相关知识,完成 mydb 数据库的备份操作。

相关知识

尽管采取了一些管理措施来保证数据库的安全,但是不确定的意外情况总是有可能造成数据的损失,例如意外的停电、管理员不小心的操作失误都可能会造成数据的丢失。

保证数据安全的最重要的一个措施是确保对数据进行定期的备份。如果数据库中的数据丢失或者出现错误,可以使用备份的数据进行还原,这样就尽可能地降低了意外原因导致的损失。

SQL Server 提供了一整套功能强大的数据库备份和恢复工具。本关我们将介绍数据备份的相关知识。

数据备份

备份就是对数据库结构和数据对象的复制,以便在数据库遭到破坏时能够及时修复数据库,数据备份是数据库管理员非常重要的工作。数据库备份后,一旦系统发生崩溃或者执行了错误的数据库操作,就可以从备份文件中恢复数据库。

SQL Server 2012 中有4种不同的备份类型,分别是完整数据库备份、差异备份、文件和文件组备份和事务日志备份。

完整数据库备份

完整数据库备份将备份整个数据库,包括所有的对象、系统表、数据以及部分事务日志,开始备份时 SQL Server 将复制数据库中的一切。完整备份可以还原数据库在备份操作完成时的完整数据库状态。

由于是对整个数据库备份,因此这种备份类型速度较慢,并且将占用大量磁盘空间。在对数据库进行备份时,所有未完成的或发生在备份过程中的事务都将被忽略。这种备份方法可以快速备份小数据库。

T-SQL 语言使用 BACKUP DATABASE 菜单命令创建完整备份的基本语法格式如下:

BACKUP DATABASE { database_name | @database_name_var }
TO <backup_device> [,...n]
[ WITH
{
COPY_ONLY
| NAME = {backup_set_name | @backup_set_name_var }
| { NOINIT | INIT }
| DESCRIPTION = { 'test' | @text_variable }
| PASSWORD = { password | @password_variable }
| { EXPIREDATE = { 'date' | @date_var }
| RETAINDAYS = { days | @days_var } } [,...n]
}
]
[;]

其中,各语句的含义如下:

  • DATABASE:指定一个完整数据库备份。

  • **{ database_name | @ database_name_var }**:备份事务日志、部分数据库或者完整的数据库时所用的数据源。如果作为变量(@ database_name_var)提供,则可以将该名称指定为字符串常量(@ database_name_var=database name)或指定为字符串数据类型(ntext 或 text 数据类型除外)的变量。

  • **<backup_device>**:指定用于备份操作的逻辑备份设备或物理备份设备。

  • COPY_ONLY:指定备份为仅复制备份,该备份不影响正常的备份顺序。仅复制备份是独立于定期计划的常规备份而创建的。仅复制备份不会影响数据库的总体备份和还原过程。

  • **NAME = {backup_set_name | @ backup_set_name_var }**:指定备份集的名称。如果未指定 NAME 它将为空。

  • **{ NOINIT | INIT }**:控制备份操作是追加还是覆盖备份媒体中的现有备份。默认为追加到媒体中最新的备份集(NOINIT)。

  • **DESCRIPTION = { 'test' | @ text_variable }**:指定说明备份集的自由格式文本。

  • **PASSWORD = { password | @ password_variable }**:为备份集设置密码,PASSWORD 是一个字符串。

  • **{ EXPIREDATE = { 'date' | @ date_var }**:指定允许覆盖该设备的备份集的日期。

  • **RETAINDAYS = { days | @ days_var }**:指定必须经过多少天才可以覆盖备份媒体集。

首先在本地磁盘中创建一个文件夹(例如D:\databackup),用来存储你的备份文件。然后我们来创建 Test 数据库的完整备份,语句如下图3:

图3 数据库完整备份

这个时候你的本地就有了备份文件,如下图 4:

图4 备份文件

差异备份

差异备份基于所包含数据的前一次最新完整备份。差异备份仅捕获自该次完整备份后发生更改的数据。因为只备份改变的内容,所以这种类型的备份速度比较快,可以频繁地执行,差异备份中也备份了部分事务日志。

差异数据库备份也使用 BACKUP 菜单命令,与完整备份菜单命令语法基本相同,只是在使用菜单命令时,在 WITH 选项中指定 DIFFERENTIAL 参数。下面对 Test 做一次差异数据库备份,语句如下图 5:

图5 数据库差异备份

差异备份完成后,我们可以看到备份文件变大了一点:

图6

事务日志备份

创建第一个日志备份之前,必须先创建完整备份,事务日志备份所有数据库修改的记录,用来在还原操作期间,提交完成的事务以及回滚未完成的事务,事务日志备份记录备份操作开始时的事务日志状态。

事务日志备份比完整数据库备份节省时间和空间,利用事务日志进行恢复时,可以指定恢复到某一个时间,而完整备份和差异备份做不到这一点。

创建事务日志备份使用 BACKUP LOG 语句,其基本语法如下:

BACKUP LOG { database_name | @database_name_var }
TO <backup_device> [,...n]
[ WITH
NAME = { database_set_name | @backup_set_name_var }
| DESCRIPTION = { 'test' | @test_variable }
]
{ { NORECOVERY | STANDBY = undo_file_name } } [,...n]

LOG 指定仅备份事务日志,该日志是从上一次成功执行的日志备份到当前日志的末尾,必须创建完整备份,才能创建第一个日志备份,其他各参数与前面介绍的各个备份语句中的参数的作用相同。

但是在进行事务日志备份之前,需要先将数据库的恢复模式设置为“大容量日志”,在【对象资源管理器】中选择你要备份的数据库右击选择【属性】,弹出窗口后,在【选择页】中选择【选项】,修改恢复模式即可,如下图 7:

图7

例如,对 Test 数据库执行事务日志备份,语句如下图 8:

图8 - 数据库事务日志备份

上面我们所做的三个备份,是可以通过 T-SQL 来查看的,查询效果如下图 9:

图9

文件和文件组备份

文件和文件组备份方法可以对数据库中的部分文件和文件组进行备份。当一个数据库很大时,数据库的完整备份会花很多时间,这时可以采用文件和文件组备份。

在使用文件和文件组备份时,还必须备份事务日志,所以不能在启用【在检查点截断日志】选项的情况下使用这种备份技术。文件组是一种将数据库存放在多个文件上的方法,并运行控制数据库对象存储到那些指定的文件上,这样数据库就不会收到只存储在单个硬盘上的限制,而是可以分散到许多硬盘上。利用文件组备份,每次可以备份这些文件中的一个或多个文件,而不是备份整个数据库。这种方式感兴趣的同学可以自行查询资料。

编程要求

在右侧编辑器中的Begin-End之间补充代码,使用完整备份模式完成对 student 数据库的备份,具体要求如下:

  1. 备份文件路径为/usr/local/databackup/mydb.bak(注意路径不要输错了,平台会在此路径下查询备份集);

  2. 备份集名称 NAME 为“full backup”;

  3. 备份集说明 DESCRIPTION 文字为“this is full backup file”。

测试说明

补充完代码后,点击测评,平台会对你编写的 SQL 进行测试,当你的结果与预期输出一致时,即为通过。

预期输出:

  1. DatabaseName BackupName BackupDescription UserName
  2. --------------------------------------------------------------
  3. mydb full backup this is full backup file sa
  4. (1 rows affected)

开始你的任务吧,祝你成功

解题代码

第4关:数据库的还原

任务描述

本关任务:学习还原备份数据库的相关知识,完成 school 数据库的还原。

相关知识

还原是备份的相反操作,当完成备份之后,如果发生硬件或软件的损坏、意外事故或者操作失误导致数据丢失时,需要对数据库中的重要数据进行还原,还原过程和备份过程相似,本关将介绍数据库的还原方式。

数据库还原

上一关中介绍了4种备份方式,在还原时也可以使用4种方式,分别是完整备份还原、差异备份还原、事务日志备份还原,以及文件和文件组备份还原。

完整备份还原

完整备份还原是差异备份和事务日志备份的基础,同样在还原时,第一步要先做完整备份还原,完整备份还原将还原完整备份文件。

完整还原模式可以将数据库还原到故障点或时间点。这种模式下,所有操作被写入日志,例如大容量的操作和大容量的数据加载,数据库和日志都将被备份,因为日志记录了全部事务,所以可以将数据库还原到特定时间点。

T-SQL 语言对数据库还原操作使用的是 RESTORE 语句,基本用法如下:

RESTORE DATABASE{ database_name | @database_name_var}
FROM <backup_device> [,...n]
[ WITH
{
[ { CHECKSUM | NO_CHECKSUM }
| [ RECOVERY | NORECOVER | STANDBY = {standby_file_name | @standby_file_name_var}]
| FILE = { backup_set_file_number | @back_set_file_number }
| PASSWORD = { password | @password_variable }
| MEDIANAME = { media_name | @media_name_variable}
| MEDIAPASSWORD = { mediapassword | @mediapassword_variable }
| MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' [,...n]
| REPLACE
| STOPAT = {'datatime' | @datatime_var}
}
]
[;]

<backup_device> :: =
{
{ logical_backup_device_name | @logical_backup_device_name_var }
| { DISK | TAPE } = { 'pysical_backup_device_name' | @pysical_bakcup_device_name_var }
}

其中,各语句的含义如下:

  • **{ CHECKSUM | NO_CHECKSUM }**:默认行为是在存在校验和时验证校验和,不存在校验和时不进行验证并继续执行操作。

  • RECOVERY:指示还原操作回滚任何未提交的事务。在恢复进行后即可随时使用数据库。如果既没有指定 NORECOVERY 和 RECOVERY,则默认为 RECOVERY。

  • NORECOVRY:指示还原操作不回滚任何未提交的事务。

  • **FILE = { backup_set_file_number | @ back_set_file_number }**:标识要还原的备份集。例如,backup_set_file_number 为 1,指示备份媒体中的第一个备份集;backup_set_file_number 为 2,指示第二个备份集。可以通过使用 RESTORE HEADERONLY 语句来获取备份集的 backup_set_file_number。未指定时,默认值为1。

  • **MEDIANAME = { media_name | @ media_name_variable}**:指定媒体名称。

  • **MEDIAPASSWORD = { mediapassword | @ mediapassword_variable }**:指定媒体集的密码,密码为一个字符串。

  • **MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' [...n]**:对于由 logical_file_name_in_backup 指定的数据或日志文件,应当通过将其还原到 operating_system_file_name 所指定的位置来对其进行移动。默认情况下,logical_file_name_in_backup 文件将还原到它的原始位置。

  • REPLACE:指定即使存在另一个具有相同名称的数据库,SQL Server 也创建指定的数据库及其相关文件。在这种情况下将删除现有的数据库。如果不指定则会执行安全检查。这样可以防止以外覆盖其他数据库。REPLACE 还会覆盖在恢复数据库之前备份尾日志的要求。

  • **STOPAT = {'datatime' | @ datatime_var}**:指定将数据库还原到它在 datatime 或 @ datatime_var 参数指定的日期和时间状态。

  • **{ logical_backup_device_name | @ logical_backup_device_name_var }**:是由存储过程创建的备份设备(数据库将从该备份设备还原)的逻辑名称。

  • **{ DISK | TAPE } = { 'pysical_backup_device_name' | @ pysical_bakcup_device_name_var }**:允许从命名磁盘或磁带设备还原备份。

下面通过示例来看看完整备份还原的效果和使用方式:

--创建数据库
CREATE DATABASE student
GO
--打开创建的数据库
USE student
GO
--创建测试表
create table tb_test(num int);
--插入一条数据
INSERT INTO tb_test values(1);
--做完整备份
backup database student to disk='d:\test.bak';
--删除数据库
drop database student;
GO

现在已经做了完整备份,备份信息我们可以通过如下 T-SQL 来查询:

图1 备份文件信息

数据库已被删除了,但是做了完整备份,我们可以根据备份进行恢复,T-SQL 代码如下图 2:

图2 还原备份查询结果

差异备份还原

完整备份还原之后,可以执行差异备份还原。例如在周末晚上执行一次完整数据库备份,以后每隔一天创建一个差异备份集,如果在周三数据库发生了故障,则首先用最近上个周末的完整备份做一个完整备份还原,然后还原周二做的差异备份。

差异备份还原与完整备份还原的语法基本一样,只是在还原差异备份时,必须先还原完整备份,再还原差异备份,具体请看如下案例:

--创建数据库
CREATE DATABASE student
GO
--打开创建的数据库
USE student
GO
--创建测试表
create table tb_test(num int);
--插入一条数据
INSERT INTO tb_test values(1);
--做完整备份
backup database student to disk='d:\test.bak';
--再插入一条数据
INSERT INTO tb_test values(2);
--做差异备份
backup database student to disk='d:\test.bak' with differential;
--删除数据库
drop database student;
GO

如果数据库进行了如上操作,还原 SQL 则如下图 3 所示:

图3 差异备份还原

在对 student 数据库备份时,差异备份是备份集中的第2个(可以通过 T-SQL 查询备份集的position属性值),因此需要指定 FILE 参数。

事务日志备份还原

事务日志备份还原比较频繁,因此事务日志备份的还原步骤比较多。例如周末对数据库进行完整备份,每天晚上 8 点对数据库进行差异备份,每隔 3 小时做一次事务日志备份。如果周三早上 9 点钟数据库发生故障,那么还原数据库的步骤如下:首先恢复周末的完整备份,然后恢复周二下午做的差异备份,最后依次还原差异备份到损坏为止的每一个事物日志备份,即周二晚上 11 点、周三早上 5 点和周三早上 8 点所做的事务日志备份。

与差异备份还原类似,事务日志备份还原时只要知道它在备份集中的位置即可。还原事务日志备份之前,必须先还原在其之前的完整备份,除了最后一个还原操作,其他所有操作都必须加上 NORECOVERY 或 STANDBY 参数。

请看下面案例:

--创建数据库
CREATE DATABASE student
GO
--做一个完整备份
backup database student to disk='d:\test.bak'
--打开创建的数据库
USE student
GO
--创建测试表
create table tb_test(num int);
--插入一条数据
INSERT INTO tb_test values(1)
--做一个日志备份
backup log student to disk='d:\test.bak'
--再插入一条数据
INSERT INTO tb_test values(2)
--做尾日志备份
use master;
GO
backup log student to disk='d:\test.bak' with norecovery
--删除数据库
drop database student
GO

因为这里的备份集比较少,不需要查询出日志备份的位置,因此恢复 SQL 如下图 4:

图4 事务日志备份还原

文件和文件组备份还原

该还原方式并不常用,只有当数据库中文件或文件组发生损坏时,才使用这种还原方式。

编程要求

在右侧编辑器中的Begin-End之间补充代码,完成 school 数据库的还原,具体要求如下:

  1. school 数据库做了三个备份,依次是完整备份、差异备份和事务日志备份(数据库中创建了一张表,一共三条数据,每向表里插入一条数据依次进行备份);

  2. 备份文件路径为/usr/local/databackup/school.bak

  3. 使用 master 数据库还原,还原的数据库名称为 school_db(平台会在你还原的这个数据库中查询表中数据,以此来判断是否完成还原操作)。

测试说明

补充完代码后,点击测评,平台会对你编写的 SQL 进行测试,当你的结果与预期输出一致时,即为通过。

预期输出:

  1. name age sex
  2. -------------------- ----------- ----------
  3. Zhangsan 20 male
  4. Lisi 18 female
  5. Wangwu 16 female
  6. (3 rows affected)

开始你的任务吧,祝你成功!

解题代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值