mysql 当主服务器工作正常但读取复制副本在混合归类时失败时,如何修复复制错误

k5ifujac  于 2022-10-31  发布在  Mysql
关注(0)|答案(1)|浏览(158)

不知何故,我们的MySQL版本(RDS - replicaset)得到了更新5.7与更改排序规则(一些魔术发生),它停止复制从节点上出现以下错误

Read Replica Replication Error - SQLError: 1267, reason: Error 'Illegal mix of collations (utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,EXPLICIT) for operation '='' 
on query. Default database: 'someDatabase'. 
Query: 'UPDATE someTable SET bc = bc + ABS( NAME_CONST('_value',3.00)) 
WHERE user_id = NAME_CONST('_user_id',_latin1'alpha-number-string' COLLATE 'latin1_swedish_ci')'

似乎数据库是在latin1_swedish_ci排序规则上,并以类似的格式写入bin long,在升级后,由于一些操作,它被转换为utf8_general_ci
我在某个地方读到,如果更改了数据库排序规则,则必须重新创建存储过程,以便它们可以使用正确排序规则。

在我们的例子中,我们并没有故意更改,因此我们没有重新创建存储过程。(我假设我们通过查看错误来解决这个问题)

当复制副本尝试同步时,它遇到非法的排序规则混合,因此保持不同步

**Try 1:**我想是否可以跳过该错误,但没有用。在副本节点上运行以下命令

CALL mysql.rds_skip_repl_error;
它显示了以下消息'Slave has encountered a new error. Please use SHOW SLAVE STATUS to see the error.'

从站


# Slave_IO_State = 'Waiting for master to send event'

# Last_Error = 'SAME ERROR AS SHOWN ABOVE'

我想如果我创建一个新的副本,它必须从快照(而不是从二进制日志)创建,不会有问题,但它似乎是不正确的,新的副本也处于错误状态与相同的问题。
这是一个AWS-RDS解决方案,不确定修改binlog和重新应用是否会对我有帮助。

是否有办法解决此问题?没有停机时间或停机时间最少?它非常奇怪,主写入工作正常?不知道为什么它没有面临同样的问题?

我能否获得存储过程的排序规则(我的猜测是查询中的错误清楚地显示这是latin1_swedish_ci)
对于DB,我可以使用以下查询获取排序规则。

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = "someDatabase";

我计划在主数据库上运行以下更新,不确定它是否明智或是否会修复此问题。(请注意生产中的此问题,因此存在风险)。

ALTER TABLE someTable MODIFY user_id VARCHAR(45) CHARACTER SET latin1 COLLATE 'latin1_swedish_ci';
ou6hu8tu

ou6hu8tu1#

首先重新创建存储过程。这篇文章可能会有所帮助:mysql: drop and recreate functions with new collation in bulk
然后丢弃您的副本并从快照创建新副本。当前副本已被丢弃。
您可能无法避免一些停机。
这是一个教训,当你在云中使用托管数据库时,你会放弃一些控制权。你会在不可预测的时间有更多的停机时间,而不是更少。

相关问题