教你管理SQL数据库系列(1-4)

原文

教你管理 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
  事务日志文件负责存储针对一个数据库执行的所有事务处理。

物理结构.png

二、数据库的逻辑结构
  一个实例(instance)通常包含多个组件 http://bbs.51cto.com/thread-1074972-1.html ,数据库引擎(database engine)是其中一个组件。数据库(database)是数据库引擎的一个子集。
  数据库引擎不仅包含若干个数据库,还包含安全凭据(安全性)、配置设置、Windows服务以及其它SQL Server对象(例如复制、备份设备、端点等)。对于Windows管理员来说,一个SQL Server实例中的数据库引擎组件就是一个服务(service)。
 


  对于某一个实例,可以有多个连接(connection),还可以分别连接到这个实例的某个组件(数据库引擎、分析服务、报表服务、集成服务等)。
  必须首先连接(或者登录)到某个实例,才可以访问这个实例里面的数据库。
 

   
 
 
 
 
(2)系统数据库和用户数据库
 
一、系统数据库
  一共有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
 
问:resource数据库是隐藏的,那我怎么才能看到它呢?distribution数据库怎么才能出现呢?
答:resource是隐藏的,官方就是不让你看的。如果你一定要做一回技术大师,一定要看看它里面都有哪些内容,那么:
该数据库的默认位置为 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实例运行时所需的所有read-only的关键的系统表、元数据、存储过程等。只有在安装Service Pack之类的补丁时,数据库引擎才会写入resource数据库。
  resource数据库是在SQL Server 2005才引入的,因此在SQL Server 2005及以后的版本中,安装Service Pack的速度明显比SQL Server 2000快。而且,一旦安装补丁失败,回滚到前一个版本的速度也很快。
这是因为,SQL Server 2005及以后的版本,可以直接用Resource数据库的副本覆盖旧的数据库。而SQL Server 2000需要运行很多脚本以删除旧的系统对象然后重建新的系统对象,需要的时间当然很长。
distribution数据库不是隐藏的,但是你首先得让这台服务器成为复制分发服务器。如果你的SQL Server没有配置“发布”,当然看不到distribution数据库。
好比你想查查你家的汽车是否有违章记录,前提条件是你先得要有一辆车。如果你连车都没有,去哪里查违章记录?

新建发布.png

 
 
 
 
 
 
(3)磁盘规划 
raid的概念参考:raid在数据库上的应用
一、磁盘I/O的竞争来源
  磁盘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)用户数据库
  应当估算用户数据库的容量增长,并规划足够的磁盘空间。
  当磁盘已满导致数据库不能获得更多的磁盘空间,会报错“数据库已满”或“数据库日志已满”,数据库将拒绝写入。
 
建议:如果有条件,所有的文件都推荐放在RAID 10。没条件的话,log用RAID1就够了。
疑问:比如两块盘做RAID1写入的速度会降低,这样性能将是个大的问题。而LOG是要求写入速度的。
恢复:没错。不过,一般来说,Log的写入量都不大,而且是连续写,RAID1基本上足够了。我测试发现,RAID10在连续写的性能比RAID1几乎没有差别。
如果用户的log每天都写入几十甚至几百GB,RAID10估计也撑不住。这个时候建议把数据库分拆到多台服务器上。
 
问:分区和卷不是一个概念吧?
答:以前大部分PC只有一个硬盘,所以就用分区(partition)。
后来,挂的硬盘越来越多,就出现了卷(volume),例如“跨区卷”允许将多个硬盘做成一个逻辑硬盘,“带区卷”允许将2个硬盘做成“软RAID1”。。。
但是每一个RAID仍然只是一个逻辑硬盘,习惯上我们仍然还用分区的说法。Windows 7/2008的管理工具仍然还叫做DiskPart
 
 
 
(4)文件组
一、多个数据文件
 
 在创建数据库时,默认使用“主文件组”。后陆创建数据文件时,都位于这个文件组内部。
  多个数据文件起到负载均衡的作用。因此,尽量使每个数据文件的大小相同,这样可以优化比例填充的性能。
  例如:某文件组有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. 往这个文件组写入数据

 
原文地址:https://www.cnblogs.com/gered/p/9599629.html