我目前正在扫描70个项目,共计约200万行代码。一直都很顺利,直到几个星期前我收到通知,因为我们在SonarQube服务器上的硬盘空间不足而导致一些项目失败。我确信根据硬件/软件要求我们有足够的空间。我读到重新启动Sonarqube服务器服务确实清除了临时文件,但经过多次这样做之后,仍有一些东西占用了更多的空间。罪魁祸首来自SQL服务器:
...\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\sonarqube_log.ldf
此文件的大小目前为66.8 GB。有谁知道我是否可以截断那里的东西,知道减少这个文件大小的任何最佳做法,并在未来的扫描期间保持尺寸下降?
答案 0 :(得分:2)
好的,如果您的数据库恢复设置为“完全”并且您没有备份事务日志,那就是问题所在。
如果您希望了解恢复模型之间的差异,请start here。简短版本是完全恢复允许时间点(也称为故障点)恢复,这意味着您可以将数据库恢复到问题发生前的确切时刻。完全恢复的缺点是您必须备份您的事务日志,否则会发生以下问题:日志会无休止地增长。简单的恢复消除了对事务日志备份的需要(事实上,我不认为您可以在Simple数据库上执行事务日志备份),但是限制您将数据库恢复到上次运行数据库备份时的状态。请注意,简单恢复仍使用事务日志!系统只是定期冲洗它们。
因此,您需要执行以下两项操作之一:使用完全恢复并定期备份您的事务日志(我已经看到系统每小时执行一次,甚至每15分钟执行一次高流量系统)或切换简单的恢复。这是你唯一真正的选择。
无论您执行哪种操作,切换到Simple或备份日志都会刷新事务日志。您可以使用DBCC SQLPERF(logspace)
进行验证。但是,您会注意到sonarqube_log.ldf
根本不会改变大小。它仍然是66.8 GB。这是按设计。在适当管理的系统中,事务日志将达到其运行所需的大小,然后备份和简单刷新将保持大小不变。日志文件将是运行系统的正确大小,因此它永远不需要增长(这是昂贵的)并且永远不会耗尽空间(这将导致所有事务失败)。
"那么,我如何恢复磁盘空间?"你问。 "我已经解决了这个问题,所以现在日志文件将占据95%的浪费空间。"
您需要做的是缩小日志文件。这是你经常看到的,你永远不应该写的东西。而且,我同意,在一个管理得当的系统中,你永远不需要这样做。但是,您的系统运行不正常。日志文件处于失控状态。但总的来说,你不应该这样做。
首先,进行完整的数据库备份。我再说一遍:对数据库进行完整备份。这不应该导致任何问题,但是你不想在没有新备份的情况下做这样的事情。
接下来,您需要找到相关数据库的日志文件的文件ID。你可以这样做:
select d.name, mf.file_id
from sys.databases d
join sys.master_files mf
on d.database_id = mf.database_id
where mf.type = 1
and d.name = 'SonarQube'
mf.type = 1
仅返回事务日志文件。如果数据库的名称不是SonarQube
,请使用该数据库的名称。
--Switch to the SonarQube database. If you're not in the right context, you'll shrink the wrong file.
use [SonarQube];
--Do a checkpoint if you're on Simple recovery
checkpoint;
--Do a log backup if you're on Full recovery
backup log ....
--Shrink logfile to 1 GB. Replace @file_id with the id you got above.
dbcc shrinkfile ( @file_id, 1024 );
大小以MB为单位。您必须根据数据库的大小以及对系统所做的更改进行猜测。对于大多数系统而言,DB大小的50%和DB大小的100%之间的安全性非常安全。无论如何,我不会将日志缩小到1 GB以上。您需要监视日志空间以及日志是否继续增长。 SSMS中的Disk Usage report是一种很好的方法。
第一次运行时,您可能根本看不到磁盘空间的大量增益。它可能会达到66.0 GB或62 GB。原因是因为日志文件的当前尾部仍在事务日志文件的末尾。您应该做的是,如果系统处于活动状态,请等待几个小时,然后再次运行上述操作。这将使系统有时间将日志循环回日志文件的开头,并且您可以将其缩小。如果您有兴趣,Here是一篇很好的文章,内容涵盖了日志文件实际缩小的方式。