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 / 问题 / 78172
Accepted
Continuation
Continuation
Asked: 2009-10-26 14:10:30 +0800 CST2009-10-26 14:10:30 +0800 CST 2009-10-26 14:10:30 +0800 CST

您如何处理更改生产 MySQL 数据库架构的任务?

  • 772

我听到的关于 MySQL 的最大抱怨之一是,如果您尝试更改其架构(例如添加列或添加索引),它会锁定表。

“锁定桌子”是否意味着我既不能读也不能写桌子?有时几个小时?

这似乎是一个相当严重的限制。我打算将 MySQL 用于我的新项目,但这让我暂停了。

有解决方法吗?您如何处理更改生产 MySQL 数据库架构的任务?

顺便说一句,有人告诉我 Postgresql 没有这个问题。这是真的吗 - 我可以在更改其架构的同时读取和写入 Postgresql 表?是否会产生任何性能损失?

很想听听你的经历。

mysql
  • 2 2 个回答
  • 1415 Views

2 个回答

  • Voted
  1. Best Answer
    staticsan
    2009-10-26T21:11:08+08:002009-10-26T21:11:08+08:00

    是的,MySQL 在执行 ALTER TABLE 语句时会完全锁定表。大部分时间都花在物理复制表上,这就是为什么建议您将所有必要的更改放在一个 ALTER TABLE 语句中的原因。

    如果您无法获得合适的维护窗口,有几种方法可以在实时数据库上缓解此问题。

    首先,许多环境有几分钟的超时等待表可供查询,并且不知道(而且很难检查)表被锁定的原因。我已经使用实时网站的这个怪癖来更改表格。在我曾经照看的一个网站上,我认为我们在有人开始注意到之前有大约 7 分钟的时间。:-) 这有助于确保你的老板站在你这边。

    另一种方法是执行 select-insert-rename 技巧。如果表具有相当低的UPDATE频率,或者纯粹是INSERTs 的目标,则此方法效果很好。基本步骤是复制表的模式,进行必要的更改,制作一条语句以INSERT...SELECT从旧到新,然后重命名表(在一个语句中进行重命名)。您还需要提前准备一份声明,以复制在SELECT和之间添加或更新的任何“新”记录RENAME。我在过去的工作中也做过几次。

    但是,有一些警告:

    • 如果源表是 MyISAM,您几乎肯定会遇到问题,除非该表几乎从未被写入。这是因为 MyISAM 表的锁定方式。它适用于 InnoDB 表,因为它仍然可以在您的 bigINSERT...SELECT运行时读取。
    • 您需要一种万无一失的方法来找出在SELECT和 之间添加或更改的记录RENAME。对于仅用于 的表INSERT,请使用 auto_increment 列。对于获得UPDATEs 的表,您将需要一个可靠的 last-modified 列。

    解决此问题的其他方法包括修改从属设备并使应用程序失败。这与您的数据库如何复制更紧密相关。我自己也没有做过这个,所以我无法描述确切的步骤。

    最后,您可以调整十几个服务器设置,还有几个更难更改的设置,这将影响复制表所需的时间。排序缓冲区是一个,但 MySQL 允许使用多少内存是另一个。(请记住,您也可以为每个连接设置很多,而不是全局设置其中一些。)当处理大量数据时,MySQL 有一个“临界点”效应,事情在一定程度上是相当线性的大小,然后突然下地狱。它经常提出处理大量数据的复杂查询,并且与内部临时表大小和允许使用多少内存有关,但它可能会提出表更改,因为它们涉及重新索引数据。这就是为什么为数据库提供更多内存几乎总是一件好事的一个原因。

    • 2
  2. womble
    2009-10-26T18:17:29+08:002009-10-26T18:17:29+08:00

    这是你听过的关于 MySQL 的最大抱怨?天啊,我有一桶比那个更大的……(也许改天再说)

    是的,当您在其上运行 ALTER TABLE 时,MySQL 会完全锁定一个表;在此期间没有读取或写入,并且尝试这样做的查询会暂停,直到完成。在奇怪的情况下,我必须修改大型 MySQL 表的模式(小型表完成更改的速度足够快,不会引起明显的问题),我通常只是安排一个维护窗口然后再做。对于副本上的给定表,准确地确定这种更改需要多长时间并不难。

    如果你有一个白痴管理层拒绝让你有合理的维护窗口(如果是这样,那就跑到另一份工作去),那么我听说有人在做一些事情,比如复制一个表的模式,修改空表,然后对新表进行复制选择(使用写锁以防止更改),然后重命名表。听起来对我的口味来说风险太大了。Maatkit 的mk-table-sync有一个模式可以做到这一点,如果你希望在它死时能够责怪别人。

    虽然 PostgreSQL 没有“巨大的厄运锁”,但在 PgSQL 中修改表的模式仍然会导致显着的性能损失——它需要大量的磁盘 IO。不过,我无法想象任何 RDBMS 将如何避免这种情况。

    • 1

相关问题

  • 开源与专有关系 db mgt 系统的优缺点是什么?

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何移动 MySQL 的数据目录?

  • 通过 VPN 连接什么是远程服务器 IP?

  • mysql崩溃

Sidebar

Stats

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

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

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

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +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