docker 安装配置mysql5.7.18
最近公司测试服务器要迁移,而且是报废式迁移,北京的服务器全部不再使用,位于北京测试机器上的服务和数据库需要自己重新搭建到上海的测试服务器去。。。。关于服务器其他的相关配置在之前的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