關聯文章
今天分享如何在docker上部署mysql 8.0,並解決部署過程遇到的問題。
如果需要其他mysql版本,可以到docker hub進行查找,地址:https://hub.docker.com/_/mysql
docker部署mysql步驟
1、查看mysql鏡像列表
docker search mysql
2、拉取自己需要的鏡像版本,這裏我們選擇的是默認版本
docker pull mysql
3、查看下載的鏡像版本
docker images
4、創建掛載目錄,目錄地址根據自己需要創建
mkdir -p /dockerdata/mysql/conf /dockerdata/mysql/data
5、根據下圖,瞭解到主配置文件 my.cnf 加載了 /etc/mysql/conf.d 文件夾下所有的配置(後綴必須是 .cnf),新建配置文件 myconf.cnf,並寫入自定義配置內容。
1)、通過vim新建myconf.cnf
vim myconf.cnf
2)、輸入內容後通過esc+wq指令保存,這裏注意,如果配置lower_case_table_names啓動會報錯,自己試了下確實會啓動失敗,具體結局方式需要查找相關文檔,問題來源:https://bugs.mysql.com/bug.php?id=90695
[mysqld]
#Mysql服務的唯一編號 每個mysql服務Id需唯一
server-id = 1
#服務端口號 默認3306
port = 3306
#數據庫默認字符集,主流字符集支持一些特殊表情符號(特殊表情符佔用4個字節)
character-set-server = utf8mb4
#數據庫字符集對應一些排序等規則,注意要和character-set-server對應
collation-server = utf8mb4_general_ci
#設置client連接mysql時的字符集,防止亂碼
init_connect='SET NAMES utf8mb4'
#最大連接數
max_connections = 400
#最大錯誤連接數
max_connect_errors = 1000
#時區配置
default-time_zone = '+8:00'
#慢sql等等其他的日誌配置可以自己網上查找,配置新參數後,後記得重啓
6、啓動容器,掛載目錄和密碼根據自己需求配置
docker run -it -d --name mysql \
-v /dockerdata/mysql/conf:/etc/mysql/conf.d \
-v /dockerdata/mysql/data:/var/lib/mysql \
-p 3306:3306 -p 33060:33060 -e MYSQL_ROOT_PASSWORD=123456 mysql
# 賬號爲root, MYSQL_ROOT_PASSWORD 密碼根據自己需求配置
7、查看容器狀態
docker ps -a
8、使用Navicat測試連接
以上,docker部署mysql就完成了。
問題總結
1、Navicat連接mysql出現authentication plugin ‘caching_sha2_passord’錯誤。
問題原因:mysql 8.0 默認使用 caching_sha2_password 身份驗證機制,從原來的 mysql_native_password 更改爲caching_sha2_password。從 5.7 升級 8.0 版本的不會改變現有用戶的身份驗證方法,但新用戶會默認使用新的 caching_sha2_password 。客戶端不支持新的加密方式。如果你安裝的是5.7等版本應該不會出現這個錯誤。
解決方法:
#進入容器內部
docker exec -it XXX /bin/bash
#訪問mysql,並輸入密碼
mysql -u root -p
#更換密碼的驗證方式,然後進行刷新
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
#退出容器
先按,Ctrl+P; 再按,Ctrl+Q
2、數據庫時區問題,有的同學安裝後,發現時間戳等自動生成的時間小於當前時間8小時
問題原因:這裏我們可以進入docker內部,執行sql指令查看當前的時間和time_zone配置
mysql> select now();
mysql> show variables like '%time_zone%';
解決方法一:通過mysql命令設置time_zone
優點:不需要重啓MySQL服務,缺點:MySQL服務重啓,設置就會消失
mysql> set time_zone = '+8:00';
mysql> set global time_zone = '+8:00';
解決方法二:通過cnf配置,我在上文中的cnf配置已經設置了時區,配置完後記得要重啓
[mysqld]
#設置默認時區
default-time_zone='+8:00'
設置後我們再查看time_zone,問題就解決了