如何正确升级mysql到8.0版本

一、注意事项:

    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替代。

    欢迎大家关注以下公众号进行数据库方面知识探讨:

如何正确升级mysql到8.0版本_第1张图片

 

你可能感兴趣的:(mysql)