MySQL高版本导出数据库,低版本导入不了的问题

news/2024/8/27 21:49:32 标签: mysql, docker, utf8mb4

前言

有关docker在创建mysql container的时候,初始化数据库失败的问题解决记录;

Config

 docker:19.03.5
 mysql image:5.7
 system:centos 7

Operate

正常操作

mysqldocker-compose上的配置如下

test_mysql:
    image: test_mysql:latest
    restart: always
    container_name: test_mysql
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - "33060:3306"
    volumes:
      - ./mysql/volumes/data/:/var/lib/mysql/
      - ./mysql/volumes/config/my.cnf:/etc/my.cnf
      - ./mysql/volumes/init/:/docker-entrypoint-initdb.d/
      - ./mysql/volumes/logs/:/var/log/
    environment:
      MYSQL_ROOT_PASSWORD: Test123
      MYSQL_DATABASE: test_db
      TZ: Asia/Shanghai
    networks:
      - net_test

将需要初始化的数据库(test.sql)文件放到init目录下,在data目录为空的情况下,创建容器并启动,mysql容器就会去初始化数据库,然后加载对应的表结构和数据。

具体操作

  1. 将test.sql放到init目录下;
  2. 给当前目录设置最高权限(sudo chmod -R 777 .);
  3. 清除掉data目录下所有数据(sudo rm -rf mysql/volumes/data/*);
  4. 启动docker-compose(docker-compose up -d);

异常问题

好了,问题来了,在一系列正常的操作下,发现容器启动后,数据库里面并没有任何表和数据,只有一个空荡荡的数据库,究竟是什么原因造成这个问题呢?

问题解决

问题描述

在对比另外的配置,一样的操作,不一样的结果(这次失败了)。我首先判断是初始化的数据库(test.sql)有问题,所以初始化就失败了,我个人电脑的mysql客户端workbench是8.0的版本,mysql的容器是5.7版的。所以我让同事(workbench是5.6的)导出个数据库让我试试能不能加载,结果还是失败了,他喵的这是在搞事情啊!

问题定位

在用docker logs打印mysql容器启动的日志时,发现有个Error,如下:

ERROR 1273 (HY000) at line 25: Unknown collation: 'utf8mb4_0900_ai_ci'

很好,有错误真的挺好的,至少我可以根据这个错误来定位问题,网上搜了一下,发现这格式在mysql5.7的时候是不支持的,所以会出现用mysql8.0导出的数据库表结构和数据,带这种格式的数据库是导不进5.7版本的mysql的,会出现以上那个报错。

解决方式

既然知道了是格式问题,那么就直接改格式好了,用workbench打开导出来的数据库(test.sql),然后全局替换两个值就可以了,如下:

utf8mb4_0900_ai_ci 改为 utf8_general_ci
utf8mb4 改为 utf8

将修改后的数据库脚本文件保存后,放到docker挂载出来的init目录下,这次启动就正常了。


http://www.niftyadmin.cn/n/994279.html

相关文章

Mac os x 下配置Intellij IDEA + Tomcat 出现权限问题的解决办法

零,写在最前面 帮同学解决问题时在网上找到的,很好用转载一下 一,解决方法 出现的错误提示如下: 下午9:11:27 All files are up-to-date 下午9:11:27 All files are up-to-date 下午9:11:27 Error running Tomcat 8.0.18: Cannot run program “/Users/horse_leo…

Docker打包镜像的两种方式

前言 Docker镜像是一个特殊的文件系统,既提供了运行时所需的程序、库和资源,还提供了相应的配置参数,只是不包含动态数据。我们可以将任何我们的软件产品打包成镜像,以供服务器能够用Docker直接快速安装并部署运行。 System&…

稍有迷茫

耳边音乐响动,却丝毫没有削弱我迷茫的感觉。此刻我宁愿让自己忙起来,疯狂的写CODE,让自己无暇顾及思想上的迷茫。今天因为是在本应该放假的时间里上班, 所以小卖部门都关了,烟没了,坐在公司里总感觉心神不定…

FragmentTabHostTopDemo【FragmentTabHost固定宽度且居中】

版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(居中且宽度非全屏)展现。 备注:该Demo主要是演示FragmentTabHost的一些设置和部分功能,实际中需要…

闭包

本质与解析 当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。 function outter() {var a 1function inner() {console.log(a)}return inner } var accept outter() accept() // 1 在此例中,将内…

Springboot多模块依赖开发

前言 有关Spring-boot多模块依赖开发,针对使用springboot架构的java程序开发,为了解耦合,需要把各个功能模块给封装起来并区分开,进行模块化,减少重复性的工作; 项目地址:https://github.com/v…

Sybase数据库在UNIX、Windows上的实施和管理 集中讨论2:这本书的目录

《Sybase数据库在UNIX、Windows上的实施和管理》讨论42:这本书的目录 文平 首先,谢谢大家关注这本书。同志们众多邮件要求我提供本书的目录结构,其实该目录在当当网、亚马逊都有,我这里不厌其烦,再发一边,…

有关EMQX桥接的配置工作

前言 桥接是一种连接多个 EMQ X 或者其他 MQTT 消息中间件的方式。不同于集群,工作在桥接模式下的节点之间不会复制主题树和路由表。桥接模式所做的是: 按照规则把消息转发至桥接节点;从桥接节点订阅主题,并在收到消息后在本节点…