今天发现一个数据库虽然处于简单恢复模式,但是日志一直在增长的情况。手工收缩日志但是无效。
网上查了一下,运行如下代码就能查看日志不能截断的原因:
USE [master]
SELECT [name] ,[database_id] ,[log_reuse_wait] ,[log_reuse_wait_desc] FROM [sys].[databases]发现那个数据库的log_reuse_wait_desc是REPLICATION。但是那个数据库并没有复制。网上说这可能是SQL Server 2008中的Bug,需要在那个数据库上创建一个临时的复制发布,再删掉就好了。
然而我在创建发布时碰到报错,无法创建发布。继续谷歌度娘,了解到发生这种情况的原因一般是以前在迁移数据库时没有先删除复制就直接附加数据库文件造成的。
解决方法:
解决列名originator_id无效错误的SQL:
alter table 数据库名.dbo.syspublications add [originator_id] int null
解决找不到存储过程“”错误的SQL:
delete from 数据库名.dbo.sysreplservers
这样就可以成功创建复制,然后再删除它以清除删除该数据库中遗留的复制的信息。
之后就可以用以下SQL收缩处于简单模式的数据库的日志文件
checkpoint
use 数据库名
dbcc shrinkfile (日志文件逻辑名,100)另外在使用复制时确保@@ServerName正确,否则不能连接到复制
运行以下代码查看服务名是否与机器名一致:
select @@servername,serverproperty('servername')
如果二者不一致的话需运行以下代码:
if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver @server = @server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver @server = @server , @local = 'LOCAL'
end然后重启数据库服务
参考资料:
浙公网安备 33010602011771号