文档首页/ 数据复制服务 DRS/ 用户指南(巴黎区域)/ 常见问题/ 实时迁移/ 低版本迁移至MySQL 8.0,应该注意哪些问题
更新时间:2023-01-05 GMT+08:00

低版本迁移至MySQL 8.0,应该注意哪些问题

MySQL 8.0较MySQL 5.7增加了一些新的特性,并在性能表现上存在差异。迁移前,需要做兼容性分析并给出解决方案。可以从兼容性、系统变量等方面考虑。

  • 兼容性分析:

    针对MySQL8.0社区版与MySQL5.7社区版进行分析,包括以下两方面:

    1. 不影响迁移,但使用方法出现差异。

      兼容性

      检查项

      作用

      状态

      解决方案

      数据类型或函数

      ENCODE()函数

      加密

      移除

      AES_ENCRYPT()函数代替

      DECODE()函数

      解密

      移除

      AES_DECRYPT()函数代替

      ENCRYPT()函数

      加密

      移除

      SHA2()函数代替

      DES_ENCRYPT()函数

      加密

      移除

      AES_ENCRYPT()函数代替

      DES_DECRYPT()函数

      解密

      移除

      AES_DECRYPT()函数代替

      JSON_APPEND()函数

      增加json元素

      移除

      JSON_ARRAY_APPEND()函数代替

      PASSWORD()函数

      修改用户密码

      移除

      ALTER USER user IDENTIFIED BY 'auth_string';

      JSON_MERGE()函数

      将多个json合并为一个

      废弃

      JSON_MERGE_PERSERVE()函数代替

      SQL MODE

      NO_AUTO_CREATE_USER、DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS

      -

      移除

      -

      外键约束长度

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

      使用ALTER TABLE调整长度

      features

      GRANT创建用户

      -

      移除

      CREATE USER

      GRANT修改用户信息

      -

      移除

      ALTER USER

      IDENTIFIED BY PASSWORD 'auth_string'

      设置密码

      移除

      IDENTIFIED WITH auth_plugin AS 'auth_string'

      SQL语句中的\N

      NULL

      移除

      NULL代替

      PROCEDURE ANALYSE()语法

      对MySQL字段值进行统计分析后给出建议的字段类型

      移除

      -

      空间函数

      -

      -

      -

      mysql_install_db

      初始化

      移除

      mysqld --initialize或--initialize-insecure

    2. 影响迁移,需要提前做检查。

      兼容性

      检查项

      作用

      状态

      解决方案

      原始用法

      保留关键字

      cume_dist、dense_rank、empty、except、first_value、grouping、groups、json_table、lag、last_value、lateral、lead、nth_value、ntile、of、over、percent_rank、rank、recursive、row_number、system、window

      -

      新增

      SET sql_mode = 'ANSI_QUOTES'

      名称:数据库、表、索引、列、alias、view、存储过程、分区、表空间

      字符集

      UTF8MB3

      -

      废弃

      使用UTF8MB4代替

      -

      分区表

      不得出现不支持本地分区的存储引擎的分区表

      -

      移除

      SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

      可按照下述两种方式解决:

      (1)ALTER TABLE table_name ENGINE=INNODB;

      (2)ALTER TABLE table_name REMOVE PARTITIONING;

      不支持MyISAM

      语法

      group by … asc/desc

      升序/降序

      移除

      使用order by子句代替

      view、function等

      名称长度

      view的列名称不能超过64个字符

      -

      -

      alter处理

      最多255个字符

      enum或set元素的总长度不能超过255个字符

      -

      -

      用户处理

      最大64K

      大小写

      lower_case_table_names

      MySQL设置字母大小写是否敏感

      -

      升级过程中,如果设置该参数为1,则必须确保schema和table名称必须是小写的

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

      -

      触发器

      是否有空定义或者无效的创建上下文

      -

      -

      show triggers查看,检测character_set_client、 collation_connection、Database Collation属性

      -

  • 系统变量默认值变更

    针对社区版MySQL5.7与8.0版本的默认值作对比,默认值不影响迁移,但对迁移后的业务会产生影响。

    序号

    parameter/option

    community

    作用

    备注

    原默认值

    新默认值

    Server

    1

    character_set_server

    latin1

    utf8mb4

    -

    和源保持一致

    2

    collation_server

    latin1_swedish_ci

    utf8mb4_0900_ai_ci

    -

    和源保持一致

    3

    explicit_defaults_for_timestamp

    OFF

    ON

    更新某一行时是否更新timestamp列

    和源保持一致

    4

    optimizer_trace_max_mem_size

    16KB

    1MB

    -

    和源保持一致

    5

    validate_password_check_user_name

    OFF

    ON

    -

    和源保持一致

    6

    back_log

    -1 (autosize) changed from : back_log = 50 + (max_connections / 5)

    -1 (autosize) changed to : back_log = max_connections

    在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。

    和源保持一致

    7

    max_allowed_packet

    4194304 (4MB)

    67108864 (64MB)

    限制Server接受的数据包大小

    按默认值

    8

    max_error_count

    64

    1024

    控制显示告警的个数

    和源保持一致

    9

    event_scheduler

    OFF

    ON

    -

    和源保持一致

    10

    table_open_cache

    2000

    4000

    -

    和源保持一致

    11

    log_error_verbosity

    3 (Notes)

    2 (Warning)

    -

    按默认值

    INNODB

    1

    innodb_undo_tablespaces

    0

    2

    -

    按默认值

    2

    innodb_undo_log_truncate

    OFF

    ON

    -

    按默认值

    3

    innodb_flush_method

    NULL

    fsync (Unix),

    unbuffered (Windows)

    控制innodb数据文件及redo log的打开、刷写模式

    按SQL默认值O_DIRECT

    4

    innodb_autoinc_lock_mode

    1 (consecutive)

    2 (interleaved)

    控制着在向有auto_increment 列的表插入数据时,相关锁的行为;

    和源保持一致

    5

    innodb_flush_neighbors

    1 (enable)

    0 (disable)

    从缓冲池刷新页面是否也刷新相同范围内的其他脏页。

    和源保持一致

    6

    innodb_max_dirty_pages_pct_lwm

    0 (%)

    10 (%)

    影响innodb刷新脏页行为

    按默认值

    7

    innodb_max_dirty_pages_pct

    75 (%)

    90 (%)

    影响innodb刷新脏页行为

    按默认值

    PERFORMANCE SCHEMA

    整体是不是开的

    -

    -

    -

    和源保持一致

    REPLICATION

    1

    log_bin

    OFF

    ON

    -

    默认打开

    2

    server_id

    0

    1

    -

    如果是0,则设为1

    3

    log-slave-updates

    OFF

    ON

    -

    默认打开

    4

    expire_log_days

    0

    30

    -

    按默认值1

    5

    master-info-repository

    FILE

    TABLE

    -

    默认TABLE

    6

    relay-log-info-repository

    FILE

    TABLE

    -

    默认TABLE

    7

    transaction-write-set-extraction

    OFF

    XXHASH64

    -

    按默认值

    8

    slave_rows_search_algorithms

    INDEX_SCAN, TABLE_SCAN

    INDEX_SCAN, HASH_SCAN

    -

    按默认值

  • 移除系统变量

    针对社区版MySQL 5.7与8.0进行分析,移除系统变量不影响迁移。

    移除变量

    innodb_locks_unsafe_for_binlog

    log_builtin_as_identified_by_password

    old_passwords

    query_cache_limit

    query_cache_min_res_unit

    query_cache_size

    query_cache_type

    query_cache_wlock_invalidate

    ndb_cache_check_time

    ignore_db_dirs

    tx_isolation

    tx_read_only

    sync_frm

    secure_auth

    multi_range_count

    log_error_verbosity

    sql_log_bin

    metadata_locks_cache_size

    metadata_locks_hash_instances

    date_format

    datetime_format

    time_format

    max_tmp_tables

    ignore_builtin_innodb

    innodb_support_xa

    innodb_undo_logs

    innodb_undo_tablespaces

    internal_tmp_disk_storage_engine