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

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

时间:2023-08-23 18:22:04浏览次数:61  
标签:utf8mb4 -- 兼容性问题 mysql5.0 mysqld mysql mysql8.0 gtid

项目里一直用的是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

 

标签:utf8mb4,--,兼容性问题,mysql5.0,mysqld,mysql,mysql8.0,gtid
From: https://www.cnblogs.com/allay/p/17652418.html

相关文章

  • MySQL8.0 JSON的对比、排序和索引
    (目录)JSON的对比和排序JSON值可以通过=,<,<=,>,>=,<>,!=,<=>操作符来进行对比JSON不支持BETWEEN,IN(),GREATEST(),LEAST(),可以通过将JSON转换为其他数据类型来使用这些操作符。JSON值的对比在两个级别上进行,先进行数据类型的对比,如果类型相同,再进行值的对比。类型可以......
  • 修改mysql8.0的数据存储目录
     -------先查看datadir的路径------------------------------------usemysqlshowvariableslike'%datadir%';————————————————————————--datadir=/data/mysqldata/mysql   老的--datadir=/bigdata/new_mysqldata  新的———————......
  • MySQL8.0版本无法连接kettle
    问题在于jar驱动包1.遇到的问题问题显示:Driverclass'org.gjt.mm.mysql.Driver'couldnotbefound,makesurethe'MySQL'driver(jarfile)isinstalled.org.gjt.mm.mysql.Driver猜测是mysql的jar驱动包未安装,于是给kettle添加进了:mysql-connector-java-8.0.22.ja......
  • 1-linux下mysql8.0.33安装
    在互联网企业的日常工作/运维中,我们会经常用到mysql数据库,而linux下mysql的安装方式有三种:1.mysqlrpm安装2.mysql二进制安装3.mysql源码安装今天就为大家讲讲linux下mysql8.0.33版本rpm方式的安装。1.前提1.1.系统版本CentOS7.9.2009命令:cat/etc/redhat-release[root@cent79-2~]......
  • MySQL8.0.30在线调整redo log
    测试验证MySQL8.0.30版本带来一个与REDO日志文件有关的新特性:在线调整REDO日志文件的大小,在一定程度上简化了运维的工作量。一台MySQL实例部署完后REDO日志文件大小一般不会保持默认值,DBA会根据数据的写入量以及频率来调整其为合适的值,与业务匹配的REDO日志文件大小能让数据库......
  • MySQL8.0 JSON相关函数(二) -更改JSON值
    (目录)本文涉及函数简介函数作用JSON_ARRAY_APPEND在数组后追加元素JSON_ARRAY_INSERT在JSON数据中的指定位置插入元素JSON_INSERT如果存在值,不操作,否则插入值JSON_REPLACE如果存在值,更新该值,否则不操作JSON_SET如果存在值,就更新,否则就插入JSON_REM......
  • MySQL8.0 JSON数据类型
    (目录)JSON数据类型MySQL8.0支持原生的JSON数据类型。JSON数据类型存在以下优点自动验证存储在json列中的JSON文档,无效文档会产生错误优化存储格式。json列中的文档被转换为内部格式,可以直接对文档元素进行快速读取访问。JSON值JSON值类型在MySQL中,JSON值可以是字符串/数......
  • mysql8.0环境的搭建(Linux)
    1.安装前说明1.1Linux系统及工具的准备。安装并启动好两台虚拟机:CentOS7安装有远程访问centOS系统的工具CentOS6和CentOS7在MySQL的使用中的区别默认防火墙:CentOS6是iptables;CentOS7是firewalld;启动服务的命令:CentOS6是servicemysqldstart;CentOS7是systemctlstart......
  • mysql8.0环境的搭建(Windows)
    1.MySQL的卸载因为之前可能安装过其他版本的mysql,所以在安装之前,需要将原先安装的进行卸载。1.1步骤1:停止MySQL服务在卸载之前,先停止MySQL8.0的服务。按键盘上的Ctrl+Alt+Delete组合键,打开任务管理器对话框,可以在服务列表找到MySQL8.0的服务,如果现在正在运行......
  • Debian11 TAR包安装MySQL8.0
    MySQL8下载地址访问https://downloads.mysql.com/archives/community/版本选择8.0.32,操作系统选择Linux-Generic,操作系统版本选择Linux-Generic(glibc2.17)(x86,64-bit);选择CompressedTARArchive,MinimalInstall点击下载,或者使用下面的URL直接下载https://cdn.my......