首页 > 解决方案 > 当通过 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.collat​​ion_connection=255,@@session.collat​​ion_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

谢谢,莱纳斯

标签: javamysqljdbcmysql-connectormysqlbinlog

解决方案


将数据从 5.7 升级到 8.0 时,必须运行一个重要的脚本来处理此主要升级中的差异。

查看您使用的步骤。


推荐阅读