背景
MySQL的DDL没有被设计成事务操作,因此DDL操作是无法回滚的(像PgSQL把DDL也设计成事务操作,DDL就可以在执行成功后被回滚操作取消)。这就会导致如果某个DDL语句内部被拆分为多个原子的DDL调用,那么这个DDL语句就不具备中途执行失败后回滚整个DDL语句的能力,也就是说,即使语句逻辑内的某个原子DDL调用失败了,也无法回滚已经完成的那些原子DDL调用。
keep running, just do it!
在MySQL中,表是和操作系统中的文件对应的,而文件名在有的操作系统下是区分大小写的(比如linux),有的是不区分大小写(比如Windows),表名与文件名的大小写对应关系,MySQL 是通过lower_case_table_names 这个变量来控制的。
5.6.4及以上版本,datetime,time,timestamp的Binlog在5.6.4以下的备库无法执行,如:
5.6.16(主库): create table t1(t datetime default now()); insert into t1 values(now());
5.5.18(备库): show slave stauts\G ;
此时备库中断,报错:Last_Errno: 1677,
描述信息:Last_Error: Column 1 of table t1.t’ cannot be converted from type ‘’ to type ‘datetime’
详情见Bug#70085
在上一期的月报中,我们在InnoDB自增列重复值问题中提到,InnoDB 自增列在重启后会丢失,因为MySQL没有持久化自增值,平时是存在内存表对象中的。如果实例重启的话,内存值丢失,其初始化过程是做了一个类似 select max(id) + 1 操作。实际上存在另外一种场景,实例即使不重启,也会导致自增值丢失。