数据库空间管理

查看数据库所有表的空间使用情况:

if   object_id('tempdb..#tableinfo') IS NOT NULL   DROP   TABLE  #tableinfo;
CREATE TABLE [dbo].#tableinfo(
 表名 [varchar](500) COLLATE Chinese_PRC_CI_AS NULL,
 记录数 [int] NULL,
 预留空间 [varchar](500) COLLATE Chinese_PRC_CI_AS NULL,
 使用空间 [varchar](500) COLLATE Chinese_PRC_CI_AS NULL,
 索引占用空间 [varchar](500) COLLATE Chinese_PRC_CI_AS NULL,
 未用空间 [varchar](500) COLLATE Chinese_PRC_CI_AS NULL
)
insert into #tableinfo(表名, 记录数, 预留空间, 使用空间, 索引占用空间, 未用空间)
exec sp_MSforeachtable "exec sp_spaceused '?'"

select 表名,记录数,REPLACE(预留空间,'KB','')/1024 [预留空间/M] ,REPLACE(使用空间,'KB','')/1024 [使用空间/M], REPLACE(索引占用空间,'KB','')/1024 [索引占用空间/M] ,REPLACE(未用空间,'KB','')/1024 [未用空间/M]  from #tableinfo ORDER by 记录数 desc

某张表的使用情况:

exec sp_spaceused 'BssCost'

查询数据库的数据文件及日志文件的大小:

select name, convert(float,size) * (8192.0/1024.0)/1024.0 空间大小 from RJBSS.dbo.sysfiles
或
SELECT DB_NAME(database_id) AS 数据库名称,[Name] AS 逻辑文件名称,[Physical_Name] AS [物理文件名称],((size * 8) / 1024) AS [文件大小/M],max_size 文件最大值,b.备份类型,b.最近一次备份的时间
FROM sys.master_files  a
INNER JOIN (
    SELECT database_name,CASE type WHEN 'D' THEN '数据库全备份' WHEN 'I ' THEN '数据库差异' WHEN 'L' THEN '日志' WHEN 'F' THEN '文件或文件组' END 备份类型,
    MAX(backup_finish_date) AS 最近一次备份的时间  FROM msdb.dbo.backupset 
    GROUP BY database_name,CASE type WHEN 'D' THEN '数据库全备份' WHEN 'I ' THEN '数据库差异' WHEN 'L' THEN '日志' WHEN 'F' THEN '文件或文件组' END 
) b ON b.database_name=DB_NAME(database_id)
WHERE DB_NAME(database_id) IN('RJBSS') 
ORDER BY DB_NAME(database_id),Physical_Name

检查日志现在使用情况和数据库状态:

select name 服务器名称,recovery_model_desc 恢复模式,log_reuse_wait 日志重用等待个数,log_reuse_wait_desc 日志重用等待状态 FROM sys.databases

其中,日志重用等待状态:

  • NOTHING:当前有一个或多个可重用的虚拟日志文件(无需备份)
  • CHECKPOINT:自上次日志截断之后,尚未出现检查点,或者日志头部尚未跨一个虚拟日志文件移动,这是日志截断延迟的常见原因
  • LOG_BACKUP:要求日志备份将日志标头前移(仅适用于完整恢复模式或大容量日志恢复模式),日志备份不会阻止截断,日志备份完成后,日志标头将前移,并且一些日志空间可能会变为可重新使用。
  • ACTIVE_TRANSACTION:事务处于活动状态,在日志备份开始时,可能存在长时间运行的事务,在这种情况下,释放空间可能需要进行其他日志备份;或者是事务将延迟。

 查看当前数据库的数据和文件信息和查询各个磁盘分区的剩余空间:

sp_helpfile --当前数据库的数据和文件信息 
Exec master.dbo.xp_fixeddrives --  查询各个磁盘分区的剩余空间

关于事务日志:

对于集群环境下的数据库,即AlwayOn(高可用性组)环境下,在不停掉集群的情况下无法将数据库切换到简单恢复模式,在这种情况下,最好的办法是先做数据库的完整备份,然后做事务日志的备份,接着及时收缩文件,最好是每周做sql server的日志备份,备份完成后(有时候需要做两次事务日志的备份收缩日志才有效果),数据库就会释放原有占用的空间,例如每周产生的日志为10G,每周做一次备份,在磁盘的日志大小可以保持在10G左右。如果是非集群环境下,可以先做数据库的全备份(安全起见),然后切换数据库为简单恢复模式,接着再收缩日志,此时可以最大限度的收缩日志文件,解决事务日志文件不断暴涨的问题

 

返回的是当前数据库最久未被提交的事务:

dbcc opentran ;

 

返回当前数据库最久未被提交的事:

SELECT st.text,t2.*                                                         
from sys.dm_exec_sessions as t2,
sys.dm_exec_connections as t1
CROSS APPLY sys.dm_exec_sql_text(t1.most_recent_sql_handle) AS st 
where  t1.session_id = t2.session_id
and t1.session_id >50  

 

找到未提交是事务后,比较安全的方法是找到那个程序,从客户端提交或是取消这个事务,如果来不及或者找到,可以在server端用kill命令尝试关闭这个链接,如 kill 52.但是kill命令并不是百试不爽,如果一个连接正处于提交或是回滚的过程中,sql server会尊重它的执行而不是强行去终止它.而如果需要终止的这个链接所开启的事务非常庞大,比如正在做几百万数据的修改或删除动作,那么取消这个动作而产生的回滚时间,可能不比它运行的时间短,有时候甚至终止不掉,所以这个办法只能是应急的时候使用.SQL SERVER 2008后LOG NO_LOG 已不再被支持,要收缩数据库日志,首先需要通过将数据库恢复模式设置为 SIMPLE 来截断该文件。

 

posted on 2018-03-15 17:23  Mr.念语  阅读(324)  评论(0编辑  收藏  举报