AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1069568
Accepted
Cat Mucius
Cat Mucius
Asked: 2021-07-15 03:30:18 +0800 CST2021-07-15 03:30:18 +0800 CST 2021-07-15 03:30:18 +0800 CST

SQL AlwaysOn 可用性组中的数据一致性

  • 772

我有一个 SQL Server 2019 的 AlwaysOn 集群,其中包含一个处于同步模式的 3 个副本的可用性组。根据微软文档:

  1. 辅助副本强化日志并向主副本返回确认。
  2. 在收到来自辅助副本的确认后,主副本完成提交处理并向客户端发送确认消息。

本文更详细地解释了这一点:

  1. 在辅助副本中,日志接收从主副本获取日志记录并写入日志缓存。在参与同步提交模式的每个辅助副本上重复此过程。
  2. 在每个从副本上,都存在重做线程,它将日志记录中提到的所有更改写入数据页和索引页。它刷新日志以强化辅助数据库日志。
  3. 如前所述,在同步数据提交中,主副本等待来自辅助副本的确认。在此阶段,辅助副本发送确认事务强化已在辅助副本上完成。
  4. 一旦主副本收到来自辅助副本的确认,它就会向客户端发送事务完成消息。

因此,如果我理解正确: 如果我通过主副本成功更新记录,则此更新后的值应该立即可供查询辅助副本的客户端使用。

但是,当我对此进行测试时,这不起作用。我运行一个简单的批处理文件,如下所示:

sqlcmd -E -S tcp:SQL-AG-Listener -d TestDB -Q "BEGIN TRANSACTION; UPDATE TestSyncTable SET CurrentTime='%currentTime%'; COMMIT TRANSACTION;"
sqlcmd -E -S tcp:SQL-Server01 -d TestDB -Q "SELECT * FROM TestSyncTable" -K ReadOnly
sqlcmd -E -S tcp:SQL-Server02 -d TestDB -Q "SELECT * FROM TestSyncTable" -K ReadOnly
sqlcmd -E -S tcp:SQL-Server03 -d TestDB -Q "SELECT * FROM TestSyncTable" -K ReadOnly

所以我CurrentTime通过主副本(托管 AG 侦听器)更新该字段,然后立即通过所有三个副本读取它。每个sqlcmd命令都是一个单独的客户端进程,因此它打开了自己独立的 TCP 连接。

然后我看到这样的东西:

SQL-Server01: CurrentTime = 20:02:19.93
SQL-Server02: CurrentTime = 20:02:16.94
SQL-Server03: CurrentTime = 20:02:19.93

(重新格式化输出以获得更好的可读性)

据我所见,主副本始终返回更新后的值。辅助节点也这样做 - 但只是一些短暂的延迟。

所以问题是:为什么?同步模式不应该保证读操作的结果与写操作的结果一致吗?如果辅助副本仅在其重做线程更新数据页面后才发送确认 - 那怎么可能呢?

谢谢,穆修斯。

sql-server database high-availability alwayson data-consistency
  • 1 1 个回答
  • 117 Views

1 个回答

  • Voted
  1. Best Answer
    Ben Thul
    2021-07-15T08:00:17+08:002021-07-15T08:00:17+08:00

    来自您在问题中引用的同一篇 SQL Shack 文章:

    1. 次要副本还包含一个重做线程,它独立于 SQL Server Always on 中的日志块进程。重做线程从日志缓存中读取日志。重做线程的处理可能会有延迟,并且日志记录可能在日志缓存中不可用,因为它已经被硬化到磁盘。在这种情况下,重做线程从日志磁盘中读取日志块。

    我读到这意味着日志强化过程不会使更改立即在辅助数据库中可用,而是辅助数据库上的重做线程需要首先处理它们。

    • 1

相关问题

  • sql server 连接字符串上的网络数据包大小以提高吞吐量

  • 基于 Microsoft 的服务器(IIS、MSSQL 等)上的病毒扫描应排除哪些内容?

  • SQL 洗衣清单

  • OPENROWSET、二进制文件、varchars 和 varbinaries

  • 聚集索引与非聚集索引?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve