【MySQL Shell】9.8 InnoDB ReplicaSet 锁定机制

从 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() 是更改实例的操作。这意味着,如果 MySQLShell 在实例上处理这些操作,则该实例将被锁定,以进行任何进一步的实例更改操作。然而,此锁仅在实例级别,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:3306)上的锁,例如,因为ReplicaSet.setPrimaryInstance()(或其他类似操作)仍在运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独上西楼影三人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值