问题描述:

在使用了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后如何收缩数据库日志相关推荐

  1. always on sql 收缩日志_使用alwayson后如何收缩数据库日志的方法详解

    问题描述: 在使用了alwayson后,主从库实时同步,原理是通过事务日志同步的,所以造成主数据库的事务日志一直在使用,而且无法收缩主数据库的事务日志. 在主从库同步时,收缩数据库是不起作用的.由于主 ...

  2. 0x84bb0001 sqlserver_sqlserver 实现收缩数据库日志操作

    说明: 收缩日志的原因有很多种,有些是考虑空间不足,有些则是应用程序限制导致的. --将"恢复模式"设置为"简单" ALTER DATABASE xszzxt_ ...

  3. SQLServer收缩数据库日志

    SQL2000删除数据库日志有两种方法 一种方法:清空日志. 1.打开查询分析器,输入命令 DUMP TRANSACTION 数据库名 WITH NO_LOG 2.再打开企业管理器--右键你要压缩的数 ...

  4. sql2008r 收缩数据库日志log文件;删除errorlog文件的方法

    1.清空log文件,以减少数据库文件log所占的空间 USE dbname1 ; GO ALTER DATABASE dbname1 SET RECOVERY SIMPLE;--设置简单恢复模式 GO ...

  5. 清除SQLServer数据库日志(ldf文件)的几种方法

    概述 我是下面有三个ldf:**_log2.ldf,**_log3.ldf,**_log.ldf,我是通过方案2减小了**_log.ldf.另两个改了后缀名还没有报错,因为我这个是测试环境,运行一段时 ...

  6. sql server 2012 如何收缩事务日志(脚本)

    sql2008不再支持 BACKUP LOG 数据库名 WITH NO_LOG   语句 BACKUP Log zxta with no_log 截断事务日志 sql2008 提示错误如下 BACKU ...

  7. mysql数据库日志清理工具_MSSQL数据库日志清理工具

    MSSQL数据库日志清理工具是一款专用的数据库日志清理软件,软件支持SQL多个版本清理,能够帮助用户快捷方便实用数据库,另外还支持备份数据库日记,为用户带来最便捷的使用体验! 软件介绍 MSSQL数据 ...

  8. DBCC SHRINKFILE收缩日志/收缩数据库/收缩文件

    DBCC SHRINKFILE 收缩相关数据库的指定数据文件或日志文件大小. 语法 DBCC SHRINKFILE     ( { file_name | file_id }         { [  ...

  9. 压缩SQL数据库日志-收缩SQL数据库日志-备份SQL数据库日志-删除SQL数据库日志

    [标题]压缩SQL数据库日志-收缩SQL数据库日志-备份SQL数据库日志-删除SQL数据库日志  [内容]         清除SQL数据库日志文件        有两种方式: 一.是压缩日志,二.是 ...

最新文章

  1. 18.绝对路径和相对路径
  2. ServiceMesh有关sidecar理解
  3. R语言泊松回归(poisson)模型案例:基于robust包的Breslow癫痫数据集
  4. Scrum敏捷开发工具Leangoo
  5. Different Layouts for Different Widths
  6. ALV的SAP自带标准程序实例
  7. 去除覆盖在文字上的水印_PDF文档密码移除与文字水印去除工具
  8. 天平应什么放置_天平是否应该放干燥剂?
  9. 你,下周可否“报上有名”?
  10. openresty 日志输出的处理
  11. PS教程第二十一课:有了选区就有了界限
  12. 【Python】Python figure显示的两种方式
  13. Android Studio 如何修改项目名称
  14. Datawhale编程学习之图(6)
  15. python实现求解字符串集的最长公共前缀
  16. Excel 脚本编写
  17. 第2次作业—— 时事点评
  18. 赵小楼《天道》《遥远的救世主》深度解析(35)你觉得叶晓明、冯世杰、刘冰是底层吗?
  19. latex 各级标题公式
  20. MAC 中selenium、webdriver打开Chrome浏览器闪退问题(版本号一致)

热门文章

  1. 金航数码选择应用 TDengine 时序数据库,改造现有数据库架构
  2. Java中HashMap底层实现原理
  3. 大数据时代医疗大数据建设,主要存在哪些问题?
  4. 计算机自学知识,计算机基础知识自学
  5. 微信公众平台测试帐号的注册与使用
  6. 单源最短路径 Dijkstra+优先队列
  7. 两年计算机考研教训经验贴
  8. 五面拿下阿里飞猪offer,java电子书百度云
  9. 正则表达式:检测密码由6-21字母和数字组成
  10. 两台服务器公用一个显示器,两台服务器链接一台显示器