如何收缩2005 Mirror数据库

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

在论坛看到收缩主数据库在Mirror上没有效果的问题。以前我也认为在主数据库上执行的DBCC Shirnkfile命令会在Mirror数据库上重做,所以收缩主数据库可以导致Mirror数据库跟着收缩。事实不是。从MS网站找到的资料:

When you use databasemirroring in Microsoft SQL Server 2005, SQL Server automatically propagates anychanges on the principal database to the mirror database. However, if you runthe DBCC SHRINKDATABASE statement or the DBCC SHRINKFILE statements to shrinkthe principal database,theshrink operation is not duplicated on the mirror database.

CAUSE:Database mirroring will change the physical file sizes only after a checkpoint.

在主数据库上执行DBCC SHRINKDATABASE或者DBCC SHRINKFILE的命令,收缩的操作不会在Mirror数据库上重做。原因是:Mirror数据库只在checkpoint动作后才会修改物理文件的大小。

有几个办法可以解决这个问题:

1.       Master数据库执行下面的命令创建存储过程,在主数据库上运行创建的存储过程。

usemaster

go

if object_id('sp_shrink_mirrored_database','P')isnot null

drop procsp_shrink_mirrored_database

go

create proceduresp_shrink_mirrored_database@dbnamesysname,@target_percentint=null

as

begin

declare@filenamesysname

declare@filesizeint

declare@sqlnvarchar(4000)

 

if @target_percentis null

dbccshrinkdatabase(@dbname)

else

dbccshrinkdatabase(@dbname,@target_percent)

declareccursorfor

select[name],[size]fromsys.master_fileswheretype=0anddatabase_id= db_id(@dbname)

open c

fetch nextfromcinto@filename,@filesize

while @@fetch_status=0

begin

set @filesize=(@filesize+1)*8

set @sql='alter database ['+@dbname+ '] modify file ( name='

+ @filename+', size='+cast(@filesizeasnvarchar)+'kb )'

executesp_executesql@sql

fetchnextfromcinto @filename,@filesize

end

close c

deallocatec

end

go

 

2.       在主数据库上执行收缩命令之后手动允许checkpoint命令。

 

3.       可以考虑做Failover将辅助的直接变成主的,执行收缩命令。

另外建议经常对数据库进行日志备份,如果发现日志文件增长的快可以考虑增加备份的频率,这样可以导致日志空间重用,从而减少日志文件的增长。

另外在2008版本上测试不会有这个问题,收缩的命令可以成功在Mirror上面起作用,所以这个现象可能只限于2005的版本。

 

本文转自 lzf328 51CTO博客,原文链接:http://blog.51cto.com/lzf328/1252921


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5月前
|
SQL 监控 数据库
sql2012收缩数据库
在 SQL Server 2012 中,\移动后,释放不再使用的空间。这可以通过几种不同的方法来实现,具体取决于你希望如何管理这个过程。以下是一些常见的方法和步骤来收缩 SQL Server 数据库:
|
3月前
|
SQL Oracle 关系型数据库
SQL Server 2016 自动备份、收缩数据库
SQL Server 2016 自动备份、收缩数据库
54 0
|
6月前
|
关系型数据库 测试技术 数据库
`pg_rewind` 是 PostgreSQL 数据库的一个工具,用于将一个数据库集群回退到指定的时间点
pg_rewind 是 PostgreSQL 数据库的一个工具,用于将一个数据库集群回退到指定的时间点。这对于恢复数据或解决某些问题非常有用。 简单来说,如果你有一个 PostgreSQL 数据库集群并且你知道在某个时间点它是健康的,但之后出现了问题,你可以使用 pg_rewind 来将数据库回退到那个时间点,从而恢复到已知的、健康的、一致的状态。 使用 pg_rewind 的基本步骤如下: 确定基准时间:首先,你需要确定一个基准时间点,知道在该时间点上数据库是健康的。 备份当前数据库:在执行 pg_rewind 之前,确保你已经备份了当前的数据库。 执行 pg_rewind:使用
191 1
|
12月前
|
存储 NoSQL Shell
如何将阿里云WiredTiger引擎的MongoDB物理备份文件恢复至自建数据库
数据库操作一直是一个比较敏感的话题,动不动“删库跑路”,可见数据库操作对于一个项目而言是非常重要的,我们有时候会因为一个游戏的严重bug或者运营故障要回档数据库,而你们刚好使用的是阿里云的Mongodb,那么这篇文章将给你提供一个思路(或许你按照阿里云官网的文档一顿操作下来,并不是那么顺利,有一些报错,无法登录...)
|
SQL 关系型数据库 分布式数据库
PolarDB数据库维护
本场景带您体验PolarDB数据库维护常用功能。
819 0
|
数据库
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
844 0
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
|
关系型数据库 数据库连接 数据库
删除 PostgresSql 数据库 报错:有 N 个其它会话正在使用数据库 的解决方案
遇到的问题 在PostgreSQL 9.2 及以上版本,执行下面的语句: postgres=# drop database dbtest; # 执行删除指定数据库的时候,报以下错误 ERROR: database "dbtest" is being accessed by other users DETAIL: There is 2 other session using the database. 或者使用 Navicat 等第三方数据库连接工具,删除指定数据库的时候报错,说明此时有两个客户端在连接此数据库,此时不能删除数据库。
1887 0
|
数据库 Go
收缩数据库日志
原文:收缩数据库日志 USE DATABASENAME; GO --不得已时再用这个 DUMP TRANSACTION DATABASENAME WITH NO_LOG --先截断事务日志 BACKUP LOG DATABASENAME TRUNCATE_ONLY|WITH NO_LOG|TO DISK='文件路径' --再收缩日志 DBCC SHRINKFILE (2, 7)|SHRINKFILE (DATABASENAME); --要收缩的文件的fileid,对应sysfiles中的fileid。
922 0
|
网络协议 数据库
SQLServer 数据库镜像+复制切换方案
原文:SQLServer 数据库镜像+复制切换方案 目标:       主机做了Mirror和Replication,当主机出现问题时,Replication和Mirror实现自动的故障转移(Mirror 和Replication都切换到备机,而当主机        重新启动后,自动充当备机的角色)。
1879 0