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目錄下,這次啓動就正常了。

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