数据库日志无法收缩

时间:2022-01-29 07:13:30
今天忽然发现一个数据库日志文件非常大,但是这个数据库是简单恢复模型,而且启用了自动收缩。
我使用Backup LOG 和With No_log选项、DBCC Shrinkdatabase命令后,数据库日志反而增大了。
观察日志文件的使用情况,发现已使用空间为0,未使用空间100%。
反复几次之后,数据库日志文件越来越大。
根据这个库的使用情况,判断可能跟这个库上存在数据库复制有关。
我在数据库复制的编辑界面,手动取消所有的复制对象后,备份数据库,收缩,数据库日志依然越来越大。
后来使用sp_removedbreplication命令强制清除了所有复制对象,然后使用Backup LOG 和With No_log选项、DBCC Shrinkdatabase命令,这次日志文件被收缩掉了。
但是我所建立的数据库复制也被彻底清除了,但是订阅仍然存在。
从微软的论坛查阅到一些资料,通常如果你设置过数据库复制或发布,而后来设置失败并没有启用,可能会导致这个问题,你看不到跟复制有关的内容,但是在数据库里却存在这样的东西,于是日志被它堵住了,这成了一个永远无法完成的命令,所以后续的日志都无法截断。
实际情况是我的复制对象会定期进行发布,用以同步数据。
现在强制清除了复职,需要重新进行配置,对日常工作影响很大。
有没有其他方法,即不清除复制,又能收缩数据库日志?

32 个解决方案

#2


估计还是得压缩啊

#3


分离,移志或删除日志,附加。

#4


把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

#5


 
 
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

--备份数据库
BACKUP DATABASE testdb TO DISK='d:\data\testdb20070906.bak'
--清空日志
DUMP TRANSACTION testdb WITH NO_LOG        
--截断事务日志   
BACKUP LOG testdb WITH NO_LOG      
--收缩数据库   
DBCC SHRINKDATABASE(testdb)   
--设置自动收缩
EXEC SP_DBOPTION testdb,AUTOSHRINK,TRUE

试试看可以不

#6


引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

这种方法我考虑过,只不过担心会对数据库造成损坏,如果附加不上或置疑了就不好玩了。
因为我使用DBCC Shrinkdatabase命令的时候提示所有的日志文件都正在被使用,无法进行收缩。

#7


引用 6 楼 pbsh 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

这种方法我考虑过,只不过担心会对数据库造成损坏,如果附加不上或置疑了就不好玩了。
因为我使用DBCC Shrinkdatabase命令的时候提示所有的日志文件都正在被使用,无法进行收缩。

...

#8


引用 6 楼 pbsh 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

这种方法我考虑过,只不过担心会对数据库造成损坏,如果附加不上或置疑了就不好玩了。
因为我使用DBCC Shrinkdatabase命令的时候提示所有的日志文件都正在被使用,无法进行收缩。

以前我也遇到过跟你相同的情况,我用分离附加解决的。

#9


谢谢楼上各位的回复。
不过希望曾经遇到过这种问题的达人指点一下,这些常用的命令就不用了。

#10


引用 8 楼 htl258 的回复:
引用 6 楼 pbsh 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

这种方法我考虑过,只不过担心会对数据库造成损坏,如果附加不上或置疑了就不好玩了。
因为我使用DBCC Shrinkdatabase命令的时候提示所有的日志文件都正在被使用,无法进行收缩。

以前我也遇到过跟你相同的情况,我用分离附加解决的。


分离和附加应该不会导致失去去复制设置了吧。

#11


引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。


最有效的方法

#12


引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。 

这是最后的办法!

#13


引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。


我认为这种方式危险系数过高,而且对于多文件组或多文件的数据库存在困难。

#14


引用 11 楼 wujinjian2008n 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。


最有效的方法

这是个有危险的动作,要谨慎使用

#15


帮顶有分

#16


引用 15 楼 pbsh 的回复:
帮顶有分
先备份数据库!然后再按上面的方法,应该可以实现的!

#17


引用 14 楼 haiwer 的回复:
引用 11 楼 wujinjian2008n 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。


最有效的方法

这是个有危险的动作,要谨慎使用


海爷有没有其他方法?

#18


你是数据文件大还是日记文件?

#19


引用 18 楼 tengjian1981 的回复:
你是数据文件大还是日记文件?


Log

#20


帮顶有分 
 
如果没有直接的方法,那这个就成了SQL SERVER的BUG了。

#21


--指定收缩大小试试
DBCC SHRINKFILE(log逻辑文件名,1024)

#22


sp_helpdb DBname
贴一下log文件那行的数据。

#23


引用 22 楼 perfectaction 的回复:
sp_helpdb DBname
贴一下log文件那行的数据。


已经被我干掉了。

#24


先截断日志,再收缩

#25


难道要我打电话给MS咨询,T_T

#26


引用 25 楼 pbsh 的回复:
难道要我打电话给MS咨询,T_T
顶!打给比尔!

#27


我这里在发布数据库,每周都要清理事务日志,收缩数据库的,好像没发生楼主的情况啊。

#28


引用 27 楼 navy887 的回复:
我这里在发布数据库,每周都要清理事务日志,收缩数据库的,好像没发生楼主的情况啊。


目前不是很清楚原因

#29


引用 26 楼 soft_wsx 的回复:
引用 25 楼 pbsh 的回复:
难道要我打电话给MS咨询,T_T
顶!打给比尔!


一个license只能问一个问题,囧

#30


学习一下,其实定期整理log就好了,这种情况没遇到

#31


该回复于2009-09-22 15:59:14被版主删除

#32


引用 30 楼 7761098 的回复:
学习一下,其实定期整理log就好了,这种情况没遇到


这个库是简单模型,自动收缩,本来没在意他的日志,偶然发现日志文件暴大。

#1


#2


估计还是得压缩啊

#3


分离,移志或删除日志,附加。

#4


把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

#5


 
 
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

--备份数据库
BACKUP DATABASE testdb TO DISK='d:\data\testdb20070906.bak'
--清空日志
DUMP TRANSACTION testdb WITH NO_LOG        
--截断事务日志   
BACKUP LOG testdb WITH NO_LOG      
--收缩数据库   
DBCC SHRINKDATABASE(testdb)   
--设置自动收缩
EXEC SP_DBOPTION testdb,AUTOSHRINK,TRUE

试试看可以不

#6


引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

这种方法我考虑过,只不过担心会对数据库造成损坏,如果附加不上或置疑了就不好玩了。
因为我使用DBCC Shrinkdatabase命令的时候提示所有的日志文件都正在被使用,无法进行收缩。

#7


引用 6 楼 pbsh 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

这种方法我考虑过,只不过担心会对数据库造成损坏,如果附加不上或置疑了就不好玩了。
因为我使用DBCC Shrinkdatabase命令的时候提示所有的日志文件都正在被使用,无法进行收缩。

...

#8


引用 6 楼 pbsh 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

这种方法我考虑过,只不过担心会对数据库造成损坏,如果附加不上或置疑了就不好玩了。
因为我使用DBCC Shrinkdatabase命令的时候提示所有的日志文件都正在被使用,无法进行收缩。

以前我也遇到过跟你相同的情况,我用分离附加解决的。

#9


谢谢楼上各位的回复。
不过希望曾经遇到过这种问题的达人指点一下,这些常用的命令就不用了。

#10


引用 8 楼 htl258 的回复:
引用 6 楼 pbsh 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。

这种方法我考虑过,只不过担心会对数据库造成损坏,如果附加不上或置疑了就不好玩了。
因为我使用DBCC Shrinkdatabase命令的时候提示所有的日志文件都正在被使用,无法进行收缩。

以前我也遇到过跟你相同的情况,我用分离附加解决的。


分离和附加应该不会导致失去去复制设置了吧。

#11


引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。


最有效的方法

#12


引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。 

这是最后的办法!

#13


引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。


我认为这种方式危险系数过高,而且对于多文件组或多文件的数据库存在困难。

#14


引用 11 楼 wujinjian2008n 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。


最有效的方法

这是个有危险的动作,要谨慎使用

#15


帮顶有分

#16


引用 15 楼 pbsh 的回复:
帮顶有分
先备份数据库!然后再按上面的方法,应该可以实现的!

#17


引用 14 楼 haiwer 的回复:
引用 11 楼 wujinjian2008n 的回复:
引用 4 楼 htl258 的回复:
把数据库分离,移走或删除日志,再附加数据库,SQL会自动生成日志文件。


最有效的方法

这是个有危险的动作,要谨慎使用


海爷有没有其他方法?

#18


你是数据文件大还是日记文件?

#19


引用 18 楼 tengjian1981 的回复:
你是数据文件大还是日记文件?


Log

#20


帮顶有分 
 
如果没有直接的方法,那这个就成了SQL SERVER的BUG了。

#21


--指定收缩大小试试
DBCC SHRINKFILE(log逻辑文件名,1024)

#22


sp_helpdb DBname
贴一下log文件那行的数据。

#23


引用 22 楼 perfectaction 的回复:
sp_helpdb DBname
贴一下log文件那行的数据。


已经被我干掉了。

#24


先截断日志,再收缩

#25


难道要我打电话给MS咨询,T_T

#26


引用 25 楼 pbsh 的回复:
难道要我打电话给MS咨询,T_T
顶!打给比尔!

#27


我这里在发布数据库,每周都要清理事务日志,收缩数据库的,好像没发生楼主的情况啊。

#28


引用 27 楼 navy887 的回复:
我这里在发布数据库,每周都要清理事务日志,收缩数据库的,好像没发生楼主的情况啊。


目前不是很清楚原因

#29


引用 26 楼 soft_wsx 的回复:
引用 25 楼 pbsh 的回复:
难道要我打电话给MS咨询,T_T
顶!打给比尔!


一个license只能问一个问题,囧

#30


学习一下,其实定期整理log就好了,这种情况没遇到

#31


该回复于2009-09-22 15:59:14被版主删除

#32


引用 30 楼 7761098 的回复:
学习一下,其实定期整理log就好了,这种情况没遇到


这个库是简单模型,自动收缩,本来没在意他的日志,偶然发现日志文件暴大。