MySQL 无法更改正在主动写入的表

2023-12-21

在我的应用程序的一个用例中,我有两个并发MySQL连接:

  • 主动写入名为的表T(实际上,不断更新该表中的一行),并且
  • 另一个对同一个表执行 DDL (ALTER TABLE,添加 8 个新列并从varchar(80) to varchar(2000))。 DDL 预计最终会完成。

中的列UPDATEDML 是not受 DDL 的影响。

该表仅包含一行(该行是UPDATE'd).

Analysis

当运行涵盖此用例的集成测试时,我观察到的是测试超时(表被如此积极地写入,因此 DDL 永远不会完成),但仅限于MySQL5.7.通常,测试预计在我们的硬件上在 30 秒内完成(这确实发生在MySQL5.6 和 8.0),但是对于MySQL5.7 即使200秒也不够。我尝试过不同的ALGORITHM and LOCK值(参见13.1.8 ALTER TABLE 语法 https://dev.mysql.com/doc/refman/8.0/en/alter-table.html),没有运气。

当我分析我的应用程序时(MySQL5.7 情况),我观察到 99% 的 CPU 时间都花在从套接字读取上(即等待MySQL回应表已被更改),但数据库实例对我来说是一种黑匣子——当然我有performance_schema启用并可以对其运行查询,但我不知道我正在寻找哪些确切信息。

合成

同时,我未能将问题简化为最小的独立单元测试——我观察到的唯一事情是3x to 10x测试所用时间增加MySQL5.7 与其他相比MySQL版本,但 DDL 不会永远挂起:

All MySQL版本是库存版本Windows or Debian Linux下载自mysql.com https://www.mysql.com/以最小的改变my.cnf,或者官方Docker images.

问题:

  1. Is it indeed technically possible for MySQL to delay the execution of ALTER TABLE DDL forever? Or what I'm observing is just a very busy database instance? Is it possible to either
    • 要求ALTER TABLE是中断执行的,i。 e.如果超过一定的超时时间,数据库将返回错误,或者
    • 强制所有其他连接,这甚至可能会导致SHARED锁定表或其某些行以暂停,以便它们在执行 DDL 时不会干预?
  2. 在处理原来的集成测试超时时,如何进一步诊断情况MySQL side?

TL;DR — 提交事务以解锁 ALTER TABLE。


是的,ALTER TABLE 可以阻塞很长时间。它可能看起来像是永远。它的值实际上是锁等待超时 https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lock_wait_timeout,默认为 31536000 秒,即 365 天。

在 MySQL 中,像 ALTER TABLE 这样的 DDL 语句需要独占元数据锁 https://dev.mysql.com/doc/refman/8.0/en/metadata-locking.html在桌子上。目的是确保您不会同时从两个并发会话中更改表。

DML 语句(如 SELECT、INSERT、UPDATE、DELETE)也持有“共享”元数据锁。共享锁可以由多个会话同时持有,但会阻塞排它锁,因为排它锁要求它们是唯一一个在表上持有任何类型锁的锁。

文件指出:

这种锁定方法意味着,在事务结束之前,一个会话中的事务正在使用的表不能被其他会话在 DDL 语句中使用。

DML 语句持有元数据锁的目的是这样它们可以保留表的可重复读取视图,而不必担心另一个会话正在执行 DROP TABLE 或 ALTER TABLE 来损害它们的表视图。这种锁定是必要的,因为 MySQL 没有版本化元数据(他们正在逐步朝这个方向努力 https://mysqlserverteam.com/mysql-8-0-data-dictionary-architecture-and-design/).

这意味着运行简单 SELECT 且未提交的事务将阻止需要锁定更改的 DROP TABLE 或 ALTER TABLE。

在线 DDL 的引入存在一些细微差别。

在线DDL性能和并发性 https://dev.mysql.com/doc/refman/8.0/en/innodb-create-index-concurrency.html更详细地描述了 ALTER TABLE 通过获取共享元数据锁开始,因此未提交的事务不会阻塞它。但如果 ALTER TABLE 更改的性质需要,下一阶段可能会将共享元数据锁升级为独占元数据锁。此时,锁获取被阻止,因为另一个事务仍然持有自己的元数据锁。

在线 DDL 并不适用于所有类型的 ALTER TABLE 操作;有些仍然需要独占锁。例如,更改数据类型,就像您所做的那样,需要独占锁。看在线 DDL 概述 https://dev.mysql.com/doc/refman/8.0/en/innodb-create-index-overview.html了解详情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 无法更改正在主动写入的表 的相关文章

随机推荐

  • 与 Redux 反应?那么“背景”问题呢?

    我通常在 Stack 上发布与代码相关的内容 但这更多的是关于社区总体想法的问题 似乎有很多人提倡使用 Redux 和 React 来管理数据 状态 但是在阅读和学习两者时 我发现了一些看起来不太正确的东西 Redux 在此页面底部 htt
  • 如何获取datagrid列绑定的字段?

    在我的 xaml 中 我修改了每个列标题以包含一个按钮 对于命令参数 我想使用列的数据字段名称 而不是标题内容 例如 我想要 JOB TITLE 而不是标题内容的 职位名称 对于标题内容我会使用
  • 在 VSTS 中创建 Kubernetes 端点会生成错误

    设置新的 Kubernetes 端点并单击 验证连接 时出现错误消息 Kubconfig 不包含用户字段 请检查 kubeconfig 始终显示 尝试了多种输出配置文件的方法均无效 我还从网上复制并粘贴了许多示例配置文件 但最终都遇到了相同
  • Google 表格当前用户

    我希望你能帮助我 我希望在单元格中显示 google 工作表的当前用户以进行 vlookup 我添加了一个脚本来将登录的用户名拉入脚本库 但我无法将 logger log 信息转储到 google 工作表中 任何信息都会很棒 谢谢 奈杰尔
  • 无法使用 Elixir 连接到远程 SSH 服务器

    我已经尝试使用 elixir 连接到远程 ssh 服务器一段时间了 这就是我在 IEX 中所做的 Macintosh elixir logglycious master gt iex 15 07 20 0 11 Erlang OTP 17
  • 应用程序的启动时间

    在android中启动应用程序并计算其启动时间的最佳方法是什么 如果可以用一些代码完成 那就更好了 嗯 首先 更准确地说 我应该指出 在 Android 中 您启动的是 Activity 而不是应用程序 因此 由于应用程序的入口点是处理 L
  • 无法在 .NET standard 2 项目中使用实体框架

    如何在 NET Standard 项目中使用实体框架或类似的东西 NET Standard 2 似乎不支持 EF 这真的很烦人 所以我尝试使用 Microsoft EntityFrameworkCore SqlServer 和 icroso
  • 我可以使用 Razor Intellisense 查看 .html 文件,就好像它们是 Visual Studio 2010 中的 .cshtml 文件一样吗?

    我已经让 Net MVC3 来处理 html 和其他自定义扩展 就像处理 cshtml 文件一样 但 VS2010 不会突出显示 Razor 语法或显示它的 Intellisense 如何让 VS2010 将 html 文件识别为 csht
  • 使用 VS 2015 Professional 创建无需管理员权限即可运行的安装程序

    我正在尝试创建一个无需管理员权限即可运行的安装文件 MSI 为此 我尝试了以下选项 我已经设置了安装所有用户财产给false如下 还设置了安装所有用户可见 to false 我还更改了默认位置 应用程序数据文件夹 更改上述属性后 仍然需要管
  • 如何重新启动用 Delphi 编写的 Windows 服务应用程序?

    我有一个用 Delphi 编写的 Windows 服务 它使用的第三方资源之一偶尔会被损坏 我发现解决这种情况的唯一方法是退出并重新启动程序 我可以从程序内部检测到资源何时损坏 并且可以告诉 Windows 在服务停止后重新启动该服务 但我
  • 新的 ViewController 导致黑屏

    我通过界面生成器添加新的视图控制器 场景 我将它们放在画布上 然后创建一个新的视图控制器子类 NewViewController 这会创建两个文件 NewViewController h and NewViewController m 然后
  • 通知用户应用程序商店中应用程序的新更新作为警报并自动在 iPhone 中安装更新版本?

    目前我的应用程序版本 1 1 可以在应用程序商店中找到 当前情况 当我更新新版本时 当用户访问应用程序商店时 更新会显示在应用程序商店中 必需的 一旦用户启动应用程序警报 就会弹出 如果应用程序商店中有新版本 它应该如果用户单击 确定 则自
  • 从应用程序内部调用地图获取路线 - iOS 5 iOS 6

    这是一个奇怪的问题 我的应用程序应该能够调用 iOS 中的内置地图 5 1 和 6 事实证明 它在iOS6下工作得很好 但在iOS5 1下却不行 iOS6 中的地图被调用 并跟踪从saddr 到daddr 的方向 但是当我在iOS5 中时
  • JDK 似乎已安装,但未检测到且命令不起作用

    我家里刚买了一台新电脑 我整晚都在尝试在我的 Windows 7 64 位机器上安装 JDK 8u11 我知道我下载了正确的 64 位版本 我知道我的计算机上已经安装了 JRE 因为java version回报java version 1
  • 无法在 Windows 上安装 pylibmc

    我尝试在 Windows 10 计算机上使用 pip install pylibmc 安装 pylibmc 但出现以下错误 我需要知道是否有任何方法可以在 Windows 10 上安装 libmemcached 因为我需要安装需要 libm
  • exif数据中没有方向 - PHP图像上传

    一直在尝试检测从 iPhone 上传的图像的图像方向 然后据此调整它们的方向 我正在尝试解决以肖像拍摄的图像以 90 度旋转上传的问题 我尝试了许多不起作用的 switch 语句 因此决定在 JSON 返回中返回 exif 数据 我看到的问
  • 在 mongodb C# 驱动程序中设置 DateTimeSerializationOptions.Defaults 的新方法是什么?

    我正在使用这一行来设置日期时间默认值 DateTimeSerializationOptions Defaults DateTimeSerializationOptions LocalInstance 我收到这个警告 MongoDB Bson
  • 为什么静态类被视为“类”和“引用类型”?

    我今天一直在思考 C 和 CIL 类型系统 并且开始想知道为什么静态类被视为类 在很多方面它们并不是真正的类 普通 类可以包含非静态成员 而静态类则不能 在这方面 类更类似于struct与静态类相比 结构体具有单独的名称 您可以引用 普通
  • 如何在 kdeplot 上绘制 0 和均值 y 值之间的均值线

    我有一个分布图 我想绘制一条从 0 到平均频率 y 值的平均线 我想做这个 https stackoverflow com questions 51417483 mean median mode lines showing only in
  • MySQL 无法更改正在主动写入的表

    在我的应用程序的一个用例中 我有两个并发MySQL连接 主动写入名为的表T 实际上 不断更新该表中的一行 并且 另一个对同一个表执行 DDL ALTER TABLE 添加 8 个新列并从varchar 80 to varchar 2000