【问题标题】:Aurora Read Replica: Cannot create a JSON value from a string with CHARACTER SET 'binary'Aurora 只读副本:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值
【发布时间】:2022-01-14 17:14:25
【问题描述】:

我看过的相关票证:123

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

从属线程被此错误阻塞:

  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

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

有错误的 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_

【问题讨论】:

  • 提供有问题的查询的完整 SQL 文本。为其中提到的所有表提供完整的 CREATE TABLE。提供所有会话变量的值,例如 'char%''coll%'(还要检查主从服务器上的表结构和字符集/排序规则设置是否完全相同)。以格式化代码/文本的形式提供信息,没有屏幕截图。
  • 添加了@Akina所需的信息
  • 在查询文本中我看到明确的COLLATE 'utf8mb4_bin'... 是什么原因?
  • 转储文件由 AWS 主数据库实例自动创建并由副本自动读取。我还试图找出转储文件是如何创建其查询的,但我在 AWS 文档中没有找到任何相关信息
  • 据我了解,您使用基于语句的复制。如果是这样,那么二进制日志包含在主服务器上执行的语句,是吗?我怀疑主服务器在查询中添加了一些必须在从属服务器上执行的内容......检查相同的查询在主服务器上的样子。

标签: mysql amazon-web-services amazon-aurora mysql-5.7


【解决方案1】:

对于那些遇到同样问题的人,这是我们的调查结果。

我们查看了代码的错误部分。在此之后还有另一个 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 为同一个查询返回不同的类型

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

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 2016-10-30
    • 2021-01-19
    • 1970-01-01
    • 2020-03-31
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多