暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 8.0特性概览

DBA入坑指南 2021-04-18
1090



点击上方 蓝字关注我们!



一、前言


距离MySQL 8.0 GA已经过去两年多了,现在最新版本截止今天也已经迭代到了8.0.21,不少公司或多或少都开始小规模使用MySQL 8.0了,尤其是MGR架构,所以对于犹豫在要不要MySQL 8.0的问题,笔者觉得是可以上的,目前8.0经过两年多的迭代发行,已经越来越稳定了,而且目前也支持了比较多的特性,当然在用之前,我还是建议大家认真看一遍官方文档,了解MySQL 8.0带来的新特性,比如这个特性能不能解决目前公司业务碰到的问题或者痛点呢?虽然目前MySQL 5.7确实已经很稳定了,但技术是不断向前的,跟着新技术走能不断地更新我们的知识库,有利于职业发展。下面是笔者总结的大部分MySQL 8.0的特性,有些不重要的特性和细节被我省略掉了,由于时间仓促,有概括不详细或者不清晰的地方,欢迎各位指正。由于MySQL 8.0在不断的迭代开发中,之前不同小版本发布支持的新特性或语法可能在下一个小版本就被拿掉了,所以笔者建议看看MySQL Change Log,以便更好地去了解MySQL 8.0。



二、MySQL 8.0新增特性


1、数据字典。在以前的MySQL版本,数据字典被存储在元数据文件和myisam表。

2、支持原子DDL。原子DDL语句结合了数据字典更新、存储引擎操作和二进制日志写与DDL操作成一个单一的原子事务。

3、升级过程有所不同。在8.0.16以前的版本,需要DBA手工执行mysql_upgrade去更新系统表来进行升级,8.0.16之后server在下一次启动会自动执行所有必要的更新任务,不在依赖DBA去调用mysql_upgrade,除此之外,server会更新帮助表的内容,这是mysql_upgrade不去做的事情,同时mysqld增加了--upgrade选项,用于控制server如何自动去升级数据字典和server更新操作。

4、安全和账号管理,主要用于提高安全性和方便DBA灵活管理账号。  

  • mysql系统库的授权表现在是InnoDB表,详细一点说就是除了general_log和slow_log表是csv表,其他表都是InnoDB表。

  • 现在使用caching_sha2_password作为新的认证插件,它提供了比mysql_native_password更安全的密码验证,并作为MySQL8.0的默认认证插件,所以大家在升级MySQL到8.0版本要特别注意这点。

  • MySQL包含用户账号类别的概念,系统和常规用户区分在于他们是否有SYSTEM_USER权限。

  • 在MySQL 8.0.16版本之后,如果启用partial_revokes系统变量,可以支持对特定库回收权限,进一步加强了安全性。

  • 支持角色,并且GRANT语句支持AS user [WITH ROLE]语法,可以更灵活地控制用户权限

  • MySQL现在维护密码历史信息,方便DBA修改密码而又不影响业务。

  • 支持FIPS模式。

  • TLS上下文新连接的服务器使用,现在支持在运行时重新配置,便于更新ssl证书。

5、资源管理,实际生产场景本人觉得应该很少用。

6、表加密管理。

7、InnoDB增强

  • 自增值持久化到redo日志

  • 当遇到索引树损坏,InnoDB会写一个损坏标记到redo日志,使崩溃安全,在每次checkpoint时,InnoDB也写内存损坏标志数据到一个引擎私有的系统表里面,在recovery期间,InnoDB读取损坏标志位置和合并结果之前将内存中的表和索引对象标记为损坏。

  • InnoDB memached插件支持多个get操作。

  • innodb_deadlock_detect成为新的动态变量。

  • 新表INFORMATION_SCHEMA.INNODB_CACHED_INDEXES可以查看每个索引缓存在缓冲池的索引页数量。

  • InnoDB临时表现在被创建在共享临时表空间ibtmp1里面。

  • InnoDB支持对redo日志undo日志加密。

  • InnoDB支持NOWAIT和SKIP LOCKED选项,可以和SELECT ... FOR SHARE/SELECT ... FOR UPDATE一起使用。

  • mysql系统表和数据字典表存储在单独的InnoDB表空间mysql.ibd文件里面,之前的版本这些表被创建存储在mysql数据库目录下的单独InnoDB表空间里面。

  • MySQL初始化时,默认有两个undo表空间,undo日志不在创建在系统表空间里面。

  • Innodb_max_dirty_pages_pct_lwm默认值由0改为10,innodb_max_dirty_pages_pct默认值从75改为90,这两个变量分别用于缓冲池的预刷新和刷新行为,innodb_autoinc_lock_mode变量默认值为2。

  • 支持ALTER TABLESPACE ... RENAME语法来重命名通用表空间。

  • 新增innodb_dedicated_server变量,8.0.14之前默认禁用,需要可以开启,本人觉得这个变量主要用于初学者。

  • 新视图INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF可以查看InnoDB表空间的元数据信息。

  • SDI存在于所有InnoDB表空间文件除了全局临时表空间和undo表空间文件,SDI数据被压缩存储但是仍然会增加表空间文件大小。

  • MySQL 8.0.12 alter table支持ALGORITHM=INSTANT,只修改数据字典元数据,不会持有表MDL(支持快速加列)。

  • MySQL 8.0.13 TempTable存储引擎支持存储二进制大对象类型列,如BLOB类型。

  • MySQL 8.0.14之后InnoDB支持并行读取聚集索引,可以提高check table性能,通过变量innodb_parallel_read_threads开启并行读。

  • MySQL 8.0.19支持有效采样InnoDB数据生成直方图统计信息,这个对于索引的正确选择性很重要,尤其针对有数据倾斜的表。

  • MySQL 8.0.20之后doublewrite缓冲存储区域位于doublewrite文件,不在存储在系统表空间。

  • 事务调度采用CATS算法,以前版本采用的是FIFO算法 (更好的事务调度功能)。

  • MySQL 8.0.21允许更细粒度的访问锁队列,以前单一锁系统互斥锁保护所有锁队列,影响并发 (lock_sys->mutex优化)。

  • MySQL 8.0.21可以使用 ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG去启停redo日志,禁用redo日志可以加快数据加载速度。

  • MySQL 8.0.21当使用基于行复制时,CREATE TABLE ... SELECT语句作为一个事务被记录在二进制日志,以前它被作为两个事务记录,一个是创建表,另外一个插入数据, CREATE TABLE ... SELECT目前在基于行复制是安全的,并且支持GTID复制。

  • MySQL默认字符集是utf8mb4,并添加了几个新的校对集,默认校对集为utf8mb4_0900_ai_ci,迁移数据的时候要特别注意,另外如果不支持新的校对集可能会影响公司的ETL流程,解决办法就是改回以前的校对集。

  • JSON增强。

  • BLOB、TEXT、GEOMETRY和JSON数据类型支持使用表达式作为默认值。 

  • 支持隐藏索引、降序索引、函数索引。

  • MySQL 8.0.16 semijoin优化可用于in子查询和exists子查询。

  • MySQL 8.0.17版本和之后版本where条件后not in和not exists在内部被转化为antijoin(子查询优化)。

  • 支持公共表表达式(CTE)。

  • 支持窗口函数。

  • 支持横向派生表。

  • MySQL 8.0.16及之后版本,单表delete语句支持使用表别名。

  • 支持正则表达式。

  • TempTable存储引擎替换MEMORY存储引擎作为默认的内存内部临时表,对varchar和varbinary提供有效存储,internal_tmp_mem_storage_engine和temptable_max_ram变量可以控制内存表大小。

  • 日志增强。

  • 新类型的备份锁,使用LOCK INSTANCE FOR BACKUP语句,在线备份期间允许DML,防止操作可能导致不一致的快照。

  • 复制功能增强,二进制日志支持json文档的部分更新。

  • 支持配置管理端口用于管理连接,主要用于连接数满的情况下,DBA可以连接登录,并且支持使用压缩算法减少通过连接到服务器发送的字节数。

  • 支持255字符的主机名,之前的最大是60。

  • 插件增强。

  • MySQL C API现在支持异步非阻塞通信与MySQL服务器的功能。

  • MySQL 8.0.17开始支持额外的目标类型强制转换。

  • 支持JSON模式校验。

  • MySQL 8.0.17开始支持多值索引。

  • MySQL 8.0.17开始支持使用SET_VAR对time_zone会话变量hint。

  • MySQL 8.0.17开始支持redo日志归档,这个跟oracle类似,可以用于备份。

  • MySQL 8.0.17开始支持克隆插件功能,这个在MGR中比较有用。

  • MySQL 8.0.18开始支持hash join。

  • MySQL 8.0.18开始支持EXPLAIN ANALYZE,提供了更多扩展信息。

  • MySQL 8.0.19时区支持TIMESTAMP和DATETIME。

  • MySQL 8.0.19开始ON DUPLICATE KEY UPDATE支持行和列别名。

  • optimizer hints支持FORCE INDEX和IGNORE INDEX。

  • MySQL 8.0.21开始当创建或者修改用户账号时可以设置用户注解和属性。

  • MySQL 8.0.21 optimizer_switch新加prefer_ordering_index和subquery_to_derived。

  • XML增强。

  • MySQL 8.0.22开始支持转化到YEAR类型。

  • MySQL 8.0.22及之后版本支持同步输出dump文件,当使用SELECT INTO DUMPFILE和SELECT INTO OUTFILE语句。

  • MySQL 8.0.20开始doublewrite缓冲存储区域位于doublewrite文件,以前的版本doublewrite缓冲存储区域位于系统表空间,减少写延迟,增加吞吐量,并且提供了灵活性对放置doublewrite缓冲页面(DoubleWrite优化)



三、MySQL 8.0废弃的特性


1、utf8mb3字符集被废弃

2、sha256_password验证插件被废弃,请使用caching_sha2_password,它是sha256_password的超集。

3、SQL模式PAD_CHAR_TO_FULL_LENGTH被废弃。

4、对于FLOAT和DOUBLE类型,AUTO_INCREMENT支持被废弃。

5、FLOAT、DOUBLE和DECIMAL类型UNSIGNED属性被废弃。

6、FLOAT(M,D)和DOUBLE(M,D)语法指定列数字的位数是非保准MySQL扩展,被废弃。

7、对于数字数据类型ZEROFILL属性被废弃。

8、对于字符串数据类型,BINARY属性是非标准MySQL扩展,被废弃。

9、非标&&、||和!操作被废弃,可以使用AND、OR和NOT操作。

10、JSON_MERGE()函数被废弃,请使用JSON_MERGE_PRESERVE()。

11、SQL_CALC_FOUND_ROWS查询修改器和FOUND_ROWS()被废弃。

12、CREATE TEMPORARY TABLE不在支持TABLESPACE = innodb_file_per_table和TABLESPACE = innodb_temporary语法,MySQL 8.0.13废弃。

13、mysql_upgrade客户端被废弃。

14、relay_log_info_file、 max_length_for_sort_data系统变量和--master-info-file被废弃。

15、前缀索引列不在支持作为一个表分区键的一部分。

16、InnoDB memcached插件在MySQL 8.0.22版本中被废弃。



四、MySQL 8.0移除的特性


1、innodb_locks_unsafe_for_binlog系统变量被移除。

2、information_schema_stats变量被移除,在MySQL 8.0.3被information_schema_stats_expiry替换。

3、INFORMATION_SCHEMA视图基于系统InnoDB表被内部系统视图替换。

4、不支持使用grant创建用户,IDENTIFIED BY PASSWORD语法被移除,SET PASSWORD ... = PASSWORD('auth_string')不在可用。

5、查询缓存被移除。

6、--ignore-db-dir选项和ignore_db_dirs系统变量被移除。

7、DDL日志/元数据日志在MySQL 8.0.3被移除。

8、tx_isolation和 tx_read_only系统变量被移除,取而代之的是transaction_isolation和transaction_read_only。

9、由于.frm文件被废弃,所以sync_frm系统变量被移除。

10、multi_range_count和secure_auth系统被移除。

11、log_warnings系统变量被移除,取而代之的是log_error_verbosity。

12、全局范围sql_log_bin系统变量被移除,sql_log_bin目前只是会话范围。

13、metadata_locks_cache_size和metadata_locks_hash_instances系统变量被移除。

14、date_format、datetime_format、time_format和max_tmp_tables系统变量被移除。

15、DB2、MAXDB、MSSQL、MYSQL323、MYSQL40、ORACLE、POSTGRESQL、NO_FIELD_OPTIONS、NO_KEY_OPTIONS、NO_TABLE_OPTIONS这些废弃的兼容SQL模式被移除。

16、EXPLAIN语句不在支持EXTENDED和PARTITIONS关键字,已被移除。

17、ENCODE()、DECODE()、ENCRYPT()、DES_ENCRYPT()、DES_DECRYPT()函数已被移除,可以使用SHA2()、AES_ENCRYPT()和AES_DECRYPT()函数替代。

18、SQL语句解析不在把\n作为NULL的同义词,这个改变不影响使用LOAD DATA或者SELECT ... INTO OUTFILE进行文本文件导入导出操作,NULL仍然代表\n。

19、PROCEDURE ANALYSE()语法被移除。

20、ignore_builtin_innodb系统变量被移除。

21、mysql_install_db程序被移除,请使用mysqld。

22、MySQL 8.0只支持对InnoDB的表进行分区,使用其他存储引擎会创建失败。

23、mysql_plugin工具被移除,请使用--plugin-load和--plugin-load-add选项,或者在运行时使用INSTALL PLUGIN语句。

24、resolveip和resolve_stack_dump工具被移除。

25、InnoDB不再支持压缩临时表。

26、InnoDB当在MySQL数据目录外创建表空间数据文件,InnoDB不再创建.isl文件(InnoDB软链接文件),innodb_directories选项现在支持定位数据目录之外的表空间创建的文件。

27、InnoDB文件格式变量innodb_file_format、innodb_file_format_check、innodb_file_format_max和innodb_large_prefix被移除。

28、innodb_support_xa系统变量被移除,InnoDB支持两阶段提交在xa事务。

29、DTrace支持被移除。

30、支持在共享表空间放置表分区在MySQL 8.0.13被废弃,这个功能将在MySQL 9.0被移除。

31、innodb_undo_logs变量被移除,取而代之的是innodb_rollback_segments。

32、Innodb_available_undo_logs状态变量被移除,请使用SHOW VARIABLES LIKE 'innodb_rollback_segments'查看每个表空间可用回滚段数量。

33、ALTER TABLE ... UPGRADE PARTITIONING语句被移除。

34、internal_tmp_disk_storage_engine系统变量在MySQL 8.0.16被移除,在磁盘的内部临时表现在使用InnoDB存储引擎。

35、CMake选项DISABLE_SHARED被移除。



参考文档:https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html  ,建议阅读一遍。



扫码二维码

获取更多知识

DBA入坑指南



文章转载自DBA入坑指南,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论