Aurora 只读副本:无法从具有字符集 'binary' 的字符串创建 JSON 值

Aurora Read Replica: Cannot create a JSON value from a string with CHARACTER SET 'binary'

我看过的相关门票:1, , 3

我提出的解决方案的问题是他们要求更改转储文件,这在这种情况下是不可能的。

从线程被这个错误阻塞:

  Error 'Cannot create a JSON value from a string with CHARACTER SET 'binary'.' on query. Default database: 'db'. Query: 'UPDATE ....

我的副本 Aurora MySQL 正在读取二进制日志复制文件,无法从中生成 json。我注意到的一件事是 json 对象

中的这一部分
_utf8mb4'<json object here>' COLLATE 'utf8mb4_bin'

我可以在主数据库实例参数中更改什么吗?还是极光复制品?

如有任何帮助,我们将不胜感激!

编辑:关于架构的更多信息

Aurora Replica 的 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

主数据库的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 以尝试作为潜在的解决方案,但它仍然给出相同的错误)

TABLE 错误在主数据库和副本

中具有完全相同的 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_

对于遇到同样问题的人,以下是我们的调查结果。

我们看错了代码部分。在此之后还有另一个 json 查询导致错误

UPDATE db.item SET last_action = IFNULL(null, last_action) WHERE id = 1

在 binlog 转储文件中,因为查询在存储过程中,所以看起来像这样:

UPDATE db.item SET last_action = IFNULL(NAME_CONST('sp_param', null), last_action) WHERE id = 1

转储文件添加了 NAME_CONST()。如果您 运行 上面 MySQL 中的确切查询,它将完美运行。但是如果你 运行 它在 Aurora MySQL 中,你会得到 Cannot create a JSON value from a string with CHARACTER SET 'binary'.

为什么? MySQL 和 Aurora MySQL returns 同一查询的不同类型

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() 修复了 Aurora MySQL 中的查询。但由于它包含在 MySQL binlog 复制生成的转储文件中,所以这不是解决方案。

解决方案是使用 COALESCE 而不是 IFNULL,因为它在 Aurora MySQL

中具有相同的行为
UPDATE db.item SET last_action = COALESCE(NAME_CONST(sp_param), last_action) WHERE id = 1