升级版本选择原则和建议
MySQL的升级需要遵循以下几条原则和建议:
支持从MySQL5.7升级到8.0,注意仅支持GA版本之间的升级。不支持跨大版本的升级,如从5.6升级到8.0是不支持的。建议升级大版本前先升级到当前版本的最近小版本,如5.7先升级到5.7.35后再升级到8.0。在大版本内部GA的小版本可以直接升级,如从8.0.9直接升级到8.0.26。
MySQL8.0的一些变化
在升级到8.0之前需要充分考虑版本变化带来的使用兼容性的问题,其中不兼容的部分需要特别关注,建议升级大版本前做充分的测试。下面简单介绍下MySQL8.0的部分变化。
数据字典
不同于之前的版本将字典数据存储在元数据文件和非事务系统表中,MySQL8.0将包含数据库对象的全局数据字典存储在事务表中。在使用上如果设置了innodb_read_only 参数会导致所有表的创建、删除、***yze、修改表引擎操作无法执行。CREATE TABLE dst_tbl LIKE src_tbl 要求src_tbl必须是base table。mysqldump和mysqlpump不会导出infor***tion_sche***,不会导出MySQL Sche***中数据字典表,需导出存储过程和事件需指定–routines和–events选项,并且用户需要全局selet权限。
Authentication Plugin
MySQL8.0将默认身份验证插件从mysql_native_password变更为caching_sha2_password,客户端需要验证现有版本是否支持。
Configuration ChangesMySQL8.0开始只有InnoDB和NDB引擎支持分区表,升级前需确保不存在非InnoDB引擎的分区表。部分error code被启用,详见https://dev.mysql.com/doc/ref***n/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] AbortingServer Changes8.0.11开始部分账户管理功能被删除,如Grant命令修改用户非权限特性,NO_AUTO_CREATE_USER模式,PASSWORD() 函数和 old_passwords 系统变量。8.0.11开始删除了部分兼容 SQL 模式:DB2、MAXDB、MSSQL、MYSQL323、MYSQL40、ORACLE、POSTGRESQL、NO_FIELD_OPTIONS、NO_KEY_OPTIONS、NO_TABLE_OPTIONS。从 MySQL 8.0.3 开始,空间数据类型允许 SRID 属性,以明确指示存储在列中的值的空间参考系统 (SRS)。并删除了部分非ST_前缀的空间函数。详见https://dev.mysql.com/doc/ref***n/8.0/en/mysql-nutshell.html#mysql-nutshell-removals在线切换binlog for***t增加了更多限制。InnoDB Changesinfor***tion_Sche***中,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)SQL changegroup by 不再支持DESC和ASC,GROUP BY {col_name | expr | position}, … [WITH ROLLUP]]保留字变更。https://dev.mysql.com/doc/ref***n/8.0/en/keywords.html升级后建议测试optimizer hints,在8.0中部分hint可能不再适用。部分默认配置的变化。
升级过程包含哪些操作
升级MySQL时需要对现版本MySQL中的数据字典和元数据等进行更新。在MySQL Sche***中需更新数据字典表和系统表,在其他Sche***中需要更新一些内置的MySQL持有的表,如perfor***nce_Sche***、infor***tion_sche***和sys sche***等。
升级过程大致分为两个部分,升级数据字典和升级服务。
升级数据字典包括升级MySQL Sche***中的数据字典表,以及perfor***nce sche***,infor***tion_sche***。升级数据字典表时,如当前版本低于期望版本,则服务器将创建新版本的数据字典表并将持久化的元数据拷贝到新表,在新旧表做原子性替换后重新初始化数据字典。服务器启动后会按需执行,可以使用 –upgrade=NONE(8.0.16以后)或–no-dd-upgrade (8.0.16之前)参数启动MySQL,阻止数据字典表的升级。升级服务及其余升级任务,包括MySQL Sche***中的非数据字典表,sys sche***和用户sche***。
在8.0.16之前需使用mysql_upgrade执行除数据字典表外的其余升级步骤,在8.0.16以后该步骤由MySQL服务在启动后执行。MySQL服务会根据升级到的版本以及in-place或logical升级的指示确定是否执行所有的升级步骤。
8.0.16开始启动参数–upgrade= 控制MySQL服务在启动时执行自动升级的动作。
升级前的检查
在执行升级操作前需要做一些检查工作,确认准备工作是否就绪,避免升级过程中出现异常。
可以使用MySQL Shell使用util.checkForServerUpgrade进行检查,返回内容包括不符合迁移要求的问题,error的问题需要迁移前修改。
下面的例子中就存在一个不兼容的问题,ymh.t1表是一个MyISAM引擎的分区表,需将该表引擎调整为innodb后方可升级。
MySQL Shell的
util.checkForServerUpgrade工具主要做了以下检查,当然我们也可以手动进行相关的检查。
不应存在以下问题使用过时的数据类型和函数的表。如5.6.4之前的不支持小数点的时间格式。需在执行In-place升级前执行repair table修复。没有孤立的.frm文件。触发器不能缺失或空的definer或无效的creation context。可执行以下命令检查上述问题:mysqlcheck -u root -p –all-databases –check-upgrade不应存在非InnoDB或NDB引擎的分区表,如存在需变更引擎或转换成非分区表。可通过以下SQL检查:检查是否使用了8.0新增的保留字。MySQL Sche***中不应存在8.0数据字典表同名的表,可用以下SQL检查:不得有外键约束名称长度超过 *** 个字符的表,如存在则删除后重建。可用以下SQL检查:sql_mode系统参数不能含前面提到弃用模式。视图中不能有显式定义超过***个字符的列名。可查看INFORMATION_SCHEMA.VIEWS检查。表和存储过程中单个枚举和SET列元素不能超过255个字符或1020个字节。升级到8.0.13版本前,包括系统表空间和通用表空间在内的共享表空间中不能存在表分区。查询和存储过程中不能在group by子句中使用ASC或者DESC。不能使用8.0中不支持的功能和配置参数。https://dev.mysql.com/doc/ref***n/8.0/en/added-deprecated-removed.html https://dev.mysql.com/doc/ref***n/8.0/en/mysql-nutshell.html#mysql-nutshell-removals从 MySQL 8.0.19 开始,如果lower_case_table_names=1,升级过程会检查表和模式名称以确保所有字符都是小写。如果发现表或架构名称包含大写字符,升级过程将失败并显示错误。
如果出现上述问题导致的升级失败,MySQL会将变更还原,这时删除redo log并重启5.7版本实例即可。注意关闭前一定设置innodb_fast_shutdown=0。
Linux系统升级Binary或Package-based安装的MySQL
在这种场景下可以选择in-place或者logical方式进行升级。
in-place升级
关闭现有版本MySQL,将二进制或包替换成新版本并在现有数据目录上启动MySQL并执行升级任务的方式,称为in-place升级。升级过程分为以下几步:
完成升级前检查,并处理不合规问题。如果使用了XA事务,升级前通过命令xa recover未提交XA事务,并使用xa commit或xa rollback命令提交或回滚。如当前版本低于5.7.11且使用了加密表空间,升级前轮换keyring的***ster keyALTER INSTANCE ROTATE INNODB MASTER KEY。将innodb_fast_shutdown改为0或1。关闭现版本MySQL。升级MySQL二进制文件或软件包。在现有数据目录上启动新版本MySQL。如果有加密的 InnoDB 表空间,请使用 –early-plugin-load选项加载keyring插件。如升级失败请删除redolog,启动5.7版本并修复错误,设置innodb_fast_shutdown为0后关闭MySQL。再使用8.0版本MySQL启动。如目标版本小于8.0.16,MySQL启动后还需执行mysql_upgrade后重启MySQL。
如下所示:
logical升级
逻辑升级是指使用逻辑备份从旧版本MySQL中导出数据,安装新版本MySQL并导入数据的升级方式。由于可能存在的不兼容问题会导致导入失败,导出前需要做升级前检查,导入前可能还需要对备份文件进行修改。
升级步骤如下:
对旧版本数据做全量导出。mysqldump -u root -p –add-drop-table –routines –events –all-databases –force > data-for-upgrade.sql关闭当前版本数据库。安装8.0版本数据库并初始化(从error log中获取’root’@’localhost’用户初始密码)。在新的数据目录中启动MySQL8.0,并重置初始密码。将备份文件导入mysql -u root -p –force < data-for-upgrade.sql。如导出文件包含系统表,则不建议导入时开启GTID(gtid_mode=ON)。执行剩余的升级操作。目标版本大于8.0.16时需重启服务器,启动时使用–upgrade=FORCE参数。8.0.16之前的版本先执行mysql_upgrade再重启MySQL。
墨天轮原文链接:https://***.modb.pro/db/135456?sjhy(***到浏览器或者点击“阅读原文”立即查看)
关于作者
杨明翰,云和恩墨服务总监。拥有MySQL、TDSQL、TiDB、openGauss等认证。长期从事MySQL、PG、Redis、MongoDB的数据库技术服务。现负责云和恩墨西区开源数据库交付运维工作;热衷于开源数据库产品的研究。
本文来自墨尔本·晴投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/649746.html