Documentation Home
MySQL 外壳 8.0  / 第 9 章 MySQL InnoDB 副本集  /  9.8 InnoDB 副本集锁定

9.8 InnoDB 副本集锁定

从 8.0.20 版本开始,AdminAPI 使用锁定机制来避免不同的操作同时对 InnoDB ReplicaSet 执行更改。以前,MySQL Shell 的不同实例可以同时连接到 InnoDB ReplicaSet 并同时处理 AdminAPI 操作。这可能会导致不一致的实例状态和错误,例如,如果和 是并行处理的。 ReplicaSet.addInstance()ReplicaSet.setPrimaryInstance()

InnoDB ReplicaSet 操作具有以下锁定:

  • dba.upgradeMetadata()并且 dba.createReplicaSet()是全球独家经营。这意味着如果 MySQL Shell 在 InnoDB ReplicaSet 上处理这些操作,则不能对 InnoDB ReplicaSet 或其任何实例处理其他操作。

  • ReplicaSet.forcePrimaryInstance() 并且 ReplicaSet.setPrimaryInstance() 是改变主要的操作。这意味着如果 MySQL Shell 针对 InnoDB ReplicaSet 处理这些操作,则在第一个操作完成之前,不会处理其他更改主要或实例更改的操作。

  • ReplicaSet.addInstance()ReplicaSet.rejoinInstance()ReplicaSet.removeInstance() 是更改实例的操作。这意味着如果 MySQL Shell 在实例上处理这些操作,则该实例将被锁定以进行任何进一步的实例更改操作。然而,这个锁只在实例级别,InnoDB ReplicaSet 的多个实例可以同时处理一个这种类型的操作。换句话说,对于 InnoDB ReplicaSet 中的每个实例,一次最多可以处理一个实例更改操作。

  • dba.getReplicaSet()并且 ReplicaSet.status() 是 InnoDB ReplicaSet 读取操作并且不需要任何锁定。

实际上,如果您尝试处理 InnoDB ReplicaSet 相关操作,而另一个无法并发处理的操作仍在运行,您会收到一个错误,指示无法获取所需资源的锁。在这种情况下,您应该等待持有锁的正在运行的操作完成,然后再尝试处理下一个操作。例如:

mysql-js> rs.addInstance("admin@rs2:3306");

ERROR: The operation cannot be executed because it failed to acquire the lock on
instance 'rs1:3306'. Another operation requiring exclusive access to the
instance is still in progress, please wait for it to finish and try again.

ReplicaSet.addInstance: Failed to acquire lock on instance 'rs1:3306' (MYSQLSH
51400)

在此示例中, 操作失败是因为无法获取 ReplicaSet.addInstance() 主实例 ( ) 上的锁,例如因为 操作(或其他类似操作)仍在运行。 rs1:3306ReplicaSet.setPrimaryInstance()