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);
posted @ 2021-01-03 23:42  scogee  阅读(81)  评论(0编辑  收藏  举报