我给出的解决方案的问题是,他们要求修改dumpfile,这在这种情况下是不可能的。
从线程正被此错误所阻塞:
Error 'Cannot create a JSON value from a string with CHARACTER SET 'binary'.' on query. Default database: 'db'. Query: 'UPDATE ....我的复制Aurora MySQL正在将binlog复制文件读取为二进制文件,无法从中生成json。我注意到的一件事是json对象中的这个部分。
_utf8mb4'<json object here>' COLLATE 'utf8mb4_bin'主DB实例参数中有什么我可以更改的吗?还是极光复制品?
任何在这方面的帮助都是非常感谢的!
编辑:关于模式的更多信息
Aurora副本的Char和coll变量:
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database latin1
character_set_filesystem utf8mb4
character_set_results utf8mb4
character_set_server latin1
character_set_system utf8
character_sets_dir /rdsdbbin/oscar-5.7.mysql_aurora.2.10.1.0.4.0/share/charsets/
collation_connection utf8mb4_general_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci主DB的Char和coll变量:
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database latin1
character_set_filesystem binary
character_set_results utf8mb4
character_set_server latin1
character_set_system utf8
character_sets_dir /rdsdbbin/mysql-5.7.33.R2/share/charsets/
collation_connection utf8mb4_general_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci(注意,我在Aurora副本中手动将character_set_filesystem更改为utf8mb4,以尝试作为一种潜在的解决方案,但仍然会产生相同的错误)
带有错误的表在主DB和副本中具有完全相同的CREATE语句。
CREATE TABLE `item_list` (
`_id` varchar(50) NOT NULL,
`item_id` varchar(50) NOT NULL,
`description_id` varchar(45) NOT NULL,
`user_id` varchar(45) NOT NULL,
`last_action` json DEFAULT NULL,
`item_info` json DEFAULT NULL,
PRIMARY KEY (`item_id`,`description_id`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;last_sql_error中的查询文本(文本被切断)
UPDATE item_list\n SET last_action = NAME_CONST('p_last_action',_utf8mb4'{\\"amount\\": 25380, \\"message\\": \\"Send to JL@CW\\", \\"actionId\\": \\"send\\", \\"photoPath\\": \\"https://s3-us-west-1.amazonaws.com/VBFrNVYIr.jpg\\"' COLLATE 'utf8mb4_bin') WHERE item_id = NAME_CONST('p_item_发布于 2022-01-14 09:14:25
对于那些遇到同样问题的人,这是我们的调查结果。
我们看错了代码的一部分。在此之后,又有一个json查询导致了错误。
UPDATE db.item SET last_action = IFNULL(null, last_action) WHERE id = 1在binlog dumpfile中,因为查询位于存储过程中,所以如下所示:
UPDATE db.item SET last_action = IFNULL(NAME_CONST('sp_param', null), last_action) WHERE id = 1dumpfile添加了NAME_CONST()。如果您在MySQL中运行上述准确的查询,它将完美地工作。但是如果在Aurora MySQL中运行它,就会得到Cannot create a JSON value from a string with CHARACTER SET 'binary'。
为什么?MySQL和Aurora MySQL为同一个查询返回不同的类型
SELECT IFNULL(NAME_CONST('sp_param', value), last_action) FROM db.item WHERE id = 1;
MySQL --> returns a json
Aurora MySQL --> returns a blob which causes the error删除NAME_CONST()修复了MySQL中的查询。但是,由于它包含在由MySQL binlog复制生成的dumpfile中,所以这不是解决方案。
解决方案是使用COALESCE而不是IFNULL,因为它在Aurora MySQL中具有相同的行为。
UPDATE db.item SET last_action = COALESCE(NAME_CONST(sp_param), last_action) WHERE id = 1https://stackoverflow.com/questions/70677453
复制相似问题