MySQL 升级

来自Linux78|wiki

升级方法

MySQL推荐两种升级方式:就地升级和逻辑升级。

就地升级需要关闭旧版本的MySQL,替换当前的二进制文件或包,然后在现有的数据目录上重启MySQL,并运行mysql_upgrade。

逻辑升级需要使用备份或导出语句从旧版本的MySQL中导出SQL语句,然后安装新版本,在新版本的基础上执行导出的SQL语句。

使用旧版本导出的SQL语句在新版本中可能会报错,所以请预先使用checkForServerUpgrade脚本进行检查,使逻辑升级能够顺利进行。

升级路线

MySQL支持从5.7版本升级到8.0,仅限于正式发行版,即GA版。

MySQL支持逐级升级,不可跳级。例如,要想升级到MySQL 8,必须先升级到5.7版本,5.6版本无法直接升级到8版本。

一旦发行系列到达稳定版状态,正式发行版之间可以直接进行升级。例如,MySQL 8.0.x可升级至8.0.y,也可升级至8.0.z。

MySQL 8.0.11是MySQL 8.0发行系列的第一个正式发行版本。

升级前的准备

首先需要备份当前数据库和日志文件。备份内容应包含mysql系统数据库,涵盖MySQL数据字典表和系统表。

MySQL 8包含一个全局数据字典。在之前的MySQL版本中,字典数据存储在元数据文件和非事务的系统表中。将MySQL 5.7升级到8时,需将数据目录从基于文件的结构升级到基于数据字典的结构。

升级前需检查版本之间的兼容问题,重点检查新特性、过时或废弃特性以及一些影响应用的改变,在升级前后及时处理以确保应用正常运行。

验证MySQL 5.7升级到8前的先决条件

(1)确保没有使用过时的数据类型、函数和单独的frm文件的数据库表、非本地分区的InnoDB引擎表以及没有定义的触发器。检查命令如下:

   mysqlcheck -u root -p --all-databases --check-upgrade

(2)确保已分区的数据库表使用的存储引擎都支持本地分区。检查命令如下:

   SELECT TABLE_SCHEMA, TABLE_NAME
   FROM INFORMATION_SCHEMA.TABLES
   FROM INFORMATION_SCHEMA.TABLES
   WHERE ENGINE NOT IN ('innodb', 'ndbcluster')
   AND CREATE_OPTIONS LIKE '%partitioned%';

上述语句中查询出的数据库表可通过两种方式进行修正,将存储引擎改为InnoDB或移除表的分区。命令如下:

   #设置表的存储引擎为InnoDB
   ALTER TABLE table_name ENGINE = INNODB;
   #移除表分区
   ALTER TABLE tablename REMOVE PARTITIONING;

(3)确保MySQL 5.7版本中mysql系统数据库中的表名与MySQL 8数据字典的表名不重复。检查命令如下:

   SELECT TABLE_SCHEMA, TABLE_NAME
   FROM INFORMATION_SCHEMA.TABLES
   WHERE LOWER(TABLE_SCHEMA) = 'mysql'
   and LOWER(TABLE_NAME) IN
   (
   'catalogs',
   'character_sets',
   'collations',
   'column_statistics',
   'column_type_elements',
   'columns',
   'dd_properties',
   'events',
   'foreign_key_column_usage',
   'foreign_keys',
   'index_column_usage',
   'index_partitions',
   'index_stats',
   'indexes',
   indexes',
   'parameter_type_elements',
   'parameters',
   'resource_groups',
   'routines',
   'schemata',
   'st_spatial_reference_systems',
   'table_partition_values',
   'table_partitions',
   'table_stats',
   'tables',
   'tablespace_files',
   'tablespaces',
   'triggers',
   'view_routine_usage',
   'view_table_usage'
   );

(4)确保外键限制名称均不超过64个字符。检查命令如下:

(5)确保数据库表或程序使用单独的枚举或设置列元素的长度不超过255个字符或1020个字节。

(6)确保本地的MySQL 5.7版本中未使用在MySQL 8中已不再提供支持的特性。

就地升级

(1)参考第三条中升级前的准备,做好准备工作。

(2)关闭MySQL 5.7服务。

(3)替换二进制文件或安装包。

(4)启动MySQL 8服务,使用现有的数据目录,参考命令如下:

   mysqld_safe --user=mysql --datadir=/path/to/existing-datadir

(5)MySQL 8.0服务启动成功之后,运行如下命令:

   mysql_upgrade -u root -p

这个命令可以检查当前数据库中所有不兼容的表。

(6)关闭并重启服务,确保所有更改已生效。参考命令如下:

   mysqladmin -u root -p shutdown
   mysqldsafe --user=mysql --datadir=/path/to/existing-datadir

升级问题

(1)在MySQL 5.7中,frm表文件和InnoDB数据字典模式不匹配会导致升级失败。

(2)如果出现mysqld服务无法启动的情况,检查是否存在旧的配置文件。

(3)如果升级后客户端程序编译报错,检查一下是否使用了旧的头文件或库文件。

(4)如果升级后自定义函数名称与新版本的函数名称重复,那么自定义函数将无法被使用,需要使用DROP FUNCTION命令移除函数后再使用CREATE FUNCTION命令重新创建不重名的函数。