文章目录
- 1、MySQL版本5.7和8的区别
- 2、MySQL 5.7升级8
1、MySQL版本5.7和8的区别
在数据库管理系统中,MySQL是一个广泛使用、开源的解决方案。它提供了强大的功能,同时具有优秀的性能和可扩展性。
MySQL 5的发布于2005年,在MySQL数据库的发展历史中具有重要的里程碑意义。
MySQL 8于2018年发布,引入了众多新功能和改进,以提供更高性能、更强安全性和更丰富的功能。
主要来说,升级的理由有以下:
-
性能提升级
官方表示MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在读/写工作负载、IO 密集型工作负载、以及高竞争工作负载时相比MySQL5.7有更好的性能。 -
更强的NoSQL文档支持
MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的ACID合规性。 -
窗口函数
也就是在满足某种条件的记录集合上执行的特殊函数。它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而 是将结果放回多行当中。即窗口函数不需要GROUP BY。窗口函数的使用,将大大提高相关的分析型场景的效率。 -
UTF-8编码
从MySQL8.0开始,使用utf8mb4作来MySQL的默认字符集,并支持Unicode 9,默认字符集将从 latin1改为utf8mb4,默认定序collation将从latin1_swedish_ci改为utf8mb4_800_ci_ai; -
隐藏索引
可以将索引通过命令设置为隐藏或显示。对于被隐藏的索引,它不会被查询优化器所使用,我们可以使用这一功能,对相关的查询进行性能调试,通过隐藏或显示,分析数据库性能差异的原因,同时也可以去除无效的索引。这个跟Oracle里面设置索引失效时一样的。 -
持久化设置
MySQL8.0新增SET PERSIST的命令,该命令的配置值保存到数据目录下的mysqld-auto.cnf文件中,待重启后,读取该文件,用其中的配置覆盖缺省的配置文件,补充了SET GLOBAL命令只能临时生效的不足; -
重构BLOB
重构BLOB加速了片段读取/更新操作,可以加速JSON数据的操作。大幅改进了对JSON的支持,添加了基于路径查询参数从JSON字段中抽取数据的JSON_EXTRACT()函数,以及用于将数据分别组合到JSON数组和对象中的JSON_ARRAYAGG()和JSON_OBJECTAGG()聚合函数。 -
事务性数据字典
完全脱离了MyISAM存储引擎,真正将数据字典放到InnoDB中的一些表中,不再需要 FRM、TRG、PAR 等文件;Information Schema现在以数据字典表的一个视图出现。也就是原则上可以不需要MyISAM数据表类型,系统表都可以放到InnoDB之中。 -
SQL角色
可以创建角色,给用户设置或去除角色,大大方便权限的管理。 -
除去查询缓存
首先,查询缓存的效果取决于缓存的命中率,只有命中缓存的查询效果才能有改善,因此无法预测其性能。其次,查询缓存的另一个大问题是它受到单个互斥锁的保护。在具有多个内核的服务器上,大量查询会导致大量的互斥锁争用。
2、MySQL 5.7升级8
mysql从5.7升级到8.0是支持的,但是只支持GA版本的升级,并且要求版本为5.7.9或者更高
在升级到8.0之前,建议升级到5.7的最新版本。仅仅支持从5.7版本升级到8.0,不支持5.6版本升级到8.0
根据版本变化及官方升级教程,列举注意事项:
- 注意字符集设置。为了避免新旧对象字符集不一致的情况,可以在配置文件将字符集和校验规则设置为旧版本的字符集和比较规则。
- 密码认证插件变更。为了避免连接问题,可以仍采用5.7的mysql_native_password认证插件。
- sql_mode支持问题。8.0版本sql_mode不支持NO_AUTO_CREATE_USER,要避免配置的sql_mode中带有NO_AUTO_CREATE_USER。
- 是否需要手动升级系统表。在MySQL 8.0.16版本之前,需要手动的执行mysql_upgrade来完成该步骤的升级,在MySQL 8.0.16版本及之后是由mysqld来完成该步骤的升级。
升级前准备:
-
1、备份数据(包括当前的数据库和日志文件)
--备份数据 mysqldump -uroot -p ycapp_dflg_prod --single_transaction --flush-logs --master-data=2 >/backup/ycapp.sql
-
2、升级检查
mysqlcheck -u root -p --all-databases --check-upgrade -
3、检查分区表(不支持分区的存储引擎)
select table_schema,table_name from information_schema.tables where engine not in (‘innodb’,‘ndbcluster’) and create_options like ‘%partitioned’; -
4、在mysql数据库中,必须不存在与mysql8.0数据字典相同名称的表
所有同名的表必须要重命名。 -
5、必须要不存在外键超过64字符的表
如果存在,必须修改表。 -
6、必须要确保不存在拥有ENUM或者SET列元素并且超过255字符或者1020字节长度的表和存储过程
-
7、mysql5.7中必须不使用8.0不支持的特性。例如NDB引擎,8.0不再支持;部分启动选项不再支持:例如–ignore-db-dir已被移除。
-
8、如果innodb使用了XA事务,确保所有XA事务提交或者回滚。
-
9、如果存在加密的innodb表空间,执行语句
alter instance rotate innodb master key; -
10、停止数据库
mysqladmin -u root -p shutdown
升级过程:
-
1、下载解压安装包
官网下载对应版本的tar包,可通过wget下载或者本地下载后上传。 -
2、执行升级程序
在mysql8.0.16版本后只需要使用新版本软件包启动MySQL Server,此时Server会自动检查并执行第一步升级操作,升级数据字典表。 -
3、重启数据库并验证
-
4、卸载旧mysql数据库
-
5、设置MySQL8 自启动服务脚本
-
6、设置环境变量
参考资料:1, 2, 3