关于添加有默认值的日期类型字段,主从同步的问题(主:InnoDB,从:TokuDB)

测试添加有默认值的日期类型字段,主从同步的情况

环境说明:
主库使用MySQL 5.7.20社区版本,从库使用吴老师提供的XeLabs TokuDB
1. 开启gtid模式
2. binlog格式为ROW
3. tokudb部分的参数配置,参考老师提供的配置文件
#tokudb
loose_tokudb_cache_size=100M
loose_tokudb_directio=ON
loose_tokudb_fsync_log_period=1000
tokudb_commit_sync=0


1. 表DDL和基本数据

主库:
root@localhost:mysql_3306.sock [db1]>show create table td1109\G
*************************** 1. row ***************************
       Table: td1109
Create Table: CREATE TABLE `td1109` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

root@localhost:mysql_3306.sock [db1]>select * from td1109;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
| 10 |
| 20 |
| 21 |
| 22 |
+----+
7 rows in set (0.01 sec)

从库:
root@localhost:tokudb_3316.sock [db1]>show create table td1109\G
*************************** 1. row ***************************
       Table: td1109
Create Table: CREATE TABLE `td1109` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=TokuDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

root@localhost:tokudb_3316.sock [db1]>select * from td1109;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
| 10 |
| 20 |
| 21 |
| 22 |
+----+
7 rows in set (0.01 sec)

2. 在主库上进行DDL操作,添加日期字段,并定义默认值
主库上执行:
root@localhost:mysql_3306.sock [db1]>alter table td1109 add column gmt_time datetime not null default current_timestamp;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

root@localhost:mysql_3306.sock [db1]>select * from td1109;
+----+---------------------+
| id | gmt_time            |
+----+---------------------+
|  1 | 2017-12-13 17:01:47 |
|  2 | 2017-12-13 17:01:47 |
|  3 | 2017-12-13 17:01:47 |
| 10 | 2017-12-13 17:01:47 |
| 20 | 2017-12-13 17:01:47 |
| 21 | 2017-12-13 17:01:47 |
| 22 | 2017-12-13 17:01:47 |
+----+---------------------+
7 rows in set (0.00 sec)

从库上查询:
root@localhost:tokudb_3316.sock [db1](17:01:40)>select * from td1109;
+----+---------------------+
| id | gmt_time            |
+----+---------------------+
|  1 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 |
|  3 | 0000-00-00 00:00:00 |
| 10 | 0000-00-00 00:00:00 |
| 20 | 0000-00-00 00:00:00 |
| 21 | 0000-00-00 00:00:00 |
| 22 | 0000-00-00 00:00:00 |
+----+---------------------+
7 rows in set (0.00 sec)

发现从库上的表,新增日期字段值为"0000-00-00 00:00:00",跟主库不一致

3. 将从库的存储引擎改为InnoDB,重做上面的实验

从库:
root@localhost:tokudb_3316.sock [db1]>alter table td1109 engine=innodb;
Query OK, 7 rows affected (0.04 sec)
Records: 7  Duplicates: 0  Warnings: 0

主库上执行:
root@localhost:mysql_3306.sock [db1]>alter table td1109 drop column gmt_time;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

root@localhost:mysql_3306.sock [db1]>alter table td1109 add column gmt_time datetime not null default current_timestamp;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

root@localhost:mysql_3306.sock [db1]>select * from td1109;                   
+----+---------------------+
| id | gmt_time            |
+----+---------------------+
|  1 | 2017-12-13 17:04:14 |
|  2 | 2017-12-13 17:04:14 |
|  3 | 2017-12-13 17:04:14 |
| 10 | 2017-12-13 17:04:14 |
| 20 | 2017-12-13 17:04:14 |
| 21 | 2017-12-13 17:04:14 |
| 22 | 2017-12-13 17:04:14 |
+----+---------------------+
7 rows in set (0.00 sec)

从库上执行:
root@localhost:tokudb_3316.sock [db1](17:04:02)>select * from td1109;            
+----+---------------------+
| id | gmt_time            |
+----+---------------------+
|  1 | 2017-12-13 17:04:14 |
|  2 | 2017-12-13 17:04:14 |
|  3 | 2017-12-13 17:04:14 |
| 10 | 2017-12-13 17:04:14 |
| 20 | 2017-12-13 17:04:14 |
| 21 | 2017-12-13 17:04:14 |
| 22 | 2017-12-13 17:04:14 |
+----+---------------------+
7 rows in set (0.00 sec)

从库新增字段的值能够同步。

疑问:
上面的现象是属于TokuDB的bug,还是我哪里配置有问题引起的?
已邀请:

wubx - 专注MySQL及架构设计

赞同来自: arron

XeLabs TokuDB 5.7.20 Release

恭喜XeLabs TokuDB 5.7.20发布,该版本基本地Percona版本TokuDB进行优化。基于Percona 5.7.20发版。

对TokuDB提升如下

Percona Server has implemented TokuDB integration with PERFORMANCE_SCHEMA.
关于添加有默认值的日期类型字段,主从同步的问题(主:InnoDB,从:TokuDB) http://q.fireflyclub.org/?/question/47
加入show engine中XeLabs TokuDB 标识
mysql --version 加入XeLabs 标识(本次只在CentOS7的版本标识)
二进制下址地址: https://pan.baidu.com/s/1qYRyH3I
更多问题加入QQ群:579036588 联系群主

arron

赞同来自: wubx

新版本测试过了,没问题

yejr

赞同来自:

先把binlog和relay log拿出来解析下看看

arron

赞同来自:

对应的binlog和relay log解析过,类似下面的内容:
# at 1205854
#171213 17:00:26 server id 1033306  end_log_pos 4895538 CRC32 0x4c6ff7a7        Query   thread_id=4043  exec_time=0     error_code=0
SET TIMESTAMP=1513155626/*!*/;
alter table td1109 add column gmt_time datetime not null default current_timestamp
/*!*/;
 
 
DDL操作,binlog和relay log里面只记录操作的SQL语句。
在测试表是InnoDB引擎或TokuDB引擎的情况下,没有区别。为什么最后应用完有这么大的区别呢?

wubx - 专注MySQL及架构设计

赞同来自:

这个问题是tokudb的一个bug,XeLabs/TokuDB分支已经修复,修复commit id:

https://github.com/XeLabs/toku ... 292ff

要回复问题请先登录注册