Transaction Log 不会收缩,DB 认为它在复制

Sam*_*tch 16 replication sql-server transaction-log

我有一个运行 Kaspersky Security Center 的 SQL Server 2008 R2 Express 数据库,我不知道安装是在什么情况下发生的,但数据库似乎认为它正在被复制并且不会从事务日志中释放任何空间。例如:

USE master;

SELECT 
    name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled 
FROM 
    sys.databases 
WHERE 
    name = 'KAV';

SELECT DATABASEPROPERTYEX('KAV', 'IsPublished');
Run Code Online (Sandbox Code Playgroud)

返回:

name | log_reuse_wait | log_reuse_wait_desc | is_cdc_enabled
-----|----------------|---------------------|---------------
KAV  | 6              | REPLICATION         | 0 
Run Code Online (Sandbox Code Playgroud)
DATABASEPROPERTYEX('KAV', 'IsPublished')
----------------------------------------
0 [not published]
Run Code Online (Sandbox Code Playgroud)

ReplicationSSMS的部分中也没有列出任何内容。

到目前为止,我已经尝试了从 Google 结果中收集到的几个语句:

USE KAV;
EXEC sp_repldone null, null, 0,0,1;
EXEC sp_removedbreplication KAV;
Run Code Online (Sandbox Code Playgroud)

但是我没有运气让这个数据库停止认为它正在被复制。

完整sys.databases信息:

USE master;

SELECT 
    name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled 
FROM 
    sys.databases 
WHERE 
    name = 'KAV';

SELECT DATABASEPROPERTYEX('KAV', 'IsPublished');
Run Code Online (Sandbox Code Playgroud)

还:

DBCC OPENTRAN;
No active open transactions.

DBCC SQLPERF(LOGSPACE);
KAV 171066  99.55339    0

EXEC sp_replcounters;
KAV 0   0   0   0x00000000000000000000  0x00000000000000000000
Run Code Online (Sandbox Code Playgroud)

我也刚刚执行了完整的数据和日志备份。

我遇到了一些情况非常相似的帖子,给出的解决方案是设置复制发布和分发,然后再次将其删除。然而,这是 Express Edition,这些选项甚至不会出现在我身上。

我们主要是一家 Linux 商店,这是我们拥有的唯一 SQL Server 实例。如果所有其他方法都失败了,获得真正的许可证可能是我们唯一的办法:将备份恢复到非 Express 实例并尝试设置然后删除发布,然后最后恢复回 Express。

小智 7

恢复已发布数据库的解决方案

我们遇到了类似的问题:发布的数据库存储在 Server1 上。每天都会在 Server2 上备份和恢复此数据库。

  • 我们经常收到错误消息:

    由于复制,日志已满

  • log_reuse_wait_desc被设置为REPLICATION
  • 无法删除复制,因为此数据库未在 Server2 上发布。

解决方案

恢复数据库后启用发布并将其删除:

USE MyDatabase
GO
-- 1.) enable publication for MyDatabase
EXEC sp_replicationdboption 
  @dbname = 'MyDatabase', 
  @optname = N'publish', 
  @value = N'true';
GO
-- 2.) remove publication from database. Use the PUBLICATION-name (not database name)
sp_removedbreplication 'Publ_MyDatabase','both'

-- 3.) disable publication for MyDatabase
EXEC sp_replicationdboption 
  @dbname = 'MyDatabase', 
  @optname = N'publish', 
  @value = N'false';
GO

-- Verify: log_reuse_wait_desc should have changed from REPLICATION to NOTHING
SELECT name, log_reuse_wait_desc, * FROM sys.databases WHERE name = 'MyDatabase'
Run Code Online (Sandbox Code Playgroud)


You*_*nny 1

该数据库停机是否可以接受?这可能是从复制数据库恢复的,也可能是订阅者被不当删除,尽管这种情况不太可能发生。您可以尝试从快速版本进行备份并恢复到标准或更高版本,然后再次设置复制并将其删除。然后您可以从标准备份并恢复到快速。只要您在较高版本中不启用数据库上的任何功能,降级就不会有问题。您可以在实际中断之前对此进行测试,以确保它将删除状态并全部编写脚本以最大限度地减少停机时间。如果您没有可以使用的其他服务器,请获取评估副本并安装在本地计算机、虚拟机、原始计算机(如果可以接受)或任何您能找到的地方。正如您所观察到的,您对快递的选择有限。