3.2.1 数据库的定义
数据库是存储数据的重要基础,对于数据库,从逻辑角度看,描述信息的数据存储在数据库中并由DBMS统一管理;从物理角度看,描述信息的数据是以文件的方式存储在物理磁盘上,由操作系统进行统一管理。
1)数据库的逻辑结构
在SQL Server中,创建一个数据库时,SQL Server会对应地在物理磁盘上创建相应的操作系统文件,数据库中的所有数据、对象和数据库操作日志都存储在这些文件中。一个数据库的所有物理文件,在逻辑上通过数据库名联系在一起,也就是说一个数据库在逻辑上对应一个数据库名,在物理存储上会对应若干存储文件。SQL Server中的每个数据库至少有两个文件(一个主数据文件和一个事务日志文件)以及一个文件组(主要文件组)。
(1)数据文件
数据文件是存放数据库数据和数据库对象的文件。一个数据库可以有一个或多个数据文件,一个数据文件只能属于一个数据库。当有多个数据文件时,其中只有一个数据文件被定义为主数据文件(扩展名为.mdf),用来存储数据库的启动信息,并指向数据库中的其他文件,是数据库的起点,一个数据库只能有一个主数据文件;次要数据文件(扩展名为.ndf)是可选的,除主数据文件以外的其他所有数据文件都是次要数据文件,一个数据库可以没有次要数据文件,也可以有多个次要数据文件。采用主数据文件和次要数据文件来存储数据,容量可以无限制地扩充而不受操作系统文件的大小限制。另外,通过将数据文件存储在不同的硬盘上,可以同时对几个硬盘进行并行存取,从而可以提高数据处理的效率。
(2)事务日志文件
事务日志文件(扩展名为.ldf)用来记录所有事务以及每个事务对数据库所做的修改。当数据库发生损坏时,可以根据日志文件来分析出错的原因;当数据丢失时,还可以使用事务日志恢复数据库。每个数据库至少拥有一个事务日志文件,当然也可以有多个事务日志文件。
(3)文件组
为了更好地实现数据库文件的组织,从SQL Server 7.0开始引入了文件组的概念。文件组是将多个数据文件集合起来形成的一个整体,是文件的逻辑结合。文件组可以对组内的多个数据文件进行统一管理,每个文件组有一个组名。通过设置文件组,可以有效地提高数据库的读写速度。例如,可以分别在3个磁盘驱动器(C盘、D盘、E盘)上创建3个数据文件:Teach_1.ndf、Teach_2.ndf和Teach_3.ndf,然后将这3个文件分配给文件组Group1。当创建Student表时,可以指定将表创建在文件组Group1上,这样该表的数据就可以分布在3个逻辑磁盘上,当对Student表中的数据进行查询操作时,可以并行操作,从而可以提高查询性能。
SQL Server提供了3种类型的文件组:主文件组(PRIMARY)、默认文件组、用户自定义文件组。
主文件组:每个数据库有一个主文件组,主文件组包含主数据文件和未指定文件组的所有次要数据文件。数据库的系统表都放在主文件组里。
默认文件组:每个数据库都有一个被指定的默认文件组,在创建数据库对象时,如果没有指定将其放在哪一个文件组中,就会将其放在默认文件组中;如果没有指定默认文件组,则主文件组为默认文件组。
用户自定义文件组:为便于管理、数据分配和放置,用户也可以自己定义文件组。所有在创建数据库CREATE DATABASE语句或修改数据库ALTER DATABASE语句中FILEGROUP关键字所指定的文件组都属于用户自定义文件组。
注意:一个数据文件只能存在于一个文件组中,一个文件组也只能被一个数据库使用;日志文件不分组,它不属于任何文件组。
2)数据库的物理结构
数据库创建成功后,会在操作系统的物理介质——硬盘的NTFS或者FAT分区上生成多个文件(*.mdf文件、*.ndf文件或者*.ldf文件),数据库的物理存储结构如图3-3所示。其中SQL Server中的数据文件是以页的形式存储,而日志文件不包含页,只是包含一系列日志记录。
(1)数据页
数据页简称为页,是SQL Server中数据存储的基本单位。数据页的大小为8 KB,这意味着SQL Server数据库中每MB有128页。每页的开头有96字节的标头,用于存储有关页的系统信息,如页码、页类型、页的可用空间以及拥有该页的对象的分配单元ID。磁盘I/O操作在页级执行,也就是说,SQL Server读取或写入所有数据页。
SQL Server中的页按照顺序从0到n连续编号,数据库中的每个文件都有一个唯一的文件ID号,因此,若要唯一标识数据页,需要同时使用文件ID和页码。图3-4显示了包含4 MB主数据文件(512页)和1 MB(128页)次要数据文件的数据库中的页。
图3-3 数据库的物理存储结构
图3-4 数据库中的数据页示例
(2)扩展盘区
扩展盘区是8个物理上连续的页的集合,它是一种文件存储结构,每个区大小为8×8 KB=64 KB。扩展盘区用来有效地管理页,所有页都存储在区中。
当创建一个数据库对象时,SQL Server会自动以扩展盘区为单位给它分配空间,同时扩展盘区也是数据检索的基本单位。
(3)事务日志
事务日志文件不包含页,而是包含一系列日志记录,是一种串行化的、顺序的、回绕的文件,一旦到达了物理日志的末尾,SQL Server将绕回并在物理日志的开头继续写当前日志。
当把数据修改写入日志时,会得到一个日志序列号LSN,如果日志记录越来越多,日志文件被填满,达到了事务日志的最大容量,那么数据库将不会允许进行数据修改。为了避免事务日志文件被填满,必须定期清理日志中的旧事务,首选的方式是备份事务日志。
3)创建数据库
在使用数据库之前,必须创建数据库。用户可以通过SQL Server Management Studio创建数据库,也可以使用CREATE DATABASE语句创建数据库。
(1)使用SQL Server Management Studio创建数据库
启动SQL Server Management Studio。
在左边的“对象资源管理器”窗口中选中“数据库”节点,单击鼠标右键,在出现的快捷菜单中选择“新建数据库”命令,如图3-5所示。
图3-5 选择“新建数据库”命令
进入“新建数据库”窗口,其中包含3个选项卡。“常规”选项卡:用于设置新建数据库的名称及所有者;“选项”选项卡:用于设置数据库的排序规则及恢复模式等选项,这里均采用默认设置;“文件组”选项卡:显示文件组的统计信息,这里均采用默认设置。操作方式如图3-6所示。
图3-6 “常规”选项卡
“常规”选项卡中,如果要更改文件的初始大小,可以直接更改文件行中的“初始大小(MB)”值;如果要修改文件的自动增长/最大大小,单击该文件行中的“自动增长/最大大小”按钮,打开如图3-7所示的对话框,修改相应值后,再单击“确定”按钮返回即可;“路径”按钮用于设置数据库的物理存储路径。
以上各项设置完成后,单击图3-6中的“确定”按钮,即可完成数据库的创建。
图3-7 更改“自动增长/最大大小”设置
(2)使用CREATE DATABASE语句创建数据库
其基本格式如下:
database_name:新建数据库的名称,其在服务器中必须唯一,并且符合标识符的命名规则;
ON:指定显式定义用来存储数据库数据部分的磁盘文件(数据文件);
PRIMARY:指定关联的<filespec>列表定义主文件。在主文件组的<filespec>项中指定的第一个文件将成为主数据文件,一个数据库只能有一个主文件。如果没有指定PRIMARY,那么CREATE DATABASE语句中列出的第一个数据文件将成为主数据文件;
LOG ON:指定显式定义用来存储数据库日志的磁盘文件(日志文件)。如果没有指定LOG ON,将自动创建一个日志文件,其大小为该数据库的所有数据文件大小总和的25%或512 KB,取二者之中的较大者;
<filespec>用于设置文件属性,其中,
NAME:指定文件的逻辑名称,logical_file_name在数据库中必须唯一,并且符合标识符规则;
FILENAME:指定操作系统(物理)文件名;
SIZE:指定文件的初始大小,可以使用KB、MB、GB和TB后缀,默认值为MB。如果没有为主数据文件提供size,数据库引擎将使用model数据库中主数据文件的大小;
MAXSIZE:指定文件可增大到的最大大小,可以使用KB、MB、GB和TB后缀,默认值为MB。UNLIMITED指定文件将增长到磁盘充满。max_size是整数,如果未指定,文件将一直增长到磁盘满为止;
FILEGROWTH:指定文件的自动增量,该设置不能超过MAXSIZE设定的值。growth_increment可以KB、MB、GB、TB或百分比(%)为单位,默认值为MB。
【例3.1】 创建未指定文件的数据库。
CREATE DATABASE Teach1;
说明:创建Teach1数据库,并创建相应的主数据文件和事务日志文件。因为上述语句中没有<filespec>项,所以系统会自动为主数据文件和事务日志文件通过向database_name追加后缀生成逻辑文件名和物理文件名,并将其放置于默认位置(可使用“服务器属性”→“数据库设置”选项卡查看或更改数据文件和事务日志文件的默认位置);主数据文件的大小为model数据库主数据文件的大小,事务日志文件设置为二者(512 KB或主数据文件大小的25%)中的较大值;因为没有指定MAXSIZE,文件可以增大到填满所有可用的磁盘空间为止。该数据库的两个文件的设置如图3-8所示:
图3-8 Teach1数据库的数据文件和事务日志文件设置情况
【例3.2】 创建指定数据文件和事务日志文件的数据库。
说明:创建Teach2数据库,将数据文件和事务日志文件放置于不同的磁盘上,以便提高性能。由于未使用关键字PRIMARY,因此第一个文件(Teach2_dat)将成为主数据文件。因为在Teach2_dat文件的SIZE、MAXSIZE和FILEGROWTH参数中没有指定MB或KB,将使用MB并按MB分配空间。
【例3.3】 创建具有多个数据文件和事务日志文件的数据库。
说明:创建Teach3数据库,该数据库有3个数据文件和2个事务日志文件。主数据文件是数据文件列表中的第一个文件,事务日志文件在LOG ON关键字后指定。注意各文件的扩展名:.mdf用于主数据文件,.ndf用于次要数据文件,.ldf用于事务日志文件。
【例3.4】 创建具有文件组的数据库。
说明:创建Teach4数据库,该数据库具有如下文件组:
包含Teach4_1_dat和Teach4_2_dat的主文件组;
包含Teach4_G1_1_dat和Teach4_G1_2_dat的文件组Group1;
包含Teach4_G2_1_dat和Teach4_G2_2_dat的文件组Group2。
4)修改数据库
在SQL Server中,数据库是以model数据库为模板创建的,数据库创建后,可以根据用户的需求对数据库进行修改。用户可以通过SQL Server Management Studio修改数据库,也可以使用ALTER DATABASE语句修改数据库。
(1)使用SQL Server Management Studio修改数据库
启动SQL Server Management Studio。
在左边的“对象资源管理器”窗口中展开“数据库”节点,选中并右击要修改的数据库,在出现的快捷菜单中选择“属性”命令,如图3-9所示。
图3-9 选择“属性”命令
打开数据库属性对话框,如图3-10所示,在左侧窗口中选择相应的选择页,可以添加、删除数据文件以及修改数据文件的属性;可以添加、删除文件组以及修改文件组的属性;可以设置数据库的“只读”属性;可以对数据库进行收缩;可以设置用户对数据库的使用权限等。
(2)使用ALTER DATABASE语句修改数据库
其基本格式如下:
图3-10 数据库“属性”页
说明:
database_name:要修改的数据库的名称;
MODIFY NAME=new_database_name:使用指定的名称new_database_name重命名数据库;
COLLATE collation_name:指定数据库的排序规则;
ADD FILE子句:向指定的文件组添加数据文件;
ADD LOG FILE子句:添加事务日志文件;
REMOVE FILE子句:删除逻辑文件说明并删除物理文件;
MODIFY FILE子句:指定应修改的文件;
ADD FILEGROUP子句:添加文件组;
REMOVE FILEGROUP子句:删除文件组;
MODIFY FILEGROUP子句:修改文件组的属性;
<filespec>用于设置文件属性。OFFLINE:将文件设置为脱机并使文件组中的所有对象都不可访问。注意:仅当文件已损坏但可以还原时,才能使用该选项。<filespec>中其他参数同CREATE DATABASE。
【例3.5】 修改例3.1中创建的Teach1数据库名称为Teach。
【例3.6】 向例3.4中创建的Teach4数据库中添加两个事务日志文件。
5)删除数据库
用户可以通过SQL Server Management Studio删除数据库,也可以使用DROP DATABASE语句删除数据库。
(1)使用SQL Server Management Studio删除数据库
启动SQL Server Management Studio。
在左边的“对象资源管理器”窗口中选中“数据库”节点,单击鼠标右键,在出现的快捷菜单中选择“删除”命令,如图3-11示。
出现“删除对象”对话框,单击“确定”按钮,即可删除Teach数据库,如图3-12所示。
图3-11 选择“删除”命令
图3-12 “删除对象对话框”
(2)使用DROP DATABASE删除数据库
其基本格式如下:
说明:
执行数据库删除操作会从SQL Server实例中删除数据库,并删除该数据库使用的物理磁盘文件;
不能删除当前正在使用的数据库,也不能删除系统数据库。
【例3.7】 删除例3.2和例3.3中创建的数据库Teach2和Teach3。