不知何故,我们的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';
1条答案
按热度按时间ou6hu8tu1#
首先重新创建存储过程。这篇文章可能会有所帮助:mysql: drop and recreate functions with new collation in bulk
然后丢弃您的副本并从快照创建新副本。当前副本已被丢弃。
您可能无法避免一些停机。
这是一个教训,当你在云中使用托管数据库时,你会放弃一些控制权。你会在不可预测的时间有更多的停机时间,而不是更少。