怎么使用alwayson后如何收缩数据库日志
这篇文章将为大家详细讲解有关怎么使用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、取消主从同步
---YOUMUSTEXECUTETHEFOLLOWINGSCRIPTINSQLCMDMODE.:ConnectDBSERVER1-Usa-Pabc@123USE[master]GOALTERAVAILABILITYGROUP[syncdb]REMOVEDATABASE[test];GO
2 删除从库上的数据库,在收拾后,再添加上。
:ConnectDBSERVER3-Usa-Pabc@123USE[master]GODROPDATABASE[test]GO
3.备份事务日志,收缩日志文件,添加从库数据库。
---YOUMUSTEXECUTETHEFOLLOWINGSCRIPTINSQLCMDMODE.:ConnectDBSERVER1-Usa-Pabc@123USE[master]GOBACKUPLOG[test]TODISK='NUL:'withSTATS=10gouse[test]goDBCCSHRINKFILE(N'test_log',20480)GOUSE[master]GOALTERAVAILABILITYGROUP[test]ADDDATABASE[test];GO:ConnectDBSERVER1-Usa-Ptest@123BACKUPDATABASE[test]TODISK=N'\\dbserver3\e$\share\test.bak'WITHCOPY_ONLY,FORMAT,INIT,SKIP,REWIND,NOUNLOAD,COMPRESSION,STATS=5GO:ConnectDBSERVER3-Usa-Ptest@123RESTOREDATABASE[test]FROMDISK=N'\\dbserver3\e$\share\test.bak'WITHNORECOVERY,NOUNLOAD,STATS=5GO:ConnectDBSERVER1-Usa-Ptest@123BACKUPLOG[test]TODISK=N'\\dbserver3\e$\share\test.trn'WITHNOFORMAT,NOINIT,NOSKIP,REWIND,NOUNLOAD,COMPRESSION,STATS=5GO:ConnectDBSERVER3-Usa-Ptest@123RESTORELOG[test]FROMDISK=N'\\dbserver3\e$\share\test.trn'WITHNORECOVERY,NOUNLOAD,STATS=5GO:ConnectDBSERVER3-Usa-Ptest@123--Waitforthereplicatostartcommunicatingbegintrydeclare@connbitdeclare@countintdeclare@replica_iduniqueidentifierdeclare@group_iduniqueidentifierset@conn=0set@count=30--waitfor5minutesif(serverproperty('IsHadrEnabled')=1)and(isnull((selectmember_statefrommaster.sys.dm_hadr_cluster_memberswhereupper(member_nameCOLLATELatin1_General_CI_AS)=upper(cast(serverproperty('ComputerNamePhysicalNetBIOS')asnvarchar(256))COLLATELatin1_General_CI_AS)),0)<>0)and(isnull((selectstatefrommaster.sys.database_mirroring_endpoints),1)=0)beginselect@group_id=ags.group_idfrommaster.sys.availability_groupsasagswherename=N'yorkdb'select@replica_id=replicas.replica_idfrommaster.sys.availability_replicasasreplicaswhereupper(replicas.replica_server_nameCOLLATELatin1_General_CI_AS)=upper(@@SERVERNAMECOLLATELatin1_General_CI_AS)andgroup_id=@group_idwhile@conn<>1and@count>0beginset@conn=isnull((selectconnected_statefrommaster.sys.dm_hadr_availability_replica_statesasstateswherestates.replica_id=@replica_id),1)if@conn=1begin--exitloopwhenthereplicaisconnected,orifthequerycannotfindthereplicastatusbreakendwaitfordelay'00:00:10'set@count=@count-1endendendtrybegincatch--Ifthewaitloopfails,donotstopexecutionofthealterdatabasestatementendcatchALTERDATABASE[test]SETHADRAVAILABILITYGROUP=[syncdb];GOGO
在执行:Connect 命令前记得把SQLCMD模式打开
打开后,你能看到SQLCMD命令是灰色的。
关于“怎么使用alwayson后如何收缩数据库日志”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。