数据库经常遇到的问题:

1)、数据库文件空间用尽  2)、日志文件不停增长 3)、数据库文件无法收缩  4)、自动增长和自动收缩

本系列就以上面的4个问题入手分析并总结数据库空间的管理方法。

  1、文件的分配方式以及文件空间检查方法

首先,你在你的数据库中运行sp_spaceused;之后会看到当前数据库的使用空间信息;这个命令也就会将大概的数据库空间信息给你展现出来,并不能查看每个数据文件和日志文件的使用情况;其中对于数据库tempdb来说里面存储的临时数据对象,这个命令是统计不到的。我们知道数据库分为主文件(.mdf)和辅助文件(.ndf);数据的存放按照页和区来存放和管理的,这里有一条命令可以查看具体的页内容:DBCC PAGE (<db id >,<file id >,<page id>,<format id>)我们来运行这个命令前打开跟踪标志(trace flag):

上图使用参数为3的命令,下面我们设置参数为2:看看输出的信息,里面的信息结合Sql Server专题一:索引(上)的内容便可理解,下面的内容其实就将222的数据页内的内容给展现出来了;补充(与下文无关):SQL Server会将总长超过8K的的数据页分开存放,单独放在行溢出(Row-Overflow)页中.

PAGE: (:)
BUFFER:
BUF @0x00000001F07A2F40
bpage = 0x00000001E1068000 bhash = 0x0000000000000000 bpageno = (:)
bdbid = breferences = bcputicks =
bsampleCount = bUse1 = bstat = 0x9
blog = 0x2121215a bnext = 0x0000000000000000 PAGE HEADER:
Page @0x00000001E1068000
m_pageId = (:) m_headerVersion = m_type =
m_typeFlagBits = 0x0 m_level = m_flagBits = 0x200
m_objId (AllocUnitId.idObj) = m_indexId (AllocUnitId.idInd) = Metadata: AllocUnitId =
Metadata: PartitionId = Metadata: IndexId =
Metadata: ObjectId = m_prevPage = (:) m_nextPage = (:)
pminlen = m_slotCnt = m_freeCnt =
m_freeData = m_reservedCnt = m_lsn = (::)
m_xactReserved = m_xdesId = (:) m_ghostRecCnt =
m_tornBits = - DB Frag ID = Allocation Status GAM (:) = ALLOCATED SGAM (:) = NOT ALLOCATED PFS (:) = 0x40 ALLOCATED 0_PCT_FULL
DIFF (:) = CHANGED ML (:) = NOT MIN_LOGGED DATA: Memory Dump @0x000000000F89A000 000000000F89A000: dd000000 01000a00 df000000 ....................
000000000F89A014: 2600c81e de000000
省略 ............
000000000F89BFF4: 90015c01 1001be00 ..\.......`. OFFSET TABLE: Row - Offset
(0x88) - (0x1e92)
(0x87) - (0x1e70)
(0x86) - (0x1e28)
(0x85) - (0x1dd4)
(0x7d) - (0x1c06)
(0x76) - (0x1a92)
省略 ............
(0x5) - (0x190)
(0x4) - (0x15c)
(0x3) - (0x110)
(0x2) - (0xbe)
(0x1) - (0x86)
(0x0) - (0x60) DBCC 执行完毕。

另一种查看数据库的方法是:在Mangement Studio中选择数据,右键-->报表-->标准报表中查看:这两种统计的方法是不同的;这里是按照区来统计的;上面的sp_spaceused使用的是页统计方法;报表这种方法内部是调用了DBCC SHOWFILESTATS命令,这个命令直接从GAM和SGAM这样的系统分配页面上读取区的分配信息,直接算出数据库文件里面有多少区被分配了;因为SQL Server绝大多数是按照区为单位来分配新的空间的,而系统分配页上的信息是实时更新的,所以这个统计方法比较可靠;在服务器负载很高的情况下也可以执行;所以不推荐sp_spaceused的方法,这种方法还不如查看系统试图(sys.dm_db_partition_stats);

其实还有一种查看数据空间的方法:DBCC SHOWCONTIG(或者 sys.dm_db_index_physical_stats)这个命令可以统计出你的某张表或者索引用了多少页面、多少区、甚至页面的平均数据量。从这些值你可以算出一张表格占用了多少空间。这个命令的代价恨到,SQL Server会扫描数据库,而扫描的过程是要加锁的;例如sys.dm_db_index_physical_stats就有三种扫描方式。越精确扫描越久。1:LIMITED   2 : SAMPLED  3 : DETAILED这3中方式扫描时间依次增加; 下面为DBCC SHOWCONTIG的统计信息。这种信息对于统计区的使用情况、碎片程度展现比较好。

DBCC SHOWCONTIG 正在扫描 'DimAccount' 表...
表: 'DimAccount' ();索引 ID: ,数据库 ID:
已执行 TABLE 级别的扫描。
- 扫描页数................................:
- 扫描区数..............................:
- 区切换次数..............................:
- 每个区的平均页数........................: 2.0
- 扫描密度 [最佳计数:实际计数].......: 100.00% [:]
- 逻辑扫描碎片 ..................: 50.00%
- 区扫描碎片 ..................: 0.00%
- 每页的平均可用字节数.....................: 2695.0
- 平均页密度(满).....................: 66.70%
DBCC SHOWCONTIG 正在扫描 'DimCurrency' 表...
表: 'DimCurrency' ();索引 ID: ,数据库 ID:
已执行 TABLE 级别的扫描。
- 扫描页数................................:
- 扫描区数..............................:
- 区切换次数..............................:
- 每个区的平均页数........................: 1.0
- 扫描密度 [最佳计数:实际计数].......: 100.00% [:]
- 逻辑扫描碎片 ..................: 0.00%
- 区扫描碎片 ..................: 0.00%
- 每页的平均可用字节数.....................: 3147.0
- 平均页密度(满).....................: 61.12%
DBCC SHOWCONTIG 正在扫描 'DimCustomer' 表...
表: 'DimCustomer' ();索引 ID: ,数据库 ID:
已执行 TABLE 级别的扫描。
- 扫描页数................................:
- 扫描区数..............................:
- 区切换次数..............................:
- 每个区的平均页数........................: 8.0
- 扫描密度 [最佳计数:实际计数].......: 15.90% [:]
- 逻辑扫描碎片 ..................: 75.27%
- 区扫描碎片 ..................: 3.05%
- 每页的平均可用字节数.....................: 3037.7
- 平均页密度(满).....................: 62.47%
省略……
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

附加:日志文件 

我们知道日志文件不是按照页、区来分配和管理的。SQL Server 数据库引擎在内部将每一物理日志文件分成多个虚拟日志单元。虚拟日志单元没有固定大小,并且一个物理日志文件所包含的虚拟日志单元数十部固定的。管理员不能配置或设置虚拟日志单元的大小或数量。但 SQL Server 会尝试控制虚拟日志单元的数目,把它限制在一个合理的范围里。例外情况是,日志文件每字段增长一次,会至少增加一个虚拟日志单元。所以,如果一个日志文件经历了多次自动增长,里面的虚拟日志单元数目会比正常的日志文件多很多,这种情况会影响日志文件管理的效率,以至于影响SQL Server 的启动。事务日志是一种回绕的文件。另外,这里有一篇专门介绍SQL Server的日志的博客。下图为事务日志的工作方式;

最后:了解了文件的分配和检查再加上对索引的了解,我们下面就解决第一个和第三个问题:1)、数据库文件空间用尽 。3)、数据库文件无法收缩  

首先如果出现此种问题,管理员首先会想到将数据文件收缩或者清空。一般有两种命令可以选择: 1】. DBCC SHRINKDATABASE    2】. DBCC SHRINKFILE  由于DBCC SHRINKDATABASE一次运行同时影响所有的文件(包括数据文件和日志文件),使用者不能指定每个文件的目标大小,其结果可能不能达到预期要求。所以建议还是做好规划,对每个文件确定预期目标,然后使用DBCC SHRINKFILE来一个个的处理。一般收缩数据文件的情况会比较多,但是,首先要了解:

          1.文件当期的使用情况,收缩量的大小不可能超过当前文件的空闲空间大小。如果想要压缩数据库的大小,首先就要确认数据文件的确有相应未被使用的空间。如果空间都在使用中,那就要先确认大量占用空间的对象。然后通过归档历史数据,先把空间释放出来;

         2.主数据文件是不能被清空的,能被清空的只有辅助数据文件。

         3.如果要把一个文件组整个清空,要删除分配在这个文件组的对象,或者把他们移到其他文件组上 DBCC SHRINKFILE是不能帮你做到这些的。

        把数据文件里面该清除的数据和对象清除完、确认数据文件有足够的空闲空间后,管理员就可以下 DBCC SHRINKFILE命令来缩小或清空指定文件了。如果是要所有文件,就要填上tearget_size,如果是要清空文件,就选择EMPTYFILE。SQL Server 在做 DBCC SHRINKFILE的时候,会扫描数据文件并对正在读的页面加锁,所以对数据库的性能会有所影响。但是这不是一个独占的行为。在做 DBCC SHRINKFILE的时候,其他用户照样可以对数据库进行读写操作。可以在进程的任何一点停止 DBCC SHRINKFILE操作。

      可是,有时候,明明看到数据文件里面有空间,为啥就是不能压缩或者清空?这是因为数据文件里面虽然有很多空的页面,但是这些页面分散在各个区里,使得整个文件没有很多空区。需要说明的是, DBCC SHRINKFILE做的都是区一级别的动作。他会把使用过的区前移,把没有使用过的区从文件中移除。但是,他不会把一个区里面的空页移除、合并,也不会把页里面的空间移除、合并。所以一个数据库中有很多只使用一个两个页面的区, DBCC SHRINKFILE的效果就不会明显。

SQL Server数据库空间管理 (1)的更多相关文章

  1. SQL Server数据库空间管理 (2)

     本篇内容主要解决剩余的两个问题:2).日志文件不停增长  4).自动增长和自动收缩 日志文件不停增长的解决 首先,当日志文件超过预期的时候,我们然要看看日志文件中存放了什么内容:DBCC LOG ; ...

  2. MS SQL Server数据库在线管理工具

    MS SQL Server数据库以其优异的性能,被广泛使用,特别是政务,医疗行业.但是远程维护挺不方便的,目前有一款基于WEB的工具TreeSoft数据库管理系统. 免安装,直接解压就可以用了.直接通 ...

  3. Microsoft SQL Server 数据库服务器管理维护角色

    固定服务器角色: 按照从最低级别的角色(bulkadmin)到最高级别的角色(sysadmin)的顺序进行描述: Bulkadmin:这个服务器角色的成员可以运行BULK INSERT语句.这条语句允 ...

  4. SQL Server 数据库空间使用情况

    GO /****** Object: StoredProcedure [dbo].[SpaceUsed] Script Date: 2017-12-01 11:15:11 ******/ SET AN ...

  5. c# SQL Server数据库操作-管理命令参数的类:SqlParameter

    使用SqlCommand类来执行Transact-SQL语句或存储过程时,有时需要用参数传值或作为返回值,SqlParameter类正是为了此需要而设计的类.下面介绍如何使用该类为SqlCommand ...

  6. 《SQL Server企业级平台管理实践》读书笔记——SQL Server数据库文件分配方式

    1.文件分配方式以及文件空间检查方法 最常用的检查数据文件和表大小的命令就是:sp_spaceused 此命令有三个缺陷:1.无法直观的看出每个数据文件和日志文件的使用情况.2.这个存储过程依赖SQL ...

  7. 3. SQL Server数据库状态监控 - 可用空间

    原文:3. SQL Server数据库状态监控 - 可用空间 数据库用来存放数据,那么肯定需要存储空间,所以对磁盘空间的监视自然就很有必要了. 一. 磁盘可用空间 1. 操作系统命令或脚本.接口或工具 ...

  8. SQL Server 数据库表的管理

    上一篇文章简单梳理了一下SQL Server数据库的安装和基本操作,这篇文章主要讲述一下数据库表的管理 一.数据库的创建 有关数据库的创建有两种方式,一种是通过视图创建,第二种就是通过T-SQL语句来 ...

  9. 《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的还原方式

    本篇是继上篇的备份方式,本篇介绍的是还原方案,在SQL Server在2005以上现有的还原方案一般分为以下4个级别的数据还原: 1.数据库完整还原级别: 还原和恢复整个数据库.数据库在还原和恢复操作 ...

随机推荐

  1. 纯js实现积木(div)拖动效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 禁用物料不允许BOM

    应用 Oracle Bill Of   Materiel 层 Level Function 函数名 Funcgtion Name BOM_BOMFDBOM 表单名 Form Name BOMFDBOM ...

  3. TEA encryption with 128bit key

    If anyone needs some basic encryption in software, here's one solution. This TEA implementation fits ...

  4. HttpRuntime类

    HttpRuntime在ASP.NET处理请求中负责的是创建HttpContext对象以及调用HttpApplicationFactory创建HttpApplication. 其定义如下: publi ...

  5. 狗屎的asp.net core 果然发生了重大的变更

    狗屎的asp.net core  果然发生了重大的变更 ....仔细看官方的文档,想骂娘....你发布版本的时候,能不能先想好先设计好再发布?朝三暮四...大撒笔....你老这样变来变去,谁还敢碰你啊 ...

  6. Linux系统编程(12)——shell基础

    Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个 ...

  7. Linux系统编程(5)——文件与IO之mmap函数

    mmap系统调用它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作.而Posix或系统V的共享内存IPC则纯粹用于共享目的,mmap()实现共享内存也是其主要应用之一. ...

  8. 【转】内核编译时, 到底用make clean, make mrproper还是make distclean(转载)

    原文网址:http://dongyulong.blog.51cto.com/1451604/449470 内核编译时, 到底用make clean, make mrproper还是make distc ...

  9. DWR常用<init-param>参数

    1 安全参数 allowGetForSafariButMakeForgeryEasier 开始版本:2.0 默认值:false 描述:设置成true使DWR工作在Safari 1.x , 会稍微降低安 ...

  10. android面试题集1

    Android 面试题(有详细答案) 附带答案,共100分 一.选择题(30题,每题1.5分,共45分) 1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分类,按功 ...