我不是SQL专家,每当我需要做一些基本之外的事情时,我就会想起这个事实。我有一个测试数据库,它的大小不是很大,但是事务日志确实很大。如何清除事务日志?
当前回答
首先检查数据库恢复模型。默认情况下,SQL Server Express Edition会为简单恢复创建一个数据库 (如果我没记错的话)。
备份日志DatabaseName With Truncate_Only
DBCC ShrinkFile(yourLogical_LogFileName, 50)
SP_helpfile将为您提供逻辑日志文件名。
请参考:
从SQL Server数据库中的完整事务日志中恢复
如果您的数据库处于完全恢复模式,并且您没有进行TL备份,那么将其更改为SIMPLE。
其他回答
首先检查数据库恢复模型。默认情况下,SQL Server Express Edition会为简单恢复创建一个数据库 (如果我没记错的话)。
备份日志DatabaseName With Truncate_Only
DBCC ShrinkFile(yourLogical_LogFileName, 50)
SP_helpfile将为您提供逻辑日志文件名。
请参考:
从SQL Server数据库中的完整事务日志中恢复
如果您的数据库处于完全恢复模式,并且您没有进行TL备份,那么将其更改为SIMPLE。
根据我在大多数SQL server上的经验,没有事务日志的备份。 完全备份或差异备份是常见的实践,但事务日志备份确实很少。 因此事务日志文件会一直增长(直到磁盘满为止)。 在这种情况下,恢复模型应该设置为“simple”。 不要忘记修改系统数据库“model”和“tempdb”。
数据库“tempdb”的备份没有任何意义,因此这个数据库的恢复模型应该总是“简单”的。
DB事务日志收缩到最小大小:
备份:事务日志 收缩文件:事务日志 备份:事务日志 收缩文件:事务日志
我在几个db上做了测试:这个序列工作。
它通常缩小到2MB。
或通过脚本:
DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>'; --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>'; --Input Variable
EXEC
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO
这是一种简单且不优雅且有潜在危险的方法。
备份数据库 分离数据库 重命名日志文件 附加数据库 将重新创建新的日志文件 删除重命名日志文件。
我猜您没有做日志备份。(截断日志)。我的建议是将恢复模式从完全恢复改为简单恢复。这将防止日志膨胀。
下面是收缩事务日志的脚本,但是我强烈建议在收缩之前备份事务日志。
如果你只是缩小文件,你将失去大量的数据,这些数据在灾难发生时可能会成为救星。事务日志包含大量有用的数据,可以使用第三方事务日志读取器读取(可以手动读取,但需要付出很大的努力)。
当涉及到时间点恢复时,事务日志也是必须的,所以不要把它扔掉,而是要确保事先备份它。
以下是人们使用存储在事务日志中的数据来完成恢复的几篇文章:
如何查看SQL Server 2008的事务日志 读取SQL Server 2008中的日志文件(*.LDF)
USE DATABASE_NAME;
GO
ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);
ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO
当执行上面的命令时,您可能会得到类似这样的错误
"不能收缩日志文件(日志文件名),因为逻辑 位于文件末尾的日志文件正在使用"
这意味着正在使用TLOG。在这种情况下,尝试在一行中多次执行该命令,或者找到减少数据库活动的方法。
推荐文章
- 确定记录是否存在的最快方法
- 从现有模式生成表关系图(SQL Server)
- 我如何循环通过一组记录在SQL Server?
- 数据库和模式的区别
- 如何在SQL Server中一次更改多个列
- 外键约束可能导致循环或多条级联路径?
- 如何选择每一行的列值不是独特的
- nvarchar(max)非文本
- 在SQL Server 2008 R2中重命名数据库时出错
- 将数据复制到另一个表中
- 如何在SQL中选择表的最后一条记录?
- 修改列,添加默认约束
- 在存储过程中使用“SET XACT_ABORT ON”有什么好处?
- 如何检查SQL Server文本列是否为空?
- 如何创建一个SQL Server函数“连接”多行从一个子查询到一个单独的分隔字段?