Linux上mysql配置以及docker启动mysql
linux下载mysql
文件下载
- 官方下载文件传输到服务器
- 链接:https://pan.baidu.com/s/1QSEcRNjn5kuutvo6qaCZwQ
提取码:asdf
linux中mysql下载
链接:https://pan.baidu.com/s/1Ws0ToDCKrtN8rjtmBy4aNQ
提取码:asdf
linux中docker运行mysql
docker下载镜像
- dockerhub官方下载
- 链接:https://pan.baidu.com/s/1eTbR04qMWOzI6FLccLIdoQ?pwd=asdf
提取码:asdf
docker运行mysql容器
docker run \
--name mysql \ #容器名称
-v /mydata/mysql/data:/var/lib/mysql \ #数据库存储文件作为数据卷
-v /mydata/mysql/conf:/etc/mysql/conf.d \ #数据库配置文件作为数据卷
-p 13306:3306 \ #端口映射
-e MYSQL_ROOT_PASSWORD=123 \ #配置mysql密码
-d \
mysql:5.7.25
docker run --name mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysl/conf.d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7.25
数据库存储文件位置
/var/lib/mysql
如果将该文件与mysql镜像产生的容器的/var/lib/mysql(容器中数据库存储文件)关联,而服务器中mysql是一直启动,如果直接使用/var/lib/mysql来关联docker容器的/var/lib/mysql,会报错
InnoDB: Cannot open datafile './ibdata1'
这是因为服务器本机mysql启用使用着这个文件。
我们需要将docker中的/var/lib/mysql与一个新建目录关联
数据库配置文件位置
/etc/my.cnf
在/mydata/mysql/conf新建文件my.cnf
touch my.cnf
并在该文件下添加
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
docker显示容器日志信息
docker logs -f [id]
因为mysql容器报错没在运行状态使用
docker ps
是无法查找到mysql的容器id,应该使用
docker ps -a
命令
然后查看mysql容器的日志报错
2022-11-23T11:48:40.641049Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2022-11-23T11:48:40.642358Z 0 [Note] mysqld (mysqld 5.7.25) starting as process 1 ...
2022-11-23T11:48:40.643936Z 0 [ERROR] Could not open file '/var/log/mysqld.log' for error logging: Permission denied
2022-11-23T11:48:40.643970Z 0 [ERROR] Aborting
2022-11-23T11:48:40.643989Z 0 [Note] Binlog end
2022-11-23T11:48:40.645569Z 0 [Note] mysqld: Shutdown complete
修改/var/log/mysqld.log文件的权限
发现还是报错,使用
cat /etc/my.cnf
[mysqld]
...
log-error=/var/log/mysqld.log
...
命令,
因此修改my.cnf权限
然后开启容器
navicat无法连接到mysql容器
使用mysql密码用MYSQL_ROOT_PASSWORD配置的不能通过,而使用服务器mysql密码可以通过
修改与docker数据库存储文件关联的data目录修改其中的mysql目录(mysql用户密码存储在该目录下的user.MYD文件)
链接:https://pan.baidu.com/s/1YIQdyCGcIascgNoEdRZ3Bw
提取码:asdf
docker中的mysql不允许外界访问
使用navicat连接时报错
‘[ip]’ is not allowed to connect to this mysql
docker无法插入中文
进入容器 查看字符集
[root@master2 ~]# docker exec -it b18f56aa1e15 /bin/bash
root@b18f56aa1e15:/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
查看容器支持的字符集
root@b18f56aa1e15:/# locale -a
C
C.UTF-8
POSIX
不能输入中文原因:系统使用的是POSIX字符集,POSIX字符集是不支持中文的,而C.UTF-8是支持中文的 只要把系统中的环境 LANG 改为"C.UTF-8"格式即可解决问题
只要这样进入容器即可输入中文: docker exec -it b18f56aa1e15 env LANG=C.UTF-8 /bin/bash
[root@master2 ~]# docker exec -it b18f56aa1e15 env LANG=C.UTF-8 /bin/bash
root@b18f56aa1e15:/# 你好
root@b18f56aa1e15:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 80
Server version: 5.7.17-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 你好
注意:这样修改只是临时修改。要永久修改,需要在创建容器时在dockerfile中设置。
K8s进入pod不能输入中文 也可用此方法解决。
导入sql文件
docker cp yyy.sql mysql:/yyy.sql
mysql> create database yyy;
mysql> use yyy;
mysql> source yyy.sql
Unknown collation: ‘utf8mb4_0900_ai_ci‘ 的解决方案
原因
将MySQL8.0生成的sql文件,导入MySQL5.7版本时,出现了版本不兼容问题
解决
将MySQL8.0导出的sql文件中,所有的utf8mb4_0900_ai_ci替换为utf8_general_ci,以及所有的utf8mb4替换为utf8