MySQL 8.0支持DDL原子化

在MySQL 5.5/5.6/5.7版本中,DDL操作是非原子型操作,在执行过程中遇到实例故障重启,可能导致DDL没有完成也没有回滚。如
1、执行DROP TABLE T1,T2操作,实例重启恢复后,表T1被删除,表T2仍存在。
2、执行CREATE TABLE操作,创建过程中实例重启,表创建失败但是有部分表文件残留,导致后续DDL执行失败。
 
问题原因:
1、在MySQL Server层使用MyISAM引擎的系统表来存放元数据信息,故障恢复时不能保证数据一致性
2、在存储引擎层不同引擎使用不同规则存放元数据信息,故障恢复后存在MySQL Server层和存储引擎层的元数据不一致问题。
 
存在风险:
1、两份元数据信息不一致,数据访问出错
2、DDL操作未原子化,在DDL操作部分完成的情况下Binlog被传递到从库,导致主库不一致。
3、DDL操作未原子化,导致故障恢复后,不能正常回滚和恢复
 
MySQL 8.0解决办法:
1、将MySQL Server层和存储引擎层的元数据信息统一存放在一起,并使用MySQL Innodb存储引起保存这些数据,保证事务一致性。
2、使用Innodb表(系统表)存放DDL操作锁所产生的日志,用于DDL事务提交或回滚,每条DDL事务分配一个事务ID,所产生的DDL LOG被同步刷新到表中进行持久化,该同步操作不受参数innodb_flush_log_at_trx_commit的控制。
 
 
 

猜你喜欢

转载自www.cnblogs.com/gaogao67/p/10610763.html