原配置
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用户通过 任意地址 连接时的密码验证方式
这样客户端就可以连接了