docker compose 安装mysql后group by使用不了,提示'this is incompatible with sql_mode=only_full_group_by'

本人出现问题的mysql版本是8.x,但是所有出现这种问题的mysql一下的解决方法是通用的

 

问题出现的原因:

  默认情况下,MySQL镜像中的sql_mode含有only_full_group_by,如果MySQL启用了only_full_group_by SQL模式的话,MySQL将拒绝选择列表,即不能使用group by

 

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

select @@global.sql_mode

 

注意:网上有方法说是直接在连接工具里执行以下SQL进行设,只能暂时的临时修改,mysql重启后就得重新进行配置,弄得人很不舒服

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

 

于是咱们就将mysql的cnf配置文件在docker-compose文件映射上去

volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
      - ./mysql.cnf:/etc/mysql/conf.d/mysql.cnf

 

如果是个新容器有概率会启动成功,但是如果你是个旧容器,这个时候大概率会映射配置失败一下信息(但是会启动成功),容器内mysql的警告信息如下:

[Warning] World-writable config file ‘/etc/mysql/conf.d/mysql.cnf’ is ignored.

原因是:Mysql 的配置文件因为读写权限不安全(竟然是完全的读-写-执行权限)被 Mysql 的安全机制忽了,进而导致我的配置设置没生效。

 

 

在docker-compose文件中添加如下:

command: >
          bash -c "chmod 644 /etc/mysql/conf.d/*.cnf && /entrypoint.sh mysqld"

 

完整的docker-compose文件:

# 可参考: https://hub.docker.com/_/mysql
version: '3'
services:
  mysql:
    image: mysql:8.0        # 原镜像`mysql:8.0`
    container_name: mysql   # 容器名为'mysql8.0'
    restart: always         # 指定容器退出后的重启策略为始终重启
    command: >
          bash -c "chmod 644 /etc/mysql/conf.d/*.cnf && /entrypoint.sh mysqld"
    volumes:                # 数据卷挂载路径设置,将本机目录映射到容器目录
      - ./mysql.cnf:/etc/mysql/conf.d/mysql.cnf
      - ./data:/var/lib/mysql
    environment:                        # 设置环境变量,相当于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      MYSQL_ROOT_PASSWORD: root         # 设置root用户密码
    ports:                              # 映射端口
      - "3306:3306"

完整的mysql.cnf:

# 服务端参数配置
[mysqld]
user=mysql                     # MySQL启动用户,如果是已经使用过且有自己的数据库,需要把当前注释掉,否则会启动失败
default-storage-engine=INNODB  # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4   # 设置mysql服务端默认字符集
collation-server = utf8mb4_general_ci # 数据库字符集对应一些排序等规则,注意要和character-set-server对应

pid-file        = /var/lib/mysql/mysqld.pid  # pid文件所在目录
socket          = /var/lib/mysql/mysqld.sock # 用于本地连接的socket套接字
datadir         = /var/lib/mysql             # 数据文件存放的目录
log-error       = /var/lib/mysql/error.log
#bind-address   = 127.0.0.1                   # MySQL绑定IP
expire_logs_days=7                            # 定义清除过期日志的时间(这里设置为7天)

# 设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'

# 是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

# 执行sql的模式,规定了sql的安全等级, 暂时屏蔽,my.cnf文件中配置报错
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# 事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
transaction_isolation = READ-COMMITTED

# TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp = true

#它控制着mysqld进程能使用的最大文件描述(FD)符数量。
#需要注意的是这个变量的值并不一定是你设定的值,mysqld会在系统允许的情况下尽量获取更多的FD数量
open_files_limit    = 65535

# 允许最大连接数
max_connections=200

#最大错误连接数
max_connect_errors = 600


[client]
default-character-set=utf8mb4  # 设置mysql客户端默认字符集

 附·参考资料:

1、fixing-world-writable-mysql-error-in-docker

posted @ 2021-06-23 17:37  盆鱼宴之武冈分宴  阅读(912)  评论(0)    收藏  举报