Docker MySQL容器初始化不了数据库

前言

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

Config

 docker:19.03.5
 mysql image:5.7
 system:centos 7

Operate

正常操作

mysql在docker-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目录下,这次启动就正常了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章