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
我看过的相关门票:1,
我提出的解决方案的问题是他们要求更改转储文件,这在这种情况下是不可能的。
从线程被这个错误阻塞:
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