使用docker-compose.yml启动mysql8时遇到的问题解决

原配置

version: '3.1'
services:
  mysql:
    restart: always
    image: mysql
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --default-authentication-plugin=mysql_native_password
      --lower_case_table_names=1
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

启动过程中遇到的问题:

mysql容器虽然启动了,但是状态却一直是restarting状态,导致客户端连接不上mysql,查看log,发现应该是这些参数的问题,因为一直再报设置这些参数时异常或者是检查时。

--character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --default-authentication-plugin=mysql_native_password
      --lower_case_table_names=1
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    volumes:

于是我一个参数一个参数的启动,开始发现问题:
1.

 --lower_case_table_names=1 

:此参数是设置表名是否对大小写敏感的,mysql8默认是0(敏感),如果在这设置初始化参数为1,就会有冲突,可以通过命令查看该参数值,show variables like ‘lower_case_table_names’;实际是需要改为1的,但是通过各种方式改配置,依然不行,先放弃它了,不要加这个参数就行。
2.

--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"

:这些参数不做解释,自己百度,都是些配置,但是特殊的的是mysql8 已经取消了 NO_AUTO_CREATE_USER 这一项配置,所以配置有它会导致容器启动失败。删除即可。
3. 还有一些其他问题,比如客户端(navicate、sqlyog)连不上,一般是因为用户的密码验证方式不一致导致的,可以通过一下命令查看 ,进入mysql

 use mysql
 select user,host,plugin from user;  # pugin 是mysql的密码验证方式,5.7以后是:caching_sha2_password, 以前是:mysql_native_password ,一般改成它,就可以连接了

修改命令

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; #这是改root用户通过本地连接时的密码验证方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; #这是改root用户通过 任意地址 连接时的密码验证方式

这样客户端就可以连接了

你可能感兴趣的:(docker-compose)