java - 当通过 JDBC 完成 db mods 时,mysqlbinlog (v8) 发出 character_set_client=255
问题描述
短:
我在运行 OSX 11.6 (BigSur) 的新 MacBook 上安装了 MySQL 8.0.27。
我使用二进制日志和 mysqlbinlog 为不同机器上安装的旧 mysql 5.7 生成更新。
问题是 mysqlbinlog 为通过 JDBC 进行的更新生成的 SQL 包含语句 SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=83/ !/; 较旧的 mysqls 无法处理。
根据http://minsql.com/mysql8/MySQL-8.0-to-5.7-backward-replication/的建议,我设置了 mysql8,以便使用 mysql 客户端手动制作的 mod 不会生成该行,而是设置 character_set_client =33 (utf8)。
但是,当应用程序使用 JDBC (mysql-connector/J v 8.0.24) 进行修改时,该违规语句会返回。
JDBC 连接 URL 包括 characterEncoding=UTF-8 选项。
我的问题是:通过 mysql 设置、jdbc 连接配置和/或 mysqlbinlog 选项的某种组合通过 JDBC 制作 mod 时,有什么方法可以让 mysqlbinlog 不设置 character_set_client=255?
更多的:
是的,我知道向下版本复制(从技术上讲,这不是)不受官方支持。该系统在大多数离线客户端之间进行非实时数据库同步。
my.cnf 是:
[mysqld]
port=63306
server-id=0
log-bin=lolo-bin.log
log-bin-index=bin-log.index
max_binlog_size=100M
binlog_format=mixed
binlog-do-db=database
character_set_server=utf8
collation_server=utf8_bin
init-connect='SET NAMES utf8 COLLATE utf8_bin'
[client]
# doesn't work with mysqlbinlog
# default-character-set=utf8
JDBC连接URL为:jdbc:mysql://localhost:63306/database?characterEncoding=utf8
我添加了 --set-charset=UTF8 mysqlbinlog 选项无济于事。
部分 mysqlbinlog SQL 输出(最后带有 set character_set_client):
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES UTF8 */;
DELIMITER /*!*/;
# at 4
#211101 10:04:33 server id 0 end_log_pos 125 CRC32 0xdd1b24c3 Start: binlog v 4, server v 8.0.27 created 211101 10:04:33 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
IR6AYQ8AAAAAeQAAAH0AAAABAAQAOC4wLjI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAhHoBhEwANAAgAAAAABAAEAAAAYQAEGggAAAAICAgCAAAACgoKKioAEjQA
CigBwyQb3Q==
'/*!*/;
# at 125
#211101 10:04:33 server id 0 end_log_pos 156 CRC32 0x79526201 Previous-GTIDs
# [empty]
# at 156
#211101 10:05:08 server id 0 end_log_pos 235 CRC32 0xcbe86045 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=no original_committed_timestamp=1635786308071091 immediate_commit_timestamp=1635786308071091 transaction_length=674
# original_commit_timestamp=1635786308071091 (2021-11-01 10:05:08.071091 PDT)
# immediate_commit_timestamp=1635786308071091 (2021-11-01 10:05:08.071091 PDT)
/*!80001 SET @@session.original_commit_timestamp=1635786308071091*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 235
#211101 10:05:08 server id 0 end_log_pos 330 CRC32 0x38ea85f7 Query thread_id=7818 exec_time=0 error_code=0
SET TIMESTAMP=1635786308/*!*/;
SET @@session.pseudo_thread_id=7818/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=83/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
BEGIN
/*!*/;
# at 330
#211101 10:05:08 server id 0 end_log_pos 799 CRC32 0xfd49bf12 Query thread_id=7818 exec_time=0 error_code=0
谢谢,莱纳斯
解决方案
将数据从 5.7 升级到 8.0 时,必须运行一个重要的脚本来处理此主要升级中的差异。
查看您使用的步骤。
推荐阅读
- c# - 连接两个表并从第一个表中选择一个相关值
- reactjs - 在 useEffect 挂钩中请求未知数量的 API 页面的最佳方法
- c - 您更喜欢哪种代码,为什么?使用指针交换值的程序
- dataweave - 如何使用 Dataweave 从对象数组中获取特定键的所有值
- reactjs - 如何为 react-i18next 添加格式?
- javascript - 如何从与另一个 id 数组匹配的数组中删除对象
- vue.js - Nuxt 生成 vuetify 样式问题
- c# - 从也需要求和的分组中预测结果
- javascript - 如何在续集的模型中声明外键
- javascript - 获取数据成功,但出现 TypeError: Cannot read property '0' of null