前言
有关docker在创建mysql container的时候,初始化数据库失败的问题解决记录;
Config
docker:19.03.5
mysql image:5.7
system:centos 7
Operate
正常操作
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容器就会去初始化数据库,然后加载对应的表结构和数据。
具体操作
- 将test.sql放到init目录下;
- 给当前目录设置最高权限(sudo chmod -R 777 .);
- 清除掉data目录下所有数据(sudo rm -rf mysql/volumes/data/*);
- 启动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目录下,这次启动就正常了。