数据库日志无法清空

MaJiaP 2010-12-02 03:15:18
我的数据库日志以前使用下面的SQL来清空,最近发现日志没法清空一直在增加,数据库是Sql Server 2005,怎么解决?

--清空日志
DUMP TRANSACTION 库名 WITH NO_LOG
--截断事务日志
BACKUP LOG 数据库名 WITH NO_LOG
--收缩数据库
DBCC SHRINKDATABASE(数据库名)
----
...全文
920 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
京地之蛙 2011-12-16
  • 打赏
  • 举报
回复
这个问题可能是由于 你此数据库是从其他地方复制过来的或者你离线后,移动过数据库再附加引起的,可以先执行

sp_removedbreplication

然后再收缩
randee_luo 2010-12-03
  • 打赏
  • 举报
回复
好像不能清空吧。 最少都得保留504K的
MaJiaP 2010-12-03
  • 打赏
  • 举报
回复
网上Google一下,自己找到了解决办法

解决办法的原文:
REPLICATION
这是我遇到的情况,但我根本没有启用过REPLICATION,据查,这好像是SQLSERVER2008的一个BUG,解决方法是给标有“REPLICATION”的数据库任意一个表创建数据库事务复制(TRANSACTION REPLICATION),然后再删除,执行数据库与日志备份后,就可以收缩了。

地址:http://dev.firnow.com/course/7_databases/sql/sqlServer/20100719/449726.html

主要还是log_reuse_wait_desc REPLICATION的问题造成的,据说是个BUG。通过创建一个新的数据库事务复制然后再删除就正常了。
hardycheng 2010-12-03
  • 打赏
  • 举报
回复
只能连续回复三次 哈哈
2010-12-03
  • 打赏
  • 举报
回复
我来帮忙了。
MaJiaP 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 luoyefeng1022 的回复:]

你先分离数据库,再附加数据库时只附加数据文件,就可以清楚日志了!
没问题的,不过最好先备份,我日志也是几个G 就这样处理的!
[/Quote]
这样太麻烦了,我平时都是定时运行清空数据库的SQL
luoyefeng1022 2010-12-02
  • 打赏
  • 举报
回复
你先分离数据库,再附加数据库时只附加数据文件,就可以清楚日志了!
没问题的,不过最好先备份,我日志也是几个G 就这样处理的!
MaJiaP 2010-12-02
  • 打赏
  • 举报
回复
试了这个SQL,不行,有错误提示

EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1

消息 18757,级别 16,状态 1,过程 sp_repldone,第 1 行
无法执行过程。该数据库没有发布。请在已为复制发布的数据库中执行该过程。


billpu 2010-12-02
  • 打赏
  • 举报
回复
最好先问问 不然运行了 容易出问题...
MaJiaP 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 billpu 的回复:]

引用 18 楼 majiap 的回复:

引用 16 楼 billpu 的回复:

很明显 你的数据库用了复制 所以不能截断
所以停掉复制 重新运行吧

什么是复制?我重没用过,如何停掉?

汗 sqlserver不是你管的吧...
你运行17楼的那个语句
SQL code
EXEC sp_repldone @xactid = NULL, @xact_segno = NU……
[/Quote]
我只用SQL而已,数据库的这类问题不懂了,我先试试。
fa_ge 2010-12-02
  • 打赏
  • 举报
回复
先分离数据库文件,再附加单个数据文件。这样日志文件就重建了
billpu 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 majiap 的回复:]

引用 16 楼 billpu 的回复:

很明显 你的数据库用了复制 所以不能截断
所以停掉复制 重新运行吧

什么是复制?我重没用过,如何停掉?
[/Quote]
汗 sqlserver不是你管的吧...
你运行17楼的那个语句
EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0,     @time = 0, @reset = 1

那个是标记所有的事务已被传送到distributor,运行之后
再运行你1楼的截断事务的语句
MaJiaP 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 billpu 的回复:]

很明显 你的数据库用了复制 所以不能截断
所以停掉复制 重新运行吧
[/Quote]
什么是复制?我重没用过,如何停掉?
cjzm83 2010-12-02
  • 打赏
  • 举报
回复
have a try

EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
billpu 2010-12-02
  • 打赏
  • 举报
回复
很明显 你的数据库用了复制 所以不能截断
所以停掉复制 重新运行吧
MaJiaP 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cjzm83 的回复:]

1.DBCC OPENTRAN 看看是否有老的活动事务

2.是否用了复制
[/Quote]
运行DBCC OPENTRAN后显示,不明白什么意思。你讲的复制是指什么?我因为没用了。
已复制的事务信息:
最早的分布式 LSN : (0:0:0)
最早的非分布式 LSN : (1874429:25:1)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
MaJiaP 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 billpu 的回复:]

首先并不是以上的语句能确保截断或者收缩你的数据库日志
你一定要了解 你的数据库日志能不能被截断(先不要谈收缩)并不一定是你的语句有问题,而是你的日志能否有被可标记为复用的段(截断),比如一个很长很长,或者永远不会结束的事务都会影响你截断事务
用以下语句看一下 是否你的日志文件允许被截断,或者不允许被截断的原因,你只要找log_reuse_wait和log_reuse_wait_desc 两个……
[/Quote]
log_reuse_wait和log_reuse_wait_desc分别是6 REPLICATION,怎么解决?
billpu 2010-12-02
  • 打赏
  • 举报
回复
首先并不是以上的语句能确保截断或者收缩你的数据库日志
你一定要了解 你的数据库日志能不能被截断(先不要谈收缩)并不一定是你的语句有问题,而是你的日志能否有被可标记为复用的段(截断),比如一个很长很长,或者永远不会结束的事务都会影响你截断事务
用以下语句看一下 是否你的日志文件允许被截断,或者不允许被截断的原因,你只要找log_reuse_wait和log_reuse_wait_desc 两个字段就可以了
select [name],log_reuse_wait,log_reuse_wait_desc from sys.databases

可以的话贴上来看看
-晴天 2010-12-02
  • 打赏
  • 举报
回复
其实,不让日志文件长太大的方法,最简单的就是创建三个小的日志文件.SQL在这三个日志文件中循环,一般每个几十兆就不再大了.
cjzm83 2010-12-02
  • 打赏
  • 举报
回复
1.DBCC OPENTRAN 看看是否有老的活动事务

2.是否用了复制
加载更多回复(9)

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧