MySQL8.0已经推出2年多了,是时候考虑将您的MySQL升级至8.0版本了。在升级之前需要考虑哪些因素呢?本文将为您解答。
看过之前文章升级吗?的朋友可能已经了解MySQL8.0推出了一款升级检查工具,使用它,可以对正在使用的MySQL5.7进行一个全方位的检查,主要内容包括以下十个方面:
一,MySQL8.0使用了新的数据字典,数据字典的内容以InnoDB表的形式保存在系统数据库mysql下面,因此,需要检查现有的数据库里面是否存在重名的表,如果存在,需要进行更改。表名包括‘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’, ‘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’。可以在5.7里面执行下面的语句来确认是否存在重名的表。
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',
'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'
);
二,数据类型。如果表字段使用了过于“古老”的数据类型,升级8.0将会产生错误。可以在5.7版本里面执行CHECK TABLE…FOR UPGRADE或mysqlcheck来识别这些表。这些表无法升级,可以通过执行REPAIR TABLE进行修复。
三,MySQL8.0的分区表不支持非原生分区,如果有该类型的表,将无法升级。可以执行下面的SQL找出是否存在该类型的表。
SELECT
TABLE_SCHEMA, TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
WHERE
ENGINE NOT IN ('innodb' , 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';
可以将这类表的存储引擎转换为InnoDB或者是删除分区。
四,MySQL 5.0.17之前的CREATE TRIGGER不支持定义属性。这类触发器可以在5.7版本通过运行mysqlcheck 使用check-upgrade 选项或者运行 CHECK TABLE 识别。
五,在MySQL 8.0之前的版本中,当用户未明确指定表名时,InnoDB通过在表名后附加'_ibfk_X'(其中X是数字)来自动生成外键约束名。如果表名是多字节64个字符,自动生成的外键约束名称将超过64个字符,MySQL8.0将无法支持。可以通过下面的SQL别该类表:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN
(SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1),INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1)
FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE
LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);
这类表可以通过删除约束并通过添加具有显式约束名称的约束来进行更改。
六,在MySQL 8.0之前,用户可以使用最多255个字符的显式列名称创建视图。MySQL 8.0不支持显式列名大于64个字符的视图。可以通过 在MySQL 5.7中执行SHOW CREATE VIEW来识别这些视图。
七,在MySQL 8.0之前,所有枚举元素以2字节存储在FRM文件中,总长度可能会达到约64k,因此,可以使用大于255个字符的枚举元素创建表和存储过程。但是在MySQL 8.0中,不支持包含于255个字符的表或存储过程。升级之前应该更改这些表或存储过程。
八,升级“ frm”文件和InnoDB字典中元数据信息不匹配的表会导致错误。原因可能是frm损坏。在升级之前,可以通过dump和restore此类表。
九,空间函数。为了统一命名规则,8.0删除了一部分空间函数名称(多名称函数,例如:PointFromText),并且为了统一命名规则,函数使用ST_ 前缀执行精确操作、MBR_前缀用于执行基于最小边界矩形的操作。删除的函数如下,必须为其加上ST或MBR前缀:
ST:Area()
, AsBinary()
, AsText()
, AsWKB()
, AsWKT()
, Buffer()
, Centroid()
, ConvexHull()
, Crosses()
, Dimension()
, Distance()
, EndPoint()
, Envelope()
, ExteriorRing()
, GeomCollFromText()
, GeomCollFromWKB()
, GeomFromText()
, GeomFromWKB()
, GeometryCollectionFromText()
, GeometryCollectionFromWKB()
, GeometryFromText()
, GeometryFromWKB()
, GeometryN()
, GeometryType()
, InteriorRingN()
, IsClosed()
, IsEmpty()
, IsSimple()
, LineFromText()
, LineFromWKB()
, LineStringFromText()
, LineStringFromWKB()
, MLineFromText()
, MLineFromWKB()
, MPointFromText()
, MPointFromWKB()
, MPolyFromText()
, MPolyFromWKB()
, MultiLineStringFromText()
, MultiLineStringFromWKB()
, MultiPointFromText()
, MultiPointFromWKB()
, MultiPolygonFromText()
, MultiPolygonFromWKB()
, NumGeometries()
, NumInteriorRings()
, NumPoints()
, PointFromText()
, PointFromWKB()
, PointN()
, PolyFromText()
, PolyFromWKB()
, PolygonFromText()
, PolygonFromWKB()
, SRID()
, StartPoint()
, Touches()
, X()
, Y()
.
MBR:
Contains()
, Disjoint()
, Equals()
, Intersects()
, Overlaps()
, Within()
十,升级之前,必须关闭innodb_fast_shutdown 值设置为0或 1的MySQL 5.7服务器。这将确保InnoDB重做日志为空,否则将会报错。
此外,还有其它一些需要考虑的事项:
默认身份验证插件已更改为“ caching_sha2_password”,它提供比“ sha256_password”更安全的密码比“ mysql_native_password”插件更好的性能。升级到MySQL 8.0后,可能会导致某些应用程序与“ caching_sha2_password”插件相关的错误。原因是客户端/连接器尚未支持'caching_sha2_password'插件。
MySQL 8.0中更改了几个默认值。最重要的是“ character_set_server”和“ character_set_database”的默认值从“ latin1”更改为“ utf8mb4”。“ collation_server”和“ collation_database”的默认值已从“ latin1_swedish_ci”更改为“ utf8mb4_0900_ai_ci”。由于默认值的更改有可能在升级到MySQL 8.0产生影响。
UNDO日志将从系统表空间移出,并且innodb_undo_tablespaces设置为最小值和默认值“两个”UNDO表空间。系统表空间不能用于MySQL 8.0中的UNDO日志。用户可以灵活地配置UNDO日志表空间,并且可以不停机的情况下截断UNDO日志表空间。
从包含加密数据文件的MySQL 5.7升级需要一个额外的步骤:应该执行ALTER INSTANCE ROTATE INNODB MASTER KEY,以确保它与复制一起正常工作。
以上内容是从5.7升级至8.0之前应考虑的因素,请在升级前务必确认相关内容。
感谢您关注“MySQL解决方案工程师”!