• 教你管理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. 往这个文件组写入数据

     
  • 相关阅读:
    poj1125传播谣言(弗洛伊德,求最长路)
    poj2253青蛙(可到达路径的单次跳跃最短距离)
    poj1860 兑换货币(bellman ford判断正环)
    poj1062 昂贵的礼物(dijkstra+枚举)
    hdu4081 秦始皇修路(次小生成树)
    梦想,永不停息!
    nofollow标签如何使用
    后台地址报错:Service Unavailable
    DEDECMS批量修改默认文章和列表命名规则的方法
    FreeOnTerminate 的线程在线程管理类的Destroy释放时手工释放的问题
  • 原文地址:https://www.cnblogs.com/gered/p/9599629.html
Copyright © 2020-2023  润新知