拉取mysql 镜像
docker pull mysql:8.0.30
创建项目目录
mysql/
├── common
│ ├── mysql-master (配置文件路径)
│ │ ├── conf
│ │ │ └── my.conf
│ │ └── sql
│ │ └── create_user.sql
│ └── mysql-slave (配置文件路径)
│ ├── conf
│ │ └── my.conf
│ └── sql
│ └── conn_master.sql
├── DATA (数据文件路径)
│ ├── mysql-master
│ └── mysql-slave
└── docker-compose.yml (启动文件)
查看配置
查看docker-compose.yml
version: "3"
networks:
db_network:
services:
master:
image: mysql:8.0.30
container_name: master
restart: always
ports:
- "3316:3306"
mem_limit: 2gb
env_file: ./common/mysql-master/.env (数据库密码=111111)
volumes:
- ./common/mysql-master/conf/:/etc/mysql/conf.d/
- ./DATA/mysql-master:/var/lib/mysql
networks:
db_network:
slave:
image: mysql:8.0.30
container_name: slave
restart: always
ports:
- "3326:3306"
mem_limit: 2gb
env_file: ./common/mysql-slave/.env (数据库密码=111111)
volumes:
- ./common/mysql-slave/conf/:/etc/mysql/conf.d/
- ./DATA/mysql-slave:/var/lib/mysql
networks:
db_network:
depends_on:
- master
查看mysql配置文件
关于配置文件中的参数及解释,借用的CSDN其他博主的,感谢博主大大。
master mysql配置
cat common/mysql-master/conf/my.conf
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
symbolic-links=0
secure-file-priv= NULL
#设置同步的binary log二进制日志文件名前缀,默认为binlog
log-bin=mysql-bin
#服务器唯一id,默认为1,主数据库和从数据库的server-id不能重复
server-id=1
# 设置默认时区
default-time_zone='+8:00'
# 最大连接数
max_connections=10000
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
innodb_redo_log_capacity = 16M
#########可选配置#######
#主从复制的数据库名
#binlog-do-db=tmd
#指定忽略同步的数据库
#binlog-ignore-db=mysql
#为每个session分配的内存
binlog_cache_size=1M
#主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
#设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。这里设置为7天
expire_logs_days=7
#跳过主从同步中遇到的所有错误或指定类型的错误,避免slave端复制中断,1062错误是指一些主键重复
slave_skip_errors=1062
!includedir /etc/mysql/conf.d/
slave mysql配置
cat common/mysql-slave/conf/my.conf
[mysqld]
##############################slave从配置##############################
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
lower_case_table_names=1
symbolic-links=0
#设置同步的binarylog二进制日志文件名前缀,默认是binlog
log-bin=mysql-bin
#服务器唯一ID,主数据库和从数据库的server-id不能重复
server-id=22
# 最大连接数
max_connections=10000
# 设置默认时区
default-time_zone='+8:00'
innodb_redo_log_capacity = 16M
###############################可选配置#################################
#需要主从复制的数据库
#replicate-do-db=tmd
#忽略同步的数据库
binlog-ignore-db=mysql
#为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
#主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
#设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,1062错误是指一些主键重复
slave_skip_errors=1062
#relay_log配置中继日志,默认采用主机名-relay-bin的方式保存日志文件
relay_log=replicas-mysql-relay-bin
#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#防止改变数据(只读操作,除了特殊的线程)
read_only=1
!includedir /etc/mysql/conf.d/
查看数据目录
注: 容器启动前,必须保证数据目录为空
[root@localhost mysql]# tree DATA/
DATA/
├── mysql-master
└── mysql-slave
启动
启动容器
[root@localhost mysql]# docker-compose up -d
Creating network "mysql_db_network" with the default driver
Creating master ... done
Creating slave ... done
查看容器信息
[root@localhost mysql]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b18f41527b1 mysql:8.0.30 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 33060/tcp, 0.0.0.0:3326->3306/tcp, :::3326->3306/tcp slave
c66b356bcbf1 mysql:8.0.30 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 33060/tcp, 0.0.0.0:3316->3306/tcp, :::3316->3306/tcp master
获取master 容器IP地址
[root@localhost mysql]# docker inspect master|grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.23.0.2",
配置数据库
分别链接数据库
master 配置
进入master数据库,执行以下sql语句
CREATE USER 'master'@'%' IDENTIFIED WITH mysql_native_password BY 'master123';
GRANT REPLICATION SLAVE ON *.* TO 'master'@'%';
show master status;
(图 1-1)
获取字段 File = binlog.000002
(图 1-2)
slave 配置
我们上面已经获取到master 的IP,及File字段值,将在这里使用,
CHANGE MASTER TO
MASTER_HOST='172.23.0.2',
MASTER_USER='master',
MASTER_PASSWORD='master123',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=1163;
开始同步
1.同步
start slave;
show slave status;
2.排错
1.查看错误信息
发现上图中Slave_IO_Running = No
查看slave 容器日志,发现报错信息
docker logs -n 5 -f slave
[ERROR] [MY-013117] [Repl] Slave I/O for channel '': Fatal error: The slave I/O thread \n
stops because master and slave have equal MySQL server ids; these ids must be different \n
for replication to work (or the --replicate-same-server-id option must be used on \n
slave but this does not always make sense; please check the manual before using it). Error_code: MY-013117
2. 解决错误
1.查看server_id
在 master、slave 数据库中分别执行
show variables like 'server_id';
发现 master、slave 的id 都是server_id = 1
2.修改slave 的server_id
set global server_id = 2;
再次查询slave 的server_id
show variables like 'server_id';
3. 重新开始同步
stop slave;
reset slave;
start slave;
show slave status
下图中查看到Slave_IO_Running = Yes,说明问题解决
3. 验证
1. master 创建数据库表
2. 查看结果
数据库同步成功