从 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()
是改变主要的操作。这意味着如果 MySQL Shell 针对 InnoDB ReplicaSet 处理这些操作,则在第一个操作完成之前,不会处理其他更改主要或实例更改的操作。ReplicaSet
.setPrimaryInstance()
、ReplicaSet
.addInstance()
和ReplicaSet
.rejoinInstance()
是更改实例的操作。这意味着如果 MySQL Shell 在实例上处理这些操作,则该实例将被锁定以进行任何进一步的实例更改操作。然而,这个锁只在实例级别,InnoDB ReplicaSet 的多个实例可以同时处理一个这种类型的操作。换句话说,对于 InnoDB ReplicaSet 中的每个实例,一次最多可以处理一个实例更改操作。ReplicaSet
.removeInstance()dba.getReplicaSet()
并且
是 InnoDB ReplicaSet 读取操作并且不需要任何锁定。ReplicaSet
.status()
实际上,如果您尝试处理 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:3306
ReplicaSet
.setPrimaryInstance()