我可以在镜像数据库上收缩事务日志文件吗?


9

这是先前问题的后续问题,该问题为何我无法缩小主体数据库上的日志文件。

简而言之,我设置了数据库镜像,但是忘记确保备份事务日志的作业再次运行,并且事务日志增长到将近60GB。

由于已建立镜像,因此在镜像服务器上重复进行了此大小增加,最终占用了所有磁盘空间,并使镜像数据库不可用。

这一问题有关镜像数据库事务日志的维护,你不能备份日志上镜,但是当在特别要求评论有关如何收缩镜像数据库上一个杂草丛生的日志文件,一个注释中留下了

一种方法是将故障转移到镜像数据库并在该数据库上进行收缩。在非生产环境中进行彻底测试,以确保它具有您想要/期望的行为。

这似乎表明可能还有其他方法可以将镜像文件收缩到镜像上,并且这种方法在生产服务器上不一定是安全的。

有没有办法安全地缩小数据库镜像上的事务日志文件?


2
唯一受支持的方法是在主体上缩小文件,这也会在镜像上缩小文件。如果您的镜像不再与主体相同,则您确实不想尝试故障转移到镜像。如您在上一个问题中所述,中断镜像并重新创建它。
Max Vernon

Answers:


6

DBCC SHRINKFILE命令将从主体镜像到镜像数据库。这是一些证据。

在主体上创建一个示例数据库:

create database MirroredDb;
go

使用NORECOVERY以下命令从备份创建相同的数据库:

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

设置镜像会话,但是选择哪种方式。

主体数据库上,查看数据库文件大小:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

我的结果集如下所示:

name            size
MirroredDb      392
MirroredDb_log  104

镜像数据库上,创建快照并查看相同的信息:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

我的结果集如下所示:

name            size
MirroredDb      392
MirroredDb_log  104

现在在主体数据库上增长事务日志文件(我将其增加到1 GB):

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

查看主体数据库的事务日志大小,我们现在看到调整后的大小:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

我的结果集如下所示:

name            size
MirroredDb      392
MirroredDb_log  131072

镜像数据库上创建另一个快照,然后查看其中的事务日志文件大小:

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

我的结果集如下所示:

name            size
MirroredDb      392
MirroredDb_log  131072

现在DBCC SHRINKFILE主体执行

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

我的结果集如下:

name            size
MirroredDb      392
MirroredDb_log  104

镜像数据库上创建第三张也是最后一张快照,然后查看其大小:

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

我得到以下结果集:

name            size
MirroredDb      392
MirroredDb_log  104

因此,如您在此处看到的,该DBCC SHRINKFILE命令实际上已镜像到镜像数据库。


谢谢,我也没有意识到日志文件的大小也是从主体服务器复制过来的。但是,如果由于事务日志大小而导致镜像无法正常工作,那么删除和重新创建镜像的唯一解决方案是吗?当镜像过程不起作用时,无法安全收缩镜像日志吗?
Rachel

您无法连接到镜像数据库,因此无法在其DBCC SHRINKFILE上运行。至于是否可以在不删除该数据库上的镜像的情况下修复镜像会话,则还需要进行更多调查。似乎是由于文件大小而被暂停。您是否尝试过恢复伴侣?
Thomas Stringer

是的,但是它立即又回到暂停状态。我想这是因为自镜像停止以来已过去了太多时间,因此在到达“收缩日志文件”部分之前仍需要传输大量数据。我希望还有一些我不知道的其他方式,例如可以从镜像数据库运行以缩小文件的内容,或某些文件系统的操作,但事实并非如此。尽管您的回答仍然很有帮助,所以谢谢您:)
Rachel

希望不再。一旦数据库被挂起/断开连接,并且在主数据库上执行了日志备份,您几乎可以在不重新初始化的情况下恢复镜像同步。
杰森·坎伯兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.