Error number: MY-010636; Symbol: ER_NDB_BINLOG_CANT_RELEASE_SLOCK; SQLSTATE: HY000
Message: NDB: Could not release slock on ‘%s.%s’, Error code: %d Message: %s
Error MY-010636(ER_NDB_BINLOG_CANT_RELEASE_SLOCK)是MySQL抛出的一个错误码,所对应的SQLSTATE状态码也是HY000。
错误说明
MY-010636(ER_NDB_BINLOG_CANT_RELEASE_SLOCK)指明在处理过一个包含NDB变更纪录(由NDB集群使用)的MySQL二进制日志(binlog)事件时出现了一个错误。通常,该错误可用于表明一个存在的MySQL变更将不能正确将这个变更应用到NDB表中。
常见案例
此错误发生的最常见的案例大致如下:MySQL尝试使用binlog日志文件恢复一个正在使用NDB集群的MySQL二进制表上的行变更。这些变更是通过对任何NDB表执行DML(数据库更新语言)语句而触发的。例如,当使用UPDATE语句更新NDB表时,binlog会记录此操作并将记录保存到binlog日志文件中。
当此变更被记录到binlog日志文件时,MySQL会在NDB表上创建一个独立的名为SLOCK的锁定。SLOCK的主要目的是防止在binlog操作期间使用DML更新任何NDB表。
当binlog日志文件恢复变更时,SLOCK将被释放用于表示binlog操作已完成,而这种释放的操作可能会在生成MY-010636(ER_NDB_BINLOG_CANT_RELEASE_SLOCK)错误时失败。
解决方法
大多数MY-010636(ER_NDB_BINLOG_CANT_RELEASE_SLOCK)错误都可以通过更正binlog日志文件中错误记录的偏移量来修复。
在更正binlog日志文件恢复变更时发生的错误后,可以使用以下SQL语句查看是否SLOCK仍然存在:
SHOW ENGINE NDB STATUS;
当SLOCK显示为不存在时,说明解决了此错误。否则,将需要重启MySQL实例以释放SLOCK锁。重启MySQL实例应该能够释放SLOCK锁定,除非SLOCK已被另一个MySQL实例利用。
另一种解决方法是对此变更进行回滚,然后重新尝试采用更新,这应该能够解决此错误。更新此变更后,需要再次检查SLOCK以确保其已被释放,否则可能需要重新尝试。