前言
有關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容器就會去初始化數據庫,然後加載對應的表結構和數據。
具體操作
- 將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目錄下,這次啓動就正常了。