购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.7 MySQL 8.0的新特性

4.7.1 数据字典合并并转为事务型

MySQL 8.0包含一个事务型数据字典,用于存储有关数据库对象的元数据信息。在MySQL 8.0之前的版本中,Server层和InnoDB引擎层有两套数据字典表,其中Server层部分的数据字典,存储在.frm文件里面,而InnoDB存储引擎层也有自己的数据字典表,在information_schema库下面的tables表中进行存储。这种方式的最大问题就是数据字典信息改动很难同步,而且两个字典信息库很难保证一致性,根源就在于DDL操作不是原子性的,对数据字典的更新不是事务型的。新的数据字典不仅简化了层面结构,而且Server层面和InnoDB层面的数据字典也进行了合并。MySQL 8.0将所有已存放于数据字典文件中的信息全部存放到数据库系统表中,即将之前版本的.frm、.opt、.par、.TRN、.TRG和.isl文件都移除了,不再通过文件的方式存储数据字典信息。数据字典信息全都存储在InnoDB存储引擎里面,实现了原子性的DDL。InnoDB也可以保证对于数据字典表的更新是事务型的,并可以通过视图的方式查看数据字典,查询性能提升近百倍。

4.7.2 DDL操作原子化以支持事务完整性

在MySQL 8.0中,InnoDB表的DDL操作原子化以支持事务完整性,即一条DDL的SQL语句操作要么全部成功,要么全部失败,将DDL操作日志写入data dictionary数据字典表mysql.innodb_ddl_log中,用于回滚操作,该表是隐藏的表,通过show tables无法看到。通过设置参数,可将DDL操作日志打印输出到mysql错误日志中。

下面通过案例演示MySQL 5.7和MySQL 8.0中DDL操作的区别。SQL语句示例如下。

1.MySQL 5.7

(1)在MySQL 5.7版本的DBMS系统中先创建数据库“db_temp”,然后创建数据表“tb_temp1”。

提示信息表示创建数据库和数据表成功。

(2)使用SHOW语句查看“db_temp”数据库的所有数据表。

(3)删除数据表“tb_temp1”和“tb_temp2”。

提示信息表示DROP语句执行发生错误,因为在“db_temp”数据库中“tb_temp2”数据库表不存在。

(4)再次使用SHOW语句查看“db_temp”数据库的所有数据表。

从结果可以看出,虽然在删除数据表时报错了,但是仍然删除了数据表“tb_temp1”。这是因为在MySQL 5.7中,DDL语句不是原子操作,即要么都成功,要么都失败。

2.MySQL 8.0

(1)同样在MySQL 8.0的DBMS系统中,先创建数据库“db_temp”,然后创建数据表“tb_temp1”。

提示信息表示创建数据库和数据表成功。

(2)使用SHOW语句查看“db_temp”数据库的所有数据表。

(3)删除数据表“tb_temp1”和“tb_temp2”。

提示信息表示DROP语句执行发生错误,因为在“db_temp”数据库中“tb_temp2”数据库表不存在。

(4)再次使用SHOW语句查看“db_temp”数据库的所有数据表。

从结果可以看出,数据表“tb_temp1”没有被删除。这是因为在MySQL 8.0中DDL操作已经原子化,即一条DDL的SQL语句中的数据库操作要么都成功,要么都失败。 VjToWa8FbQ3RHaadHcU/NeUs1riOdMs1HnZIv2fQco4IpIpkqN97zJmrE7MXxVM7

点击中间区域
呼出菜单
上一章
目录
下一章
×