前言
参考文章
- 概念:mysql的主主、主从、主背
https://blog.csdn.net/qq_39871711/article/details/123494048
可以设置binlog-format:statement,row和mixed。 - 额
https://blog.csdn.net/agonie201218/article/details/121499881
实战
1、创建3个数据库容器,分别为:mysql-3306-master、mysql-3307-slave,mysql-3308-slave;
2、修改主库my.cnf配置、修改从库my.cnf配置
3、启动主从同步
创建容器
1、创建容器挂载目录和文件
需要把3个容器的挂载目录都创建出来
mkdir -p \
/Users/qilongsun/docker-data/mysql-3306/data \
/Users/qilongsun/docker-data/mysql-3306/conf \
/Users/qilongsun/docker-data/mysql-3307/data \
/Users/qilongsun/docker-data/mysql-3307/conf \
/Users/qilongsun/docker-data/mysql-3308/data \
/Users/qilongsun/docker-data/mysql-3308/conf
创建文件
touch \
/Users/qilongsun/docker-data/mysql-3306/conf/my.cnf \
/Users/qilongsun/docker-data/mysql-3307/conf/my.cnf \
/Users/qilongsun/docker-data/mysql-3308/conf/my.cnf
2、创建3个容器
创建容器
docker run -p 3306:3306 \
--name mysql-3306-master \
-v /Users/qilongsun/docker-data/mysql-3306/data:/var/lib/mysql \
-v /Users/qilongsun/docker-data/mysql-3306/conf/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=root -d mysql:latest \
docker run -p 3307:3306 \
--name mysql-3307-slave \
-v /Users/qilongsun/docker-data/mysql-3307/data:/var/lib/mysql \
-v /Users/qilongsun/docker-data/mysql-3307/conf/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=root -d mysql:latest \
docker run -p 3308:3306 \
--name mysql-3308-slave \
-v /Users/qilongsun/docker-data/mysql-3308/data:/var/lib/mysql \
-v /Users/qilongsun/docker-data/mysql-3307/conf/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=root -d mysql:latest
查看是否创建成功
docker ps
修改主从配置
停掉容器,添加主从配置
停掉容器
docker stop mysql-3306-master mysql-3307-slave mysql-3308-slave
添加主库配置
vi /Users/qilongsun/docker-data/mysql-3306/conf/my.cnf
内容如下
[mysqld]
#默认配置
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
#主库配置
#服务器id,默认为1,不可重复
server-id=1
#二进制日志名,默认binlog
#log-bin=binlog
#是否只读,1代表只读,0代表读写
#read-only=0
#需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行(先建好库),不指定则同步整个数据源
#binlog-do-db=t_user
#不同步系统数据库
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
添加从库配置(3307)
vi /Users/qilongsun/docker-data/mysql-3307/conf/my.cnf
内容如下
[mysqld]
#默认配置
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
#从库配置
#服务器id,默认为1,不可重复
server-id=2
#二进制日志名,默认binlog
#log-bin=binlog
添加从库配置(3308)
vi /Users/qilongsun/docker-data/mysql-3308/conf/my.cnf
内容如下
[mysqld]
#默认配置
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
#从库配置
#服务器id,默认为1,不可重复
server-id=3
#二进制日志名,默认binlog
#log-bin=binlog
启动3个容器,验证修改的配置
# 启动容器
docker start mysql-3306-master mysql-3307-slave mysql-3308-slave
#进入容器
docker exec -it mysql-3306-master bash
#查看配置
cat ./etc/my.cnf
启动主从同步
这时候,主库从库都已经建立完成。
查看主库binlog文件信息(当前文件数和行数)
每次重启数据库binlog文件数都会加1,行数表示的当前操作在binlog日志中所记录的行数。
在主库下面执行
show master status;
从库连接主库
分别在两个从库下面执行该条sql。
注意:如果binlog文件名称在上面配置中改的话,这里也要改!!!(binlog.000003)
CHANGE MASTER TO
master_host='172.20.51.131',
master_user='root',
master_password='root',
master_port=3306,
master_log_file='binlog.000003',
master_log_pos=157;
示例:
分别执行后,然后查询状态
show slave status;
启动同步
分别在两个从库下面执行
启动同步
start slave;
查询启动状态
show master status;
测试
在主库添加数据库,从库也会一样同步过来
其他配置
从库连接主库从新连接
## 停止同步(在从库下面执行)
stop slave;
## 重置连接(在从库下面执行)
reset slave;
## 查询主库最新的binlog文件信息(在主库下面执行)
show master master;
## 重新连接(在从库下面执行)
...sql略
## 查看连接状态(在从库下面执行)
show slave status;
延迟同步
## 单位秒(在从库下面执行)(对应连接状态里面的SQL_Delay字段)
CHANGE MASTER TO master_delay = 3600;
总结
主从连接以后,主库无论是建库、建表、增删改字段 和数据,都能同步到从库;
一旦同步链接断开,似乎只能从头开始同步;
另外,要注意binlog的有效期;
同一个ip下的数据库,只要端口不一样,也是可以做主从同步的。