原文
教你管理 SQL Server 数据库(1)数据库的结构 http://bbs.51cto.com/thread-1084951-1.html
教你管理 SQL Server 数据库(2)系统数据库和用户数据库 http://bbs.51cto.com/thread-1084955-1.html
教你管理 SQL Server 数据库(3)磁盘规划 http://bbs.51cto.com/thread-1085268-1.html
教你管理 SQL Server 数据库(4)文件组 http://bbs.51cto.com/thread-1085273-1.html
(1)数据库的结构
一、物理结构
数据库的物理结构是由一系列的文件组成。
文件主要为分2类:
1. 数据文件:MDF/NDF
数据文件负责数据库中的所有数据的持久性存储。
(1)主要的数据文件:MDF
每个数据库只能有一个MDF。在创建数据库的时候,就创建了一个默认的MDF文件。
(2)辅助的数据文件:NDF
每个数据库可以没有NDF,也可以有多个NDF。
2. 事务日志文件:LDF
事务日志文件负责存储针对一个数据库执行的所有事务处理。
-
二、数据库的逻辑结构
一个实例(instance)通常包含多个组件 http://bbs.51cto.com/thread-1074972-1.html ,数据库引擎(database engine)是其中一个组件。数据库(database)是数据库引擎的一个子集。
数据库引擎不仅包含若干个数据库,还包含安全凭据(安全性)、配置设置、Windows服务以及其它SQL Server对象(例如复制、备份设备、端点等)。对于Windows管理员来说,一个SQL Server实例中的数据库引擎组件就是一个服务(service)。
对于某一个实例,可以有多个连接(connection),还可以分别连接到这个实例的某个组件(数据库引擎、分析服务、报表服务、集成服务等)。
必须首先连接(或者登录)到某个实例,才可以访问这个实例里面的数据库。
一共有6个系统数据库。
1. master
储存所有的实例层级的配置。实际上,master数据库的作用类似于实例(服务)的配置文件,在启动实例时就需要加载。如果master数据库损坏,将导致实例无法启动。
2. model
是一个模板。以后在这个实例中新建的数据库都是以model数据库作为模板。
3. msdb
存储了这个实例的维护操作(作业、警报、备份、恢复等)的所有配置和历史记录。
4. tempdb
用来保存临时或中间结果集的工作空间。每次启动实例时,都会重新创建tempdb数据库。停止实例时,将永久删除tempdb中的所有数据。
5. resource
这是SQL Server 2005或更高版本附带的数据库,包含所有的系统对象的副本。这个数据库是隐藏的,而且不可以备份。
6. distribution
将实例配置为复制分发服务器时,才存在distribution数据库。此数据库存储各种元数据、各种复制的历史记录数据以及用于事务复制的事务。
除了系统默认的6个数据库,用户也可以自己创建新的数据库。
所有的数据库(除了resource数据库)的列表都会显示在一个系统视图里。
select * from sys.databases
该数据库的默认位置为 C:Program FilesMicrosoft SQL Server“实例ID”MSSQLBinn (注意:“实例ID”,例如MSSQL11.MSSQLSERVER)
在这个目录下,可以看到mssqlsystemresource.ldf 和 mssqlsystemresource.mdf
你先把实例停了,然后把这两个文件复制到另一个目录,然后启动实例,把你复制的2个文件“附加”为实例的另一个数据库(当然,数据库的名称不能为resource)。
官方的解释 http://technet.microsoft.com/zh-cn/library/ms190940.aspx
resource数据库是在SQL Server 2005才引入的,因此在SQL Server 2005及以后的版本中,安装Service Pack的速度明显比SQL Server 2000快。而且,一旦安装补丁失败,回滚到前一个版本的速度也很快。
这是因为,SQL Server 2005及以后的版本,可以直接用Resource数据库的副本覆盖旧的数据库。而SQL Server 2000需要运行很多脚本以删除旧的系统对象然后重建新的系统对象,需要的时间当然很长。
好比你想查查你家的汽车是否有违章记录,前提条件是你先得要有一辆车。如果你连车都没有,去哪里查违章记录?
磁盘I/O是影响数据库性能的最重要因素之一。其竞争来源主要有:
(1)Windows操作系统,主要是内存分页文件、Windows日志文件。
(2)数据库的数据文件(mdf和ndf)
(3)数据库的事务日志文件(ldf)
(4)SQL Server 实例的tempdb数据库
为了消除竞争对性能的影响,建议将上述文件分别放在不同的物理磁盘。
注意:物理磁盘与逻辑磁盘是不同的概念。例如,一台PC有3块SATA硬盘,每块硬盘都是独立的,那么可以看作为3个物理磁盘。如果将这3块磁盘做成RAID0,然后再分成3个逻辑分区(卷),那么它就是1个物理磁盘、3个逻辑磁盘。
(1)tempdb
tempdb 数据库性能要求非常高,但对数据安全性要求低。建议将 tempdb 数据库放置在快速磁盘系统中。如果有许多直接连接的磁盘,可以考虑使用RAID 0 。
(2)数据文件(mdf和ndf文件)
这类文件即要求性能,又要求安全性。建议RAID 10。如果硬件预算非常紧张,RAID 5也凑合吧。
(3)事务日志文件(ldf文件)
事务日志文件的特性是连续的顺序写入,因此对性能要求不高,仅要求安全性。建议RAID 1。
尽管对于当前的驱动器的大小而言,SQL Server 的磁盘空间需求是微不足道的,但是仍然需要考虑磁盘空间的规划。
(1)系统数据库
一般来说,系统数据库都不会很大,只有tempdb例外。如果T-SQL代码的质量不佳,tempdb增长到几百GB也是有可能的。
(2)用户数据库
应当估算用户数据库的容量增长,并规划足够的磁盘空间。
当磁盘已满导致数据库不能获得更多的磁盘空间,会报错“数据库已满”或“数据库日志已满”,数据库将拒绝写入。
如果用户的log每天都写入几十甚至几百GB,RAID10估计也撑不住。这个时候建议把数据库分拆到多台服务器上。
后来,挂的硬盘越来越多,就出现了卷(volume),例如“跨区卷”允许将多个硬盘做成一个逻辑硬盘,“带区卷”允许将2个硬盘做成“软RAID1”。。。
但是每一个RAID仍然只是一个逻辑硬盘,习惯上我们仍然还用分区的说法。Windows 7/2008的管理工具仍然还叫做DiskPart
在创建数据库时,默认使用“主文件组”。后陆创建数据文件时,都位于这个文件组内部。
多个数据文件起到负载均衡的作用。因此,尽量使每个数据文件的大小相同,这样可以优化比例填充的性能。
例如:某文件组有2个数据文件,当前的文件大小分别为4GB和6GB。现在批量导入10MB的数据,结果会按比例填充,使这2个数据文件分别增加4MB和6MB的数据。
注意:请将多个数据文件分别放置在不同的物理磁盘上。如果都放在同一个物理磁盘,由于数据需在多个文件中存取,导致磁头频繁寻道、定位,反而使性能降低。
注意:强烈建议不要使用多个日志文件。不仅不会提升性能,而且会导致恢复数据库时更加复杂。
二、文件组
每个数据库有一个“主文件组”。 此文件组包含主要数据文件和未放入其他文件组的所有次要文件。 可以创建用户定义的文件组,用于将数据文件集合起来,以便于管理、数据分配和放置。
如果创建了多个文件组,那么在创建新的数据文件(ndf)时,可以指定文件组。
如果在数据库中创建对象时没有指定对象所属的文件组,对象将被分配给默认文件组。 不管何时,只能将一个文件组指定为默认文件组。 默认文件组中的文件必须足够大,能够容纳未分配给其他文件组的所有新对象。
PRIMARY 文件组是默认文件组,除非使用 ALTER DATABASE 语句进行了更改。
(1)SSMS
(2)T-SQL
ALTER DATABASE [db02] MODIFY FILEGROUP [FG1] DEFAULT
四、将对象创建到指定的文件组
在创建表、索引等数据库对象时,可以使用ON 子句指定一个文件组,例如:
CREATE TABLE [dbo].[EmpTable]( [EmpID] [varchar](10) NULL,[DepID] [nvarchar](10) NULL,[Title] [nvarchar](10) NULL ) ON [PRIMARY]
注意:系统对象和表仍然分配给 PRIMARY 文件组,而不是其它的文件组。
问:SQL文件组就是文件的逻辑集合。它的目的是为了方便数据的管理和分配.文件组可以把指定是文件组合在一起。
我创建文件组时,它提示这个!新建文件组必须得有东西?
答:新建的文件组可以暂时不包含数据文件(ndf),但是在以下情况下必须先为这个文件组至少创建一个数据文件:
1. 将这个文件组设置为默认文件组;
2. 往这个文件组写入数据