使用alwayson后如何收缩数据库日志
问题描述:
在使用了alwayson后,主从库实时同步,原理是通过事务日志同步的,所以造成主数据库的事务日志一直在使用,而且无法收缩主数据库的事务日志。
在主从库同步时,收缩数据库是不起作用的。由于主数据库无法收缩,所以从数据库的日志也会一直跟着增长,造成磁盘空间一直增长。
网上大量的收缩日志的方法,基本上都不管用,怀疑根本没有在实际环境中使用过,以下方案是我在实际中使用后总结记录的。
解决方案:
最开始发现这个问题后,也是研究了好久,发现的方法,先是全手动操作。因为这些操作,并不能用语句来实现自动化,所以一直是手动处理的。
可能人都是比较懒的吧(人只有懒,才能促进机械自动化,才会有各种发表创造!不是吗?呵呵),一直想能过脚本,实现自动化。
今天终于摸索出来了,总结一下。
大概的思路如下
通过脚本将alwayson从库,从可用性数据库是移除,就是取消主从同步,这样主库变成单库模式了。然后再收缩事务日志,收缩后再把主从数据库加上。
考虑到有一点,操作中需要删除从库上的数据库,为防止操作错误,把主库的数据库删除了,这个操作相当危险啊,所以将脚本分为三个。在两个机器上来回操作。
第一个脚本在db1上执行。
第二个脚本在db3上执行
第三个脚本在db1上执行
(这里db1是主库,db3是从库。不要问我db2呢,因为创建时先创建的db2后来db2有问题删除了。你根据你的实际情况替换就行了。)
待时机成熟,或者加上判断,可以考虑将以下三个脚本合成一个脚本,然后一键执行,或者加到定时任务,每月自动执行一次。
以下脚本经过亲测可用
syncdb 为alwayson同步的名字,
DBSERVER1和DBSERVER3是主从数据库的名称。DBSERVER1为主库,DBSERVER3为从库。
:Connect DBSERVER1 -U sa -P abc@123 是使用SQLCMD模式连接数据库,请修改后面的密码。
test为数据库名称。
1、取消主从同步
--- YOU MUST EXECUTE THE FOLLOWING SCRIPT IN SQLCMD MODE.
:Connect DBSERVER1 -U sa -P abc@123 USE [master]GOALTER AVAILABILITY GROUP [syncdb] REMOVE DATABASE [test];
GO
2 删除从库上的数据库,在收拾后,再添加上。
:Connect DBSERVER3 -U sa -P abc@123 USE [master]
GODROP DATABASE [test]
GO
3.备份事务日志,收缩日志文件,添加从库数据库。
--- YOU MUST EXECUTE THE FOLLOWING SCRIPT IN SQLCMD MODE.
:Connect DBSERVER1 -U sa -P abc@123 USE [master]GOBACKUP LOG [test] TO DISK='NUL:'with STATS = 10
go
use [test]
go
DBCC SHRINKFILE (N'test_log' , 20480)
GOUSE [master]GOALTER AVAILABILITY GROUP [test]
ADD DATABASE [test];GO:Connect DBSERVER1 -U sa -P test@123 BACKUP DATABASE [test] TO DISK = N'\\dbserver3\e$\share\test.bak' WITH COPY_ONLY, FORMAT, INIT, SKIP, REWIND, NOUNLOAD, COMPRESSION, STATS = 5GO:Connect DBSERVER3 -U sa -P test@123 RESTORE DATABASE [test] FROM DISK = N'\\dbserver3\e$\share\test.bak' WITH NORECOVERY, NOUNLOAD, STATS = 5GO:Connect DBSERVER1 -U sa -P test@123 BACKUP LOG [test] TO DISK = N'\\dbserver3\e$\share\test.trn' WITH NOFORMAT, NOINIT, NOSKIP, REWIND, NOUNLOAD, COMPRESSION, STATS = 5GO:Connect DBSERVER3 -U sa -P test@123 RESTORE LOG [test] FROM DISK = N'\\dbserver3\e$\share\test.trn' WITH NORECOVERY, NOUNLOAD, STATS = 5GO:Connect DBSERVER3 -U sa -P test@123 -- Wait for the replica to start communicating
begin try
declare @conn bit
declare @count int
declare @replica_id uniqueidentifier
declare @group_id uniqueidentifier
set @conn = 0
set @count = 30 -- wait for 5 minutes if (serverproperty('IsHadrEnabled') = 1)and (isnull((select member_state from master.sys.dm_hadr_cluster_members where upper(member_name COLLATE Latin1_General_CI_AS) = upper(cast(serverproperty('ComputerNamePhysicalNetBIOS') as nvarchar(256)) COLLATE Latin1_General_CI_AS)), 0) <> 0)and (isnull((select state from master.sys.database_mirroring_endpoints), 1) = 0)
beginselect @group_id = ags.group_id from master.sys.availability_groups as ags where name = N'yorkdb'select @replica_id = replicas.replica_id from master.sys.availability_replicas as replicas where upper(replicas.replica_server_name COLLATE Latin1_General_CI_AS) = upper(@@SERVERNAME COLLATE Latin1_General_CI_AS) and group_id = @group_idwhile @conn <> 1 and @count > 0beginset @conn = isnull((select connected_state from master.sys.dm_hadr_availability_replica_states as states where states.replica_id = @replica_id), 1)if @conn = 1begin-- exit loop when the replica is connected, or if the query cannot find the replica statusbreakendwaitfor delay '00:00:10'set @count = @count - 1end
end
end try
begin catch-- If the wait loop fails, do not stop execution of the alter database statement
end catch
ALTER DATABASE [test] SET HADR AVAILABILITY GROUP = [syncdb];GOGO
在执行:Connect 命令前记得把SQLCMD模式打开
打开后,你能看到SQLCMD命令是灰色的。
使用alwayson后如何收缩数据库日志相关推荐
- always on sql 收缩日志_使用alwayson后如何收缩数据库日志的方法详解
问题描述: 在使用了alwayson后,主从库实时同步,原理是通过事务日志同步的,所以造成主数据库的事务日志一直在使用,而且无法收缩主数据库的事务日志. 在主从库同步时,收缩数据库是不起作用的.由于主 ...
- 0x84bb0001 sqlserver_sqlserver 实现收缩数据库日志操作
说明: 收缩日志的原因有很多种,有些是考虑空间不足,有些则是应用程序限制导致的. --将"恢复模式"设置为"简单" ALTER DATABASE xszzxt_ ...
- SQLServer收缩数据库日志
SQL2000删除数据库日志有两种方法 一种方法:清空日志. 1.打开查询分析器,输入命令 DUMP TRANSACTION 数据库名 WITH NO_LOG 2.再打开企业管理器--右键你要压缩的数 ...
- sql2008r 收缩数据库日志log文件;删除errorlog文件的方法
1.清空log文件,以减少数据库文件log所占的空间 USE dbname1 ; GO ALTER DATABASE dbname1 SET RECOVERY SIMPLE;--设置简单恢复模式 GO ...
- 清除SQLServer数据库日志(ldf文件)的几种方法
概述 我是下面有三个ldf:**_log2.ldf,**_log3.ldf,**_log.ldf,我是通过方案2减小了**_log.ldf.另两个改了后缀名还没有报错,因为我这个是测试环境,运行一段时 ...
- sql server 2012 如何收缩事务日志(脚本)
sql2008不再支持 BACKUP LOG 数据库名 WITH NO_LOG 语句 BACKUP Log zxta with no_log 截断事务日志 sql2008 提示错误如下 BACKU ...
- mysql数据库日志清理工具_MSSQL数据库日志清理工具
MSSQL数据库日志清理工具是一款专用的数据库日志清理软件,软件支持SQL多个版本清理,能够帮助用户快捷方便实用数据库,另外还支持备份数据库日记,为用户带来最便捷的使用体验! 软件介绍 MSSQL数据 ...
- DBCC SHRINKFILE收缩日志/收缩数据库/收缩文件
DBCC SHRINKFILE 收缩相关数据库的指定数据文件或日志文件大小. 语法 DBCC SHRINKFILE ( { file_name | file_id } { [ ...
- 压缩SQL数据库日志-收缩SQL数据库日志-备份SQL数据库日志-删除SQL数据库日志
[标题]压缩SQL数据库日志-收缩SQL数据库日志-备份SQL数据库日志-删除SQL数据库日志 [内容] 清除SQL数据库日志文件 有两种方式: 一.是压缩日志,二.是 ...
最新文章
- 18.绝对路径和相对路径
- ServiceMesh有关sidecar理解
- R语言泊松回归(poisson)模型案例:基于robust包的Breslow癫痫数据集
- Scrum敏捷开发工具Leangoo
- Different Layouts for Different Widths
- ALV的SAP自带标准程序实例
- 去除覆盖在文字上的水印_PDF文档密码移除与文字水印去除工具
- 天平应什么放置_天平是否应该放干燥剂?
- 你,下周可否“报上有名”?
- openresty 日志输出的处理
- PS教程第二十一课:有了选区就有了界限
- 【Python】Python figure显示的两种方式
- Android Studio 如何修改项目名称
- Datawhale编程学习之图(6)
- python实现求解字符串集的最长公共前缀
- Excel 脚本编写
- 第2次作业—— 时事点评
- 赵小楼《天道》《遥远的救世主》深度解析(35)你觉得叶晓明、冯世杰、刘冰是底层吗?
- latex 各级标题公式
- MAC 中selenium、webdriver打开Chrome浏览器闪退问题(版本号一致)