MySql 主从
MySql 主从
MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。
最多有一个主服务器,可以有多个从服务器
实现MySQL主从复制需要进行的配置:
主服务器:
- 开启二进制日志
- 配置唯一的server-id
- 获得master二进制日志文件名及位置
- 创建一个用于slave和master通信的用户账号
从服务器: - 配置唯一的server-id
- 使用master分配的用户账号读取master二进制日志
- 启用slave服务
启动两个mysql 容器
docker run -p 3301:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run -p 3302:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
配置master
使用如下命令进入到Master容器内部,使用容器ID或者名称均可:
docker exec -it mysql-master /bin/bash cd /etc/mysql
# 安装vim
apt-get update
apt-get install vim #修改配置
vim my.cnf
my.cnf 文件
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=master-bin
binlog-format=ROW // 二级制日志格式,有三种 row, statement, mixed
binlog-do-db=数据库名 //同步的数据库名称,如果不配置,表示同步所有的库
或者在本地修改,然后拷贝到docker容器中的目录中
docker cp my.cnf mysql-master:/etc/mysql/my.cnf
重启mysql service
service mysql restart
docker container restart mysql-master
创建数据库同步账户
docker exec -it mysql-master /bin/bash
mysql -uroot -p123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
配置 Slave 服务器
使用如下命令进入到Master容器内部,使用容器ID或者名称均可:
docker exec -it mysql-slave /bin/bash cd /etc/mysql
cd /etc/mysql
# 安装vim
apt-get update
apt-get install vim #修改配置
vim my.cnf
my.cnf 文件
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=mysql-relay-bin
read_only=1 ## 设置为只读,该项如果不设置,表示slave可读可写
重启服务和容器
service mysql restart
docker restart mysql-slave
开启master-salve主从复制
docker exec -it mysql-master /bin/bash
mysql -uroot -p123456
进入Master库mysql客户端:输入 查看Master状态:
查询主节点的ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
进入到Slave库myslq客户端,执行如下命令:
docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456
设置同步
change master to master_host='172.17.0.2',
master_user='slave', master_password='123456', master_port=3306, master_log_file='master-bin.000002', master_log_pos=617, master_connect_retry=30;
验证
start slave;
show slave status \G
Slave_IO_Running 和 Slave_SQL_Running是查看主从是否运行的关键字段,默认为NO,表示没有进行主从复制。
使用 start slave;
开启主从复制过程,然后再次查询主从同步状态
show slave status \G;。
试一下, 在master创建一个数据库和一个表
CREATE DATABASE demo;
USE demo;
create table emp_list_key
(
empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by list(deptno)
subpartition by KEY(birthdate)
subpartitions 3
(
partition p1 values IN (10),
partition p2 values IN (20),
partition p3 values in (30)
);
insert into emp_list_key (empno,empname,deptno,birthdate,salary) values (1,'zhangsan1',10,'2017-06-20',998);
insert into emp_list_key (empno,empname,deptno,birthdate,salary) values (2,'zhangsan2',10,'2018-06-20',1998);
insert into emp_list_key (empno,empname,deptno,birthdate,salary) values (3,'zhangsan31',20,'2019-06-20',2998);
insert into emp_list_key (empno,empname,deptno,birthdate,salary) values (4,'zhangsan32',30,'2020-06-20',2998);