【问题标题】:Rebuild InnoDB Index ONLINE to prevent timeouts?在线重建 InnoDB 索引以防止超时?
【发布时间】:2011-01-06 10:10:23
【问题描述】:

当我更新一个特别大的表时,更新超时,因为在重建索引时表被锁定。有什么办法可以在线重建索引(即 Oracle),这样更新就不会超时?

【问题讨论】:

  • 这是单行更新还是批量更新?您可以删除索引,进行更新,然后重新创建索引吗?
  • 这是针对单行的,但它是一个多用户系统,现在对该表的任何更新都会锁定该表,直到重建索引。这会导致其他用户在同一表中的其他行上提交更新时出现超时错误。

标签: mysql oracle timeout indexing innodb


【解决方案1】:

pt-online-schema-change 可用于优化表。 OPTIMIZE TABLE 实际上是一个 noop ALTER TABLE

pt-online-schema-change --alter "ENGINE=InnoDB" D=sakila,t=actor

【讨论】:

    【解决方案2】:

    optimize table在线重建索引

    OPTIMIZE TABLE 对常规和分区 InnoDB 表使用在线 DDL,从而减少并发 DML 操作的停机时间。由 OPTIMIZE TABLE 触发并由 ALTER TABLE ... FORCE 在掩护下执行的表重建就地完成。排他表锁仅在操作的准备阶段和提交阶段短暂使用。在准备阶段,更新元数据并创建中间表。在提交阶段,将提交表元数据更改。

    来源:https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html

    但是!我听说过很多你不应该在 InnoDB 中重建索引,因为它们总是最新的。谷歌一下。

    【讨论】:

      【解决方案3】:

      简单的回答:不,没有办法。

      更复杂的答案:您可以通过使用基于语句的复制并首先将索引添加到从站,然后使其成为主站来模拟在线索引添加。这就是人们使用 http://mysql-mmm.org/ 之类的软件包的原因。

      【讨论】:

        猜你喜欢
        • 2019-04-26
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        • 2019-10-17
        • 2017-11-23
        • 2013-01-26
        • 2019-04-11
        • 2017-06-20
        相关资源
        最近更新 更多