数据库副本的自动种子设定(自增长)

数据库副本的自动种子设定(自增长)

背景

在 SQL Server 2012 和 2014 中,初始化 SQL Server Always On 可用性组中的次要副本的唯一方法是使用备份、复制和还原。

在一个高可用组里面添加一个数据库需要很多手动任务和一些必要条件。需要完成的这些工作中,有一些是有些困难的,比如:

  • 我们需要从主副本中备份数据库,并将这个备份分发到可用组的其他副本中。这是基于手动操作的,因为这需要你从主数据库备份还原数据库到次要副本。
  • 有时候,我们不能通过网络防火墙在副本之间传送数据库备份文件。这种情况下,需要开放SMB协议端口,以便能在节点间传输备份文件。
  • 通常,复制一个备份文件会占用更多空间,这是额外的需求,更多的磁盘空间。
  • 特别是针对第三方备份的方案,会导致备份/还原链的中断。但是这又取决于数据库的备份策略。
  • 分发和还原数据库是耗时并且不透明的过程。

 

作为一个兼职DBA,我不喜欢处理这些问题。当我创建数据库在主节点上时,我想要数据库被自动创建在所有副本上,幸运的是SQLServer 2016以后这样的工作就容易多了。为了更好的帮助DBA们处理这些问题,微软引入了可用组的自动增长数据库。即SQL Server 2016 引入了用于初始化次要副本的新功能 – 我一般称之为数据库自增长(自动种子设定)

那么这个自动化如何实现的?

 

当你打算创建一个数据库在主副本上,并且加入数据库到AG里面时,自动填充就会在数据库镜像端间进行通信,并且复制数据库到次要副本中。假设有一个可用组,由N个副本组成,replicas – Replica1, Replica2, … ReplicaN。当前你的主副本是Replica2 ,然后你创建一个新的数据库在主副本上。下一步就是要尽快把数据库加入到可用组的其他副本上。这个解决方案就如下图的流程所示:

<span>数据库副本的自动种子设定(自增长)</span>

 

数据库自动种子设定(自增长),没有特殊的必要条件和限制,只是需要数据和日志文件路径在可用组中是完全一致的。这个可用组配置自增长,数据库在可用组中一定是完整还原模式,需要有一个完成备份以及事务日志备份。如果在可用组中用手动同步加入的数据库也需要上述一样的条件。

启动自动种子设定功能

在每一个需要自增长数据库的副本上,需要允许可用组创建数据库。下面的脚本用来允许AG创建数据库,但是确保你可以连接到master数据库并且能够对所有可用组中的副本执行这个脚本:

ALTER AVAILABILITY GROUP [{your_AG_name}]
GRANT CREATE ANY DATABASE;
GO

 

可用组必须被切换为自动增长模式。该模式可以通过在每个副本中执行下面额T-SQL代码来实现(或者每个副本中启动自增模式):

ALTER AVAILABILITY GROUP [{your_AG_name}] MODIFY REPLICA ON '{your_replica_name}' WITH (SEEDING_MODE = AUTOMATIC); GO

 

 

另外,对于Always On 的可用组来说,自增期间能够使用跟踪标记trace flag 9567压缩数据流,从而大大减少传输时间。相关内容可以再找个连接看到: https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql

添加一个带有自增长属性的数据库

打开SSMS并且连接可用组主节点。导航到AlwaysOn 高可用(AlwaysOn High Availability)文件,打开“Availability Groups”,然后找到打算添加数据库的可用组。在打开”Availability Databases” 文件夹。右击”Availability Databases”,右键菜单”Add databases..”, 这个菜单选项将会激活配置向导如下:

 

<span>数据库副本的自动种子设定(自增长)</span>

选择打算加入到可用组的数据库:

<span>数据库副本的自动种子设定(自增长)</span>

 

注意,这个数据库一定满足一下必要条件。选择选项“Skip initial data synchronization”:

<span>数据库副本的自动种子设定(自增长)</span>

在次要节点,你会看到数据库已经被还原的信息:

<span>数据库副本的自动种子设定(自增长)</span>

 

因此,你也可以在msdb.dbo.restorehistory 表中看到每个数据库的增加信息。在主服务器,可以在表msdb.dbo.backupmediafamily 中看到每个数据库信息,数据库可以shiyo8ng下面的T-SQL语句实现:

ALTER AVAILABILITY GROUP {your_AG_name} ADD DATABASE {your_database_name};

<span>数据库副本的自动种子设定(自增长)</span>

 

这个脚本必须在可用组的每个数据库上执行。

优缺点

我通常使用自动数据库填充为可用组并且发现它很有价值。例如,微软SharePoint 支持组有权去创建新的数据库在主副本上,但是他们不能直接把数据库加入到可用组中,因为这样做影响了数据库的高可用。当我们使用自动数据填充在指定的可用组上时,我们可以自动添加新的Sharepoint 数据库在可用组上,使用一个将所有最近创建的Sharepoint 数据库添加到可用组上的脚本,使用2016这个特性不在需要使用手动操作。

 

综上所述,使用自动填充的优势有如下几点:

  • 操作过程简单.
  • 节省磁盘空间.
  • 节省备份还原事件,因为SQLServer复制数据库使用网络.
  • 使用追踪标记9567,能够大大减少同步时间。

 

在可用组中使用自动增长的缺点:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119691.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月26日 下午8:00
下一篇 2021年11月26日 下午8:00


相关推荐

  • GPT分区数据恢复的免费技巧!别逼我跪下来求你看

    GPT分区数据恢复的免费技巧!别逼我跪下来求你看

    2026年3月16日
    2
  • StringTokenizer类的用法「建议收藏」

    StringTokenizer类的用法「建议收藏」StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数。1.构造函数publicStringTokenizer(Stringstr)publicStringTokenizer(Stringstr,Stringdelim)publicStringTokenizer(Stringstr,Stringdelim,boolean

    2022年8月11日
    9
  • 小米6显示服务器出错,小米6解锁BL显示未连接手机解决办法以及各种小技巧汇总……

    小米6显示服务器出错,小米6解锁BL显示未连接手机解决办法以及各种小技巧汇总……本帖最后由为夫人而生于2017-6-2422:56编辑持续更新小米6未连接手机解决办法3:手机设置→关于手机→miui版本(一直点五次)→返回→更多设置→开发者选项→USB调试打开→手机绑定啥的解锁啥的都打开4:关机长按音量下加开机键出现兔子连接手机5:两种情况若显示连接直接解锁end;;;;;;;;;若显示没连接手机敲黑板重点来了右…

    2022年6月11日
    229
  • mybatis 面试题

    mybatis 面试题1.Mybatis比IBatis比较大的几个改进是什么a.有接口绑定,包括注解绑定sql和xml绑定Sql,b.动态sql由原来的节点配置变成OGNL表达式,c.在一对一,一对多的时候引进了association,在一对多的时候引入了collection节点,不过都是在resultMap里面配置2.什么是MyBatis

    2022年6月3日
    33
  • spring boot 接口_什么是API接口

    spring boot 接口_什么是API接口引言前后端分离、APP交互等,大多都是通过API接口实现的。既然要进行数据交互,那么这接口就得有讲究了:既要实用,又要优雅好看!那么,如何写一套(个)漂亮的API接口呢?一、返回格式API接口要求返回的格式是text/json,我们知道网页返回的格式一般是text/html,因此,SpringBoot为写接口,提供了两种实现方式:类注解和方法注解。类注解@Re…

    2026年1月17日
    3
  • Python保留字简单释义「建议收藏」

    Python保留字简单释义「建议收藏」GuidovanRossum在1991年正式对外发布Python版本,现在已成为最流行的语言之一。分别执行以下命令,查询Python语言中的保留字:importkeywordkeyword.kwlist1.False表示假。//即在if语句中不会执行。注:在Python中可以给False赋值(改变原有是错误的意思)2.True表示真。//False的反义词3.No…

    2025年6月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号