文章目录
1 在宿主机创建MySQL挂载目录
配置在这两台服务器上: 131.0.4.21(主),131.0.4.22(从)
主从两台机器均执行mkdir -p /data/docker_data/mysql/conf /data/docker_data/mysql/logs /data/docker_data/mysql/data
2 docker拉取MySQL镜像
主从2台均拉去
docker pull mysql:5.7.28
3 创建容器(使用docker-compose)
主从2台均创建 注意容器名称自行修改,主mysql名为mysql-master 从为mysql-slave
#创建docker-compose文件夹
mkdir -p /data/docker_data/mysql/docker-compose
#创建文件
cd /data/docker_data/mysql/docker-compose
vi docker-compose.yml
写入以下内容:
version: '3.5'
services:
mysql:
image: mysql:5.7.28
container_name: mysql-master
privileged: true
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: xxlopws@aaji12560
MYSQL_PASS: root
TZ: Asia/Shanghai
command:
--wait_timeout=31536000
--interactive_timeout=31536000
--max_connections=1000
--default-authentication-plugin=mysql_native_password
--lower-case-table-names=1
--default-time_zone='+8:00'
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
volumes:
- "/data/docker_data/mysql/data:/var/lib/mysql"
- "/data/docker_data/mysql/conf:/etc/mysql/conf.d"
- "/data/docker_data/mysql/logs:/var/log/mysql"
进入docker-compose目录,本样例中是/data/docker_data/mysql/docker-compose目录,下面有docker-compose.yml文件,执行如下命令:
docker-compose up -d --build
备注:
重启容器
docker-compose restart
停止容器:会删除容器
docker-compose down
停止但不删除容器:
docker-compose stop
docker-compose.yml文件中参数解释
参数解释:
*
--name 容器名字
*
-p 3306:3306 物理机端口:容器内部端口
*
-e 运行参数 初始化 root 用户的密码
*
-d 后台运行 mysql:5.7 镜像名字加标签
*
-v /opt/docker_v/mysql/conf:/etc/mysql:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。//配置文件目录
*
-v /opt/docker_v/mysql/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。//数据库文件存放目录
*
--lower-case-table-names 大小写敏感配置 0 :敏感 1:不敏感
*
TZ=Asia/shanghai : 设置容器时区
*
character-set-server : 服务器字符集,在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集。
*
character-set-database : 数据库字符集
*
character-set-table : 数据库表字符集
*
collation-server : 排序规则字符集
*
default-time_zone : mysql的时区
4 进入容器内部,配置
以下命令进入容器内部:
docker exec -it mysql-master bash
然后mysql:mysql -u root -p
,输入docker-compose中设置的密码
授权外网可访问:
GRANT ALL ON *.* TO 'root'@'%' ;
查看大小写和时间配置是否正确:
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | +08:00 |
+------------------+--------+
2 rows in set (0.00 sec)
mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 1 |
+------------------------+-------+
2 rows in set (0.00 sec)
修改允许远程连接:
#指定数据库
use mysql;
#查看用户连接范围
select user, host from user;
#修改mysql允许远程连接,不用管ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
update user set host='%' where user='root';
#刷新
flush privileges;
使用图形化界面进行连接,创建数据库和表选择utf8mb4
5 配置主从
5.1 主节点、从节点创建自己的配置文件
#进入之前映射的本地文件目录
cd /data/docker_data/mysql/conf
#创建自己的mysql配置文件,/etc/mysql/conf.d下的文件会被容器中的mysql配置文件引入全局配置中
vi myconf.cnf
#添加如下内容 1.开启binlog
[mysqld]
#开启二进制日志
log-bin=mall-mysql-bin
#设置server-id,和从不能一样
server-id=1
# 设置使用的二进制日志格式(row-行级别;statement=语句级别;mixed-混合级别)
binlog-format=mixed
#同步的数据库名称,如果不配置,表示同步所有的库
## binlog-do-db=db1
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
# 二进制日志过期清理时间,默认为0,表示不自动清理
expire_logs_days=7
#忽略主从复制中遇到的所有错误活指定的错误类型,避免slave端复制中断
## 如:1062错误码代表主键重复;1032错误码代表主从数据库数据不一致
slave_skip_errors=1062
从节点,如上同理进行配置
[mysqld]
## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置server_id,同一局域网中需要唯一
server_id=2
## 指定不需要同步的数据库
binlog-ignore-db=mysql
# 设置二进制日志使用内存大小(事务)
binlog_cache_size=2M
## 设置使用的二进制日志格式
binlog_format=mixed
## 二进制日志过期清理时间,默认为0,代表不自动清理
expire_logs_days=7
## 忽略主从复制中遇到的所有错误活指定的错误类型,避免slave端复制中断
## 如:1062错误码代表主键重复;1032错误码代表主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读权限(具有super权限的用户除外)
read_only=1
5.2 创建数据库同步账户
使用docker命令重新进入到主节点Master容器内部:
docker exec -it mysql-master /bin/bash
在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。登录到mysql客户端:
mysql -u root -p
#创建用户并授权:
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY 'master@test123';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Query OK, 0 rows affected (0.00 sec)
5.3 查看Master状态记住file和position
进入Master库mysql客户端:输入show master status查看Master状态:
mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000001 | 154 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
记住File和Position,后面需要用到。此时一定不要操作Master库,否则将会引起Master状态的变化,File和Position字段也将会进行变化。
5.4 从节点配置、启动同步
进入到Slave库myslq客户端,执行如下命令:(注意master-bin.000004的master_log_pos位置要一样)
docker exec -it mysql-slave /bin/bash
mysql -u root -p
mysql> change master to master_host='131.0.4.21', master_user='slave', master_password='master@test123', master_port=3306, master_log_file='mall-mysql-bin.000003', master_log_pos=154, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
命令说明:master_host :Master库的地址,指的是容器的独立ip
master_port:Master的端口号,指的是容器的端口号 master_user:用于数据同步的用户
master_password:用于同步的用户的密码 master_log_file:指定 Slave
从哪个日志文件开始复制数据,即上文中提到的 File 字段的值 master_log_pos:从哪个 Position
开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
1)开启主从复制:
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2)查看状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 131.0.4.21
Master_User: slave
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: mall-mysql-bin.000003
Read_Master_Log_Pos: 154
Relay_Log_File: mall-mysql-relay-bin.000002
Relay_Log_Pos: 325
Relay_Master_Log_File: mall-mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 537
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 98cac7a3-13ff-11ed-a406-0242ac120002
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
Slave_IO_Running 和 Slave_SQL_Running是查看主从是否运行的关键字段,默认为YES,表示主从状态正常。