【数据库原理与SQL Server应用】Part04——数据库操作
- 一、数据库基本概念
- 1.1 物理数据库
- 1.1.1 页和区
- 1.1.2 数据库文件
- 1.1.3 文件组
- 1.2 逻辑数据库
- 1.3 SQL Server 的系统数据库和用户数据库
- 1.4 报表服务器和报表数据库
- 二、创建数据库
- 2.1 管理工具界面方式创建数据库
- 2.2 命令行方式创建数据库
- 三、修改数据库
- 3.1 管理工具界面方式修改数据库
- 3.2 命令行方式修改数据库
- 四、删除数据库
- 4.1 管理工具界面方式删除数据库
- 4.2 命令行方式删除数据库
- 五、数据库的分离和附加
- 5.1 分离数据库
- 5.2 附加数据库
- 六、数据库的收缩
- 6.1 手动收缩
- 6.2 自动收缩
- 七、移动数据库
- 八、数据库快照
- 8.1 数据库快照优点
- 8.2 数据库快照的操作
一、数据库基本概念
数据库是数据库管理系统的最重要、最基本组成。
本章主要介绍SQL Server数据库的概念、分类,以及数据库的创建、修改
和删除等操作。
SQL Server数据库管理系统的数据库,就是存放、管理SQL Server系统数据的仓库。对于SQL Server系统的数据库有两种观点,即数据库管理员观点和用户观点,因此可以将数据库分为物理数据库和逻辑数据库两类。
数据库是针对数据库对象的存储结构。
1.1 物理数据库
1.1.1 页和区
页(Page
) 是SQL Server中存储数据的最小单位,每一个页的大小是8KB
。
SQL Server的数据库每1MB
有128
个页。
数据库中的每一页只存储来自某一个对象的数据。
每一个页的前96
个字节是页首。
SQL Server数据库的数据文件中的页有8
种类型:
- 数据页(
Data Page
) - 索引页(
Index Page
) - 文本/图像页
- 全局分配映射表页与共享全局分配映射表页
- 可用空间页
- 索引分配映射表页
- 大容量更改映射表页
- 差异更改映射表页
扩展盘区(Extent
)(区) 是SQL Server分配给表和索引的单位空间。
一个扩展盘区是由8个连续的页构成,大小是64KB。
SQL Server的数据库每1MB有16个扩展盘区。
SQL Server 2005的扩展盘区分为下列两种类型。
- 统一扩展盘区: 统一扩展盘区只由某单一对象所拥有。
- 混合扩展盘区: 混合扩展盘区最多可被8个对象共享,其8个页都可以被不同的对象所拥有。
1.1.2 数据库文件
数据库中的数据对象、数据记录是以数据库文件为单位进行组织与管理的。
数据库文件则是由数据文件和事务日志文件组成。
一个数据库文件至少应该包含一个数据文件和一个事务日志文件。
数据库是由下列三种类型的文件所构成:
- 主要数据文件(
Primary Database File
) - 次要数据文件(
Secondary Database File
) - 事务日志文件(
Log File
)
主要数据文件:
- 主要数据文件包含数据库的初始信息。
- 每个数据库有且只有一个。
- 主要数据文件的默认扩展名是
.MDF
。
次要数据文件:
- 次要数据文件也是用来存储数据库中的数据记录等信息。
- 用户可自行决定是否要使用次要数据文件。
- 次要数据文件的默认扩展名是
.NDF
。
使用次要数据文件的主要原因有下列两点:
在不同的物理磁盘上创建次要数据文件并将数据存储其中,可将数据横跨存储在多块物理磁盘上;
数据库中的数据非常庞大,使得主要数据文件的大小已超过Windows单一文件大小的限制,此时便需要使用次要数据文件来帮助存储数据。
采用多个数据文件来存储数据的优点:
数据库文件可以不断扩充而不受操作系统文件大小的限制;
可以将数据库文件存储在不同的硬盘中,这样可以同时对几个硬盘执行数据存取;这会提高了数据处理的效率,对于服务器型的计算机尤为有用。
事务日志文件:
- 事务日志文件包含用来恢复数据库的日志信息。
- 每一个数据库至少必须拥有一个日志文件。
- 日志文件的大小至少是1MB。
- 日志文件的默认扩展名是
.LDF
。 - 日志文件是用来记录数据库更新情况。
- SQL Server数据库文件有两个文件名:逻辑文件名和物理文件名。
1.1.3 文件组
出于数据管理与数据分配的需要,SQL Server许可用户或数据库管理员将多个文件归纳为同一组,并赋予该组一个名称,这就是“文件组”(Filegroup
) 。
文件组的作用:
- 有些系统可以借助于将数据和索引存诸在特定的物理磁盘上以提高效率,文件组正好能帮助用户或数据库管理员来完成该项操作。
- 系统管理员可以在每一个物理磁盘上创建文件组,然后将表、索引、或表中的大型对象教据指最给特定的文件组。
- 文件组使得用户能方便地将新文件添加到新的磁盘上。
设计文件与文件组时,要遵循以下原则:
- 一个文件或文件组只能被与其对应的惟一数据库所使用。
- 一个文件只能隶属于一个文件组,它不能同时隶属于两个或两个以上的文件组。
- 文件组只能包含数据文件。
- 每个数据库最多只能创建
32767
个文件组。 - 数据库快照集(
Snapshots
)不能位于文件组中。
SQL Server文件组分为3种类型
- 主要文件组(
Primary Filegroup
) - 用户定义文件组(
User-Defined Filegroup
) - 默认文件组(
Default Filegroup
)
注意:
- 大多数的数据库只需要一个主要数据文件和一个日志文件就可以运行得非常好。
- 如果确实需要使用多个文件,请为次要数据文件等附加文件创建第二个文件组并将此文件组设置为默认文件组。
- 要想获得最佳性能,应该尽量将各个文件与文件组分别存储在不同的物理磁盘上,并将需要占用大量空间的对象放置在不同的文件组中。
- 若需要将对象存储在特定的物理磁盘上,请使用文件组来完成。
1.2 逻辑数据库
用户观点认为,SQL Server数据库是存储数据的容器,即数据库是一个存放数据的表和支持这些数据的存储、检索、安全性和完整性的逻辑成分所组成的集合。组成数据库的逻辑成分称为数据库对象。
SQL Server的逻辑数据库以及对象,在SQL Server Management Studio的对象资源管理器
窗口中都能看到。如图所示:
这些数据库以及数据库对象名称都是逻辑名,即在操作系统下看不到以这个名称命名的文件,只能在SQL Server Management Studio看到。
数据库对象主要包括表、视图、索引、约束、存储过程和触发器等,见如下表:
用户在操作这些对象时,需要给出对象的名字,这些对象的名字由用户直接使用。用户可以给出两种对象名,即完全限定对象名和部分限定对象名。
- 完全限定对象名由4个标识符组成:服务器名称
server
、数据库名称database
、所有者名称schema_name
和对象名称object_name
。其语法格式为:
[[[server.][database].][schema_name].]object_name
在SQL Server中创建的每个对象都必须有一个惟一的完全限定对象名。
- 服务器、数据库和所有者的名称即所谓的对象名称限定符。
在引用对象时,通常不需要标明服务器、数据库和所有者,可以用句点标记它们的位置来省略限定符。
省略了部分或全部的对象名称限定符,这种对象名称为部分限定对象名。
部分限定对象名的有效格式包括以下几种:
server.database..object_name /* 省略所有者名称 */
server..schema_name.object_name /* 省略数据库名称 */
server...object_name /* 省略数据库和所有者名称 */
database.schema_name.object_name /* 省略服务器名称 */
database..object_name /* 省略服务器和所有者名称 */
schema_name.object_name /* 省略服务器和数据库名称 */
object_name /* 省略服务器、数据库和所有者名称 */
1.3 SQL Server 的系统数据库和用户数据库
SQL Server数据库分为三类:系统数据库、用户数据库和示例数据库。
1. 系统数据库
系统数据库存储有关SQL Server的系统信息,是系统管理的依据,由master
、model
、msdb
、tempdb
,以及隐藏的resource
数据库组成。见如下表:
安装SQL Server时,安装程序会自动创建系统数据库的主数据文件和日志文件。常用的系统数据库文件名见如下表:
resource
数据库由于隐藏,所以在默认目录下看不到。
SQL Server不支持用户直接更新系统数据库对象(如系统表、系统存储过程和目录视图)中的信息。但提供了一整套管理工具(如SQL Server Management Studio),使用户可以充分管理系统和数据库中的所有用户和对象。
SQL Server不支持对系统表定义触发器,因为触发器可能会更改系统的操作,也不要使用T-SQL语句直接查询系统表。所以,建议用户不要修改、删除系统数据库中的数据,以免影响系统的运行。
2. 用户数据库
用户数据库就是由用户自己创建的数据库。创建一个数据库就是创建一个用户数据库。
3. 示例数据库
SQL Server有示例数据库,需要另行安装,用来给初学者做实例练习用。这里就不再介绍。
1.4 报表服务器和报表数据库
除了系统数据库和用户数据库之外,还有两个数据库:ReportServer
(报表服
务器数据库)和ReportServerTempDB
(报表服务器临时数据库)。
报表服务器是一种无状态服务器,它使用SQL Server数据库引擎来存储元数据和对象定义。为了将永久性数据存储与临时存储要求分开,Reporting Services
安装使用以上两个数据库。这两个数据库一起创建,并按名称绑定。这两个数据库的表结构已经针对服务器操作进行了优化,因此不应对其进行修改或调整。
其中,ReportServer
数据库主要存储报表服务器所管理的项以及与这些项关联的所有属性和安全设置,订阅和计划定义,报表快照(包括查询结果)和报表历史记录,报表执行日志数据等。ReportServerTempDB
数据库主要用一些与使用相关的临时数据库来存储报表服务器生成的会话和执行数据、缓存报表以及工作表。
普通用户一般不要使用这两个数据库。
二、创建数据库
作为存放数据的主体,首先要创建数据库,即创建用户数据库。SQL Server提供了两种方式创建数据库,一种是管理工具界面方式创建,另一种是命令行方式创建。
通常,管理工具界面方式方便、快捷、直观。命令行方式严谨、通用。
2.1 管理工具界面方式创建数据库
SQL Server使用SQL Server Management Studio管理工具进行界面方式创建数据库。
1. SQL Server Management Studio界面布局
2. 创建新数据库
右键点击数据库
,点击新建数据库
:
设置数据库的属性:
例:新建一个名为NewDB
的数据库。
该数据库有两个文件:主数据文件和日志文件。主数据文件初始大小为10M
,文件大小可以不受限制的增长,但每次增长20%
。日志文件初始大小为5M,文件大小也不受限制的增长,但文件每次增长1M
。都不指定文件组。最后按照系统默认路径存盘。
例:新建一个名为“NewTest”的数据库,数据库文件都存盘于C
盘的DB
文件夹下。
该数据库有4
个文件:1
个主数据文件、2
个次要数据文件和1
个日志文件。主数据文件初始大小为50M
,文件大小也不受限制的增长,每次增长10M
。两个次要数据文件初始大小都为20M
,文件大小也不受限制的增长,但文件每次增长20%
。新建1
个名为NGroup
文件组,并将次要数据文件放入该文件组。日志文件初始大小为10M
,文件大小也不受限制的增长,但文件每次增长5M
。
2.2 命令行方式创建数据库
在SQL Server中,还可以利用命令行方式创建数据库。在SQL Server Management Studio的查询编辑器
窗口中使用T-SQL语句编程创建数据库,与界面方式操作效果一样。鼠标选择工具栏中的新建查询
按钮,即新建一个查询编辑器
窗口。
或者选择用户数据库,选择右键菜单新建查询
选项,也将新建一个查询编辑器
窗口。如图所示:
在查询编辑器
窗口中输入T-SQL语句,选择工具栏上的执行
按钮,或选择查询
菜单的执行
选项,或选择右键菜单执行
选项,或直接按键盘的F5
键,即可执行。如图所示:
查询编辑器
是一个功能强大的编辑器。它不仅仅是一个T-SQL语句的输入窗口,还可以说是学习T-SQL语言的好助手。
用户在查询编辑器
窗口中输入T-SQL语句,可以通过窗口中字母、数字等文本信息的颜色显示,系统自动生成的下划线标识等信息,来判断语句的语法及格式是否正确。如果运行失败后,还有详细的失败提示。
当然,用户也可以根据自己的爱好,重新配置查询编辑器,例如字体颜色、大小等。选择工具
菜单的选项
选项,在选项
对话框中设置用户需要的显示效果。如图所示:
T-SQL提供了CREATE DATABASE
语句,该语句的功能是创建一个新数据库及存储该数据库的文件,创建一个数据库快照,或从先前创建的数据库的已分离文件中附加数据库。
CREATE DATABASE
语句的语法格式如下:
CREATE DATABASE database_name
[ ON
[ < filespec > [ ,...n ] ]
[ , < filegroup > [ ,...n ] ] ]
[ LOG ON { < filespec > [ ,...n ] } ]
[ COLLATE collation_name ]
[ WITH < external_access_option > ]
[ FOR { ATTACH| ATTACH_REBUILD_LOG } ]
T-SQL语法格式约定符号的说明:
T-SQL语句不区分大小写。
为强调起见,关键字都用大写。
CREATE DATABASE
语句语法说明:
database_name
是所创建数据库的逻辑名。ON
子句指定数据库主数据库文件、辅助数据文件和文件组属性,显式地定义用来存储数据库数据部分的操作系统文件。- 该关键字后跟以逗号分隔的
<filespec>
项列表,<filespec>
项用以定义主文件组的数据文件。<filespec>
格式为:
< filespec > ::=
[ PRIMARY ]
( [ NAME = ' logical_file_name ', ]
FILENAME = {'os_file_name' | 'filestream_path' }
[ , SIZE = size [ KB | MB | GB | TB ] ]
[ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ]
[ , FILEGROWTH = growth_increment [ KB | MB | GB | TB| % ] ] ) [ ,...n ]
- 主文件组的文件列表后可跟以逗号分隔的
<filegroup>
项列表(可选),<filegroup>
项用以定义用户文件组及其文件。<filegroup>
格式为:
< filegroup > ::=FILEGROUP 文件组名 < filespec > [ ,...n ]
n
是占位符,表示可以为新数据库指定多个文件。 LOG ON
子句指定事务日志文件属性,显式地定义用来存储数据库事务日志的操作系统文件。COLLATE collation_name
子句用于指定数据库的默认排序规则。排序规则名称既可以是Windows排序规则名称,也可以是SQL排序规则名称。WITH <external_access_option>
子句用于控制外部与数据库之间的双向访问。FOR ATTACH
子句用于指定通过附加一组现有的操作系统文件来创建数据库,使用FOR ATTACH
时必须指定数据库的主文件。FOR ATTACH_REBUILD_LOG
子句用于指定通过附加一组现有的操作系统文件来创建数据库,使用这一选项将不再需要所有日志文件。
用户在开始使用T-SQL语句创建数据库之前,可以查看刚才使用界面方式创建的数据库所对应的T-SQL语句,以帮助学习使用CREATE DATABASE
语句。
以创建的NewDB数据库为例,选择NewDB
数据库,选择右键菜单编写数据库脚本为
选项的CREATE到
子选项的新查询编辑器窗口
子选项,新生成一个查询编辑器窗口。在该查询编辑器窗口中可以查看使用界面方式创建数据库时所自动生成的对应的T-SQL语句。如图所示:
例:使用CREATE DATABASE
语句最简单的方式,创建一个名为MyDB
的数据库。
新建查询编辑器窗口,输入以下T-SQL语句:
CREATE DATABASE MyDB /* 创建数据库 */
说明:T-SQL语句中,用
/* */
符号包含的是注释语句,用来注释对应的语句,不参与执行。
执行结果数据库创建成功,并且在查询编辑器窗口下方消息
窗口中提示。右键选择对象资源管理器
窗口中的数据库
选项,选择菜单刷新
选项,可以看到在数据库
中新建一个名为MyDB
的数据库。
例:使用CREATE DATABASE
语句,新建一个名为NewTest
的数据库,数据库文件都存盘于C
盘的DB
文件夹下。
该数据库有4
个文件:1
个主数据文件、2
个次要数据文件和1
个日志文件。主数据文件初始大小为50M
,文件大小也不受限制的增长,每次增长10M
。两个次要数据文件初始大小都为20M
,文件大小也不受限制的增长,但文件每次增长20%
。新建1
个名为NGroup
文件组,并将次要数据文件放入该文件组。日志文件初始大小为10M
,文件大小也不受限制的增长,但文件每次增长5M
。
新建查询编辑器窗口,输入以下T-SQL语句:
CREATE DATABASE MyTest /* 数据库名 */
ON
PRIMARY
(
NAME='MyTest_m', /* 主数据文件逻辑名 */
FILENAME='C:\DB\MyTest.mdf ', /* 主数据文件物理名 */
SIZE=50MB, /* 主数据文件初始大小 */
MAXSIZE=UNLIMITED, /* 主数据文件最大值 */
FILEGROWTH=10MB /* 主数据文件每次增长5MB */
),
FILEGROUP NGroup /* 新增文件组 */
(
NAME='MyTest_n1', /* 次要数据文件逻辑名 */
FILENAME='C:\DB\MyTest1.ndf', /* 次要数据文件物理名 */
SIZE=20MB, /* 次要数据文件初始大小 */
MAXSIZE = UNLIMITED, /* 次要数据文件最大值 */
FILEGROWTH=20% /* 次要数据文件每次增长10% */
),
(
NAME='MyTest_n2',
FILENAME='C:\DB\MyTest2.ndf',
SIZE=20MB,
MAXSIZE=UNLIMITED,
FILEGROWTH=20%
)
LOG ON
(
NAME='MyTest_log', /* 日志文件逻辑名 */
FILENAME = 'C:\DB\MyTest.ldf', /* 日志文件物理名 */
SIZE=10MB, /* 日志文件文件初始大小 */
MAXSIZE=UNLIMITED, /* 日志文件最大值 */
FILEGROWTH=5MB /* 日志文件每次增长5MB */
)
GO
三、修改数据库
如果创建的数据库需要修改,SQL Server也提供了管理工具界面和命令行两种方式修改。
3.1 管理工具界面方式修改数据库
管理工具界面方式修改数据库只能对已有数据库进行修改,修改包括以下几项:
- 增加或删除数据文件
- 改变数据文件的大小和增长方式
- 改变日志文件的大小和增长方式
- 增加或删除日志文件
- 增加或删除文件组
- 重命名数据库(只能修改数据库逻辑名,文件名不能修改)
例:使用SQL Server Management Studio界面方式修改MyTest数据库。
选择MyTest
数据库,选择右键菜单重命名
选项,对数据库逻辑名重新命名。选择属性
选项,进入数据库属性
对话框。在文件
选项页和文件组
选项页中,修改数据库主要属性,例如增加或删除文件、修改文件的增长方式、增加或删除文件组等。如图所示。也可以在其他选项页中修改数据库其它属性。
3.2 命令行方式修改数据库
命令行方式修改数据库包括以下几项:
- 修改数据库名称
- 增加或删除数据文件
- 改变数据文件的大小和增长方式
- 改变日志文件的大小和增长方式
- 增加或删除日志文件
- 增加或删除文件组
T-SQL提供了ALTER DATABASE
语句,该语句的功能是修改与数据库关联的文件和文件组。在数据库中添加或删除文件和文件组、更改数据库或其文件和文件组的属性。ALTER DATABASE
语句功能强大,这里只介绍其最主要的功能。其语法格式如下:
ALTER DATABASE database_name
{
<add_or_modify_files>
| <add_or_modify_filegroups>
}
[;]
ALTER DATABASE
语句语法说明:
database_name
是所修改数据库的逻辑名。<add_or_modify_files>
项列表用以修改各类文件。<add_or_modify_files>
格式为:
<add_or_modify_files>::=
{
ADD FILE <filespec> [ ,...n ]
[ TO FILEGROUP { filegroup_name } ]
| ADD LOG FILE <filespec> [ ,...n ]
| REMOVE FILE logical_file_name
| MODIFY FILE <filespec>
}
-
ADD FILE
子句向数据库添加数据文件。
-
ADD LOG FILE
子句向数据库添加事务日志文件。
-
REMOVE FILE
子句从数据库中删除数据文件。
-
MODIFY FILE
子句修改数据库的文件属性。
-
- 其中:
<filespec>::=
(
NAME = logical_file_name
[ , NEWNAME = new_logical_name ]
[ , FILENAME = {'os_file_name' | 'filestream_path' } ]
[ , SIZE = size [ KB | MB | GB | TB ] ]
[ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ]
[ , FILEGROWTH = growth_increment [ KB | MB | GB | TB| % ] ]
[ , OFFLINE ]
)
OFFLINE
是将文件设置为脱机并使文件组中的所有对象都不可访问。
<add_or_modify_filegroups>
项列表用以修改文件组。<add_or_modify_filegroups>
格式为:
<add_or_modify_filegroups>::=
{
| ADD FILEGROUP filegroup_name
[ CONTAINS FILESTREAM ]
| REMOVE FILEGROUP filegroup_name
| MODIFY FILEGROUP filegroup_name
{ <filegroup_updatability_option>
| DEFAULT
| NAME = new_filegroup_name
}
}
-
ADD FILEGROUP
子句向数据库添加文件组。
-
CONTAINS FILESTREAM
指定文件组在文件系统中存储FILESTREAM
二进制大型对象(BLOB)。
REMOVE FILEGROUP`子句从数据库中删除文件组。如果需要删除文件组,必需先将文件组中文件删除,且不能删除主文件组。
-
MODIFY FILEGROUP
通过将状态设置为READ_ONLY
或READ_WRITE
、将文件组设置为数据库的默认文件组或者更改文件组名称来修改文件组。
-
- 其中:
<filegroup_updatability_option>::=
{
{ READONLY | READWRITE }
| { READ_ONLY | READ_WRITE }
}
对文件组设置只读或读/写属性。READ_ONLY | READONLY
指定文件组为只读,不允许更新其中的对象。READ_WRITE | READWRITE
将该组指定为READ_WRITE
,允许更新文件组中的对象。
注意,以前修改数据库逻辑名可以调用系统存储过程sp_renamedb
操作,但在后续版本的SQL Server将删除该功能。请避免在新的开发工作中使用该功能,并应该着手修改当前还在使用该功能的应用程序。请改用ALTER DATABASE MODIFY NAME
直接给数据库重命名。
例:使用ALTER DATABASE
语句修改NewTest
数据库。
其主数据文件初始大小改为100M,最大为500M,每次增长10%。新增1个次要数据文件,初始大小为10M,最大不受限制,每次增长10M。
新建查询编辑器窗口,输入以下T-SQL语句:
ALTER DATABASE NewTest /* 修改数据库 */
MODIFY FILE /* 修改数据库文件 */
(
NAME='NewTest', /* 数据库文件逻辑名 */
SIZE=200MB, /* 修改后的文件初始大小 */
MAXSIZE=UNLIMITED, /* 修改后的文件最大值 */
FILEGROWTH=10% /* 修改后的文件增长方式 */
)
GO
ALTER DATABASE NewTest /* 修改数据库 */
ADD FILE /* 新增数据文件 */
(
NAME='N3', /* 新增数据文件逻辑名 */
FILENAME ='C:\DB\N3.ndf', /* 新增数据库文件物理名 */
SIZE=10MB, /* 新增数据文件初始大小 */
MAXSIZE=UNLIMITED, /* 文件增长不受限制 */
FILEGROWTH=10MB /* 新增数据文件增长方式 */
)
GO
四、删除数据库
如果数据库不需要了,可以删除。SQL Server同样提供了管理工具界面和命令行两种方式删除数据库。不论哪种方式,一旦数据库被删除,就是被彻底删除,包括在SQL Server Management Studio中看到的逻辑数据库和操作系统下的数据库文件,文件不经回收站直接删除。如果没有事先备份,数据库中数据全部丢失,不能还原。所以删除数据库操作在使用时一定要小心。
数据库文件符号标志变化为脱机
符号,如图所示:
如果想要将数据库恢复为联机状态,可以选择联机
选项,如图所示:
数据库的状态将影响对数据库的删除。执行删除操作时,如果数据库或它的任意一个文件处于脱机状态,则不会删除磁盘文件,必须在操作系统下手动删除这些文件。
不能删除当前正在使用的数据库,包括本机和网络用户正在使用。这表示数据库正处于打开状态,以供用户读写。
在删除数据库之前,必须将该数据库上的所有数据库快照都删除。
如果数据库涉及日志传送操作,请在删除数据库之前取消日志传送操作。
如果为事务复制发布了数据库,或将数据库发布或订阅到合并复制,请从数据库中删除复制。
无法删除系统数据库。
4.1 管理工具界面方式删除数据库
例:使用SQL Server Management Studio删除MyTest
数据库。
右键选择MyTest
数据库,选择删除
选项,进入删除对象
对话框。如果SQL Server Management Studio启动后没有对MyTest
数据库进行过其他操作,选择确定
按钮即可删除数据库。如果在删除操作之前,对该数据库进行过其他操作,一定要先选择关闭现有连接
选项,再选择确定
按钮才能删除数据库。如图所示。否则可能会提示删除失败,因为数据库正在被使用。
4.2 命令行方式删除数据库
T-SQL提供了DROP DATABASE
语句,该语句的功能是删除一个或多个数据库或数据库快照。其语法格式如下:
DROP DATABASE { database_name | database_snapshot_name } [ ,...n ]
DROP DATABASE
语句语法说明:
database_name
是要删除的数据库的名称。database_snapshot_name
是要删除的数据库快照的名称。- 可以一次删除多个数据库。
例:使用DROP DATABASE语句删除NewDB
数据库。
新建查询编辑器窗口,输入以下T-SQL语句:
DROP DATABASE NewDB
GO
运行前,和在界面方式删除数据库遇到的情况相同,必须保证被删除数据库不是当前正在使用的数据库。
五、数据库的分离和附加
数据库操作除了上述基本操作外,还有分离数据库和附加数据库操作。
SQL Server可以分离数据库的数据和事务日志文件,然后将它们重新附加到同一或其他SQL Server实例。如果要将数据库更改到同一计算机的不同SQL Server实例或要移动数据库,分离和附加数据库会很有用。
5.1 分离数据库
分离数据库是指将数据库从SQL Server数据库管理系统中删除,但不会从操作系统中删除文件,而且数据库在其数据文件和事务日志文件中保持不变。
之后,就可以使用这些文件将数据库附加到任何SQL Server数据库管理系统中,包括分离该数据库的服务器。
但分离数据库是有条件限制的。如果存在下列任何情况,则不能分离数据库:
- 已复制并发布数据库。如果进行复制,则数据库必须是未发布的。必须通过调用
sp_replicationdboption
系统存储过程禁用发布后,才能分离数据库。 - 数据库中如果存在数据库快照,必须首先删除所有数据库快照,然后才能分离数据库。
- 该数据库正在某个数据库镜像会话中进行镜像。除非终止该会话,否则无法分离该数据库。
- 数据库处于可疑状态,无法分离可疑数据库。必须将数据库设为紧急模式,才能对其进行分离。
- 该数据库是系统数据库。
可以使用SQL Server Management Studio的界面方式分离数据库。也可以使用命令行方式,调用系统存储过程分离数据库。
例:分离NewDB
数据库。
管理工具界面方式:
在SQL Server Management Studio中,右键
选择要分离的NewDB
数据库,选择任务
选项的分离
子选项,进入分离数据库
对话框。选择确定
按钮即可分离数据库。如图所示:
分离数据库后,在SQL Server Management Studio的对象资源管理器
窗口中将看不到被分离的数据库的逻辑名,但在操作系统下还可以查看到该数据库的数据文件和日志文件。
命令行方式:
使用命令行方式,调用sp_detach_db
系统存储过程同样可以分离数据库。新建一个查询窗口,输入以下调用语句:
EXEC sp_detach_db ' database_name '
说明:
EXEC
是调用系统存储过程命令。db_name
是要分离的数据库逻辑名。- 在分离时,需要拥有对数据库的独占访问权限。如果要分离的数据库正在使用时,则必须将其设置为
SINGLE_USER
模式,才能进行分离操作。可以使用下面语句对数据库设置独占访问权限:
USE master
ALTER DATABASE MyDB
SET SINGLE_USER
GO
5.2 附加数据库
分离后的数据库可以通过附加数据库操作,将其附加到某个SQL Server实例中。
当将包含全文目录文件的数据库附加到SQL Server服务器实例上时,会将目录文件从其以前的位置与其他数据库文件一起附加。
附加数据库时,所有数据文件(MDF
文件和NDF
文件)都必须可用。如果任何数据文件的路径不同于首次创建数据库或上次附加数据库时的路径,则必须指定文件的当前路径。如果附加的主数据文件是只读的,则数据库引擎假定数据库也是只读的。
可以使用SQL Server Management Studio的界面方式附加数据库。也可以使用命令行方式,调用系统存储过程附加数据库。
例:附加MyDB数据库。
在SQL Server Management Studio中,右键选择数据库
选项,选择附加
选项,进入附加数据库
对话框。添加要附加的数据库主数据文件NewDatabase.mdf
,选择确定
按钮即可附加数据库。如图所示:
成功附加数据库后,用户可以在SQL Server Management Studio的对象资源管理器
窗口中看到附加的数据库。
还可以使用
CREATE DATABASE
创建数据库命令附加数据库。只要确定该数据库文件存在的路径,以及在最后加上FOR ATTACH
子句。
例:用T-SQL语句附加MyDB数据库。
在查询窗口输入以下命令:
CREATE DATABASE MyDB
ON
(
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\MyDB.mdf'
)
FOR ATTACH
GO
执行结果与前文相同。
系统存储过程sp_attach_db
来附加数据库
SP_ATTACH_DB[ @dbname= ] 'dbname'
, [ @filename1= ] 'filename_1' [ ,...n ]
六、数据库的收缩
由于SQL Server采用预先分配存储空间的方式来创建数据库的数据文件和日志文件,这样就会造成数据库文件大小与实际使用有所差别。
当用户创建的数据库的数据增长到要超过它的配置空间时,必须增加数据库的容量。反之,如果用户配置的数据库空间有大量的空余,则可以通过缩减数据库来减少存储空间的浪费。
SQL Server提供了数据库的收缩功能,允许对数据库中的每个文件进行收缩,删除已经分配但没有使用的页。
收缩操作前,用户可以使用SQL Server Management Studio查看数据库文件空间使用情况。右键
选择NewDatabase
数据库,选择报表
选项的标准报表
子选项,选择“磁盘使用情况”选项。如图所示:
6.1 手动收缩
可以使用SQL Server Management Studio的界面方式收缩数据库。也可以使用命令行方式,调用系统存储过程收缩数据库。
在SQL Server Management Studio中,右键
选择要收缩的数据库名,选择任务
选项的收缩
子选项。如果对数据库收缩,选择数据库
选项,进入收缩数据库
对话框。用户可以通过设置收缩后文件中的最大可用空间
设置收缩比例。如图所示:
如果对文件收缩,选择文件
选项。进入收缩文件
对话框。用户可以通过设置文件组、文件名以及收缩操作来设置。
还可以使用DBCC SHRINKDATABASE
命令收缩数据库。其语法格式如下:
DBCC SHRINKDATABASE
( database_name | database_id | 0
[ , target_percent ]
[ , { NOTRUNCATE | TRUNCATEONLY } ]
)
[ WITH NO_INFOMSGS ]
DBCC SHRINKDATABASE
语句语法说明:
database_name | database_id | 0
是要收缩的数据库的名称或ID。如果指定0
,则使用当前数据库。target_percent
是数据库收缩后的数据库文件中所需的剩余可用空间百分比。NOTRUNCATE
通过将已分配的页从文件末尾移动到文件前面的未分配页来压缩数据文件中的数据。target_percent
是可选参数。文件末尾的可用空间不会返回给操作系统,文件的物理大小也不会更改。因此,指定NOTRUNCATE
时,数据库看起来未收缩。NOTRUNCATE
只适用于数据文件。日志文件不受影响。TRUNCATEONLY
将文件末尾的所有可用空间释放给操作系统,但不在文件内部执行任何页移动。数据文件只收缩到最近分配的区。如果与TRUNCATEONLY
一起指定,将忽略target_percent
。TRUNCATEONLY
只适用于数据文件。日志文件不受影响。WITH NO_INFOMSGS
取消严重级别从0
到10
的所有信息性消息。
例:对NewTest数据库的空间缩减至可用剩余空间为60%。
在查询窗口输入以下命令:
DBCC SHRINKDATABASE ('NewTest', 60)
6.2 自动收缩
为了防止用户在不注意的情况下,由于数据变化而导致数据文件的不合理,可以设置SQL Server定期自动的收缩数据库。
在数据库属性
对话框中,选择选项
,将自动
子选项的自动收缩
设置为True
,就可以让SQL Server定期自动的收缩数据库。如图所示:
或者使用ALTER DATABASE
将数据库设置为自动收缩。其语法格式如下:
ALTER DATABASE database_name
SET AUTO_SHRINK ON
七、移动数据库
如果存放数据库文件的磁盘空间不足,可以使用下面的方法将数据库中指定的文件移动到其他磁盘上。在SQL Server Management Studio中无法移动数据库文件,只能通过T-SQL语句。
移动数据库文件使用ALTER DATABASE
命令。
例:将NewTest数据库的N2.ndf文件移到D盘。
在查询窗口输入以下命令,操作分3步:
- 首先将数据库设置为离线状态,即状态设置为脱机。
ALTER DATABASE NewTest SET OFFLINE
- 执行下面语句,修改数据库文件位置。
ALTER DATABASE NewTest
MODIFY FILE
(
NAME= ' N2 ',
FILENAME='D:\N2.ndf'
)
GO
- 移动文件后,再将数据库设置为联机状态。
ALTER DATABASE NewTest SET ONLINE
GO
八、数据库快照
数据库快照是SQL Server数据库(源数据库)的只读静态视图。
自创建快照那刻起,数据库快照在事务上与源数据库一致。数据库快照始终与其源数据库位于同一服务器实例上。当源数据库更新时,数据库快照也将更新。因此,数据库快照存在的时间越长,就越有可能用完其可用磁盘空间。给定源数据库中可以存在多个快照。在数据库所有者显式删除每个数据库快照之前,该快照将一直保留。
数据库快照在数据页级运行。在第一次修改源数据库页之前,先将原始页从源数据库复制到快照。快照将存储原始页,保留它们在创建快照时的数据记录。对要进行第一次修改的每一页重复此过程。对于用户而言,数据库快照似乎始终保持不变,因为对数据库快照的读操作始终访问原始数据页,而与页驻留的位置无关。
8.1 数据库快照优点
SQL Server数据库中,之所以引入数据库快照概念,因为快照具有以下一些优点:
- 快照可用于报告目的。客户端可以查询数据库快照,这对于基于创建快照时的数据编写报表是很有用的。
- 维护历史数据以生成报表。快照可以从特定时点扩展用户对数据的访问权限。如果磁盘空间允许,还可以维护任意多个不同期间要结束时的快照,以便能够对这些时间段的结果进行查询。
- 使用为了实现可用性目标而维护的镜像数据库来减轻报表负载。使用带有数据库镜像的数据库快照,使用户能够访问镜像服务器上的数据以生成报表。而且,在镜像数据库上运行查询可以释放主体数据库上的资源。
- 使数据免受管理失误所带来的影响。定期创建数据库快照,可以减轻重大用户错误(例如删除的表)的影响。为了很好地保护数据,可以创建时间跨度足以识别和处理大多数用户错误的一系列数据库快照。
8.2 数据库快照的操作
虽然说数据库快照是SQL Server数据库的只读静态视图,但对数据库快照操作(包括创建、修改、删除等)如同操作数据库一样,而不是操作视图。
使用AS SNAPSHOT OF
子句对文件执行CREATE DATABASE
语句。创建快照需要指定源数据库的每个数据库文件的逻辑名称。语法如下:
CREATE DATABASE database_snapshot_name
ON
(
NAME = logical_file_name,
FILENAME = 'os_file_name'
) [ ,...n]
AS SNAPSHOT OF source_database_name
[;]
其中,source_database_name
是源数据库,logical_file_name
是引用该文件时在SQL Server中使用的逻辑名称,os_file_name
是创建该文件时操作系统使用的路径和文件名,database_snapshot_name
是要将数据库恢复到的快照的名称。
还需要注意的是,创建了数据库快照之后,快照的源数据库就会存在一些限制,如不能对数据库删除、分离或还原。源数据库性能会受到影响,不能从源数据库或其他快照上删除文件,源数据库还必须处于在线状态等。
例:创建NewTest
数据库的数据库快照。
CREATE DATABASE NewTest_SNAP
ON
(
NAME= NewTest,
FILENAME='D:\NSnap.mdf'
)
AS SNAPSHOT OF NewTest
GO
如果不需要快照了,可以删除。删除数据库快照语法如下:
DROP DATABASE database_snapshot_name
最后再提醒广大SQL Server用户,不同版本的SQL Server对数据库快照的支持也是不一样,标准版本通常不支持,而企业级版本通常支持。