今天在查看服务器运行情况的时候,无意间发现磁盘几乎被占满。之后经过排查发现是SQLserver数据库的问题,占了有20多G空间。
首先我查询了数据库实际用量,这里上网搜了各位大神分享的经验,找到一段sql语句,发现数据占了只有几十M。
语句如下:
IF OBJECT_ID('tempdb..#TablesSizes') IS NOT NULL
DROP TABLE #TablesSizes
CREATE TABLE #TablesSizes
(
TableName sysname ,
Rows BIGINT ,
reserved VARCHAR(100) ,
data VARCHAR(100) ,
index_size VARCHAR(100) ,
unused VARCHAR(100)
)
DECLARE @sql VARCHAR(MAX)
SELECT @sql = COALESCE(@sql, '') + '
INSERT INTO #TablesSizes execute sp_spaceused ''' + QUOTENAME(TABLE_SCHEMA,
'[]') + '.'
+ QUOTENAME(Table_Name, '[]') + ''''
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
PRINT ( @SQL )
EXECUTE (@SQL)
SELECT *
FROM #TablesSizes
ORDER BY Rows DESC;
然后我选择指定数据库——右键——属性——文件,看到数据库文件的初始化大小被设置成5G,这里我是数据库文件的初始化大小设置的不对,并非数据量过大原因导致的,所以只需要修改初始化大小就可以,如果是因为数据量过大导致的,那么需要删除无用的数据量过大的数据,然后对数据库进行压缩,选择数据库右键——任务——压缩——数据库,来到上面的压缩数据库文件,这个时候我们要选择压缩的百分比了,设置好百分比之后,我们就开始执行,这个过程可能比较漫长,毕竟是对磁盘的一次重新组合,所以敬请等待,最终会看到磁盘会空出很多可用空间。(注:一定要先备份数据,再进行此步骤压缩)
此外,还有SQLserver实例对应生成的错误日志,ERRORLOG,ERRORLOG1...ERRORLOG6,7个文件,由于长期没有清理,日志容量会越来越大。清理方法是 执行语句 EXEC sp_cycle_errorlog GO ,默认情况下,SQLserver 只保留 7 个错误日志文件。所以这个存储过程需要执行7次,错误日志就会被清理,容量减小。
以上是我发现的问题及解决办法,在此记录一下,有任何不对的地方欢迎各位大神指点。