mysql8.0 新建数据库,迁移数据,账号权限,和mysql5.0的兼容性问题等踩坑记录

发布时间 2023-08-23 18:19:23作者: 06

项目里一直用的是mysql5.7,这次立了个新项目,我果断换上mysql8.0,心想肯定新版的性能更好更强大啊,其实无形间也踩了不少坑,mysql8.0和mysql5.0的小改动(升级)引发的兼容性问题。。

一、mysql8.0搭建

首先是搭建mysql8.0环境,这里当然使用时下最方便的docker-compose方式了

my.cnf如下

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

#gtid:
server_id = 1                   #服务器id
gtid_mode = on                  #开启gtid模式
enforce_gtid_consistency = on   #强制gtid一致性,开启后对于特定create table不被支持

#binlog
log_bin = mysql-binlog
log_slave_updates = on
binlog_format = row             #强烈建议,其他格式可能造成数据不一致

#relay log
skip_slave_start = 1

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
init_connect = 'SET collation_connection=utf8mb4_general_ci'
# Custom config should go here
!includedir /etc/mysql/conf.d/

 这里sql_mode必须要设置

原因是什么呢?
mysql 5.7+中 默认启用了 ONLY_FULL_GROUP_BY
这个表示什么呢,从字面上看,大概就是一种严谨的SQL模式,类似于Oracel那些Group by语句,就是你查询那些字段,group by的时候也要写上哪些字段。知道原因了,那把这个模式去掉就可以了。

报错方式: Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY

参考文档:https://www.jianshu.com/p/9534a6878f65

#查看mysql是否启用ONLY_FULL_GROUP_BY
select @@global.sql_mode

 

 

 

docker-compose.yml文件如下

# 使用说明 V3.2.0
# docker-compose up
version: '3.1'
services:
  mysql8-01:
    container_name: mysql8-01
    hostname: mysql8-01
    image: mysql:latest
    restart: always
    ports:
      - 13306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: Jsti&mysql@0807
      MYSQL_USER: jksz
      MYSQL_PASSWORD: jksz&hlj@0815
    command:
      --default-authentication-plugin=mysql_native_password
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-time-zone='+8:00'
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --expire-logs-days=7
      # privileged: true
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
    volumes:
      - ./data:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./conf/my.cnf:/etc/mysql/my.cnf
      - ./init:/docker-entrypoint-initdb.d

参数详解:

参数1:

--default-authentication-plugin=mysql_native_password

这就是mysql8.0和mysql5.0的兼容问题:mysql5.0 加密方式默认是mysql_native_password,mysql8.0默认是 caching_sha2_password

如果想让mysql8.0用的数据可以兼容5.0,只能妥协,用mysql_native_password的方式

报错方式:2059

 

参考:https://blog.csdn.net/weixin_60764989/article/details/131020609

参数2:

 --collation-server=utf8mb4_general_ci

编码也是mysql8.0升级的地方之一,mysql8.0默认用 utf8mb4_0900_ai_ci 编码

如果想让mysql8.0用的数据可以兼容5.0,只能妥协,用 utf8mb4_general_ci