今天按常用方法收缩一个测试用的数据库日志,发现没法收缩!


dbcc sqlperf(logspace)


SqlServer 数据库日志无法收缩处理过程_数据库







USE [dbname]
GO

ALTER DATABASE [dbname] SET RECOVERY SIMPLE WITH NO_WAIT
GO
DBCC SHRINKFILE (N'dbname_log' , 0, TRUNCATEONLY)
GO
DBCC SHRINKDATABASE(N'dbname' )
GO


日志大小还是一样。



SqlServer 数据库日志无法收缩处理过程_bc_02




SqlServer 数据库日志无法收缩处理过程_数据库_03






​DBCC OPENTRAN​​ 查看是否打开的事务。发现有打开的事务,执行检查点再收缩,还是不行!


DBCC OPENTRAN (dbname) 
CHECKPOINT


SqlServer 数据库日志无法收缩处理过程_bc_04






将日志事务标志为已分发,再收缩,不行!


--日志中所有复制的事务将标记为已分发
EXEC sp_repldone @xactid = NULL,@xact_segno = NULL,@numtrans = 0,@time = 0,@reset = 1


SqlServer 数据库日志无法收缩处理过程_数据库_05






现在查看虚拟日志文件,发现有很多,并且都处于活动状态


dbcc loginfo


SqlServer 数据库日志无法收缩处理过程_数据库_06





最重要的语句竟然忘了,这可以查看日志空间的重复使用正在等待最后一个检查点的描述.。发现是REPLICATION


SELECT name,log_reuse_wait_desc FROM sys.databases where name='dbname'


SqlServer 数据库日志无法收缩处理过程_Line_07




这个数据库之前有作为事物同步过,但是都删除了。分发库也不存在了,现在竟然还有日志在等待?!




执行删除所有复制对象。


--删除当前数据库中所有复制对象
EXEC sp_removedbreplication dbname


再看日志重用状态,正常了!看来有效!


SqlServer 数据库日志无法收缩处理过程_bc_08



在收缩数据库,查看已经收缩了!其他也恢复正常!

DBCC SHRINKFILE (N'dbname_log' , 0, TRUNCATEONLY)
GO
DBCC LOGINFO
GO
DBCC OPENTRAN (dbname)
GO


SqlServer 数据库日志无法收缩处理过程_数据库_09



=======================================================================


其他类似问题


=======================================================================


更改字段,出现错误(数据库是从一个发布库中备份还原过来的)


exec sp_rename 'Clients.[userid]','clientid','COLUMN'
go

Caution: Changing any part of an object name could break scripts and stored procedures.

Msg 4928, Level 16, State 1, Procedure sp_rename, Line 547

Cannot alter column 'userid' because it is 'REPLICATED'.

Msg 0, Level 20, State 0, Line 0

当前命令发生了严重错误。应放弃任何可能产生的结果。



解决:


exec sp_removedbreplication @dbname= N'your name', @type  = 'both'