最近公司測試服務器要遷移,而且是報廢式遷移,北京的服務器全部不再使用,位於北京測試機器上的服務和數據庫需要自己重新搭建到上海的測試服務器去。。。。關於服務器其他的相關配置在之前的docker文章中已陸續記錄,本次只單獨記錄docker中安裝配置mysql,為了保證系統的穩定與兼容,仍然使用舊版本mysql5.7.18。
系統環境:centos 7.6.1810 (Core)
image版本:mysql:5.7.18 (該版本顯示5年前已停止更新)
安裝步驟參考文章:https://www.cnblogs.com/shisanye/p/15685263.html
1、拉取鏡像:https://hub.docker.com/_/mysql?tab=tags&page=1&name=5.7.18
docker pull mysql:5.7.18
2、創建主宿機映射目錄
mkdir -p /data/docker_container/mysql5.7.18 #配置文件映射 mkdir -p /data/docker_container/mysql5.7.18/data #數據文件映射
3、隨便運行一個容器,然后將里面的配置方便拷出來
docker run -di --name=mysql_test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.18
docker cp mysql_test:/etc/mysql /data/docker_container/mysql5.7.18
4、刪掉這個要拷的docker
docker stop mysql_test docker rm mysql_test
5、運行容器
docker run -dit --name mysql_test -p 3306:3306 --restart=always -e TZ="Asia/Shanghai" -v /data/docker_container/mysql5.7.18/mysql:/etc/mysql -v /data/docker_container/mysql5.7.18/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root2022 mysql:5.7.18
網上的文章大多沒有設置 --restart=always -e TZ="Asia/Shanghai",導致mysql無法開機自啟動,並且時間不是中國時間會慢8小時。
別的文章介紹還要修改root初始密碼和連接權限什么的,但我發現安裝完成后直接用navicat就可以遠程連接,無需其它配置,不知道是為什么。后面有問題再來記錄。
然后我們創建新用戶並賦予權限即可,這里我們假設賦予賬號全部權限且全部地址可以訪問:
grant all privileges on *.* to '你的賬號'@'%' identified by '你們密碼' with grant option; flush privileges;
以上運行沒問題了,但是使用后會發現一些配置問題需要修改,比如group_concat長度限制,中文亂碼等問題。
網上查資料發現很亂,而且各個版本之間差別很大,不同服務器之間也有差異,本文僅說明tencos7.* 下docker mysql5.7.18對應配置文件。
上面我們已經把配置文件夾映射到本地了,只需要修改本地配置文件即可。
在很早的版本(或者是windows版本)中可能配置的是my.ini文件,而直接在linux安裝mysql當前的版本(非docker中)對應的配置文件是my.conf文件,而我們在docker中的配置文件發現映射到本地后的my.cnf文件無法修改,通過ll(或ls -l)可看到my.cnf文件是紅色的,根據該問答(https://developer.aliyun.com/ask/129850?spm=a2c6h.13159736)說是因為軟連接的原因。然后最終發現/etc/mysql/mysql.conf.d/mysqld.conf 文件為真正的可修改配置文件。切記不可修改/etc/mysql/mysql.cnf(及其映射文件),修改該文件后mysql容器無法啟動。
以下為配置/etc/mysql/mysql.conf.d/mysqld.conf 映射文件的簡單配置,其他配置可以繼續添加修改:
[mysqld]
#...其它配置內容
#以后要注意一些配置是否必須要放在mysqld后面才生效
#不區分大小寫20231031補充,該命令必須放在mysqld下,否則不生效;
lower_case_table_names = 1
#設置group_concat限制長度 group_concat_max_len = 18446744073709551615 #設置字符集 character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4
參考文章:
修改docker中mysql配置文件:https://www.cnblogs.com/lambdadog/p/15473596.html
徹底修改中文亂碼問題:https://blog.csdn.net/u012410733/article/details/61619656
2023-08-11 20:57補充,今天發現某存儲過程傳輸中文參數報錯亂碼(通過dbeaver工具正常,通過java連接字符串報錯亂碼),但是查看數據庫所有連接配置都是如上,按道理是可以的,找了很多資料,包括問gpt,都說是我編碼不對,但我編碼沒問題啊!!!最后還是在gpt的一個回答中找到突破,就是修改編碼后已經存在的存儲過程不會變更編碼,只有新建的才會啟用新編碼,所以如果想要讓原有的存儲過程也適用新編碼規則,需要新建或修改下原存儲過程!
2023-10-30 補充:最近下載了一個git項目,發現它引用了java若依項目,該項目會自動構建一些默認的數據庫,比如QRTZ_LOCKS,但是代碼中用的是全大寫,而這個項目中給到的sql語句創建的是小寫的,導致報錯找不到表,原因就是mysql默認配置區分大小寫,所以要修改配置參數lower_case_table_names=1,但是像上面一樣mysqld.conf最后一行添加后,重啟mysql並不生效。找了很多資料才找到,docker中該參數修改配置文件不起作用,必須在docker run初始化mysql時用命令mysqld lower_case_table_names = 1配置。參考鏈接:https://blog.csdn.net/benbendelove/article/details/128860691 ,這樣確實不區分大小寫生效了。
2023-10-31補充:昨天的設置區分大小寫的方式又引起新問題,在mysql容器內無法使用mysql -u方式登錄了,報錯:mysql: [ERROR] unknown variable 'lower_case_table_names=1',那這肯定不行,以后沒法用命令行登錄mysql可不行。突然靈光閃現,昨天好像在哪看到要在[mysqld]后面添加來着,於是重新修改上面的mysql.conf.d/mysqld.conf文件,果然這次放在[mysqld]后面重啟mysql容器生效了。。。好吧,被自己坑到了。。。
2022.05.19補充:
幾個月前公司使用navicat被官方通知說再使用就發律師函了,所以被迫卸載navicat,重新找了dbeaver代替,是實話比不上navicat,但至少是開源免費的,還算可以。
昨天同事說有個存儲過程傳中文參數用dbeaver報亂碼錯誤,但實際上我之前已經按上面的配置設置了編碼格式,而且用代碼連接傳參也是正常的,所以問題肯定是出在dbeaver身上,經過一番艱難查資料,終於找到答案,現記錄下來:使用mysql.jdbc.Driver,參考文章:https://blog.csdn.net/Schaffer_W/article/details/121789508