前言
MySQL的Docker版本,部署在ubantu系統,出現問題:
1.執行一個SQL,只有錯誤編碼,沒有錯誤提示信息,主要影響排查SQL運行問題;
2.這個問題,并不影響實際的MySQL運行,如果數據庫已經很多數據,就不要再亂動了。
如下圖:
正常應該是:
嘗試解決
參考別人的博客,mysql執行語句后只有錯誤代碼,沒有錯誤信息
經過排查可能是兩個方向:
.cnf
配置錯誤- MySQL的日志映射到宿主機錯誤。
經過參考博客,最終沒有解決該問題,同時我的數據庫數據不多,準備重新部署MySQL5.7.
MySQL5.7,docker版本部署
整理了一下部署流程,掛載MySQL的數據、日志、配置文件,同時處理容器內時間同步問題等。由于時間問題,并沒有在生產環境長期運行,故慎重!!!
1. 拉取鏡像
sudo docker pull mysql:5.7
2. 宿主機掛載目錄準備
sudo mkdir -p /data/mysql/logs
sudo chmod -R 777 /data/mysql/logs
sudo mkdir -p /data/mysql/data
sudo mkdir -p /data/mysql/conf
3.配置文件
cd /data/mysql/conf
sudo touch my.cnf
[mysqld]
user=mysql
character-set-server=utf8mb4 # 與啟動參數統一
collation-server=utf8mb4_general_ci
default_authentication_plugin=mysql_native_password
default-time_zone = '+8:00' # 強制服務端時區
log_timestamps = SYSTEM # 確保日志時間戳同步
log-error = /var/log/mysql/error.log # 強制指定路徑
slow_query_log = 1 # 啟用慢查詢日志
slow_query_log_file = /var/log/mysql/slow.log
general_log = 0 # 按需開啟[client]
default-character-set=utf8mb4 [mysql]
default-character-set=utf8mb4
4.啟動命令
docker run -d \--restart=always \--name=mysql_5.7 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123456 \-p 3306:3306 \-v /data/mysql/data:/var/lib/mysql \-v /data/mysql/conf:/etc/mysql/conf.d \-v /data/mysql/logs:/var/log/mysql \-v /etc/localtime:/etc/localtime:ro \-v /usr/share/zoneinfo/Asia/Shanghai:/usr/share/zoneinfo/Asia/Shanghai:ro \mysql:5.7 \--character-set-server=utf8mb4 \--collation-server=utf8mb4_general_ci
-e TZ=Asia/Shanghai
設置容器時區為上海,確保日志時間與本地一致。-e MYSQL_ROOT_PASSWORD=123456
定義 MySQL 的 root 用戶密碼-p 3306:3306
將容器內的 3306 端口映射到宿主機的 3306 端口,允許外部通過 宿主機IP:3306 訪問 MySQL-v /data/mysql/data:/var/lib/mysql
掛載 MySQL 數據目錄,避免容器刪除后數據丟失。-v /data/mysql/conf:/etc/mysql/conf.d
映射自定義配置文件目錄(可放置 my.cnf 覆蓋默認配置)。-v /data/mysql/logs:/var/log/mysql
持久化 MySQL 日志,便于故障排查。-v /etc/localtime:/etc/localtime:ro
-v /usr/share/zoneinfo/Asia/Shanghai:/usr/share/zoneinfo/Asia/Shanghai:ro
雙重保障容器時區與宿主機同步(某些鏡像可能依賴不同時區文件)。--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
設置默認字符集為 utf8mb4(支持 Emoji 和四字節字符),排序規則為通用格式。
運行完成以后檢查數據、日志是否掛載到宿主機
- /data/mysql/logs/下
應該存在 error.log 和 slow.log 日志 - /data/mysql/data/下
應該存在MySQL的數據庫文件 - /data/mysql/conf/
應該存在my.cnf
其他驗證步驟
1.檢查掛在映射
docker inspect mysql_5.7 | grep -A 10 "Mounts"
確認Destination為/var/log/mysql
2.容器內日志生成記錄
docker exec mysql_5.7 touch /var/log/mysql/test.log
ls -l /data/mysql/log # 查看宿主機是否生成test.log
3.實時日志追蹤
docker exec mysql_5.7 tail -f /var/log/mysql/error.log
4.配置文件加載驗證
docker exec mysql_5.7 mysql --verbose --help | grep "cnf"
PS:
如果你看到這里,希望我的分享,可以幫到你,感謝你的閱讀,愿我們在代碼世界變得更強!