mysql8.0 新建数据库,迁移数据,账号权限,和mysql5.0的兼容性问题等踩坑记录
项目里一直用的是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: root密码 MYSQL_USER: 普通账号 MYSQL_PASSWORD: 普通账号密码 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
二、mysql数据迁移,初始化
1.转储下载并压缩数据库sql文件
#转储并下载数据库文件
cd /data/bak/
mysqldump 原始库名 -h 原始库ip -P端口(如果是3306可省略) -uroot -p密码 --add-drop-table >/data/bak/123.sql
#压缩数据库文件
tar -zcvf 123.tar.gz *.sql
2.把压缩文件上传新数据库docker容器 init目录,并解压缩
3.在新数据库上新建数据库
按照原数据库编码格式新建一个数据库
4.导入数据库