zoukankan      html  css  js  c++  java
  • MySQL8-软件升级

    mysql8 升级注意事项

    • 升级不可逆(即不支持降级),只能通过还原升级前的数据备份实现降级
    • 支持从MySQL 5.7升级到8.0,但不支持从非GA版本的MySQL 5.7升级
    • 建议先升级到最新版本,然后再升级到下一版本。
      • 例如,在升级到MySQL 8.0之前,先升级到最新的MySQL 5.7版本。
    • 不支持跳过大版本的升级。例如,不支持直接从MySQL 5.6升级到8.0
    • 不支持非GA版本软件升级

    升级底层变更细节

    • 更新mysql模式中的表对象

      • 数据字典表:用于存储数据库对象元数据
      • 系统表(即剩余的非数据字典表):用于其他操作目的
    • 更新其它模式中内置对象

      • performance_schema,INFORMATION_SCHEMA,sys 和 ndbinfo
      • 用户模式

    升级步骤

    更新数据字典

    • 模式中的数据字典表mysql 。如果实际数据字典版本低于当前预期版本,则服务器会创建具有更新定义的数据字典表,将持久化的元数据复制到新表中,用新表原子替换旧表,然后重新初始化数据字典。
    • performance_schema, INFORMATION_SCHEMAndbinfo

    服务器升级

    此步骤包括所有其他升级任务。如果现有MySQL安装的服务器版本低于新安装的MySQL版本的服务器版本,则其他所有内容都必须升级

    • 模式中的系统表mysql(其余的非数据字典表)。
    • sys schema
    • 用户架构
    从 MySQL 8.0.16 开始,此步骤的职责的变更
    • 在MySQL 8.0.16之前,需要手动调用mysql_upgrade工具升级performance_schema, INFORMATION_SCHEMA

    • 从MySQL 8.0.16开始,mysqld 工具自动完成由之前的mysql_upgrade工具处理的所有任务

      • 不再需要运行 mysql_upgrade,且不建议使用 mysql_upgrade
      • 从MySQL 8.0.16开始,由mysqld --upgrade 选项控制服务器在启动时是否以及如何执行自动升级
        • 不带--upgrade 选项或带 --upgrade=AUTO:Server启动时会尝试升级数据字典表和用户表
        • --upgrade=NONE:Server启动时不会执行任何的升级动作。但是当必须要升级数据字典时,Server将会异常退出并抛出错误
        • --upgrade=MINIMAL:Server启动时仅仅尝试执行数据字典的升级,其他的系统表、用户表等不会进行升级。这个选项和之前老的升级方式相同,必须再次使用mysql_upgrade 工具执行剩下的升级过程。然后需要再次重启Server。
        • --upgrade=FORCE:Server启动时强制执行升级过程。使用该选项启动时需要更长的时间检查所有的对象。
    mysql_upgrade 选项和mysqld 选项 类似等效命令
    mysql_upgrade选项 mysqld 选项
    --skip-sys-schema --upgrade=NONE 或者 --upgrade=MINIMAL
    --upgrade-system-tables --upgrade=NONE 或者 --upgrade=MINIMAL
    --force --upgrade=FORCE

    升级前准备

    不可以存在以下问题

    • 不得有使用过时数据类型或功能的表
    • 不能有孤立.frm文件
    • 触发器不能有空定义者或无效环境

    检查命令

    ${MYSQL_HOME}/bin/mysqlcheck -u root -p --all-databases --check-upgrade
    

    不得有使用不具有本机分区支持的存储引擎的分区表

    SELECT TABLE_SCHEMA, TABLE_NAME
    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 table_name REMOVE PARTITIONING;
    

    MyISAM 表转换为的信息InnoDB

    
    

    MySQL 5.7mysql系统数据库中的表不得 与MySQL 8.0数据字典使用的表同名

    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'
    );
    

    查询结果中任何表都必须删除或重命名

    不得有外键约束名称超过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);
    

    对于约束名称超过64个字符的表,请删除该约束并将其添加回不超过64个字符的约束名称

    sql_mode系统变量 不得定义过时的SQL模式

    不得有明确定义的列名超过64个字符的视图

    -- 检查视图定义
    SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS;
    

    表或存储过程中的单个 ENUMSET列元素的长度不得超过255个字符或1020个字节。

    升级到MySQL 8.0.13或更高版本之前,共享InnoDB表空间中不得存在任何表分区,共享表空间应包括系统表空间和常规表空间。

    通过查询来标识共享表空间中的表分区 INFORMATION_SCHEMA

    • 从MySQL 5.7升级
    SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
      WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';
    
    • 从早期的MySQL 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);
    

    MySQL 8.0.12或更低版本中不得有使用子句ASCDESC限定符的查询和存储程序定义GROUP BY

    如果打算lower_case_table_names在升级时将设置更改 为1,请在升级之前确保schema和表名均为小写

    检查包含大写字符的架构和表名称

    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != LOWER(TABLE_NAME) AND TABLE_TYPE = 'BASE TABLE';
    
    SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME != LOWER(SCHEMA_NAME);
    

    不建议升级中修改 lower_case_table_names 的设置

    从MySQL 8.0.19开始,如果lower_case_table_names=1,升级过程会检查表名和模式名,以确保所有字符均为小写。如果发现表或架构名称包含大写字符,则升级过程将失败并显示错误。

    升级失败处理

    如果由于上述任何问题升级到MySQL 8.0失败,则服务器会将所有更改都还原到数据目录。在这种情况下,请删除所有重做日志文件,然后在现有数据目录上重新启动MySQL 5.7服务器以解决错误。重做日志文件(ib_logfile*)默认位于MySQL数据目录中。修复错误之后,请执行缓慢关机(通过设置 innodb_fast_shutdown=0),然后再次尝试升级。

    升级过程

    MySQL二进制包软件升级

    就地升级方式

    检查未提交的XA事务
    XA RECOVER;
    
    从MySQL 5.7.11或更早版本升级到MySQL 8.0,并且有加密的 InnoDB表空间

    通过执行以下语句来旋转密钥环主密钥

    ALTER INSTANCE ROTATE INNODB MASTER KEY;
    
    快速或慢速关闭服务

    通过快速关闭或缓慢关闭,可以InnoDB 将其撤消日志和数据文件保持在可以处理的状态,以防两个版本之间的文件格式不同。

    SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
    SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown
    
    mysqladmin -uroot -p --innodb_fast_shutdown=0 shutdown
    
    升级MySQL二进制文件或软件包
    # 1. 删除软连接
    unlink mysql 
    
    # 2. 解压二进制包新版本软件
    tar -xf mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz -C /usr/local
    # 3. 创建软链接
    ln -s /usr/local/mysql-8.0.18-linux-glibc2.12-x86_64 mysql
    # 4. 修改软件目录用户及用户组
    chow -R mysql:mysql /usr/local/mysql-8.0.18-linux-glibc2.12-x86_64
    
    使用现有数据目录启动MySQL 8.0服务
    • 8.0.16 开始
    mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
    
    • 在MySQL 8.0.16之前

      mysql_upgrade -u root -p
      mysqladmin -u root -p shutdown
      mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
      
    如果存在加密的InnoDB 表空间

    使用 mysqld --early-plugin-load="myplug1=myplug1.so;myplug2=myplug2.so" 选项加载密钥环插件

  • 相关阅读:
    SAP S/4HANA extensibility扩展原理介绍
    SAP CRM系统订单模型的设计与实现
    使用nodejs代码在SAP C4C里创建Individual customer
    SAP Cloud for Customer Account和individual customer的区别
    Let the Balloon Rise map一个数组
    How Many Tables 简单并查集
    Heap Operations 优先队列
    Arpa’s obvious problem and Mehrdad’s terrible solution 思维
    Passing the Message 单调栈两次
    The Suspects 并查集
  • 原文地址:https://www.cnblogs.com/binliubiao/p/14447084.html
Copyright © 2011-2022 走看看