首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以收缩镜像数据库上的事务日志文件吗?

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

Database Administration用户
提问于 2013-04-22 13:43:39
回答 1查看 16.7K关注 0票数 9

这是对前一个问题的后续问题,问我为什么不能缩小主体数据库上的日志文件。

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

自镜像设置以来,在镜像服务器上复制了这种大小的增加,并最终占用了所有磁盘空间,使镜像数据库无法使用。

按照关于镜像数据库上事务日志维护的这个问题,您不能在镜像上备份日志,但是当在评论中专门询问如何缩小镜像数据库上已增长的日志文件时,会留下一个评论

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

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

是否有一种方法可以安全地收缩数据库镜像上的事务日志文件?

EN

回答 1

Database Administration用户

发布于 2013-04-22 14:46:52

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

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

代码语言:javascript
复制
create database MirroredDb;
go

使用NORECOVERY从备份中创建相同的数据库:

代码语言:javascript
复制
restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

设置您的镜像会话,但您选择的方式。

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

代码语言:javascript
复制
use MirroredDb;
go

select
    name,
    size
from sys.database_files;

我的结果如下所示:

代码语言:javascript
复制
name            size
MirroredDb      392
MirroredDb_log  104

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

代码语言:javascript
复制
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;

我的结果如下所示:

代码语言:javascript
复制
name            size
MirroredDb      392
MirroredDb_log  104

现在,在主体数据库上增长事务日志文件(我把它提高到了1GB):

代码语言:javascript
复制
alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

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

代码语言:javascript
复制
use MirroredDb;
go

select
    name,
    size
from sys.database_files;

我的结果如下所示:

代码语言:javascript
复制
name            size
MirroredDb      392
MirroredDb_log  131072

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

代码语言:javascript
复制
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;

我的结果如下所示:

代码语言:javascript
复制
name            size
MirroredDb      392
MirroredDb_log  131072

现在在主体上执行DBCC SHRINKFILE

代码语言:javascript
复制
use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

我的结果集如下:

代码语言:javascript
复制
name            size
MirroredDb      392
MirroredDb_log  104

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

代码语言:javascript
复制
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;

我得到以下结果集:

代码语言:javascript
复制
name            size
MirroredDb      392
MirroredDb_log  104

因此,正如您在这里看到的,DBCC SHRINKFILE命令实际上被镜像到镜像数据库。

票数 7
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/40609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档