inception icon indicating copy to clipboard operation
inception copied to clipboard

不支持emoji的备份

Open romberli opened this issue 6 years ago • 6 comments

使用了inception 2.1.52.2, 看到commit记录说已经支持了emoji, 我写了python脚本去试了下, 不经过inception, 直接对mysql执行, 则会更新成功, 数据库里显示的就是正常的emoji, 对inception执行, 则: 如果是update后的新值是emoji, 则会执行成功, 但是在数据库里是乱码(一个问号), 如果是update前的老值是emoji, 则会执行成功, 但是备份会失败

romberli avatar Aug 22 '19 12:08 romberli

需要设置inc.cnf配置文件中character-set-server=utf8mb4 同时连接inception的脚本也需要设置字符集为utf8mb4 可参考https://github.com/hhyo/Archery/pull/161/files

hhyo avatar Aug 22 '19 13:08 hhyo

@hhyo , 所有地方都设置了utf8mb4了, 不经过inception, 直接对mysql执行, emoji会正常录入到mysql里, 说明我的脚本和mysql的配置应该是正常的, 那么只剩下inception的配置文件了, 这个我也检查过, 已经配置了character-set-server=utf8mb4

romberli avatar Aug 23 '19 02:08 romberli

测试下来确实是不支持,看那次commit仅仅修改了创建表的字符集,以前也没注意类似情况,不过goinception是支持的 参考http://139.199.0.191/detail/568/

hhyo avatar Aug 23 '19 04:08 hhyo

goinception关注了挺长时间了, 不过用的人貌似还不多, inception我们已经集成到我们自己的运维平台了, 而且在生产上用了很长一段时间, 除了emoji以外, 其他用的还蛮好的, 所以暂时还没想换, 这个问题有办法修复吗?或者给点提示, 问题可能出现在哪里呢?

romberli avatar Aug 23 '19 06:08 romberli

在备份库打开了general_log, 监控inception发送给备份库的语句, 发现emoji是正常的: 2019-08-23T11:39:24.099386+08:00 147 Query create database 192_168_137_11_3307_flyway_test_db_summary 2019-08-23T11:39:24.099660+08:00 147 Query create table 192_168_137_11_3307_flyway_test_db_summary.t01(id bigint auto_increment primary key, rollback_statement longtext, opid_time varchar(50), KEY idx_opid_time (opid_time)) ENGINE INNODB DEFAULT CHARSET UTF8MB4 ROW_FORMAT compressed 2019-08-23T11:39:24.101234+08:00 147 Query create table 192_168_137_11_3307_flyway_test_db_summary.$_$Inception_backup_information$_$(opid_time varchar(50),start_binlog_file varchar(512),start_binlog_pos int,end_binlog_file varchar(512),end_binlog_pos int,sql_statement longtext,host VARCHAR(64),dbname VARCHAR(64),tablename VARCHAR(64),port INT,time TIMESTAMP,type VARCHAR(20),PRIMARY KEY(opid_time))ENGINE INNODB DEFAULT CHARSET UTF8MB4 ROW_FORMAT compressed 2019-08-23T11:39:24.102295+08:00 147 Query INSERT INTO 192_168_137_11_3307_flyway_test_db_summary.$_$Inception_backup_information$_$ VALUES ('1566531564_2833_1','mysql-bin.000008',69627,'mysql-bin.000008',69987,'update t01 set col1 = ''xcvxvz'' where id = 1 ','192.168.137.11','flyway_test_db_summary','t01',3307,NOW(),'UPDATE') 2019-08-23T11:39:24.104182+08:00 147 Query INSERT INTO 192_168_137_11_3307_flyway_test_db_summary.t01 (rollback_statement, opid_time) VALUES ('UPDATE flyway_test_db_summary.t01 SET id=1,username=''a'',col1=''😀'',last_updated_at=''2019-08-23 11:37:18.123844'' WHERE id=1;','1566531564_2833_1') 2019-08-23T11:39:24.104636+08:00 147 Quit

这个insert into语句是可以直接在备份库里执行的, 也就是说发送到mysql层面的语句是没问题的, 既然语句是正确的, 但是备份表里又没有数据, 因此我的猜测是, inception发送给mysql的时候发生了未知错误, 或者mysql返回给inception的消息被inception错误解读了, 导致没有commit, 而是直接断开连接, 回滚了

romberli avatar Aug 23 '19 06:08 romberli

debug了一段时间没有找到问题,分别测试两种场景

当把character-set-server调整为utf8mb4或者在执行语句前使用set names utf8mb4时 Inception提交给MySQL的语句中emoji表情就会变成 ???,能正常写入但是是???

而将character-set-server调整为utf8,Inception提交给MySQL的语句中emoji表情是正常的,但是由于当前会话是utf8,所以会执行失败

相关分析文档 https://dolphinsboy.github.io/2019-03-07-Inception%E6%89%A7%E8%A1%8C%E8%BF%9C%E7%A8%8B%E5%91%BD%E4%BB%A4%E5%88%86%E6%9E%90/

希望对你有帮助

hhyo avatar Aug 24 '19 04:08 hhyo