场景
当所添加字段的表数据量较大,而且所操作的表上面还有触发器, ,直接操作DDL延迟时间长(五小时左右),而pt-online-schema-change工具又不能使用,pt-online-schema-change限制,所操作的表不能建立触发器。
测试如下创建test_ddl表
注意事项:
1 mysql日志格式row
所添加字段必须位于所有字段之后,所添加的字段不能被操作,操作检查到不一致就会失败
Master:mysql> desc test_ddl;
+-------+-------------+------+-----+---------+-------+
| Field |Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
|id | int(11) | YES | | NULL | |
| name |varchar(30) | YES | | NULL | |
| name2 |varchar(40) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
Slave:执行 alter table test_ddl add name6varchar(20) after name;
Master: insert intotest_ddl(id,name,name2) values(4,'tom','cat');
Slave:sql_thread线程中断
Slave:mysql> desc test_ddl;
+-------+-------------+------+-----+---------+-------+
| Field |Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id |int(11) | YES | |NULL | |
| name | varchar(30) | YES | | NULL | |
| name6 | varchar(20) | YES | | NULL | |
| name2 | varchar(40) | YES | | NULL | |
查看master binlog格式如下
### INSERTINTO prodstockdb.test_ddl
### SET
### @1=4
### @2='tom'
### @3='cat'
根据字段匹配,master与slave表的第三个字段不一致,导致复制失败。
2 日志格式statement
上面遇到的问题,有没有办法解决,主库调整binlog_format格式为statement可解决。
3 常见操作Alter tableadd/modify/change操作,在binlog_format=row下,sql涉及到修改字段不一致都会报错。这种情况下可修改binlog_format=state格式,避开row下严格的一致性检查