MYSQL主从复制搭建

目录

一 复制概述

 二、复制原理

 三、复制优势

四、 使用docker完成1主1从

 1. master

1)新建服务器容器实例

 2)在/usr/local/mysql/mysql-docker/master/conf下新建my.cnf

3) 执行完毕之后,需要重启MySQL: 

4)进入mysql: 可以通过命令行show master status\G;查看当前binlog日志的信息(后面有用): 

 5) 创建同步数据的账户,并且进行授权操作:

  6)查看创建的是否有replication slave权限

 2. slave

1)新建服务器容器实例

 2)在/usr/local/mysql/mysql-docker/slave1/conf下新建my.cnf

3)在主数据库中查看同步状态

4)进入mysql-slave1实例

5)在从数据库中配置主从复制

 6)从数据库查看主从同步状态

 7)从数据库开启主从同步并再次查看主从同步状态

 8)测试主从同步

五、 使用docker完成2主2从

1 架构图

2 搭建步骤

1)docker创建容器实例

2)查看mysql实例是否创建成功

 3) 分别配置my.cnf文件

4)重启4个mysql实例

 5)进入master,创建用户并分配权限

5)进入master,查看master状态

 6)进入slave,在slave中进行主从复制

7)进入slave启动主从复制

8)查看主从复制状态

 9) 关闭从服务器的主从复制

10)master1,master2互相复制

 11)在master1,master2中开启主从,并查看状态

 12)开启slave1,slave2丛机主从

13)测试


一 复制概述

复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行,从而使得从库和主库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

一、DML与DDL的含义:

1、DML(Data Manipulation Language)数据操作语言-数据库的基本操作,SQL中处理数据等操作统称为数据操纵语言,简而言之就是实现了基本的“增删改查”操作。包括的关键字有:select、update、delete、insert、merge

2、DDL(Data Definition Language)数据定义语言-用于定义和管理 SQL 数据库中的所有对象的语言,对数据库中的某些对象(例如,database,table)进行管理。包括的关键字有:

create、alter、drop、truncate、comment、grant、revoke

二、DML与DDL的区别:

1.DML操作是可以手动控制事务的开启、提交和回滚的。

2.DDL操作是隐性提交的,不能rollback!

 二、复制原理

MySQL的主从复制原理如下:

  • Master主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中保存
  • 主库推送二进制日志文件中的日志事件到从库的中继日志 Relay Log
  • slave从库重新执行中继日志中的事件,将数据同步到自己的服务器MYSQL主从复制搭建_第1张图片

 三、复制优势

MySQL主从复制的优点主要包含以下三个方面:

  • 主库出现问题,可以快速切换到从库提供服务

  • 在从库上执行查询操作,在主库上执行更新操作,实现读写分离,降低主库的访问压力

  • 在从库上执行备份,以避免备份期间影响主库的服务

四、 使用docker完成1主1从

 1. master

1)新建服务器容器实例

docker run -p 3307:3306 --name mysql-master \
-v /usr/local/mysql/mysql-docker/master/log:/var/log/mysql \
-v /usr/local/mysql/mysql-docker/master/data:/var/lib/mysql \
-v /usr/local/mysql/mysql-docker/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456  \
-d mysql:5.7

 2)在/usr/local/mysql/mysql-docker/master/conf下新建my.cnf

[mysqld]

## 设置server_id,同一局域网中需要唯一

server_id=101 

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql  

## 开启二进制日志功能

log-bin=mall-mysql-bin  

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)

binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。

expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

slave_skip_errors=1062

3) 执行完毕之后,需要重启MySQL: 

docker restart mysql-master

4)进入mysql: 可以通过命令行show master status\G;查看当前binlog日志的信息(后面有用): 

docker exec -it mysq--master /bin/bash

mysql -uroot -p123456

show master status\G;

 MYSQL主从复制搭建_第2张图片

字段含义

File : 从哪个日志文件开始推送日志文件
Position : 从该日志文件的哪个位置开始推送日志
Binlog_Ignore_DB : 指定不需要同步的数据库

 5) 创建同步数据的账户,并且进行授权操作:

#授予ip地址为任意的root用户在所有数据库的所有表上主从复制的权限,%可以换为ip地址
grant replication slave on *.* to 'ydj1'@'%' identified by '123456';

#刷新权限列表
flush privileges;

#注意mysql8.0以上版本先创建用户在进行授权

        #创建用户

         CREATE USER 'ydj'@'%' IDENTIFIED BY '123456';

        #修改用户

        alter user 'ydj'@'%' identified with mysql_native_password by '123456';

        #授权

        grant REPLICATION SLAVE on *.* to 'ydj'@'%';

        #刷新权限列表
        flush privileges;

  6)查看创建的是否有replication slave权限

select user, repl_slave_priv from mysql.user;

 MYSQL主从复制搭建_第3张图片

也可以通过远程连接mysql工具navicat进行修改权限

MYSQL主从复制搭建_第4张图片

 2. slave

使用docker完成从机搭建

1)新建服务器容器实例

docker run -p 3308:3306 --name mysql-slave1 \
-v /usr/local/mysql/mysql-docker/slave1/log:/var/log/mysql \
-v /usr/local/mysql/mysql-docker/slave1/data:/var/lib/mysql \
-v /usr/local/mysql/mysql-docker/slave1/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456  \
-d mysql:5.7

 2)在/usr/local/mysql/mysql-docker/slave1/conf下新建my.cnf

[mysqld]

## 设置server_id,同一局域网中需要唯一

server_id=102

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql  

## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用

log-bin=mall-mysqlbin  

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)

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

3)在主数据库中查看同步状态

MYSQL主从复制搭建_第5张图片

4)进入mysql-slave1实例

docker exec -it mysql-slave1 /bin/bash

mysql -uroot -p123456

5)在从数据库中配置主从复制

change master to
master_host='192.168.80.130',master_user='ydj',master_password='123456',

master_port=3306,master_log_file='mysqlbin.000003',master_log_pos=1295,

master_connect_retry=30;

master_host:主数据库的IP地址;

master_port:主数据库的运行端口;

master_user:在主数据库创建的用于同步数据的用户账号;

master_password:在主数据库创建的用于同步数据的用户密码;

master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;

master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;

master_connect_retry:连接失败重试的时间间隔,单位为秒

 6)从数据库查看主从同步状态

show slave status \G;

 MYSQL主从复制搭建_第6张图片

 7)从数据库开启主从同步并再次查看主从同步状态

start slave;

show slave status \G;

MYSQL主从复制搭建_第7张图片

 8)测试主从同步

向主数据插入数据,观察从数据库同步是否成功.

五、 使用docker完成2主2从

1 架构图

MYSQL主从复制搭建_第8张图片

 

2 搭建步骤

1)docker创建容器实例

docker run -p 3307:3306 --name mysql-master1 \
-v /usr/local/mysql/mysql-docker/master1/log:/var/log/mysql \
-v /usr/local/mysql/mysql-docker/master1/data:/var/lib/mysql \
-v /usr/local/mysql/mysql-docker/master1/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456  \
-d mysql:5.7

docker run -p 3308:3306 --name mysql-slave1 \
-v /usr/local/mysql/mysql-docker/slave1/log:/var/log/mysql \
-v /usr/local/mysql/mysql-docker/slave1/data:/var/lib/mysql \
-v /usr/local/mysql/mysql-docker/slave1/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456  \
-d mysql:5.7

docker run -p 3309:3306 --name mysql-master2 \
-v /usr/local/mysql/mysql-docker/master2/log:/var/log/mysql \
-v /usr/local/mysql/mysql-docker/master2/data:/var/lib/mysql \
-v /usr/local/mysql/mysql-docker/master2/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456  \
-d mysql:5.7

docker run -p 3310:3306 --name mysql-slave2 \
-v /usr/local/mysql/mysql-docker/slave2/log:/var/log/mysql \
-v /usr/local/mysql/mysql-docker/slave2/data:/var/lib/mysql \
-v /usr/local/mysql/mysql-docker/slave2/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456  \
-d mysql:5.7

2)查看mysql实例是否创建成功

docker ps

 3) 分别配置my.cnf文件

masrer  另外一个master配置文件将server_id=103即可

[mysqld]

## 设置server_id,同一局域网中需要唯一

server_id=101 

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql  

## 开启二进制日志功能

log-bin=mall-mysql-bin  

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)

binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。

expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

slave_skip_errors=1062

## 在作为从数据库的时候, 有写入操作也要更新二进制日志文件

log-slave-updates

slave另外一个slave配置文件将server_id=104即可

[mysqld]

## 设置server_id,同一局域网中需要唯一

server_id=102

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql  

## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用

log-bin=mall-mysqlbin  

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)

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

4)重启4个mysql实例

docker restart mysql-master1  mysql-master2 mysql-slave1 mysql-slave2

 5)进入master,创建用户并分配权限

docker exec -it mysql-master1 /bin/bash

grant replication slave on *.* to 'ydj'@'%' identified by '123456';

docker exec -it mysql-master2 /bin/bash

grant replication slave on *.* to 'ydj'@'%' identified by '123456';

5)进入master,查看master状态

docker exec -it mysql-master1 /bin/bash

mysql -uroot -p123456

show master status \G;

docker exec -it mysql-master2 /bin/bash

mysql -uroot -p123456

show master status \G;

MYSQL主从复制搭建_第9张图片 

 

 6)进入slave,在slave中进行主从复制

docker exec -it mysql-slave1 /bin/bash

mysql -uroot -p123456

change master to
master_host='192.168.80.130',master_user='ydj',master_password='123456',

master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=154,

master_connect_retry=30;

MYSQL主从复制搭建_第10张图片

 

docker exec -it mysql-slave2 /bin/bash

mysql -uroot -p123456

change master to
master_host='192.168.80.130',master_user='ydj',master_password='123456',

master_port=3309,master_log_file='mall-mysql-bin.000001',master_log_pos=436,

master_connect_retry=30;

 

7)进入slave启动主从复制

start slave;

8)查看主从复制状态

show slave status \G;

MYSQL主从复制搭建_第11张图片

 

注意:如果主从复制失败,或一直连接不上的情况下先在丛机执行

stop slave;

reset slave;

在重复第6步

若还是不行就需要去排查问题;

 9) 关闭从服务器的主从复制

stop slave;

reset slave;

10)master1,master2互相复制

master1中

change master to
master_host='192.168.80.130',master_user='ydj',master_password='123456',

master_port=3309,master_log_file='mall-mysql-bin.000001',master_log_pos=436,

master_connect_retry=30;

master2中

change master to
master_host='192.168.80.130',master_user='ydj',master_password='123456',

master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=154,

master_connect_retry=30;

 11)在master1,master2中开启主从,并查看状态

master1

start slave;

show slave status;

MYSQL主从复制搭建_第12张图片

master2

start slave;

show master status;

MYSQL主从复制搭建_第13张图片 

 12)开启slave1,slave2丛机主从

步骤如6步

13)测试

MYSQL主从复制搭建_第14张图片

 

你可能感兴趣的:(mysql)