赞
踩
一、升级建议
- 参考文献如下:
- https://www.modb.pro/doc/110172
- https://www.modb.pro/db/135456
- https://www.modb.pro/doc/6313
- https://blog.csdn.net/qq961573863/article/details/133957715?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-133957715-blog-89511734.235^v38^pc_relevant_sort&spm=1001.2101.3001.4242.2&utm_relevant_index=4
-
-
- 支持从MySQL5.7升级到8.0,注意仅支持GA版本之间的升级:包名带glibc的安装包。同时包名称中glibc的版本必须相同,否则可能会出现很多依赖问题。不支持跨大版本的升级,如从5.6升级到8.0是不支持的。建议升级大版本前先升级到当前版本的最近小版本,如5.7先升级到5.7.35后再升级到8.0。在大版本内部GA的小版本可以直接升级,如从8.0.9直接升级到8.0.26。其他不同的安装包类型直接不支持直接升级。
- 某银行内部的数据库版本mysql5.7最低的版本是:mysql5.7.22.
- 经过多次测试发现mysql5.7.22 及以上版本可以直接升级到mysql8.0.33。
二、MySQL8.0的新特性
(1)数据字典
不同于之前的版本将字典数据存储在元数据文件和非事务系统表中,MySQL8.0将包含数据库对象的全局数据字典存储在事务表中。在使用上如果设置了innodb_read_only 参数会导致所有表的创建、删除、analyze、修改表引擎操作无法执行。CREATE TABLE dst_tbl LIKE src_tbl 要求src_tbl必须是base table。mysqldump 和 mysqlpump不会导出information_schema,不会导出mysql schema中数据字典表,需导出存储过程和事件需指定–routines 和 --events 选项,并且用户需要全局selet权限。
(2)认证插件
MySQL8.0将默认身份验证插件从mysql_native_password变更为caching_sha2_password,客户端需要验证现有版本是否支持。
(3)配置改变
- MySQL8.0开始只有innodb和NDB引擎支持分区表,升级前需确保不存在非innodb引擎的分区表.
- 部分error code被启用,详见https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals
- 默认字符集从latin1变更为utf8mb4,默认排序规则为utf8mb4_0900_ai_ci。
- 注意这可能会导致新旧数据库对象的字符集不一致,造成隐式类型转换的问题。
- 8.0.11版本开始,如使用与初始化配置不同的 lower_case_table_names 值启动数据库时会报错
- [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').
- [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
- [ERROR] [MY-010119] [Server] Aborting
(4)服务器端的变化
- 8.0部分账户管理功能被删除,如Grant命令修改用户非权限特性,NO_AUTO_CREATE_USER模式,PASSWORD() 函数和 old_passwords 系统变量。8.0删除了部分兼容 SQL 模式:DB2、MAXDB、MSSQL、MYSQL323、MYSQL40,ORACLE,POSTGRESQL,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS。
- 空间数据类型允许 SRID 属性,以明确指示存储在列中的值的空间参考系统 (SRS)。并删除了部分非ST_前缀的空间函数。详见https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals
- 在线切换binlog format增加了更多限制。
(5)INNODB存储引擎方面的变化
- information_Schema中,innodb_sys_% 改名为 innodb_%
- zlib库版本从1.2.3升级到1.2.11
- 只读变量innodb_directories应该包含file-per-table 和绝对路径创建的通用表空间文件的路径。
- undo日志从系统表空间移出。默认会在innodb_undo_directory指定位置(未指定则在data dir)创建两个undo表空间。从5.7升级到8.0时innodb-fast-shutdown需设置成0.
- 8.0.17开始在创建表空间时,路径不允许含 circular directory reference(/../);升级前可以查询INFORMATION_SCHEMA.INNODB_DATAFILES 表检查表空间路径
- mysql> CREATE TABLESPACE ts11 ADD DATAFILE '/data/mysql/log/test/../ts11.ibd';
- ERROR 3121 (HY000): The ADD DATAFILE filepath cannot contain circular directory references.
- mysql> CREATE TABLESPACE ts11 ADD DATAFILE '/data/mysql/log/ts11.ibd';
- Query OK, 0 rows affected (10.02 sec)
(6)SQL方面的变化
- group by 不再支持DESC和ASC,GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
- 保留字变更https://dev.mysql.com/doc/refman/8.0/en/keywords.html
- 升级后建议测试 optimizer hints,在8.0中部分hint可能不再适用
(7)隐藏索引
- 隐藏索引的特性对于性能调试非常有用。在 8.0 中,索引可以被“隐藏”和“显示”。当一个索引隐藏时,它不会被查询优化器所使用。也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。 如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可; 如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了。隐藏一个索引的语法是:
- ALTER TABLE t ALTER INDEX i INVISIBLE;
- 恢复显示该索引的语法是:
- ALTER TABLE t ALTER INDEX i VISIBLE;
- 当一个索引被隐藏时,我们可以从 show index 命令的输出中看到,该索引的 Visible 属性值为 NO。注意:当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的,这个特性本身是专门为优化调试使用。如果你长期隐藏一个索引,那还不如干脆删掉,因为毕竟索引的存在会影响插入、更新和删除的性能。
(8)设置持久化
- MySQL 的设置可以在运行时通过 SET GLOBAL 命令来更改,但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。
- MySQL 8 新增了 SET PERSIST 命令,例如:
- SET PERSIST max_connections = 500;
- MySQL 会将该命令的配置保存到数据目录下的 mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件
(9)通用表达式
- 复杂的查询会使用嵌入式表,例如:
- SELECT t1.*, t2.* FROM (SELECT col1 FROM table1) t1,(SELECT col2 FROM table2) t2;
- 而有了 CTE,我们可以这样写:
- WITH t1 AS (SELECT col1 FROM table1),
- t2 AS (SELECT col2 FROM table2)
- SELECT t1.*, t2.*
- FROM t1, t2;
- 这样看上去层次和区域都更加分明,改起来也更清晰的知道要改哪一部分。
(10)窗口函数
MySQL 被吐槽最多的特性之一就是缺少 rank() 函数,当需要在查询当中实现排名时,必须手写 @ 变量。但是从 8.0 开始,MySQL 新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数有点像是 SUM()、COUNT() 那样的集合函数,但它并不会将多行查询结果合并为一行, 而是将结果放回多行当中。也就是说,窗口函数是不需要 GROUP BY 的。
(11)新的数据类型
其中一个重要的新数据类型是GEOMETRY,用于处理地理空间数据。这个数据类型使得存储和查询地理信息变得更加容易。还有一个新的数据类型是UUID,用于存储全局唯一标识符。这对于需要在多个系统之间唯一标识数据的应用程序非常有用。这些新的数据类型扩展了MySQL的功能,使其更适合不同类型的应用程序和用例。
(12)性能改进
性能一直是数据库管理的重要关注点。MySQL 8带来了一系列性能改进,以提高数据库的响应能力。首先,MySQL 8改进了查询优化器。新的查询优化器使用了一种新的执行计划生成器,可以更好地处理复杂查询。这意味着查询在执行时更加高效,可以提供更快的响应时间。此外,MySQL 8引入了新的多线程复制机制。这一机制可以提高数据复制的速度,从而减少了主从复制之间的延迟。对于那些需要处理大量事务的应用程序,这是一个重要的性能改进。
(13)INNODB存储引擎的改进
InnoDB存储引擎一直是MySQL的默认存储引擎,而MySQL 8进一步改进了它的性能和稳定性。首先,MySQL 8引入了新的InnoDB事务日志格式,称为"redo log"。这个新的事务日志格式提高了并发性和可伸缩性,从而允许更多的并发操作。此外,InnoDB现在支持全文本搜索。这意味着开发人员可以在使用InnoDB存储引擎的应用程序中进行全文本搜索,而不必依赖于其他存储引擎。
(14)变更汇总
- 默认字符集由latin1变为utf8mb4。
- MyISAM系统表全部换成InnoDB表。
- JSON特性增强。
- 支持不可见索引,支持直方图。
- sql_mode参数默认值变化。
- 默认密码策略变更。
- 新增角色管理。
- 支持窗口函数,支持Hash join
- 普通的MyISAM引擎表修改INNODB
(15)测试发现的过期参数
- 'query_cache_type=1' --不支持注释。
- 'query_cache_size=1M' --不支持
- 'innodb_undo_logs=128' --不支持
- innodb_large_prefix--不支持
- show_compatibility_56=on--不支持
- innodb_log_file_size --不支持
- innodb_log_files_in_group--不支持
-
- 测试发现,这些参数mysql5.7支持,MySQL8.0过期或不支持,可以从参数文件中移除。
- SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
- 或者:
- SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown
-
-
- innodb_fast_shutdown这个参数升级前不能设置为2;否则升级后,无法启动数据库。
三、mysql5.7.22升级到MySQL8.0.33升级步骤
(1)备份数据
- 备份永远是重中之重,无论是物理备份还是逻辑备份,至少需要有一个有效的备份。先备份再升级。以防备份出错。
- 升级前innodb_fast_shutdown不能等于2;
- SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
- SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown
- 同时需要确认没有加密表空间,如果有加密表空间执行如下。
- ALTER INSTANCE ROTATE INNODB MASTER KEY;
- https://dev.mysql.com/doc/refman/8.0/en/upgrade-binary-package.html
(2)升级前检查
注意:升级前GTID编号=3
(3)停止mysql5.7.22
(14)mysql8.0.33安装目录启动
旧的mysql5.7.22的目录mysql 替换为:mysql7 ,新目录mysql8.0.33的mysql8修改为mysql
(5)mysql8.0.33升级
对于mysql8.0.16之后的版本升级,启动即升级。
- 可以看到使用MySQL8.0.33的安装包启动后,启动过程自动升级。
- 我们开启了BINLOG,GTID,升级过程未发生事务的变化,GTID的编号升级前后都是3。所以如果给从库,升级不会造成主/从库的GTID的变化,所以升级后,从库开启主从同步,可以继续同步。当然,我们升级的是主库,主从升级步骤一致,不同的是从库需要停止同步,升级结束后再开启同步。
- 数据检查:
四、其他低版本MySQL升级方案说明
其他低版本的MySQL 升级到高版本MySQL,建议采用 备份恢复+主从同步 的方式实现升级。同时,尽量使用带glibc的安装包,这类安装包,可以自定义程序安装目录,方便升级。同时也是MySQL推荐的稳定版本。不建议安装rpm安装包,这类安装包,好安装,但是不好升级。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。