docker 安装 mysql
安装单机 mysql
拉取镜像
docker pull mysql:8.0.39
创建mysql数据和配置目录
mkdir -p /data/mysql/log
mkdir -p /data/mysql/data
mkdir -p /data/mysql/share
mkdir -p /data/mysql/conf.d
创建配置文件my.cnf
vim /data/mysql/conf.d/my.cnf
[client]
port=3306
[mysqld]
character-set-server=utf8mb4
port=3306
max_connections=200
default-storage-engine=INNODB
innodb_buffer_pool_size=128M
创建容器
docker run -d -p 3306:3306 --name mysql --privileged=true -v /data/mysql/conf.d:/etc/mysql/conf.d -v /data/mysql/log:/var/log/mysql -v /data/mysql/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=root mysql:8.0.39
创建完成查询容器列表
如果要配置远程连接的话,需要开放端口3306,如果是云服务器,需要开两次:
-
linux服务器防火墙
# 开放3306端口 firewall-cmd --zone=public --add-port=3306/tcp --permanent # 加载规则 firewall-cmd --reload # 查询端口开启情况 firewall-cmd --zone=public --query-port=3306/tcp
-
云服务器厂商防火墙,基本上都是在云服务器
监控
菜单中。
还需要查询当前mysql的对于root用户配置的连接权限
# 进入mysql容器
docker exec -it mysql bash
# 输入mysql连接命令
mysql -uroot -p
# 输入密码
# 使用mysql库
use mysql;
# 查询root用户连接权限,默认应该是 localhost 只支持本地连接
select host,user from user;
我这边是配置完成的,
%
代表支持所有ip访问。
改变root用户连接权限
alter user 'root'@'localhost' identified by 'root';
update user set host = "%" where user = 'root';
flush privileges;
补上成功样例:
主从搭建
基本配置:同一台宿主机下搭建mysql一主一从
- 主机对应宿主机目录 :
/data/mysql/master/
,从机对应宿主机目录:/data/mysql/slave/
- 主机端口:3307,从机端口:3308
- 主机 server-id=101,从机 server-id=102(同一局域网下 server-id 必须唯一)
设置主机
-
设置主机配置文件
mkdir -p /data/mysql/master/log mkdir -p /data/mysql/master/data mkdir -p /data/mysql/master/share mkdir -p /data/mysql/master/conf.d vim /data/mysql/master/conf.d/my.cnf
[client] port=3306 [mysql] no-beep [mysqld] port=3306 # 设置server-id 同一局域网内需要唯一 server-id=101 # 字符集 character-set-server=utf8mb4 # 默认使用存储引擎类型 default-storage-engine=INNODB # 慢查询日志 slow-query-log=1 # 慢查询阈值 达到阈值才会记录 单位:s long_query_time=10 # binlog 日志存放位置 log-bin=master_binlog # 指定不需要同步的数据库名称 binlog-ignore-db=mysql # 设置binlog文件使用的内存大小 binlog_cache_size=1M # binlog_format=row 设置binlog刷盘策略 新版已被废弃,默认为 row # binlog 过期清理时间 默认为30天 binlog_expire_logs_seconds=604800 # 跳过主从复制中遇到的所有错误或指定类型的错误 避免 slave 主从同步失败 # 1062:主键重复 1032:主从数据不一致 replica_skip_errors=1062 # 最大连接数量 max_connections=151 # 存储引擎内存大小 innodb_buffer_pool_size=128M # 最大连接错误数量 max_connect_errors=100
-
创建并启动 mysql-master 容器
docker run -d -p 3307:3306 --name mysql-master --privileged=true -v /data/mysql/master/conf.d:/etc/mysql/conf.d -v /data/mysql/master/log:/var/log/mysql -v /data/mysql/master/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=root mysql:8.0.39
-
进入容器,并设置主从同步用户
docker exec -it mysql-master bash
# 创建主从同步用户 # 创建 slave 用户可以通过 root 密码登录当前机器 mysql> create user 'slave'@'%' identified by 'root'; Query OK, 0 rows affected (0.01 sec) # 赋予 slave 用户复制权限:Replication client、Replication slave mysql> grant replication slave,replication client on *.* to 'slave'@'%'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
replication client:权限代表允许执行show master status,show slave status,show binary logs命令
replication slave:权限代表允许slave从机通过此用户进行主从复制
设置从机
-
设置主机配置文件
mkdir -p /data/mysql/slave/log mkdir -p /data/mysql/slave/data mkdir -p /data/mysql/slave/share mkdir -p /data/mysql/slave/conf.d vim /data/mysql/slave/conf.d/my.cnf
[client] port=3306 [mysql] no-beep [mysqld] port=3306 # 设置server-id,同一局域网内需要唯一 server-id=102 # 字符集 character-set-server=utf8mb4 # 默认使用存储引擎类型 default-storage-engine=INNODB # 慢查询日志 slow-query-log=1 # 慢查询阈值,达到阈值才会记录,单位:s long_query_time=10 # binlog 日志存放位置 log-bin=slave_binlog # 指定不需要同步的数据库名称 binlog-ignore-db=mysql # 设置binlog文件使用的内存大小 binlog_cache_size=1M # binlog_format=row 设置binlog刷盘策略 新版已被废弃,默认为 row # binlog 过期清理时间 默认为30天 binlog_expire_logs_seconds=604800 # 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 主从同步失败 # 1062:主键重复;1032:主从数据不一致 replica_skip_errors=1062 # 设置server-id,同一局域网内需要唯一 # 设置从机中继日志存放位置 relay_log=relay_log # 表示从机将主机的 binlog 写入自己 binlog 中 log_slave_updates # 最大连接数量 max_connections=151 # 存储引擎内存大小 innodb_buffer_pool_size=128M # 最大连接错误数量 max_connect_errors=100
log_slave_updates=1:如果不配置,从库从主库复制的数据不会写入log-bin日志文件里;假如从机宕机重启后,就会造成数据丢失。
-
创建并启动 mysql-master 容器
docker run -d -p 3308:3306 --name mysql-slave --privileged=true -v /data/mysql/slave/conf.d:/etc/mysql/conf.d -v /data/mysql/slave/log:/var/log/mysql -v /data/mysql/slave/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=root mysql:8.0.39
-
查询主机状态
mysql> show master status; +----------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------------+----------+--------------+------------------+-------------------+ | master_binlog.000003 | 878 | | mysql | | +----------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
-
进入容器,并配置主从复制
docker exec -it mysql-slave bash
# 创建主从同步用户 # 创建 slave 用户可以通过 root 密码登录当前机器 mysql> change master to master_host='宿主机ip',master_user='slave',master_password='root',master_port=3307,master_log_file='master_binlog.000003',master_log_pos=878,master_connect_retry=30; Query OK, 0 rows affected, 10 warnings (0.03 sec) # 查询主从同步状态 mysql> show slave status \G; # 开启主从同步 mysql> start slave; Query OK, 0 rows affected, 1 warning (0.03 sec)
master_port:主机暴露的端口,注意:如果主从不在一台机器,要将对应端口暴露出来。
master_log_file:主机中要同步的binlog文件名
master_log_pos:当前主机中 binlog 的数据大小
master_connect_retry:连接失败重试时间间隔
主从连接问题
This was attempt 1/86400, with a delay of 30 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
问题描述:密码认证失败
原因:mysql 高版本的密码都是用 caching_sha2_password 加密过的,从机使用明文进行连接不会成功。
解决:
-
主机创建用户时,不要对密码进行加密处理,以下操作是在主机中:
mysql> create user 'slave'@'%' identified with 'mysql_native_password' by 'root';
-
使用对应的主从同步用户获取主机中的公钥,下列操作均在从机中:
-
(推荐)get_master_public_key=1
mysql> change master to master_host='宿主机ip',master_user='slave',master_password='root',master_port=3307,master_log_file='master_binlog.000003',master_log_pos=878,master_connect_retry=30,get_master_public_key=1;
-
--server-public-key-path=/xxx/xxx/public_key.pem:获取主机中的公钥并保存在对应目录下
mysql> mysql -u slave -proot -h 宿主机ip -P3307 --server-public-key-path=/xxx/xxx/public_key.pem; mysql> change master to master_host='宿主机ip',master_user='slave',master_password='root',master_port=3307,master_log_file='master_binlog.000003',master_log_pos=878,master_connect_retry=30;
-