设计SQL Server 数据库
完成这章,你将能够
- 理解每一个系统数据库的要求和功能。
- 理解SQL Server 数据库的结构。
- 创建一个数据库。
- 添加和改变文件组。
- 添加文件到文件组。
- 分离和附加数据库。
理解数据库恢复模型。
数据库是Microsoft SQL Server 关系引擎中所有对象的容器。在这一章中,你将学习系统数据库存储SQL Server 实例相关的重要信息。你还将学习到创建用户定义的数据库和用来控制怎样以及在什么地方存储数据的基础技术。这些方法包括创建由多文件组和多数据文件组成的数据库。最后,你将学习怎样把一个数据库从一个SQL Server 实例移动到另外一个实例,并且你将探索数据库恢复模型。
理解SQL Server 系统数据库
在你开始创建Microsoft SQL Server 2012 数据库前,你应该对系统数据库有一个很好的了解,这些数据库是在安装SQL Server数据库实例时默认创建的。下面每一个数据库都是为了一个特定的目标服务的,并且要求运行SQL Server。
- master
- tempdb
- model
- msdb
- resource
- distribution
master 数据库
master 数据库,正如它名字那样,是最初的数据库。没有它,SQL Server 将无法启动。master 数据库包含SQL Server 实例中对象的大多数重要信息,如下所示:
- Databases
- AlwaysON
- Database mirroring
- Configurations
- Logins
- Resource Governor
- Endpoints
//The following code returns a list of all databases on an instance of SQL Server
Select * from sys.master_files
tempdb 数据库
tempdb 数据库是运行SQL Server的内部进程创建的临时对象和用户或应用程序创建的临时对象的全局场地。这些临时对象包括临时表和存储过程,表变量,全局临时表,和游标。除了临时对象,tempdb 还存储了读提交(read-committed)或者快照隔离事务(snapshot isolation transactions),在线索引操作(online index operation),和AFTER 触发器(AFTER triggers)。重要的一点需要记住,每次SQL Server重启,tempdb 都会被重新创建。虽然你能够在 tempdb 中创建对象,但是你永远都不应该把它当做存储持久化信息的数据库。
model 数据库
model 数据库和它的名字所表明的一模一样:一个模型是针对所有的数据库被创建在一个SQL Server 实例上的。换句话说,它是被用作你每次创建数据库的模板。例如,如果你想要在一个SQL Server 实例上,每一次创建数据库时都有一个特别的表存在,你将要模型数据库中创建那张表。结果是,每一次一个数据库被创建,这个数据库将会包含那张表。
注意:如果model 数据库不存在或者离线,tempdb 不能被创建。这是因为,正如前面提到的那样,每次SQL Server 被重启,tempdb 都会被重新创建。既然每一个数据库都使用model 作为模板,并且tempdb 也不例外,在启动时,model 数据库必须存在,tempdb 才能重新创建。
msdb 数据库
msdb 最初最为 Microsof SQL Server Agent 后端数据库用的。不管什么时候,你创建和/或调度一个SQL Server Agent 工作,这个工作的元数据被存储在msdb 数据中。除了SQL Server Agent 数据,msdb 存储了以下组件的信息:
- Service brokers
- Alerts
- Log shipping
- SSIS packages
- Utility control point (UCP)
- Database mail
- Maintenance plans
resource 数据库
resource 数据库是一个隐藏的,只读的数据库,它不太经常被讨论到。resource 数据库最初的目的是改进SQL Server 从一个版本到下一个版本的升级过程的。SQL Server 实例的所有系统对象都被存储在resource 数据库中。这个数据库不能被还原或者重新存储。你不应该尝试改变或者移动这个数据库,除非微软客户支持指导你这么做。
distribution 数据库
最后一个系统数据库时 distribution 数据库。这个数据库只有当你把这个实例配置成分布式拷贝时,才会存在。在配置拷贝之前,你必须执行这个配置。各种类型拷贝的元数据和历史都被存储在这个数据库中。
查看系统数据库
- 打开 SQL Server Management Studio (SSMS)并且连接到服务器。
- 对象浏览器应该被打开。如果没打开,按 F8 打开它。
- 在对象浏览器中,展开数据库。
你将会看到一个标签为 System Databases 的文件夹。展开它。
理解SQL Server 数据库的结构
正如前面提到的那样,在SQL Server 中数据库时基本的数据存储对象。虽然数据库的创建过程非常简单,但是总是要非常细心的考虑数据库结构。可以使用很多不同的技术和方法创建数据库。在这一章,你将要把目光集中在使用 T-SQL 和 SSMS 上。默认情况下,每一个SQL Server 数据库由两个文件组成(请看表4-1)
- 数据文件(data file)包含数据和数据库对象,如表,视图,和存储过程。
- 日志文件(log file)包含数据库中帮助恢复事务的信息。
表4-1 SQL Server 数据库结构由至少一个数据文件和至少一个日志文件组成。
创建数据库
有两种类型的数据文件:主要的(primary)和次要的(secondary)。当一个数据库一开始被创建,主要数据文件就被创建了。默认情况下,它包含了这个数据库的所有启动信息。当用户定义的对象被创建,它们也可以被存储在主要数据文件中。然而,你可以执行某一种架构策略来改进你的数据库的性能,可扩展性和可维护性。这些策略在后面的“添加文件和文件组”章节被讨论。
运行脚本之前,在 C 盘根目录下创建两个文件夹:SQLData 和 SQLLog.
用SSMS 创建你的第一个数据库
- 打开SSMS。
- 如果对象浏览器没有打开,请打开对象浏览器。
- 点击服务器旁边的箭头。
- 右键点击数据库文件夹。
- 在上下文菜单中,选择新建数据库。
- 新建数据库对话框打开。确保左边的选择页中,常规(General)被选中。
- 在数据库名称文本框中,输入SBSChp4SSMS。
- 在数据库文件部分,定位到路径(Path)列。在路径列的第一行,点击省略号按钮。浏览到 C:\SQLData 。
- 在同一行,在文件名称列,输入SBSChp4SSMS。
- 在第二行,路径列下面,点击省略号按钮。浏览到 C:\SQLLog。
在同一行,文件名称列下面,输入 SBSChp4SSMS_log。
点击确定。
- 在左边选择页部分,选择文件组(Filegroup)。
使用 T-SQL 创建你的第一个数据库
- 在 SSMS 中打开查询编辑器。
- 在查询编辑器中,输入下面的 T-SQL 代码:
--Use this script to create a database using T-SQL
USE master;
CREATE DATABASE SBSChp4TSQL
ON PRIMARY
(NAME='SBSChp4TSQL1',FILENAME='C:\SQLDATA\SBSTSQL1.mdf',SIZE=10MB,MAXSIZE=20,FILEGROWTH=10%)
LOG ON
(NAME='SBSChp4TSQL_log',FILENAME='C:\SQLDATA\SBSTSQL_log.mdf',SIZE=10MB,MAXSIZE=200,FILEGROWTH=20%)
理解参数
在前面的脚本中,几个参数被用来使数据库被放到指定的文件目录,并且数据库一定比例增长。SQL Server 提供了一个很长的参数清单,使用这些参数可以进一步指定数据库怎样被创建和数据库放置在什么地方。前面的脚本使用了下面常用的参数:
- database_name 是数据库的名称,这个名称必须不能和现有的数据库重名。
- ON 指定文件组和数据文件定义的位置。
- LOG ON 指定日志定义的位置。
- Name 是 SQL Server 引用文件时的逻辑文件名,正如 database_name,它必须是唯一的。
- FileName 是操作系统路径和文件名,包含文件扩展名。
- Size 指定文件的初始大小,默认单位是兆字节(MB)。也可以指定 KB, GB ,TB。
- Maxsize 指定文件能增长的最大大小(默认单位 MB)。
Filegrowth 指定文件增长的增量。默认以兆字节表示,也可以指定以百分比。
注意:这不是数据库创建的全部选项清单。随着你使用 SQL Server 越来越多,你会发现你对其它选项的需求,这些选项你可以在 SQL Server Books Online 中查找到。
添加文件和文件组
除了把用户定义的对象放在主要数据文件中,你还可以选择添加到次要数据文件中。这些文件类型通常通过文件扩展名区分:主要文件(primary files)通常用 .mdf 作为后缀,而次要文件以 .ndf 作为后缀。二者都不是硬性要求;无论如何,使用这些扩展名是一个最佳实践。次要数据文件通常用来跨磁盘系统分布数据,或者当其它数据文件达到最大容量时,需要增加数据库的磁盘空间。
除了添加多种文件到数据库,另外一个最佳实践是使用文件组对文件进行分组。当一个数据库被创建,默认情况下,包含主要数据文件的主要文件组被创建。此外文件组被创建用来使数据库管理变得轻松,并且往往把数据文件分组。(请看表4-2)。
表4-2 数据库文件和文件组
在这张图中有两个文件组:
- 主要文件组,包含主要数据文件。
次要文件组,包含两个次要数据文件。
使用 SSMS 添加文件和文件组
- 打开 SSMS 并且连接到 SQL Server 实例。
- 展开数据库文件夹。
- 右键单击 SBSChp4SSMS 数据库,选择属性。
- 在数据库属性对话框中的选择页部分,选择文件组。
- 在行部分下面点击添加按钮。
- 在新建的行中,在名称列的下面,输入 SBSSSMSGroup1。
- 在第二行,在默认列,选中方框。
- 在选择页部分,选择文件,然后最大化窗口。
- 点击添加。
- 在新建的行中,在逻辑名称列的下面,输入SBSChp4SSMS1。
- 在路径列,点击省略号按钮。浏览到 C:\SQLData。
- 在文件名列,输入SBSChp4SSMS1.ndf 。
- 点击确定。
使用 T-SQL 添加文件和文件组
- 在 SSMS 中打开查询编辑器。
- 在查询编辑器中,输入下面的 T-SQL 代码:
--Use this code to add a file and filegroup to a database
USE master;
ALTER DATABASE SBSChp4TSQL
ADD FILEGROUP SBSTSQLGroup1;
ALTER DATABASE SBSChp4TSQL
ADD File
(
NAME='SBSChp4TSQL2',
FILENAME='C:\SQLDATA:\SBSTSQL2.ndf',
SIZE=10MB,
MAXSIZE=20,
FILEGROWTH=10%
)
TO FILEGROUP SBSTSQLGroup1;
分离和附加 SQL Server 数据库
既然你已经创建了你的数据库,如果你需要把它移动到另一个SQL Server 实例,会发生什么?例如,假想你要重新分配服务器上的自由空间或者停用一台服务器,这些情况将会要求你从一个SQL Server 分离一个数据库,然后附加这个数据库到一个新的SQL Server 实例上。为了达到这个目的,你可以使用 T-SQL 或者 SSMS。
目前,有两种方法附加一个数据库到一个SQL Server 实例,有一种方法从一个SQL Server 实例分离一个数据库。你可以使用 sp_attach 或者 CREATE DATABASE 指定 FOR ATTACH 参数。请注意 sp_attatch 系统存储过程不被推荐,并且将会从未来的SQL Server 版本中移除。因此,只建议你使用 使用 CREATE DATABASE 选项附加数据库。
使用SSMS 分离一个 SQL Server 数据库
- 打开 SSMS.
- 如果没有打开对象浏览器,请打开它。
- 展开服务器节点。
- 展开数据库文件夹。
- 右键单击 SBSChp4SSMS 数据库。
- 选择任务 | 分离。
- 在分离数据库对话框中,选中删除连接和更新统计学信息方框。
- 点击确定。
既然数据库已经被分离了,你可以复制这些文件到新的存储位置并且附加数据库到一个新的SQL Server 实例。