【发布时间】:2022-01-14 17:14:25
【问题描述】:
我提出的解决方案的问题是他们要求更改转储文件,在这种情况下这是不可能的。
从属线程被此错误阻塞:
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