原文

教你管理 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),还可以分别连接到这个实例的某个组件(数据库引擎、分析服务、报表服务、集成服务等)。
  必须首先连接(或者登录)到某个实例,才可以访问这个实例里面的数据库。

   
 
 
 
 
(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 Files\Microsoft SQL Server\“实例ID”\MSSQL\Binn  (注意:“实例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数据库。
好比你想查查你家的汽车是否有违章记录,前提条件是你先得要有一辆车。如果你连车都没有,去哪里查违章记录?

 
 
 
 
 
 
(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. 往这个文件组写入数据

 

教你管理SQL数据库系列(1-4)的更多相关文章

  1. 教你管理SQL实例系列(1-15)

    全系列转自:51CTO ->jimshu http://jimshu.blog.51cto.com 目录及原本连接如下: 教你管理SQL实例(1)数据库实例 教你管理SQL实例(2)服务启动帐户 ...

  2. 教你管理SQL备份与恢复系列(1-20)

    原链接:https://bbs.51cto.com/thread-1147908-1.html 教你备份与恢复数据库,直接下面下文档吧. 教你备份与恢复数据库(1)事务 http://bbs.51ct ...

  3. 教你使用SQL数据库复制系列(1-7)

    SQL Server 复制系列(文章索引) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 前言(Introduction) 复制逻辑结构图(Construction) ...

  4. 教你建立SQL数据库的表分区

    1)新建一个数据库 2)添加几个文件组 3)回到“常规”选项卡,添加数据库文件 看到用红色框框起来的地方没?上一步中建立的文件组在这里就用上了.再看后面的路径,我把每一个文件都单独放在不同的磁盘上,而 ...

  5. 教你使用SQL数据库索引(1-15)

    原文地址:http://www.sqlservercentral.com/stairway/72399/ 中文地址:https://www.cnblogs.com/tjy9999/category/4 ...

  6. 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!

    作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...

  7. 存储过程系列之存储过程sql数据库调用和程序代码调用

    1.存储过程,无参数的存储过程 创建无参数存储存储过程 Create Procedure DCEMREMR_TEMPLATEAs SELECT TOP 10 [FILENAME],[FILETITLE ...

  8. MS SQL巡检系列——检查重复索引

    前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...

  9. Oracle DBA管理包脚本系列(二)

    该系列脚本结合日常工作,方便DBA做数据管理.迁移.同步等功能,以下为该系列的脚本,按照功能划分不同的包.功能有如下: 1)数据库对象管理(添加.修改.删除.禁用/启用.编译.去重复.闪回.文件读写. ...

随机推荐

  1. 【Scala-ML】怎样利用Scala构建并行机器学习系统

    引言 在学习Scala的过程中,我发现其在构建大规模分布式计算系统上有与生俱来的特质. 其丰富的类型系统能够帮助编程设计提供非常好的信息隐藏和抽象,其monoids和monads概念利用Scala高阶 ...

  2. 用typeof查看数据类型&&用parseInt解析数字,并求和

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. vector list map 遍历删除指定元素

    #include <stdio.h> #include <stdint.h> #include <vector> #include <list> #in ...

  4. php正则表达式基本

    一.正则表达式的组成 1.分隔符,可以是除了字母,数字,反斜线及空白以外的任何字符,比如/,!,#,%,|,~等;通常有/,!,~ 2.表达式:由一些特殊字符和非特殊字符组成. 3.修饰符:用于开启或 ...

  5. react-native 启动页(react-native-splash-screen)

    用于解决iOS和Android启动白屏问题及简单的启动页面展示 下载 react-native-splash-screen yarn add react-native-splash-screen re ...

  6. URAL 1984. Dummy Guy(数学啊)

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1984 1984. Dummy Guy Time limit: 0.5 second Me ...

  7. 无法将“Update-Database”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的问题

    原因: 没有引用EntityFramework命令 解决: 在程序包管理器控制台执行如下命令:Import-Module 项目路径\packages\EntityFramework.6.1.3(EF版 ...

  8. 【SpringMVC学习09】SpringMVC与前台的json数据交互

    json数据格式在接口调用中.html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍.在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springm ...

  9. HTTP协议断点续传

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net;usi ...

  10. Delphi 泛型(三十篇)

    Delphi 泛型(三十篇)http://www.cnblogs.com/jxgxy/category/216671.html