07、Docker环境下MySql数据库容器遇到的问题

1、环境

linux版本(查看版本命令:cat /proc/version):

Linux version 4.4.0-96-generic (buildd@lgw01-10) 
(gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) )

docker版本(查看版本命令:docker --version):

Docker version 1.12.6

数据库版本:

percona:5.7.23

2、问题一:

docker 拉取镜像,创建运行mysql容器。发现,mysql容器并没有运行。

#拉取mysql镜像
docker pull percona:5.7.23
#创建运行mysql容器,并且挂载宿主机的/data/mysql-data目录到容器/var/lib/mysql目录,声明端口指定root密码
docker create --name percona -v /data/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#启动mysql容器
docker start percona
#查看当前正在运行的容器
docker ps

进到docker容器挂载的宿主机目录下,查看发现。文件目录里面是空的。

#进到/data/mysql-data目录
cd /data/mysql-data
#查看
ll

这是为什么呢?按照,正常逻辑来说。启动,mysql容器后。应该会产生一些mysql对应的文件才对阿。

怀疑是 /data/mysql-data 这个目录没有写入的权限。试着给 /data/mysql-data 赋权限。

#chmod改变权限 -R是目录下所有文件 777就是高权限(读、写、执行)
chmod -R 777 data

然后,再启动mysql容器,发现正常了。

docker start percona

3、问题二:

创建表抛[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY,虽然,表创建成功了。但是,肯定会影响到后续的程序访问操作。

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated 
column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns
 in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因:

mysql5.7.5版本开始,sql_mode使用的是默认值,设置了ONLY_FULL_GROUP_BY
而ONLY_FULL_GROUP_BY是MySQL提供的一个sql_mode,通过这个sql_mode来提供SQL语句
GROUP BY合法性的检查,在MySQL的sql_mode是非ONLY_FULL_GROUP_BY语义。
(资料参考于:https://www.cnblogs.com/xzjf/p/8466858.html)

解决方案:

修改mysql容器mysqld.cnf配置,去掉ONLY_FULL_GROUP_BY模式

#进到容器
docker exec -it 容器id /bin/bash
#cd进到etc目录
cd etc/
#查看etc目录下文件
ls
#查看my.cnf
cat my.cnf
#发现my.cnf里面引入了!includedir /etc/percona-server.conf.d/
cd /etc/percona-server.conf.d/
#查看
ls
#发现mysqld.cnf mysqld_safe.cnf 两个文件。那么,修改mysqld.cnf配置文件就行了
vi mysqld.cnf
#在 mysqld.cnf 配置最后面添加
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#保存退出
esc + :wq!
#重启mysql容器测试

上面的是直接在Docker里面做修改。当然,最优的做法是把 my.cnf 挂载到宿主机上。然后,直接可以通过修改宿主机的my.cnf配置,重启容器就可以了。

在宿主机新建个目录,存放 my.cnf 文件:

mkdir /data/mysql/conf -p
cd /data/mysql/conf
vim my.cnf
# my.cnf内容
[mysqld]
server-id=1
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

重新创建数据容器:

# 删除原来的数据库容器
docker stop 原来数据库名
docker rm 原来数据库名

#创建数据卷位置
docker volume create mysql-volume

#创建数据库容器,指定数据卷和cnf挂载位置
docker create --name 设置数据库容器名 -v mysql-volume:/var/lib/mysql -v /data/mysql/conf:/etc/my.cnf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root 数据库镜像名

以后,就可以从宿主机的 /data/mysql/conf 里面修改 my.cnf 配置,重启容器就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值