运维脚本:文件的空间使用和IO统计

http://www.cnblogs.com/ljhdo/p/4933384.html

数据库占用的存储空间,从高层次来看,可以查看数据库文件(数据文件,日志文件)占用的存储空间,从较细的粒度上来看,分为数据表,索引,分区占用的存储空间。监控数据库对象占用的硬盘空间,包括已分配,未分配,和未使用的空间占比,能够有效地管控存储空间,合理利用,避免部分文件空间不足,而其他文件浪费空间的问题。

一,数据库文件占用的存储空间

1,查看数据库的各个文件占用的存储空间

select db.name as database_name,db.is_auto_shrink_on,db.recovery_model_desc,mf.file_id,mf.type_desc,mf.name as logic_file_name,mf.size*8/10241024 as size_gb,mf.physical_name,--mf.max_size,
    mf.growth,mf.is_percent_growth,mf.state_desc
from sys.databases db 
inner join sys.master_files mf 
    on db.database_id=mf.database_id
where mf.size>1   GB
order by size_gb desc

2,查看数据文件中已分配,未分配和混合区的空间

视图:sys.dm_db_file_space_usage以Page为单位,实际上,Page的计数都是在区(Extent)级别上统计的,数据文件不够GAM(Global Allocation Map)和SGAM(Shared Global Allocation Map)。

select db_name(mf.database_id) as db_name,su.filegroup_id,255); line-height:1.5!important">as file_logic_name,su.total_page_countas total_gb,su.allocated_extent_page_countas allocated_gb,su.unallocated_extent_page_countas unallocated_gb,su.mixed_extent_page_countas mixed_mb
from sys.dm_db_file_space_usage su
join sys.master_files mf
    on su.database_id=mf.database_id
        and su.file_id=mf.file_id

还有一个DBCC命令返回相同的数据,该命令以区(Extent)为单位,统计数据库文件上已分配的,未分配的区的数量

 dbcc showfilestats

该命令从系统page:GAM 和 SGAM 上读取Extent的分配信息

3,使用查看当前数据库的空间使用量

exec sys.sp_spaceused

数据库的空间利用信息:

  • database_size数据文件和日志文件的大小;database_size 会比reserved+unallocated space的加和大,这是因为reservedunallocated_space 仅仅是数据文件的大小;
  • unallocated space:数据文件中的未分配空间虽然占用文件的硬盘空间,但是,没有分配,不能被其他数据库对象使用;
  • reserved:数据文件中的保留空间,是已经分配的硬盘空间,能够被其他数据库对象使用;
  • data:数据占用的硬盘空间;
  • index_size索引占用的硬盘空间;
  • unused:已经分配,但是未被使用的硬盘空间;

4, 统计sql Server 实例中所有数据库的日志文件的硬盘空间使用

dbcc sqlperf(logspace)返回的结果总是准确的,语句的执行不会增加系统负担

dbcc sqlperf(logspace)

二,查看数据库中,各个数据表或索引所占用的硬盘空间

1,查看数据库所有数据库表或索引所占用的硬盘空间

;with cte_space as 
(
    select 
        ps.object_id,sum(case when ps.index_id<2 then ps.row_count else 0 end) as row_count,255); line-height:1.5!important">sum(ps.reserved_page_count)as reserved_mb,255); line-height:1.5!important">sum(ps.used_page_count)as used_mb,0); line-height:1.5!important">2
                    then ps.in_row_data_page_count+ps.lob_used_page_count+ps.row_overflow_used_page_count
                  end
            )as data_used_mb
    from sys.dm_db_partition_stats ps
    join sys.tables t 
        on ps.object_id=t.object_id
    group by ps.object_id
)
select object_schema_name(s.object_id)+'.'object_name(s.object_id) as table_name,s.row_count,s.reserved_mb,s.used_mb,s.data_used_mb,s.used_mb-s.data_used_mb as index_used_mb,s.reserved_mb-s.used_mb as unsed_mb
from cte_space s
where s.reserved_mb512   more than 512MB
by unsed_mb desc,index_used_mb desc

2,以索引为单位,查看数据表上各个索引占用的硬盘空间

;sum(ps.row_count) sum(ps.in_row_data_page_count+ps.row_overflow_used_page_count)as data_used_mb,255); line-height:1.5!important">sum(ps.in_row_data_page_count)as in_row_data_used_mb,255); line-height:1.5!important">sum(ps.lob_used_page_countas max_data_used_mb
    as index_name,s.in_row_data_used_mb,s.max_data_used_mb,128); line-height:1.5!important">join sys.indexes i
    on s.=i.object_id
        and s.index_id=i.index_id
 more than 512MB
    and i.index_id>1
desc

3,在当前DB中,查看某一个数据表的空间使用信息

该存储过程用于查看当前数据库数据表的空间使用,返回的结果并不精确,默认情况下,该存储过程底层使用系统视图sys.allocation_unitssys.partitions获取数据表的所占用空间的“近似”信息。当索引被删除、索引被重建、或者大表被删除(drop,truncate)时,数据库引擎会延迟Page的释放,延迟删除导致不会立即释放已分配的空间,在这种情况下,该存储过程不会立即返回精确的空间使用信息。

exec sys.sp_spaceused dbo.dt_study'

  • rows::数据表的总行数;
  • reserved:数据文件中已分配的空间;
  • data:数据文件中,基础表占用的空间;
  • index_size:数据文件中,索引占用的空间;
  • unused:数据文件中,已分配,但是为被数据库对象(基础表和索引)使用的空间;

三,查看服务器各个逻辑盘符剩余的硬盘空间

Exec master.sys.xp_fixeddrives

四,压缩文件

sql Server中,使用DBCC ShrinkFile命令压缩数据库文件(数据文件和日志文件),或直接把数据库文件清空。除非硬盘空间不足,不要轻易收缩数据库文件,这会打乱索引的物理顺序,大幅增加的索引外部碎片,影响查询性能

在执行DBCC ShrinkFile命令,收缩数据文件的时候,数据库引擎首先把文件尾部的区(Extent)移动到文件的开头,然后释放文件末尾的空闲空间,归还给操作系统。在移动Page时,数据库引擎会扫描数据文件并对正在读取的页面加锁,对数据库性能会有所影响。但是收缩操作不是一个独占行为,其他用户仍然可以对数据库进行读写操作。在进程中的任意一个时间点停止文件收缩操作,任何已经完成的工作都将保留。

收缩文件以区为单位,它会把文件末尾已分配的区前移,把未分配的区从文件末尾移除。该命令不会把一个区里面的空闲页面(empty page)移除,也不会合并区以释放空闲页面,如果数据库中有很多只使用了一两个页面的区,DBCC SHRINKFILE的效果会不明显。

DBCC SHRINKFILE ( { file_name | file_id },EMPTYFILE ) file_id },target_size,{ NOTRUNCATE | TRUNCATEONLY } )

1,参数说明

target_size:是整数类型,单位是MB,数据库引擎尝试把文件收缩到指定的大小(Size),但不会收缩到小于数据实际存储必需的空间。只有和参数NOTRUNCATE搭配使用,才起作用。

EMPTYFILE :把数据从指定的文件迁移到同一个文件组中的其他文件中,也就是说,把当前文件清空,把数据转存到其他文件中,数据的迁移只能在同一个文件组的不同文件之间进行。数据文件被清空之后,数据库引擎不会把数据存储到空文件中,可以使用 ALTER DATABASE 把文件数据库中移除。

NOTRUNCATE:只用于数据文件,对日志文件不起作用;该参数用于把已分配(Allocated)的区(Extent)从数据文件的末尾移动到数据文件开头的未分配(Unallocated)的空间中,文件末尾被释放的空间不会返回给操作系统,仍然存在于文件中,处于未分配状态,这意味着数据库文件占用的存储空间不变。和target_size参数一起使用,用于指定文件收缩的大小。由于区(Extent)的移动是IO密集型操作,会影响数据库的IO性能

TRUNCATEONLY:文件末尾的所有空闲空间都释放,返回给操作系统,该参数不会执行任何的Page移动,也就是说,该参数收缩数据库文件,而忽略target_size参数,收缩的硬盘空间以区(Extent)为单位。

2,收缩文件示例

想要收缩数据库文件,释放硬盘空间,需要分两步:先移动,后释放

Step1,将文件末尾已分配的区(extent)向前移动,移动到文件前端未被分配的区中,移动的区被标记为未分配(Unallocated)

dbcc shrinkfile('filename',notruncate)

Step2,将文件末尾的空闲空间(以区为单位)释放,归还给操作

五,IO请求的等待和挂起

数据库引擎记录对数据文件和日志文件的IO操作,缓存到函数sys.dm_io_virtual_file_stats,对于数据文件,数据的物理读操作更为重要;对于日志文件,数据的读写操作都重要:

  • io_stall_read_ms:等待读操作的时间
  • io_stall_write_ms:等待写操作的时间

如果硬盘繁忙,数据库引擎发送的IO请求,可能会被IO子系统挂起(pending),数据库引擎把pending的IO请求缓存到视图:sys.dm_io_pending_io_requests,

  • io_pending:指定是否有IO请求挂起或完成

1,查看数据库文件的IO和等待IO完成的时间

db_name(vfs.database_id) vfs.file_id,
    mf.name file_name,mf.type_desc as file_type,vfs.sample_ms10006060 as sample_h,vfs.io_stall_read_ms/vfs.num_of_reads as avg_stall_read_ms,vfs.io_stall_write_ms/vfs.num_of_writes as avg_stall_write_ms,vfs.num_of_reads as physical_reads,vfs.num_of_bytes_read/vfs.num_of_readsas avg_read_kb,vfs.num_of_writes as physical_writes,vfs.num_of_bytes_written/vfs.num_of_writesas avg_written_kb,255); line-height:1.5!important">cast(vfs.size_on_disk_bytes1024.0 as decimal(10,2)) as disk_size_gb,128); line-height:1.5!important">cast(mf.size/1024*8/1024.0 as decimal(10,2)) as file_size_gb,
    vfs.file_handle
from sys.master_files mf 
cross apply sys.dm_io_virtual_file_stats(mf.database_id,mf.file_id) as vfs
where mf.database_id=db_id()  current db
by avg_stall_read_ms desc,avg_stall_write_ms desc

2,查看pending的IO请求

sum(pr.io_pending_ms_ticks) as io_pending_ms,pr.io_pending
from sys.dm_io_virtual_file_stats(null,null) vfs
join sys.dm_io_pending_io_requests as pr
    on vfs.file_handle=pr.io_handle
on vfs.database_idand vfs.file_id
by vfs.database_id,mf.name,mf.name

参考文档:

sp_spaceused

sys.dm_db_file_space_usage (Transact-SQL)

sys.dm_db_partition_stats (Transact-SQL)

--业精于勤而荒于嬉,行成于思而毁于随-- --欢迎转载,转载请注明出处--

相关文章

数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
(一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
(一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
(1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
(1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...