求教邹健:SQL事务复制,订阅服务器的日志日益增大,并且无法收缩

guanjm 2009-03-17 03:49:13
我数据库是SQL2000 做复制 类型:事务复制,然后订阅服务器的日志居然增加到70G了,我想清空日志,并收缩,做了以下操作:
1.DUMP TRANSACTION 数据库名 WITH NO_LOG
2.BACKUP LOG 数据库名 WITH NO_LOG
但是报错,错误信息:
The log was not truncated because records at the beginning of the log are pending replication. Ensure the Log Reader Agent is running or use sp_repldone to mark transactions as distributed.

这个如何解决?并且把日志缩写到10G以下,我希望不要把订阅服务器停掉,单纯SQL语句操作,谢谢。
...全文
711 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
nzperfect 2011-07-05
  • 打赏
  • 举报
回复
今天无意间搜到了这个,同样的问题我最近遇到过一次。
我想出现这个问题的原因可能有:
1 订阅数据库是从一个事务复制的发布数据库拷贝过来
2 订阅数据库曾经出过故障,如置疑,采用rebuild log and dbcc checkdb修复过.

我遇到的情况是第2种.
解决的方法:
1.将该库设置为分发库,简单为该库做一个发布项
2.停止该发布项使用的logreader job.
3.exec sp_repldone null,null,0,0,1
4.dbcc shrinkfile

这样就可以解决了。
Leshami 2010-03-23
  • 打赏
  • 举报
回复
我来学习了。
xujianfu 2010-03-23
  • 打赏
  • 举报
回复
你的情况跟我的有点类似,我后来是这样搞定的:
1、先将复制设置成已分发
当 xactid 为 NULL,xact_seqno 为 NULL,并且 reset 为 1 时,日志中的所有复制事务都标记为已分发。当事务日志中存在不再有效的复制事务并且想截断该日志时,此过程很有用,例如:


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


2、再开始收缩

declare @strDbName varchar(32),@sql varchar(200)



set @strDbName = 'RedBoy' --需要处理的数据库名



set @sql = 'dump transaction ['+@strDbName+'] with no_log'+char(10)+char(13)

set @sql = @sql +

'backup log ['+@strDbName+'] with no_log'+char(10)+char(13)

set @sql = @sql +

'DBCC SHRINKDATABASE(['+@strDbName+'])'

exec(@sql)
newsyue 2009-08-02
  • 打赏
  • 举报
回复
我一开始也是收缩没用。 日志有16G。比数据库还大。。。
但把日志模式改成简单后, 收缩数据库到100M。 成功
testpb 2009-03-19
  • 打赏
  • 举报
回复
牙签是竹子的 2009-03-19
  • 打赏
  • 举报
回复
shuiniu 2009-03-19
  • 打赏
  • 举报
回复
Google了一下,基本可以确定楼主遇到的问题就是我说的情况:
你的订阅数据库是从一个事务复制的发布数据库拷贝过来的。

大致的方法如下:
USE 数据库名
GO
EXEC sp_dboption '数据库名','published','true'
EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
EXEC sp_removedbreplication '数据库名'
BACKUP LOG 数据库名 WITH no_log
DBCC shrinkfile(....)
GO

wanabe 2009-03-19
  • 打赏
  • 举报
回复
我只会手动,汗
zhuxianzhu 2009-03-19
  • 打赏
  • 举报
回复
分离你的数据库,,,把那个日志文件移走,再附加数据库
claro 2009-03-18
  • 打赏
  • 举报
回复
帮顶。
fuxiaoyang13 2009-03-18
  • 打赏
  • 举报
回复
学习学习!!
shuiniu 2009-03-18
  • 打赏
  • 举报
回复

1.这里有个疑问:如果确定是单纯的订阅数据库,且又是simple恢复模式。
那么基本上不可能出现楼主说的问题。这样的问题可能发生在发布数据库
或是分发数据库上。
2.simple模式的数据库在执行checkpoint时会自动截断事务日志。但是一些因素会
导致截断事务日志的延迟如:事务复制或长时间运行的事务。收缩simple模式数
据库的事务日志非常简单:

use dbname
GO
checkpoint
GO
dbcc shrinkfile(log_file_id)
GO

这样就行了。
2.存在一种可能,检查你的复制拓扑,订阅数据库是否又重新发布了?

--SQL2K
SELECT DATABASEPROPERTYEX('订阅数据库','IsPublished')
GO
--SQL2K5
SELECT is_published FROM sys.databases
WHERE database_id = DB_ID('订阅数据库')

4.最早的活动事务,最早的分布式和非分布式复制事务

DBCC opentran(订阅数据库)
GO

5.如果确实如此:订阅数据库又重新发布或是问题是在发布数据库或是分发数据库
就按照错误信息中的方法来处理:
Ensure the Log Reader Agent is running or use sp_repldone to mark transactions as distributed.
shuiniu 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 guanjm 的回复:]
引用 13 楼 perfectaction 的回复:

还有你的日志文档初始化是多少?增长是怎么设置的?

日志文件初始是7G,是从另外个DB拷贝过来的,做订阅服务器的,增长是10%,默认的
[/Quote]

1.问题可能就出在你这个订阅数据库是怎么来的了?
2.是否这个订阅数据库是从一个发布数据库拷贝过来的???
3.检查一下数据库里是否存在syspublications这个表?
4.当前订阅数据库可以同步成功嘛?

shuiniu 2009-03-18
  • 打赏
  • 举报
回复
如果只是A数据库发布 B数据库订阅,B的恢复模式是simple。
你在操作B数据库的事务日志,是不会碰到你说的那个错误的!
shuiniu 2009-03-18
  • 打赏
  • 举报
回复
楼主看明白我的第一个回复了嘛?
nzperfect 2009-03-18
  • 打赏
  • 举报
回复
是否可以远程看下,你这个情况挺特殊.
guanjm 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 shuiniu 的回复:]
汗一个先!
楼主把你需要把问题再重新描述一下,否则没办法帮你解决的。
如果只是不知道SP_REPLDONE的用法,可以看帮助讲的很清楚了。
[/Quote]
现在有个订阅服务器,数据库日志达到70G,然后收缩没用,用了很多方法都不行。
数据库版本:SQL2000 标准版 英文
数据库模型:简单

现在想用SQL语句来把日志文件收缩到10G以下,谢谢啦!!!
shuiniu 2009-03-18
  • 打赏
  • 举报
回复
汗一个先!
楼主把你需要把问题再重新描述一下,否则没办法帮你解决的。
如果只是不知道SP_REPLDONE的用法,可以看帮助讲的很清楚了。
xiaoliwind 2009-03-18
  • 打赏
  • 举报
回复
关注中,, 我也再面临类似的问题。
Novelty 2009-03-18
  • 打赏
  • 举报
回复
SQL Server 2005不装sp也有这个问题,打上sp后可以解决这个问题。

不知道2000如何解决,呵呵,等高手吧。
加载更多回复(17)

34,596

社区成员

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

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