一、注意事项:
mysql从5.7升级到8.0是支持的,但是只支持GA版本的升级,并且要求版本为5.7.9或者更高
在升级到8.0之前,建议升级到5.7的最新版本。仅仅支持从5.7版本升级到8.0,不支持5.6版本升级到8.0
二、升级准备工作:
1,备份数据(包括当前的数据库和日志文件)
2,升级检查:mysqlcheck -u root -p --all-database --check-upgrade
3,检查分区表(不支持分区的存储引擎)select table_schema,table_name from information_schema.tables where engine not in ('innodb','ndbcluster') and create_options like '%partitioned');
如果存在记录,必须把对应表修改为innodb引擎或者把表修改为非分区的(alter table table_name engine=INNODB或alter table table_name remove partitioning);
4,在mysql数据库中,必须不存在与mysql8.0数据字典相同名称的表。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'
); 所有同名的表必须要重命名。
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,必须要确保不存在拥有ENUM或者SET列元素并且超过255字符或者1020字节长度的表和存储过程
7,mysql5.7中必须不使用8.0不支持的特性。例如NDB引擎,8.0不再支持;部分启动选项不再支持:例如--ignore-db-dir已被移除。
8,如果innodb使用了XA事务,确保所有XA事务提交或者回滚。
9,如果存在加密的innodb表空间,执行语句:alter instance rotate innodb master key;
10,如果mysql5.7启动设置了innodb_fast_shutdown参数为2(冷停止),通过设置参数为1或者0来实现快速或者慢停止。
set global innodb_fast_shutdown=1; ---fast shutdown
set global innodb_fast_shutdown=0; ---slow shutdown
11,停止数据库:mysqladmin -u root -p shutdown
三、升级过程:
1,下载mysql 8.0包,解压
2,启动mysql 8.0:mysqld_safe --mysql=mysql --datadir=/existing-datadir(该目录为需要升级的数据库数据目录)
3,如果存在加密的innodb表空间,使用--early-plugin-load选项去加载钥匙插件
4,在启动mysql8.0服务器后,它会自动检测数据字典表是否存在,如果没有,他会创建他们,并通过元数据来填充他们。在此过程中,服务器将升级元数据
对于所有数据库对象,包括数据库、表空间、系统和用户表、视图,以及存储程序(存储过程和函数、触发器、事件调度程序事件)。服务器同时删除以前用于元数据存储的文件。
例如,升级后,您将注意到您的表不再有.frm文件。
5,如果4步骤执行完成,server将会创建一个backup_metadata_57的目录,目录中将会备份db.opt及以.frm,.par,.TRG,.TRN,.isl
6,在启动成功后,执行命令:mysql_upgrade -u root -p
7,命令执行完成后,停止数据库,再启动数据库查看升级结果:
mysqladmin -u root -p shutdown
mysqld_safe --user=mysql --datadir=/data
8,升级完成后,caching_sha2_password和sha256_password将替代mysql_native_password:
alter user user identified with caching_sha2_password by 'password';
9,低于8.0版本的客户端连接服务器,出现身份验证兼容问题,可以加入参数:
[mysqld]
default_authentication_plugin=mysql_native_password
但是这个参数只能作为临时使用。
四、升级变动:
1,字符集修改:默认字符集由latin1变为utf8mb4(character_set_server,character_set_database),latin1_swedish_ci变为utf8md4_0900_ai_ci(collation_server,collation_database)
2,grant语句去修改用户非特权特性;NO_AUTO_CREATE_USER sql mode;PASSWORD()方法;old_passwords系统变量;这些都被移除。
3,innodb修改:基于系统表的information_schema视图都被基于数据字典表的内部系统视图替代:
Old Name New Name
INNODB_SYS_COLUMNS INNODB_COLUMNS
INNODB_SYS_DATAFILES INNODB_DATAFILES
INNODB_SYS_FIELDS INNODB_FIELDS
INNODB_SYS_FOREIGN INNODB_FOREIGN
INNODB_SYS_FOREIGN_COLS INNODB_FOREIGN_COLS
INNODB_SYS_INDEXES INNODB_INDEXES
INNODB_SYS_TABLES INNODB_TABLES
INNODB_SYS_TABLESPACES INNODB_TABLESPACES
INNODB_SYS_TABLESTATS INNODB_TABLESTATS
INNODB_SYS_VIRTUAL INNODB_VIRTUAL
4,undo表空间不再基于系统表空间,而是拥有独立的表空间
5,SQL修改,到了8.0.13,之前的基于group by语法的asc和desc限定词被移除,使用order by替代。
欢迎大家关注以下公众号进行数据库方面知识探讨: