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

Rac*_*hel 9 sql-server mirroring transaction-log

这是上一个关于为什么我无法缩小主体数据库上的日志文件的问题的后续问题。

长话短说,我设置了数据库镜像,但忘记确保备份事务日志的作业再次运行,事务日志增长到近 60GB。

由于设置了镜像,这种大小的增加在镜像服务器上重复出现,最终占用了所有磁盘空间,使镜像数据库无法使用。

根据有关镜像数据库上事务日志维护的这个问题,您无法备份镜像上的日志,但是当在有关如何缩小镜像数据库上过度增长的日志文件的评论中特别询问时,留下了一条评论

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

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

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

Tho*_*ger 6

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

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

create database MirroredDb;
go
Run Code Online (Sandbox Code Playgroud)

从备份创建相同的数据库NORECOVERY

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go
Run Code Online (Sandbox Code Playgroud)

无论您选择哪种方式,都可以设置您的镜像会话。

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

use MirroredDb;
go

select
    name,
    size
from sys.database_files;
Run Code Online (Sandbox Code Playgroud)

我的结果集如下所示:

name            size
MirroredDb      392
MirroredDb_log  104
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

我的结果集如下所示:

name            size
MirroredDb      392
MirroredDb_log  104
Run Code Online (Sandbox Code Playgroud)

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

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go
Run Code Online (Sandbox Code Playgroud)

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

use MirroredDb;
go

select
    name,
    size
from sys.database_files;
Run Code Online (Sandbox Code Playgroud)

我的结果集如下所示:

name            size
MirroredDb      392
MirroredDb_log  131072
Run Code Online (Sandbox Code Playgroud)

镜像数据库上创建另一个快照,并查看那里的事务日志文件大小:

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;
Run Code Online (Sandbox Code Playgroud)

我的结果集如下所示:

name            size
MirroredDb      392
MirroredDb_log  131072
Run Code Online (Sandbox Code Playgroud)

现在DBCC SHRINKFILE主体上做:

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;
Run Code Online (Sandbox Code Playgroud)

我的结果集如下:

name            size
MirroredDb      392
MirroredDb_log  104
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

我得到以下结果集:

name            size
MirroredDb      392
MirroredDb_log  104
Run Code Online (Sandbox Code Playgroud)

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