# 1.创建文件夹 mkdir /mydata/mysql/conf # 2.进入到新建的目录中 cd /mydata/mysql/conf
# 3.编写配置文件:文件名任意,但需以.cnf结尾 # 如我,此处编写了 custom.cnf文件 vim custom.cnf 文件内容如下:【作用-在linux系统中查看数据库内容出现中文乱码】
[mysqld]
init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
init_connect="SET NAMES utf8mb4"
skip-character-set-client-handshake
编写自定义配置文件的原因:
在创建mysql8的docker容器时:进入容器你会发现,在/etc/
目录下有my.cnf的文件,在这个文件中最后一行是!includedir /etc/mysql/conf.d/
,意思是,在 /etc/mysql/conf.d/ 目录下新建自定义的配置文件[文件名].cnf
也会被读取到,而且还是优先读取
的(Docker Hub中的MySQL教程文档有说到)。【我们在后边创建容器的时候,会进行数据卷挂载,挂载到/etc/mysql/conf.d/目录】
而mysql8的默认编码会出现中文乱码,所有我们需要设置一下外部的配置文件,如果有什么优化mysql的也可以再此设置
docker run -p 3306:3306 -v /mydata/mysql/conf/conf.d:/etc/mysql/conf.d -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/logs:/logs -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai --name mysql8.0 -d mysql:8.1
ls /mydata/ ls /mydata/mysql/data/ vim /mydata/mysql/conf # 第一次跑起来的容器,查看conf里边是空的 ls /mydata/mysql/conf
发现连接失败
docker exec -it 883850e8013b /bin/bash # 进入容器内的数据库 mysql -uroot -p
# 查看mysql数据库下的user表,结果如下 select host,user,plugin,authentication_string from mysql.user; # 修改plugin为mysql_native_password,结果如下 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; # 刷新 flush privileges;
备注:host为 % 表示不限制ip localhost表示本机使用 ;plugin非mysql_native_password 则需要修改密码
注:阿里云远程数据库状态下,别设置为localhost。
不然,用Navicat连接时会报一个,什么什么ip不允许连接
# 重启一下容器 docker restart mysql8.0 # 再次测试,发现还是连接成功
# 进入容器: docker exec -it 883850e8013b /bin/bash #修改密码 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '要修改的密码'; # 删除host等于localhost的user DELETE FROM mysql.user WHERE user = 'root' AND host = 'localhost'; # 刷新 FLUSH PRIVILEGES;
docker update mysql8.0 --restart=always
mysql8.0容器名
1)网上说是端口没有开放,但是我的阿里云服务器确实开发了3306端口
2)如果你不确定你是否开启了,你可以用mysql5版本的来测试一下
docker run -it -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 -d mysql:5.7
把容器跑起来后,去用Navicat去连接,发现可以连上 —— 说明你的端口是开放的,什么防火墙没开啊,阿里云端口没开啊,都是扯蛋!!!
# 查看用户和加密方式 select host,user,plugin,authentication_string from mysql.user;
# 修改加密方式为:mysql_native_password ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; # 生效 FLUSH PRIVILEGES;
MySQL执行命令:
UPDATE user SET host = '%' WHERE user = 'root';
报错:
ERROR 1062 (23000): Duplicate entry '%-root' for key 'user.PRIMARY'
# 查看所有用户 select user,host from user; 发现有两个root
# 删除host等于localhost的那一个 DELETE FROM user WHERE user = 'root' AND host = 'localhost'; # 此时,下边的命令也不必执行了,因为它执行完,就是你删除完后的 # UPDATE user SET host = '%' WHERE user = 'root';
# 生效【但我没使用也成功了】 FLUSH PRIVILEGES;