mysql 主从复制授权_mysql主从复制

mysql复制

一、概述

主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。

使用场景: 高可用HA

(优点) 读写分离,降低主库的访问压力

负载均衡(读操作)

在从库进行备份,以免备份期间影响主库的服务

二、原理

流程介绍:

主节点:

开启二进制日志,主库上的数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。

dump线程:读取主库二进制日志事件用来响应从库的请求

从节点:

I/O 线程 :从master 请求二进制日志事件,并保存于中继日志中

SQL thread: 从中继日志中读取日志事件,在本地完成重放

三、特点:

1、基于GTID复制

GTID (Global Transaction ID)是全局事务ID,master生产的自增ID,每个事务的唯一标识,它由UUID:NUMBER构成,因此,不同 mysql节点产生的GTID必然不同,因此在整个集群全局中不会重复。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。

2、

1)异步复制

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这会存在个问题,主从数据不一致,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

补充说明:

2)半同步复制

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。MySQL以插件的形式支持半同步复制

3)全同步复制

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

四、三种复制方式:

####statement: 基于sql的binlog,每条修改数据的SQL都会保存到binlog 中

优点:并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点: 2020/01/09 20:44 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候。这种 情况下会导致master-slave中的数据不一致

* LOAD_FILE()

* UUID()

* USER()

* FOUND_ROWS()

####row:基于行级别,记录每一行数据的变化,也就是将每一行数据的变化都记录到binlog中

优点:安全可靠, 任何情况都可以被复制

缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。

mixed:混合statement和row模式

五、主从配置

1、主节点:启动二进制日志 Log_bin=master-bin

为当前节点设置一个全局唯一的ID号 Server_id=

创建有复制权限的用户账号

从节点:启动中继日志

为当前节点设置一个全局唯一ID

使用有复制权限的用户账号连接至主服务器,并启动复制线程

2、复制架构: 一主一从

主主 环状复制

一主多从,从还可以再有从

环境:主:192.168.159.131

从:192.168.159.132

********** 基于position

master :

1) 创建测试数据

create database masterdb1;

create table test1(name char(50));

insert into tset1 values(1111);

insert into tset1 values(2222);

2)vi /etc/my.cnf

log-bin

server-id = 131

systemctl restart mysqld

3) 创建复制用户并授权

grant replication slave, replication client on *.* to 'rep'@'192.168.159.%' identified by 'Mysql@123';

4)mysqldump -p'mysql123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql

5)观察二进制分隔点

slave :

1) 测试复制用户

mysql -h 192.168.159.131 -urep -p'Mysql@123'

2) vi /etc/my.cnf

server-id=132

systemctl restart mysqld

3) 导入数据

##set sql_log_bin=0; 如果想在主库上执行一些操作,但不复制到slave库上,可以通过修改参数sql_log_bin来实现。

source ''.sql

4) 设置主服务器

change master to master_host='192.168.159.131',

master_user='rep', master_password='MyMysql@123', master_log_file='master-bin.000003',

master_log_pos=154; ####在备份sql上查看

5)启动从设备

start slave;

6) 查看启动状态(IO-YES/SQL-YES)

show slave status\G;

返回主服务器(master1)更新数据,在从服务器(node1)观察是否同步。

**********基于GTID

master :

1)reset master;

2)添加数据,与上面实验区分

insert into masterdb1.test1 values (55555);

insert into masterdb1.test1 values (66666);

3) vi /etc/my.cnf

log-bin

server-id=1

gtid_mode=ON

enforce_gtid_consistency=1

systemctl restart mysqld

4) grant replication slave, replication client on *.* to 'aaa'@'192.168.159.%' identified by 'Mysql@123';

flush privileges;

5) mysqldump -p'mysql123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql

slave:

1) 测试复制用户

mysql -h 192.168.159.131 -uraaa -p'

2)2 启动二进制日志,服务器ID,GTID

vim /etc/my.cnf

log-bin

server-id=132

gtid_mode=ON

enforce_gtid_consistency=1

systemctl restart mysqld

4) source ''.sql

5) 设置主服务器

change master to master_host='192.168.159.131',master_user='rep',master_password='Mysql@123',

master_auto_position=1;

start slave;

show slave status\G;

返回主服务器(master1)更新数据,在从服务器(node1)观察是否同步。

***********双主

目前:已经设置master为node1的主服务器,只需设置node12为master1的主服务器,

1 设置node1为master的主服务器

1)创建复制用户

grant replication slave, replication client on *.* to 'aaa'@'192.168.159.%' identified by 'Mysql@123';

flush privileges;

2) node开启bin-log

3) 设置主服务器

change master to master_host='192.168.159.132',master_user='aaa',master_password='Mysql@123',

master_auto_position=1;

start slave;

show slave status\G;

2 、测试

master上插入数据,在node上观察 insert into masterdb1.test1 values (55555);

node1上插入数据,在master上观察 insert into masterdb1.test1 values (55555);

双方同步成功,双主设置完成。

#############################33

半同步复制:配置

Mysql > show plugins;

If not exist : mysql >

Master :install plugin rpl_semi_sync_master soname 'semisync_master.so';

Slave :install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

MASTER: show global variables like '%semi%';

Slave: set global rpl_semi_sync_slave_enabled=ON;

Master :show global status like '%semi%';

复制过滤器:

从服务器SQL_THREAD在replay 中继日志中的事件时,仅读取与特定数据库相关的数据应用于本地

问题:会造成网络及磁盘IO权限

Replicate_do_db 仅复制哪个库

Replicate_ingnore_db

Replicate_do_table 仅复制哪个表

Replicate_ingnore_table

你可能感兴趣的:(mysql,主从复制授权)