SQL Server数据库空间管理 (1)
数据库经常遇到的问题:
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)的更多相关文章
- SQL Server数据库空间管理 (2)
本篇内容主要解决剩余的两个问题:2).日志文件不停增长 4).自动增长和自动收缩 日志文件不停增长的解决 首先,当日志文件超过预期的时候,我们然要看看日志文件中存放了什么内容:DBCC LOG ; ...
- MS SQL Server数据库在线管理工具
MS SQL Server数据库以其优异的性能,被广泛使用,特别是政务,医疗行业.但是远程维护挺不方便的,目前有一款基于WEB的工具TreeSoft数据库管理系统. 免安装,直接解压就可以用了.直接通 ...
- Microsoft SQL Server 数据库服务器管理维护角色
固定服务器角色: 按照从最低级别的角色(bulkadmin)到最高级别的角色(sysadmin)的顺序进行描述: Bulkadmin:这个服务器角色的成员可以运行BULK INSERT语句.这条语句允 ...
- SQL Server 数据库空间使用情况
GO /****** Object: StoredProcedure [dbo].[SpaceUsed] Script Date: 2017-12-01 11:15:11 ******/ SET AN ...
- c# SQL Server数据库操作-管理命令参数的类:SqlParameter
使用SqlCommand类来执行Transact-SQL语句或存储过程时,有时需要用参数传值或作为返回值,SqlParameter类正是为了此需要而设计的类.下面介绍如何使用该类为SqlCommand ...
- 《SQL Server企业级平台管理实践》读书笔记——SQL Server数据库文件分配方式
1.文件分配方式以及文件空间检查方法 最常用的检查数据文件和表大小的命令就是:sp_spaceused 此命令有三个缺陷:1.无法直观的看出每个数据文件和日志文件的使用情况.2.这个存储过程依赖SQL ...
- 3. SQL Server数据库状态监控 - 可用空间
原文:3. SQL Server数据库状态监控 - 可用空间 数据库用来存放数据,那么肯定需要存储空间,所以对磁盘空间的监视自然就很有必要了. 一. 磁盘可用空间 1. 操作系统命令或脚本.接口或工具 ...
- SQL Server 数据库表的管理
上一篇文章简单梳理了一下SQL Server数据库的安装和基本操作,这篇文章主要讲述一下数据库表的管理 一.数据库的创建 有关数据库的创建有两种方式,一种是通过视图创建,第二种就是通过T-SQL语句来 ...
- 《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的还原方式
本篇是继上篇的备份方式,本篇介绍的是还原方案,在SQL Server在2005以上现有的还原方案一般分为以下4个级别的数据还原: 1.数据库完整还原级别: 还原和恢复整个数据库.数据库在还原和恢复操作 ...
随机推荐
- 编译安装httpd
一.安装前的说明: httpd依赖于apr和apr-util所以在安装httpd之前要把这些东西都安装上去. 事先安装的依赖: yum -y install gcc gcc-c++ pcre-deve ...
- Qt中一些常用的格式转换
转自:http://blog.csdn.NET/yh_1988/article/details/7190356 用Qt经常头痛于一些格式不能通用的问题 在此记录备用 1 (20120112)QStri ...
- jQuery 序列化表单数据 serialize() serializeArray()
1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用 ...
- Windows SVN变化邮件通知(Python2.7实现)
1,新增文件post-commit.bat 内容: rem REPOS-PATH (the path to this repository) set REPOS=%1 rem REV (the num ...
- UGUI Button控件
今天一起来学习下Button控件, Button控件其实是由Text,Button,Image组件形成的. 这里就简单介绍下Button组件 Interactable: 代表该组件是否进行交互, 我们 ...
- PCI、PCIE配置空间的訪问(MCFG,Bus,Device,Funtion)
一般来说,在x86平台上,有两大类方式能够訪问这一区间的寄存器, 1,配置机制1#或者配置机制2# 訪问时借助in/out指令.请注意,这样的方式有别于一般的in/out指令訪问PCI的IO空 ...
- Android 属性动画(Property Animation) 全然解析 (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...
- quick-cocos2d-x android返回键监听并实现原生退出对话框
这两天最终闲了一下,就顺手又把quick捡起来又学了学,一直都认为quick比cocos2dx那套lua绑定要方便很多,今天试了下android返回键的监听,还是挺好弄的,所以就有了这篇. 首先说明一 ...
- Linux shell中的一个问题 ${}带正则匹配的表达式
目前在准备龙芯项目的PMON,在研究其编译过程的时候,看到一些make 语句,百思不得其解.后来在shell编程中看到一点资料,牵扯到Shell中的正则表达式.故记录下来,以备后来查阅. 问题: 在某 ...
- CSS入门教程——定位(positon)
CSS入门教程——定位(positon) CSS定位在网页布局中是起着决定性作用. 定位 CSS的定位功能是很强大的,利用它你可以做出各种各样的网页布局.本节就介绍一些CSS常用的定位语句. 1. ...