关于docker上安装的MySQL无法使用group by的问题

问题描述:同一段使用了group by来进行分组的SQL,在本地的MySQL执行是没问题的,但放到docker上安装的MySQL(版本是5.7)去执行就有问题,如下图:

问题出现的原因:默认情况下,MySQL5.7镜像中的sql_mode含有only_full_group_by,如果MySQL启用了only_full_group_by SQL模式的话,MySQL将拒绝选择列表,即不能使用group by

查看SQL模式可用下面这条SQL:

select @@global.sql_mode

本地MySQL与docker上安装的MySQL的SQL模式的对比:

解决方案:修改MySQL的配置文件设置SQL模式(即将SQL模式默认有的only_full_group_by给去掉),在配置文件的[mysqld]节点下面加上

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

注意:网上有方法说是直接在连接工具里执行以下SQL进行设置

set @@global.sql_mode
=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;

这种方法亲测无效且容器一重启就又会恢复为默认的SQL模式;网上还有方法说是进入容器,然后修改/etc/mysql/mysql.conf.d/mysqld.cnf文件进行配置,这种方法亲测需要先给容器安装vim命令,否则无法修改,因为容器里是没有vim命令的;综上,我的做法是先将已有的MySQL容器删除(删除前注意将数据备份),然后重新启动容器并指定数据目录和配置文件,指定数据目录的目的是将容器内部的数据目录映射到宿主机,这样即使容器被删除了那数据依然还在宿主机,指定配置文件的目是将宿主机上的配置文件映射覆盖到容器内部,这样如果要修改容器的配置文件的话,就直接修改宿主机上的

步骤:

  • 列出正在运行的容器
docker ps
  • 将MySQL容器停掉(注意停之前先将数据备份)
docker stop bd041f156ec9
  • 将MySQL容器删除
docker rm bd041f156ec9
  • 重新启动MySQL容器,指定数据目录跟配置文件
docker run -d -p 3308:3306 -v /etc/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /mySoft/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7

#-v是将宿主机上的文件/文件夹与容器内部的文件/文件夹进行映射
#这里是将宿主机上/etc目录下的my.cnf文件与容器内部/etc/mysql/mysql.conf.d目录下的mysqld.cnf文件进行映射,即容器内部使用的配置文件就是宿主机上的/etc/my.cnf文件
#同时还将宿主机上的/mySoft/mysql/data文件夹与容器内部的/var/lib/mysql文件夹进行映射,即容器内部的数据会保存到宿主机上的/mySoft/mysql/data目录去

操作截图如下:

  • 用连接工具测试启动的MySQL能否连接上
  • 修改宿主机上的配置文件加上SQL模式的相关配置
vim /etc/my.cnf

操作截图如下:

然后问题就解决了:

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Docker安装MySQL 5.7,可以使用以下命令创建容器: docker run --privileged=true -p 3306:3306 --name mysql -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/logs:/var/log/mysql -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=223345 -d mysql:5.7 该命令将创建一个名为mysql的容器,并将主机的3306端口映射到容器的3306端口。配置文件、日志文件和数据文件将在主机上的/docker/mysql目录中进行持久化存储。容器将使用MySQL 5.7镜像,并设置root用户的密码为223345。 要在Docker安装MySQL 8.0,可以使用以下命令创建容器: docker run --privileged=true -p 3307:3306 --name mysql8 -v /docker/mysql8/conf:/etc/mysql/conf.d -v /docker/mysql8/logs:/var/log/mysql -v /docker/mysql8/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=223345 -d mysql:8.0 该命令将创建一个名为mysql8的容器,并将主机的3307端口映射到容器的3306端口。配置文件、日志文件和数据文件将在主机上的/docker/mysql8目录中进行持久化存储。容器将使用MySQL 8.0镜像,并设置root用户的密码为223345。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [docker安装myql5.7和mysql8.0](https://blog.csdn.net/weixin_65349299/article/details/125860971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [docker安装mysql5.7及8.0、redis](https://blog.csdn.net/qq_45524787/article/details/126358732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值