MySQL 8.0发布已经过去很多年了,8.4 LTS版本也已经发布。按照MySQL的发布节奏,9.0版本预计会在不久的将来和大家见面。

作为一个长期使用MySQL的DBA,我一直在关注MySQL 9.0的动态。从官方的开发路线图、邮件列表讨论、以及已经提交的代码变更来看,MySQL 9.0会带来很多令人期待的新特性和改进。

这篇文章,我想基于目前公开的信息,详细讲解一下MySQL 9.0预期的新特性和配置优化。从基础配置、性能优化、安全加固到高可用架构、运维监控,帮助大家提前了解MySQL 9.0的变化,做好升级准备。

需要说明的是,本文的内容是基于目前公开的信息和开发趋势预测的,最终的特性和配置可能会和正式发布版本有所不同。一切以官方正式发布的文档为准。

MySQL 9.0的整体变化趋势

在讲具体的配置之前,先说说MySQL 9.0的整体变化趋势。

从目前的信息来看,MySQL 9.0的发展方向,主要有以下几个方面。

第一个方向,是云原生和容器化支持的增强。

现在越来越多的企业把数据库部署在云上或者容器里,MySQL也在加强这方面的支持。MySQL 9.0预计会更好地支持容器化部署,优化在Kubernetes等容器编排平台上的运行表现,提供更完善的云原生特性,比如自动扩缩容、自动故障转移、云存储集成等。

第二个方向,是性能的持续提升。

性能是MySQL永恒的主题。MySQL 9.0预计会在多个方面提升性能,比如优化查询优化器、提升InnoDB存储引擎的性能、改进并行查询、优化JSON处理、提升大内存场景下的表现等。特别是在多核CPU、大内存、NVMe SSD等现代硬件环境下,MySQL 9.0的性能预计会有显著提升。

第三个方向,是安全性的加强。

数据安全越来越受到重视,MySQL 9.0预计会在安全性方面做很多改进,比如更完善的加密支持、更细粒度的权限控制、更安全的默认配置、更好的审计功能等。同时,MySQL 9.0预计会移除一些旧的、不安全的特性和配置,强制使用更安全的默认值。

第四个方向,是高可用和可扩展性的增强。

高可用是数据库的核心需求。MySQL 9.0预计会增强复制和高可用功能,比如改进组复制(Group Replication)、优化InnoDB Cluster、提升异步复制的性能和可靠性、支持更灵活的拓扑结构等。同时,MySQL 9.0预计会在水平扩展方面做一些探索,比如更好的分片支持、读写分离优化等。

第五个方向,是可观测性和运维体验的提升。

运维数据库,可观测性很重要。MySQL 9.0预计会提供更丰富的监控指标、更完善的性能分析工具、更友好的错误信息、更智能的配置建议等。同时,MySQL 9.0预计会改进命令行工具和管理界面,让DBA的运维工作更轻松、更高效。

了解了整体趋势之后,我们来看看具体的配置。

基础配置:从安装开始

先从最基础的配置说起。MySQL 9.0在基础配置方面,预计会有一些变化。

第一,默认字符集的变化。

MySQL 8.0已经把默认字符集改成了utf8mb4,默认排序规则改成了utf8mb40900ai_ci。MySQL 9.0预计会继续强化这一点,可能会完全移除对旧字符集(如latin1、utf8mb3)的支持,或者至少在默认配置中不再提供这些选项。

建议大家在升级到MySQL 9.0之前,先把数据库的字符集统一改成utf8mb4,避免升级后出现兼容性问题。同时,新建数据库的时候,明确指定字符集和排序规则,不要依赖默认值。

第二,默认存储引擎。

MySQL 8.0已经把默认存储引擎改成了InnoDB,并且移除了MyISAM作为默认引擎的选项。MySQL 9.0预计会进一步强化InnoDB的地位,可能会完全移除MyISAM引擎,或者只保留只读支持。

建议大家尽快把所有的MyISAM表转换成InnoDB。MyISAM不支持事务、不支持行级锁、崩溃恢复能力差,在现代应用中已经不适合使用了。转换成InnoDB之后,不仅能获得事务支持,还能获得更好的并发性能和崩溃恢复能力。

第三,默认SQL模式。

MySQL 8.0的默认SQL模式已经比较严格了,包含了ONLYFULLGROUPBY、STRICTTRANSTABLES、NOZEROINDATE、NOZERODATE、ERRORFORDIVISIONBYZERO等。MySQL 9.0预计会进一步严格化默认SQL模式,可能会加入更多的严格检查,移除一些兼容旧版本的宽松模式。

建议大家在开发的时候,就使用严格的SQL模式,不要依赖宽松模式。严格模式能帮助你更早地发现数据问题,避免一些隐性的bug。如果你的应用在严格模式下运行正常,升级到MySQL 9.0就不会有太大问题。

第四,配置文件的变化。

MySQL 9.0预计会对配置文件做一些调整,比如移除一些已经废弃的配置项,修改一些配置项的默认值,新增一些配置项。同时,MySQL 9.0预计会提供更智能的配置建议功能,能根据服务器的硬件配置和工作负载,自动推荐合适的配置参数。

建议大家在升级之前,先检查一下自己的配置文件,看看有没有使用已经废弃的配置项。可以用MySQL 8.0的废弃配置检查功能,提前发现问题。同时,不要盲目复制网上的配置模板,要根据自己的实际情况来配置。

InnoDB配置:性能优化的核心

InnoDB是MySQL的默认存储引擎,也是性能优化的核心。MySQL 9.0预计会在InnoDB方面做很多改进。

第一,缓冲池配置。

innodbbufferpool_size是InnoDB最重要的配置参数,决定了InnoDB能缓存多少数据和索引。MySQL 8.0已经支持动态调整缓冲池大小,MySQL 9.0预计会进一步优化缓冲池的管理,比如更智能的预热、更高效的LRU算法、更好的多缓冲池实例管理等。

配置建议:在专用的数据库服务器上,innodbbufferpoolsize可以设置为物理内存的60%到70%。如果服务器内存很大(比如128G以上),可以适当提高比例,但要给操作系统和其他进程留出足够的内存。同时,建议开启多个缓冲池实例(innodbbufferpoolinstances),减少并发访问的锁竞争。

MySQL 9.0预计会优化大内存场景下的缓冲池表现,如果你有大内存服务器,升级到9.0之后可能会获得明显的性能提升。

第二,日志配置。

InnoDB的日志包括redo log和undo log,对性能影响很大。MySQL 8.0已经把redo log的默认大小提高了,并且支持动态调整。MySQL 9.0预计会进一步优化日志系统,比如更大的默认redo log、更高效的日志刷盘机制、更好的undo log管理等。

配置建议:innodblogfile_size建议设置为1G到4G,具体取决于你的写入量。写入量大的场景,可以设置得大一些,减少checkpoint的频率,提升写入性能。但也不要设置得太大,否则崩溃恢复的时间会很长。

innodbflushlogattrx_commit这个参数,控制了事务提交时日志的刷盘策略,对性能和数据安全性影响很大。如果对数据安全性要求很高,设置为1(每次提交都刷盘);如果对性能要求很高,可以接受一定的数据丢失风险,设置为2(每次提交写到操作系统缓存,每秒刷盘)。

第三,并发配置。

InnoDB的并发控制,对高并发场景下的性能影响很大。MySQL 9.0预计会优化InnoDB的并发控制机制,减少锁竞争,提升高并发下的吞吐量。

配置建议:innodbthreadconcurrency控制了InnoDB内部的并发线程数。在大多数情况下,保持默认值0(不限制)就可以,InnoDB会自动管理。如果你的服务器CPU核心数很多,并发量很大,可以适当调整这个参数,但需要仔细测试。

innodblockwait_timeout控制了锁等待的超时时间,默认是50秒。建议根据你的应用场景适当调整,比如设置为10秒或30秒,避免长事务长时间占用锁。

第四,IO配置。

MySQL 9.0预计会优化InnoDB的IO处理,特别是在NVMe SSD等高速存储设备上的表现。比如更高效的异步IO、更智能的IO调度、更好的预读机制等。

配置建议:innodbiocapacity和innodbiocapacity_max控制了InnoDB的IO能力上限。如果使用的是高速SSD,可以适当提高这两个参数,比如设置为2000和4000,让InnoDB能充分利用SSD的IO能力。如果使用的是机械硬盘,保持默认值或设置得小一些。

innodbreadiothreads和innodbwriteiothreads控制了读写IO线程数。在高并发场景下,可以适当增加线程数,比如设置为8或16,提升IO处理能力。

查询优化器配置:让SQL跑得更快

查询优化器决定了MySQL如何执行SQL语句,对性能影响很大。MySQL 9.0预计会在查询优化器方面做很多改进。

第一,优化器统计信息。

优化器是基于统计信息来选择执行计划的,统计信息的准确性直接影响执行计划的好坏。MySQL 8.0已经改进了统计信息的收集和管理,MySQL 9.0预计会进一步提升统计信息的准确性和时效性,比如更智能的自动统计信息更新、更细粒度的直方图支持、更好的索引统计等。

配置建议:保持innodbstatspersistent=ON,让统计信息持久化,避免重启后统计信息丢失。innodbstatsauto_recalc保持默认值ON,让MySQL在数据发生较大变化时自动更新统计信息。同时,对于一些大表,可以定期手动运行ANALYZE TABLE,确保统计信息的准确性。

MySQL 9.0预计会增强直方图功能,建议对一些查询频繁、数据分布不均匀的列,创建直方图,帮助优化器做出更准确的判断。

第二,优化器开关。

MySQL提供了很多优化器开关,可以控制优化器的行为。MySQL 9.0预计会新增一些优化器开关,同时可能会改变一些开关的默认值,启用更多的优化特性。

配置建议:了解常用的优化器开关,比如indexmerge、indexconditionpushdown、batchedkeyaccess、hashjoin等。在大多数情况下,保持默认值就可以。如果遇到特定的性能问题,可以通过调整优化器开关来优化。

MySQL 9.0预计会默认启用更多的优化特性,比如哈希连接、窗口函数优化、CTE物化等。升级之后,建议测试一下你的SQL语句,看看执行计划有没有变化,性能有没有提升或下降。

第三,临时表和排序配置。

临时表和排序,是查询执行中常见的操作,对性能影响很大。MySQL 9.0预计会优化临时表和排序的处理,比如更高效的内存临时表、更好的排序算法、更大的默认排序缓冲区等。

配置建议:tmptablesize和maxheaptable_size控制了内存临时表的大小。如果你的查询经常使用临时表,可以适当提高这两个参数,比如设置为256M或512M,让更多的临时表能在内存中完成,避免使用磁盘临时表。但也不要设置得太大,否则可能会占用过多内存。

sortbuffersize控制了排序缓冲区的大小。对于经常需要排序的查询,可以适当提高这个参数,比如设置为4M或8M,提升排序性能。但这个参数是每个会话级别的,并发量大的时候要注意内存占用。

安全配置:保护你的数据

安全是数据库的生命线。MySQL 9.0预计会在安全方面做很多改进,提供更安全的默认配置和更完善的安全功能。

第一,认证和加密。

MySQL 8.0已经把默认认证插件改成了cachingsha2password,提供了更安全的密码认证。MySQL 9.0预计会进一步加强认证安全,比如支持更多的认证方式、更完善的密码策略、更好的TLS支持等。

配置建议:使用cachingsha2password认证插件,不要使用旧的mysqlnativepassword。设置强密码策略,比如requiresecuretransport=ON,强制使用加密连接。配置好SSL/TLS证书,确保客户端和服务器之间的通信是加密的。

MySQL 9.0预计会默认启用更严格的加密,升级之后要确保你的客户端驱动支持新的认证和加密方式,否则可能会连接不上。

第二,权限控制。

MySQL 9.0预计会提供更细粒度的权限控制,比如更灵活的角色管理、更细粒度的对象权限、更好的权限继承等。同时,MySQL 9.0预计会移除一些旧的、不安全的权限特性。

配置建议:遵循最小权限原则,只给用户授予必要的权限。使用角色来管理权限,把权限授予角色,再把角色授予用户,简化权限管理。不要给普通用户SUPER、FILE、PROCESS等高危权限。定期审查用户权限,清理不需要的权限和用户。

MySQL 9.0预计会增强角色功能,建议提前了解和使用角色,让权限管理更规范、更安全。

第三,审计和日志。

审计是安全的重要组成部分,能帮助你发现异常操作和安全事件。MySQL 9.0预计会增强审计功能,比如更完善的审计日志、更灵活的审计规则、更好的日志保护等。

配置建议:开启MySQL的审计功能,记录所有的登录操作、DDL操作、权限变更等敏感操作。把审计日志存储在安全的地方,定期备份,防止被篡改。定期审查审计日志,发现异常操作及时处理。

同时,配置好错误日志和慢查询日志,不仅能帮助你排查性能问题,也能帮助你发现安全问题,比如频繁的登录失败、异常的查询等。

高可用配置:确保服务不中断

高可用是数据库的核心需求。MySQL 9.0预计会在高可用方面做很多改进,提供更完善的复制和集群功能。

第一,复制配置。

MySQL的复制是高可用的基础。MySQL 8.0已经对复制做了很多改进,比如GTID、并行复制、半同步复制等。MySQL 9.0预计会进一步优化复制,比如更快的并行复制、更可靠的半同步、更好的冲突检测和解决等。

配置建议:使用GTID复制,简化复制的管理和故障切换。开启并行复制(slaveparallelworkers),提升从库的复制速度。对于数据安全性要求高的场景,使用半同步复制,确保主库的事务至少同步到一个从库。

配置好复制的监控,比如SecondsBehindMaster、复制错误等,及时发现复制延迟和复制中断。定期测试复制的故障切换,确保在主库故障的时候能快速切换到从库。

第二,组复制和InnoDB Cluster。

组复制(Group Replication)和InnoDB Cluster是MySQL官方提供的高可用解决方案,提供了自动故障转移、多主复制等功能。MySQL 9.0预计会增强组复制和InnoDB Cluster,比如更好的性能、更稳定的故障转移、更完善的管理工具等。

配置建议:如果需要高可用,建议使用InnoDB Cluster,它集成了组复制、MySQL Router、MySQL Shell,提供了完整的高可用解决方案。配置至少三个节点,确保大多数节点存活的时候集群能正常工作。配置好自动故障转移,确保主库故障的时候能自动选举新的主库。

MySQL 9.0预计会优化组复制的性能和稳定性,如果你现在还在使用传统的主从复制,可以考虑升级到9.0之后迁移到InnoDB Cluster。

第三,备份和恢复。

备份是高可用的最后一道防线。不管你的高可用架构有多完善,都需要有可靠的备份。MySQL 9.0预计会改进备份工具,比如更快的备份速度、更好的压缩、更灵活的备份选项等。

配置建议:使用MySQL Enterprise Backup或者Percona XtraBackup进行物理备份,每天全量备份,每小时增量备份。同时,定期使用mysqldump进行逻辑备份,作为物理备份的补充。把备份文件存储在异地,确保机房故障的时候备份还在。

最重要的是,定期测试备份的恢复。很多人只做备份,从不测试恢复,等到真的需要恢复的时候,才发现备份不可用。建议每个月至少测试一次恢复,确保备份是可用的。

运维监控:让数据库运行更稳定

运维监控是数据库稳定运行的保障。MySQL 9.0预计会在可观测性和运维工具方面做很多改进。

第一,监控指标。

MySQL提供了丰富的监控指标,通过SHOW STATUS、SHOW VARIABLES、performance_schema、sys schema等可以获取。MySQL 9.0预计会提供更多的监控指标,比如更细粒度的性能指标、更完善的资源使用指标、更好的锁和事务指标等。

配置建议:开启performance_schema,收集详细的性能数据。使用sys schema,简化性能数据的查询和分析。监控关键指标,比如QPS、TPS、连接数、慢查询数、锁等待、复制延迟、缓冲池命中率等。

使用专业的监控工具,比如Prometheus + Grafana、Zabbix、Datadog等,对MySQL进行全方位的监控。设置合理的告警阈值,在指标异常的时候及时告警,让DBA能第一时间发现和处理问题。

第二,慢查询分析。

慢查询是性能问题的重要来源。MySQL 9.0预计会增强慢查询日志和分析功能,比如更详细的慢查询信息、更智能的慢查询分析、更好的查询优化建议等。

配置建议:开启慢查询日志(slowquerylog=ON),设置合理的longquerytime阈值,比如1秒,记录所有执行时间超过1秒的查询。同时,开启logqueriesnotusingindexes,记录没有使用索引的查询。

定期分析慢查询日志,使用mysqldumpslow、pt-query-digest等工具,找出最慢、最频繁的查询,进行优化。优化慢查询是提升数据库性能最有效的方式之一。

第三,日常运维。

MySQL的日常运维,包括备份检查、磁盘空间检查、日志轮转、版本升级等。MySQL 9.0预计会提供更完善的运维工具,比如更智能的配置检查、更友好的升级工具、更自动化的日常运维任务等。

配置建议:建立完善的日常运维流程,每天检查备份是否成功、磁盘空间是否充足、复制是否正常、错误日志有没有异常。每周检查慢查询、索引使用情况、表碎片情况。每月进行一次全面的健康检查,包括性能分析、安全审计、容量规划等。

同时,关注MySQL的版本更新,及时升级到稳定版本,获取安全补丁和性能改进。但升级之前,一定要在测试环境充分测试,确保升级不会影响业务。

升级准备:如何平滑升级到MySQL 9.0

最后,说说如何平滑升级到MySQL 9.0。

第一,升级前的准备。

升级之前,一定要做好充分的准备。首先,阅读MySQL 9.0的官方升级文档,了解新特性、废弃特性、不兼容变更。然后,检查你的应用和数据库,看看有没有使用废弃的特性、不兼容的语法、旧的认证方式等。

在测试环境搭建MySQL 9.0,把生产环境的数据导入进去,进行全面的测试,包括功能测试、性能测试、兼容性测试。确保你的应用在MySQL 9.0上能正常运行,性能没有下降。

第二,备份数据。

升级之前,一定要备份好数据。最好做一个全量的物理备份,确保升级失败的时候能快速回滚。同时,备份配置文件、用户权限、存储过程、触发器等,确保升级后能恢复这些配置。

第三,选择升级方式。

MySQL的升级方式主要有两种:原地升级和逻辑升级。原地升级是直接替换MySQL的二进制文件,启动新版本,让它自动升级数据文件。这种方式速度快,适合大库,但风险相对较高。

逻辑升级是用mysqldump等工具把数据导出来,然后导入到新版本的MySQL中。这种方式更安全、更干净,但速度慢,适合小库或者对数据安全性要求很高的场景。

根据你的实际情况,选择合适的升级方式。如果是生产环境的大库,建议使用原地升级,但一定要做好备份和回滚预案。如果是小库或者可以接受较长的停机时间,可以使用逻辑升级。

第四,升级后的检查。

升级完成之后,要进行全面的检查。首先,检查数据库是否正常启动,错误日志有没有异常。然后,检查数据完整性,确保数据没有丢失或损坏。接着,检查用户权限、存储过程、触发器、事件等是否正常。

然后,进行功能测试和性能测试,确保应用能正常运行,性能符合预期。监控数据库的运行状态,观察有没有异常的指标、错误、告警。

最后,升级之后的一段时间,要密切关注数据库的运行情况,及时发现和处理升级带来的问题。

写在最后

MySQL 9.0虽然还没有正式发布,但从目前的信息来看,它会带来很多令人期待的新特性和改进。作为DBA和开发者,我们可以提前了解这些变化,做好升级准备,让MySQL更好地为我们的业务服务。

当然,技术在不断发展,MySQL也在不断进步。不管版本怎么变,数据库的核心原理是不变的:设计良好的表结构、创建合适的索引、写出高效的SQL、做好备份和监控、保证数据安全和高可用。掌握了这些核心,不管版本怎么升级,你都能应对自如。

最后,用一句话来结束这篇文章:"最好的优化,是在升级之前就做好准备。"

愿每一个DBA和开发者,都能轻松应对MySQL的版本升级,让数据库跑得更快、更稳、更安全。