【问题标题】:MySQL Drop INDEX and REPLICATIONMySQL 删除索引和复制
【发布时间】:2011-06-08 00:06:22
【问题描述】:

在 MySQL MASTER MASTER 场景中使用 InnoDB

在一个实例上删除索引时,另一个实例上的同一个表是否可用?

活动的顺序是什么? 我假设以下顺序:

  1. 在第一个实例上删除索引
  2. 已添加到二进制日志中
  3. 在第二个实例上删除索引

谁能确认一下?

【问题讨论】:

  • 确认的、不完整的操作不会被记录 :)
  • 顺便说一句:我们现在有dba.stackexchange.com(数据库管理)似乎......
  • 感谢 Wrikken。另外,我注意到 dba.stackexchange.com

标签: mysql indexing innodb database-replication sql-drop


【解决方案1】:

我相信会发生以下情况:

  • 您的 DROP INDEX(实际上运行 ALTER TABLE ... DROP INDEX)在主服务器上运行
  • 如果 ALTER 成功完成,该语句将被添加到 binlog 并在从属设备上运行

这意味着直到ALTER TABLE 在第一台(主)机器上成功完成后,另一台机器上的ALTER TABLE 才会启动。

ALTER TABLE 在任一机器上运行时,该表将在一段时间内可读,然后既不可读/不可写,因为 MySQL 首先在内部创建表的副本,然后应用更改。

来自http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

在大多数情况下,ALTER TABLE 的工作原理是 制作临时副本 原表。改动是 在副本上执行,然后 原表被删除,新表 一个被重命名。虽然 ALTER TABLE 是 执行,原始表是 其他会话可读。更新 并且对表的写入被停止 直到新表准备好,然后 被自动重定向到 没有任何失败更新的新表。 临时表是在 新表的数据库目录。 这可能不同于 原数据库目录 如果 ALTER TABLE 正在重命名表 表到不同的数据库。

【讨论】:

  • 确认,2个master之间的执行是顺序的。谢谢。
【解决方案2】:

在 MySQL MASTER MASTER 场景中使用 InnoDB

据我所知,这样的事情是不可能的。您需要使用 NDB,或者处于多主从环境中,自动递增字段配置为递增 1/2/3/更多。所以假设后者。 (注意:如果您知道基于 InnoDB 的解决方案,请分享。)

在一个实例上删除索引时,另一个实例上的同一个表是否可用?

删除索引仅意味着您的索引将不可用。不是桌子。它将被写入(并传播)到二进制日志并开始。

【讨论】:

  • 2 个“普通”服务器(即没有 mysqlcluster)可以互相作为主服务器,并且可以轻松复制大多数引擎类型。为什么你认为这是不可能的?你甚至可以做一个戒指,但这有点脆。
  • 据我所知,使用 InnoDB 获得多个 master 的唯一方法是配置自动增量以产生数字不是一个一个,而是两个(或三个、四个等)两个(或三个、四个等),这样当涉及到后者时,主人永远不会互相干扰。相比之下,NDB 将允许任何节点用作主节点,并在每个节点上正常处理自动递增字段。 (当然,我可能是错的......我之所以记得这一点,是因为我在网站上选择了 NDB 而不是 InnoDB。)
  • 您对自动增量的看法是正确的,但这确实很容易配置。我仍然不明白为什么你说MySQL MASTER MASTER scenario using InnoDB 是不可能的:很好的是,两台服务器,每台都是另一台的主机和从机。两者都允许写入,但由应用程序逻辑来避免 UNIQUE 冲突,而不是数据库本身,这是 NDB 确实没有的缺点。另一方面,NDB 需要内存中的所有内容,而这是普通的主-主复制二人组不需要的东西。最佳解决方案取决于具体情况;)
  • 你是绝对正确的。想一想,就好像我写道:“如果不使用应用程序逻辑,就不可能开箱即用”。 ;-)
  • Ack,那我们就同意了:)
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 2011-02-20
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2022-12-29
相关资源
最近更新 更多