MySQL5.7升级版本到8.0
升级⼆进制包安装的MySQL
In-Place Upgrade(替代升级)
替代升级涉及到shutdown down旧版本的MySQL,⽤新版本的包替代旧版本的⼆进制包,⽤存在的数据⽂件⽬录重启MySQL,升级剩余需要升级的部分。
1.查看章节 ‘Before You Begin’
2.通过 ‘预先检查环节’,确保升级准备已完成,否则升级过程会失败
预先准备:
1)以下问题必须没有出现
·必须确保没有表⽤到废弃的数据类型或函数,如有使⽤upgrade them using REPAIR TABLE
·必须没有单独的.frm⽂件,跟.ibd⽂件是成对存在
·触发器必须是正常的
为检查这些问题,可以执⾏这个命令:
mysqlcheck -u root -p --all-databases --check-upgrade
2)检查分区表是否使⽤了不⽀持本地分区的存储引擎
使⽤这个命令检查:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE NOT IN ('innodb', 'ndbcluster')
AND CREATE_OPTIONS LIKE '%partitioned%';
任何由上边查询出来的表,可以通过命令更改存储引擎
ALTER TABLE table_name ENGINE = INNODB;
让分区表不分区,通过命令:
ALTER TABLE table_name REMOVE PARTITIONING;
3)保留字的问题
语句中使⽤到的保留字要⽤backtick[反引号]标识,才可⽤
4)确保在现有的mysql系统库没有8.0要⽤到的表名相同的表,如有要rename表名或删除
查询命令:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE LOWER(TABLE_SCHEMA) = 'mysql'
and LOWER(TABLE_NAME) IN
(
'catalogs',
'character_sets',
'check_constraints',
'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)必须没有表外键名称超过64个字符
查询命令:
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);
6)必须确保升级后没有废弃的SQL mode系统参数,sql mode不能包含NO_AUTO_CREATE_USER,否则启动不了;
推荐sql mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
7)视图的字段名超过64个字符要整改(5.7是可以达255字符长)
8)确认没有存储过程的 ENUM或SET 字段超过255个字符
9)确保没有表分区在共享表空间内
查询命令:
SELECT DISTINCT NAME, SPACE, SPACE_TYPE
FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';
从⼀个⽐较早版本的8.0版本则⽤这个查询:
SELECT DISTINCT NAME, SPACE, SPACE_TYPE
FROM INFORMATION_SCHEMA.INNODB_TABLES
WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';
移动分区到单独表空间:
ALTER TABLE table_name REORGANIZE PARTITION partition_name
INTO (partition_definition TABLESPACE=innodb_file_per_table);
10)没有查询⽤到了ASC/DESC跟在group by后的从句
11)⼀些启动的条件被移除了在8.0
12)区分⼤⼩写,如要设置 lower_case_table_names=1,确保没有⼤写字符:
查看表或schema是否有⼤写字符,查看命令:
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != LOWER(TABLE_NAME) AND TABLE_TYPE = 'BASE TABLE';
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME != LOWER(SCHEMA_NAME);
假如在超出以上问题的情况下升级到8.0失败,server会恢复对数据⽬录所做的所有改变。在这种情况,删除redo log files并重启5.7 server⽤存在的数据⽬录来解决错误。
重启的时候会重新产⽣redo log⽂件。解决了报错在尝试重新进⾏升级。
3.假如你有⽤XA transactions,执⾏ or 进⾏解决
4.假如有加密的表空间,执⾏:ALTER INSTANCE ROTATE INNODB MASTER KEY;
5.设置innodb_fast_shutdown
mysql> SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
mysql> SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown,推荐
在⼀个fast/slow shutdown模式,undo logs和data files处于⼀种处理不同版本的⽂件格式的状态,利于升级
6.关闭MySQL
之前下过mysql现在重新下载mysql# mysqladmin -u root -p shutdown --socket=/data/mysql/mysql.sock
7.解压MySQL8.0⼆进制包
8.启动MySQL8.0,⽤存在的数据⽬录
# mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
当你启动MySQL8的时候,为所有数据库的对象升级元数据,并删除.frm⽂件(记录元数据的存储介质)
9.在上个步骤,server升级了数据字典;现在执⾏剩余的升级操作:
·⼤于MySQL8.0.16版本,启动MySQL时升级了数据字典并更新了各个系统库的表、检查各个业务库是否兼容当前8.0版本。说⼈话就是第8个步骤执⾏完就等于升级成功(如没有报错)·对于MySQL8.0.16版本之前的版本,之前以上步骤只是升级了数据字典,启动成功之后还需执⾏mysql_upgrade来执⾏剩余的升级步骤
mysql_upgrade -u root -p
然后关闭并新启动MySQL,确保对系统表所做的更改⽣效:
mysqladmin -u root -p shutdown
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
在第⼀次启动MySQL8.0时你会注意到错误⽇志有忽略未升级的表,如果mysql_upgrade执⾏成功,第⼆次启动的时候就没有这样的错误了
Logical Upgrade(逻辑升级)
1.查看信息章节,.
2.导出数据
mysqldump -u root -p
--add-drop-table --routines --events
--all-databases --force > data-for-upgrade.sql
注释:--routines and --events是导出存储过程,--all-databases会把mysql系统库也导出来
有创建虚拟列(generated column)的要规避,避免导⼊出现语法错误
3.导⼊上个步骤的dump⽂件到新的MySQL实例(即MySQL8.0版本)
mysql -u root -p --force < data-for-upgrade.sql
4. 执⾏⼀些剩余的升级操作
在MySQL8.0.16或更⾼版本,关闭server,再重启server带 --upgrade=FORCE条件来执⾏剩余的升级操作
mysqladmin -u root -p shutdown
mysqld_safe --user=mysql --datadir=/path/to/8.0-datadir --upgrade=FORCE &
带着--upgrade=FORCE重启,server做⼀些mysql升到mysql8所需的改动,也做⼀些performance_schema、information_schema、sys和业务库到mysql8版本的兼容问题
在MySQL8.0.16之前的版本
升级
# mysql_upgrade -u root -p
重启⽣效
# mysqladmin -u root -p shutdown
# mysqld_safe --user=mysql --datadir=/path/to/8.0-datadir &
5.注意是否需要删除MySQL系统库的event和proc表
DROP TABLE mysql.event;
DROP TABLE mysql.proc;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论