这篇是幕课网-MySQL5.7复制功能实战视频教程的学习笔记。http://www.imooc.com/learn/589
第1章 MySQL复制基础
MySQL是异步复制
采取针对特定用户的读写分离,可以实现假无延迟。
MySQL复制是基于binlog日志进行的。存在三种日志格式:
- statement格式 存储SQL语句,存储日志量最小
- row格式 存储event数据,日志量大,不能直接进行读取
- mixed格式 建议生产环境使用该格式
MySQL复制可以是整个实例,也可以是实例中的某个库或某个表
Master端:
--binlog-do-db
--binlog-ignore-db
Slave端:
--replicate-do-db
--replicate-ignore-db
--replicate-do-table
--replicate-ignore-table
--replicate-wild-do-table
--replicate-wild-ignore-table
数据过滤控制通常在Slave端进行,因为Master端的修改需要重启数据库实例,而Slave端就会容易操作得多,并且Slave端的控制更细
复制类型:
基于二进制日志的复制,重点关注的是主的二进制日志文件名和复制点,一主多从进行主备互换时,确认日志复制点比较麻烦
使用GTID完成基于事务的复制[MySQL5.7成熟],全局事务标识符,由主机标志和自增ID组成,推荐
MySQL支持半同步复制,通过插件实现,Master阻塞事务的提交,只有当收到Slave确认收到日志的消息后,再进地提交。第一张图为MySQL5.6,第二张图为MySQL5.7
第2章 实现基于日志点的复制
实验环境:
Node2:192.168.3.101 5.7.9 Slave
A在Master端建立复制用户
show warning;
drop user dba@'192.168.3.%';
select user,host from mysql.user;
create user 'dba'@'192.168.3.%' identified by '123456'; #先建立用户
grant replication slave on *.* to dba@'192.168.3.%'; #对用户进行授权
show databases;
create database dba;
use dba
create table t(id int,c1 varchar(10),primary key (id));
insert into t values(1,'aa'),(2,'cc'),(3,'dd');
select * from t;
B备份Master端的数据,并在Slave端恢复
--single-transaction保证事务完整性
--master-data 为1时不注释,为2时注释
--triggers 如果有触发器加上触发器
--routines 存储过程函数
--all-databases 备份所有数据
scp all.sql root@192.168.3.101:/root
mysql -uroot -p < all.sql
more all.sql 查看Master二十制文件名和日志点(--master-data=2的功劳)mysql-bin.000004 POS=1687
C使用change master命令配置复制
change master to
master_host='192.168.3.100',
master_user='dba',
master_password='123456',
master_log_file='mysql-bin.000004',
master_log_pos=1687;
change master to master_host='192.168.3.100',master_user='dba',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=1687;
show slave status \G
start slave;
iptables -L
/etc/init.d/iptables stop #关闭防火墙
主从管理的系统视图
use performance_schema;
show tables;
replication_applier_configuration 通道名称和主动延迟时间,比如1小时(3600秒),那么从需要1小时后才会同步数据,有1小时的反悔期
配置:stop slave;change master to master_delay=3600;start slave;
replication_applier_status 显示通道名称,服务状态,下一次同步剩余时间[主动延迟]
replication_applier_status_by_coordinator 多线程复制
replication_applier_status_by_worker 工作线程,线程状态信息 show processlist;
replication_connection_configuration 连接配置信息,主机、端口、用户等
replication_connection_status 连接状态 show slave status;
replication_group_member_stats
replication_group_members
第3章 如何在线变更复制类型
在线将基于日志的复制变更为基于事务的复制[仅5.7版本]
集群中所有服务器版本均高于5.7.6 #show variables like '%version%';
集群中所有服务器gtid_mode都设为off #show variables like 'gtid_mode';
处理步骤【主/备】:
set @@global.enforce_gtid_consistency=warn; #修改后需要查看mysql-error.log日志信息,只有在没有报错的情况下,才能进行下一步操作
set @@global.enforce_gtid_consistency=on;
set @@global.gtid_mode=off_permissive; #修改后需要查看mysql-error.log日志信息,只有在没有报错的情况下,才能进行下一步操作
set @@global.gtid_mode=on_permissive;
show status like 'ongoing_anonymous_transaction_count'; #应为空值或者0值,其实就是基于日志点的复制的数量
set @@global.gtid_mode=on;
show variables like 'gtid_mode'; #核对均为ON的状态
stop slave;
change master to master_auto_position=1;
start slave;
show slave status; #在备上查看状态,应有Executed_Gtid_Set项,并有值
同时,将gtid-mode=on和enforce-gtid-consistency=on写入my.cnf配置文件中,以使服务重启后能自动进入gtid模式
变更复制类型之后管理视图的变化
show tables like 'replication%';
select * from replication_connection_configuration \G #AUTO_POSITION=1
select * from replication_connection_status \G #UUID值
在线将基于事务的复制变更为基于日志的复制[仅5.7版本]
集群中所有服务器版本均高于5.7.6 #show variables like '%version%';
集群中所有服务器gtid_mode都设为on #show variables like 'gtid_mode';
处理步骤【主/备】:
stop slave;
change master to master_auto_position=0,master_log_file='filename',master_log_pos=1212;
start slave;
set @@global.gtid_mode=on_permissive;
set @@global.gtid_mode=off_permissive;
select @@global.gtid_owned; #应为空字符串之后,才能进行下一步的操作
set @@global.gtid_mode=off;
set @@global.enforce_gtid_consistency=off;
同时,去掉my.cnf配置文件中gtid-mode=on和enforce-gtid-consistency=on项目,以使服务重启后服务正常
第4章 如何使用多源复制
多源复制也就是多Master复制,允许一个Slave对应多个Master
可以用在跨实例的查询上
option:
master_bind='interface_name'
master_host='host_name'
master_user='user_name'
master_password='password'
master_port=port_num
master_connect_retry=interval
master_retry_count=count
master_delay=interval
master_heartbeat_period=interval
master_log_file='master_log_name'
master_log_pos=master_log_pos
channel_option:
for channel channel
实验环境:
Node2:192.168.3.101 5.7.9 Slave
Node3:192.168.3.102 5.7.9 Master 数据库N3,表t3
三台服务器均使用的是基于事务的模式,即show variables like 'gtid_mode'; 结果为ON
create database N3;
use N3
create table t3(id int,c1 varchar(10),c3 varchar(10),primary key (id));
show create table t3;
insert into t3 values(1,'aa','bb'),(2,'cc','dd');
select * from t3;
create user dba@'192.168.3.%' identified by '123456'; #创建复制用户
grant replication slave on *.* to dba@'192.168.3.%'; #为用户赋权
【Node2 Slave】
change master to
master_host='192.168.3.102',
master_user='dba',
master_password='123456',
master_auto_position=1 for channel 'N3';
show slave status \G
start slave for channel 'n3';
show slave status \G
错误,因为Node1和Node3都建有dba用户,所以出错,以下是解决方法:
stop slave;
use mysql
select user,host form user;
drop user dba@'192.168.3.%';
start slave;
show slave status \G #正常,此时有两条记录,对应两个Master
show databases; #此时复制正常
管理视图的变化:
use performance_schema;
show tables like 'replication%';
select * from replication_applier_configuration; #显示两行
select * from replication_applier_status; #显示两行
select * from replication_applier_status_by_coordinator \G
select * from replication_connection_configuration \G #显示两行
select * from replication_connection_status \G #显示两行
第5章 如何使用多线程复制
解决延时问题,在MySQL5.6中就已提供,但是一个线程仅能针对一个数据库。5.7中进行了增强,不再一个线程只能针对一个数据库。
在Slave服务器上停止所有链路的复制
set global slave_parallel_type='logical_clock'; #别一种类型是‘database’即5.6版本中的类型
set global slave_parallel_workers=4; #设置并发的工作线程数量
start slave;
实际配置:
show variables like 'slave_parallel%';
stop slave;
set global slave_parallel_type='logical_clock';
set global slave_parallel_workers=4;
start slave;
show processlist;
show slave status \G
视图查看:
use performance_schema
select * from replication_applier_status_by_coordinator; #以前是空,现在有两条记录,控制器
select * from replication_applier_status_by_worker; #8行,每行为一个线程