目录

【0】需求

  前提,已经假设好基于传统异步复制的主库和从库1.

  【0.1】传统异步切换成基于GTID的无损模式

  【0.2】增加特殊要求的从库

【1】操作环境

【2】构建 复制-》半同步复制 实践操作

  【2.1】搭建传统异步复制(带配置文件)
  【2.2】构建测试数据
  【2.3】在线异步模式改成无损半同步模式

【3】半同步与GTID模式的相互在线切换
  【3.1】前置条件
  【3.2】半同步切换成 GTID 模式操作步骤
  【3.3】GTID切换成半同步

【4】增加节点 203 为只复制 test 库的从库
  【4.1】在主库 mysqldump 备份 test 库(也可以在从)
  【4.2】修改配置文件(只复制test库)
  【4.3】开始主从(203从,201主)
  【4.4】核验

正文:

【0】需求

  前提,已经假设好基于传统异步复制的主库和从库1.

【0.1】传统异步切换成基于GTID的无损模式

    由于早期架构没有设置好,用的是非GTID的传统异步模式。

    为了安全与性能,需要在线切换至基于GTID的无损模式,且不能停止业务,需在线处理。

【0.2】增加特殊要求的从库

    由于业务需要,增加2个从库,从库2只需要同步一个库,从库3只需要同步某2张表。

    且从库3在使用一段时间后,不再使用,需要删除。

【1】操作环境

  操作系统:CentOS linux 7.5

  数据库版本:5.7.24

  数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复制。

  主库IP:192.168.1.201  端口:3306

  从库1_IP:192.168.1.202  端口:3306   全库

  从库2_IP:192.168.1.203  端口:3306   test数据库

  从库3_IP:192.168.1.204  端口:3306   test.test4

【2】构建 复制-》半同步复制 实践操作

【2.1】搭建传统异步复制(带配置文件)

#replication_new
log_bin=/mysql/log//mysql-bin #开启binlog
log_bin_index=/mysql/log//mysql-bin.index
binlog_format=row
binlog_rows_query_log_events=on
max_binlog_size= bind-address=0.0.0.0
server_id=
expire_logs_days= #超过7天的binlog清理
innodb_support_xa=
binlog_cache_size=1M
log_bin_trust_function_creators= #同步存储过程、函数、触发器
innodb_flush_log_at_trx_commit=
sync_binlog=
transaction-isolation=read-committed relay_log=/mysql/log//relaylog/mysql-relay.log
log-slave-updates=
#read_only=
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=
master_info_repository=table #master_info 会记录到 mysql.slave_master_info
relay_log_info_repository=table #relay_log 会记录到,mysql.slave_relay_log_info
relay_log_recovery=
slave_skip_errors=ddl_exist_errors
slave_preserve_commit_order=1
#plugin_dir=/mysql/app/mysql/lib/plugin/
#plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so #如果是5.7,参数前面加上loose_,如下列,如果是5.6 则直接使用 rpl_semi_sync_master_enabled=1 之类的就好了。
#我这里是5.7就直接做增强半同步了(loseless Semisynchronous )
#loose_rpl_semi_sync_master_enabled=1 #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled)
#loose_rpl_semi_sync_slave_enabled=1 #MySQL5.6开启从的半同步复制
#loose_rpl_semi_sync_master_timeout=5000 #超时5秒,切回异步
#rpl_semi_sync_master_wait_for_slave_count=1 #至少收到1个slave发会的ack
#rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default,增强半同步) & AFTER_COMMIT(传统半同步) #gtid_mode=1
#enforce_gtid_consistency=1

  搭建参考(这里就不再写了):异步复制

【2.2】构建测试数据

-- 【2.2.1】构造test库和test库下的test1,test2,test3表。test4表用于模拟业务一直在运行
create database test;
use test;
create table test1(id int);
insert into test1 values(1);
create table test2(id int);
insert into test2 values(2);
create table test3(id int);
insert into test3 values(3);
commit;
create table test4(id int);
insert into test4 values(4);
commit;
-- 【2.2.2】构造存储过程sp_test4来循环插入test4表,模拟业务运行
use test;
drop procedure if exists sp_test4;
delimiter $$
create procedure sp_test4()
begin
declare n int;
set n=11;
while(n<=20)
do
insert into test.test4 values(n);
commit;
set n=n+1;
end while;
end $$
delimiter ; -- 【2.2.3】构造事件,来调度sp_test4过程
use test;
set global event_scheduler=1; delimiter $$
create event if not exists event_test4
on schedule every 5 second
on completion preserve
enable
do
begin
call sp_test4();
end $$
delimiter ; -- 为了防止测试数据量累计导致卡顿,我这里5小时做一次truncate
delimiter $$
create event if not exists event_truncate_test4
on schedule every 5 hour
on completion preserve
enable
do
begin
truncate table test.test4;
end $$
delimiter ;

【2.3】在线异步模式改成无损半同步模式

参考:半同步复制
【2.3.1】在线开启半同步
在主库从库均: install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
set global rpl_semi_sync_master_enabled=1; #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled)
set global rpl_semi_sync_slave_enabled=1; #MySQL5.6开启从的半同步复制
set global rpl_semi_sync_master_timeout=5000; #超时5秒,切回异步
set global rpl_semi_sync_master_wait_for_slave_count=1; #至少收到1个slave发会的ack
set global rpl_semi_sync_master_wait_point=AFTER_SYNC;

-- 主从均核验状态
show plugins; -- 查看插件是否装好
show variables like 'rpl%'; -- 查看半同步参数设置及状态
show status like 'rpl%'; -- 查看半同步复制的状态
在从库(确认主从同步后):

stop slave io_thread; -- stop slave ;
start slave io_thread; -- start slave;

【2.3.2】修改my.cnf 重启mysql启用半同步
#plugin_dir=/mysql/app/mysql/lib/plugin/
plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so #如果是5.7,参数前面加上loose_,如下列,如果是5.6 则直接使用 rpl_semi_sync_master_enabled=1 之类的就好了。
#我这里是5.7就直接做增强半同步了(loseless Semisynchronous )
loose_rpl_semi_sync_master_enabled=1 #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled)
loose_rpl_semi_sync_slave_enabled=1 #MySQL5.6开启从的半同步复制
loose_rpl_semi_sync_master_timeout=5000 #超时5秒,切回异步
rpl_semi_sync_master_wait_for_slave_count=1 #至少收到1个slave发会的ack
rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default,增强半同步) & AFTER_COMMIT(传统半同步)
 

【3】半同步与GTID模式的相互在线切换

【3.1】前置条件

  (1)mysql5.7.6以上版本,才支持GTID

  (2)当前gtid_mode=off

  (3)下面的步骤必须按顺序执行,不能跳着执行。

    gtid_mode 在线打开切换过程:

      off >> off_permissive >> on_permissive >> on

    gtid_mode 在线关闭切换过程:

      on >> on_permissive >> off_permissive >> off

  (4)相关释义信息: 

    #gtid_mode =  

      #(1)on:产生GTID,slave只接受带GTID的事务  

      #(2)on_permissive:产生GTID,slave接受不带GTID的事务也接受带GTID的事务

      #(3)off:不产生GTID,slave只接受不带参GTID的事务  

      #(4)off_permissive:不产生GTID,slave接受带GTID也接受不带GTID的事务

    #  enforce_gtid_consistency=on  #on:当发现语句/事务不支持GTID时,返回错误信息  WARN:发现不支持返回警告  #off:不检查

【3.2】半同步切换成 GTID 模式操作步骤

-- 在所有mysql上运行~~~~

-- 【3.2.1】提交事务、设置GTID强制连续选项
commit;
set @@global.enforce_gtid_consistency=warn;
show variables like '%enforce_gtid%'; set @@global.enforce_gtid_consistency=on;
-- 【3.2.2】设置 gtid_mode
set @@global.gtid_mode=off_permissive;
set @@global.gtid_mode=on_permissive;
show variables like '%gtid_mode%'; -- 【3.2.3】查看是否还有匿名事务没有提交
show status like '%anonymous%'; -- 【3.2.4】所有的mysql清理旧的二进制日志
flush logs; -- 【3.2.5】开启GTID,设置gtid_mode=on
set @@global.gtid_mode=on;
show variables like '%gtid_mode%'; -- 这就算配完了 -------------------------------------
#【3.2.6】为了下次重启永久生效,设置好my.cnf
[mysqld]
gtid_mode=1
enforce_gtid_consistency=1
log_slave_update=1
-- 【3.2.7】在从库运行,重配基于GTID的复制
stop slave; change master to
master_host='192.168.1.201',
master_port=3306,
master_user='rpl',
master_password='123456',
master_auto_position=1; start slave;
show slave status\G -- 查看测试数据,是否同步
select count(1) from test.test4;

【3.3】GTID切换成半同步

-- 先主库
-- 【3.3.1】修改gtid_mode
commit;
set @@global.gtid_mode=on_permissive;
commit;
show variables like '%gtid_mode%';
set @@global.gtid_mode=off_permissive;
commit;
set @@global.gtid_mode=off;
commit;
show variables like '%gtid_mode%'; 【报错】ERROR 1766 (HY000): The system variable gtid_mode cannot be set
when there is an ongoing transaction.
【解决】commit; -- 提交一下空事务即可
-- 【3.3.2】从库运行
commit;
set @@global.gtid_mode=on_permissive;
commit;
show variables like '%gtid_mode%';
set @@global.gtid_mode=off_permissive;
commit;
-- 【3.3.3】从库停止复制,禁止使用master_auto_position,用file于pos重启复制
-- 在从库
stop slave;
show slave status\G -- 查看一下io线程读取到主库的哪个Binlog文件及其 pos位置 -- (如果账号密码等没有变化,可以只写最后3行,即 change master to master_log.....)
change master to
master_host='192.168.1.201',
master_port=3306,
master_user='rpl',
master_password='123456',
master_auto_position=0,
master_log_file='mysql-bin.000550',
master_log_pos=1754; start slave;
show slave status\G -- 最后再
commit;
set global gtid_mode=off;
show variables like 'gtid_mode';
-- 【3.3.4】检查测试数据是否一致
select count(1) from test.test4; -- 到这里就算完成了
------------------- -- 【3.3.5】配置my.cnf,以便下次重启也能生效,注释掉GTID参数即可
[mysqld]
#gtid_mode=1
#enforce_gtid_consistency=1
#slave_log_update=1
-- 【3.3.6】另外一种办法
-- 【3.3.1】从库停止复制,禁止使用master_auto_position,用file于pos重启复制
-- 在从库
stop slave;
show slave status\G -- 查看一下io线程读取到主库的哪个Binlog文件及其 pos位置 -- (如果账号密码等没有变化,可以只写最后3行,即 change master to master_log.....)
change master to
master_host='192.168.1.201',
master_port=3306,
master_user='rpl',
master_password='',
master_auto_position=0,
master_log_file='mysql-bin.000550',
master_log_pos=1754; start slave;
show slave status\G
-- 这里必须确认数据同步情况,因为当前主从gtid_mode都是on,还可以运行GTID事务,等待把GTID事务都跑完同步完。
-- 【3.3.2】主从都跑--修改gtid_mode
commit;
set @@global.gtid_mode=on_permissive;
commit;
show variables like '%gtid_mode%';
set @@global.gtid_mode=off_permissive;
commit;
set @@global.gtid_mode=off;
commit;
show variables like '%gtid_mode%'; 【报错】ERROR 1766 (HY000): The system variable gtid_mode cannot be set
when there is an ongoing transaction.
【解决】commit; -- 提交一下空事务即可
-- 【3.3.3】检查测试数据是否一致
select count(1) from test.test4;

-----------

【4】增加节点 203 为只复制 test 库的从库

【4.1】在主库 mysqldump 备份 test 库(也可以在从)

mysqldump --databases test --single_transaction --master-data=  -R -uroot -p123456  -E >/mysql/backup/test.bak
# --dump-slave可以获取主库的binlog文件名和位置及pos
# 如果是在从库上,加上 --dump-slave=2 即可(但要去掉--master-data=2)

【4.2】修改配置文件(只复制test库)

#-- 最初配置中的全部要加上
#-- 包含主、从、半同步、gtid 参数
[mysqld] replicate_do_db=test
replicate_wild_do_table=test.%

【4.3】开始主从(203从,201主)

stop slave;

change master to
master_host='192.168.1.201',
master_port=,
master_user='rpl',
master_password='',
master_auto_position=; start slave;
show slave status\G

【4.4】核验

(1)test库数据:

    select count(1) from test.test4;

(2)其他库数据;

    

-- 《1》主库 201 执行与查看
create database test_2;
create table test_2.test2_1(id int);
insert into test_2.test2_1 values(1);
commit;
-- -------------
select * from test_2.test2_1;  

  

-- 《2》从库202 查看

select * from test_2.test2_1; 

  

-- 《3》我们新增的从库 203 查看

select * from test_2.test2_1;

show databases;

  表不存在,新建的库也不存在,实验成功;

  

【5】增加节点204,只复制表test.test4

  从库3_IP:192.168.1.204  端口:3306   复制主库201的:test.test4

 

【5.1】备份

-- 在203上备份
mysqldump -uroot -p123456 --single-transaction -R -E --dump-slave=2 -B test >/mysql/backup/test.bak

【5.2】配置参数

[mysqld]
replicate_do_table=test.test4
replicate_wild_do_table=test.test4

【5.3】开始操作配置

# 还原
echo 'create database test;'|mysql -uroot -p123456
mysql -uroot -p123456 test </mysql/backup/test4.bak #复制
change master to
master_host='192.168.1.201',
master_user='rpl',
master_password='',
master_auto_position=;

(5.12)mysql高可用系列——复制中的在线切换GTID模式/增加节点/删除节点的更多相关文章

  1. (5.11)mysql高可用系列——复制中常见的SQL与IO线程故障

    关键词:mysql复制故障处理 [1]手工处理的gtid_next(SQL线程报错) 例如:主键冲突,表.数据库不存在,row模式下的数据不存在等. [1.1]模拟故障:GTID模式下的重复创建用户 ...

  2. (5.8)mysql高可用系列——MySQL中的GTID复制(实践篇)

    一.基于GTID的异步复制(一主一从)无数据/少数据搭建 二.基于GTID的无损半同步复制(一主一从)(mysql5.7)基于大数据量的初始化 正文: [0]概念 [0.5]GTID 复制(mysql ...

  3. MySQL高可用系列之MHA(二)

    一.參数说明 MHA提供了一系列配置參数.深入理解每一个參数的详细含义,对优化配置.合理使用MHA非常重要.非常多高可用性也都是通过合理配置一些參数而实现的. MHA包含例如以下配置參数,分别说明例如 ...

  4. (5.15)mysql高可用系列——MHA实践

    关键词:MHA,mysql mha [1]需求 采用mysql技术,实现MHA高可用主从环境,预计未来数据量几百G MHA概念参考:MYSQL高可用技术概述 [2]环境技术架构 [2.1]MHA简介 ...

  5. (5.1)mysql高可用系列——高可用架构方案概述

    关键词:mysql高可用概述,mysql高可用架构 常用高可用方案 20190918 现在业内常用的MySQL高可用方案有哪些?目前来说,用的比较多的开源方案分内置高可用与外部实现,内置高可用有如下: ...

  6. (5.3)mysql高可用系列——mysql复制(理论篇)【续写中】

    关键词:mysql主从复制,mysql复制,MGR,mysql并行复制 目录 [1]mysql支持的复制类型 [2]mysql的主从4种同步方式介绍 (1)异步 (2)同步 (3)5.6 半同步 (4 ...

  7. (5.7)mysql高可用系列——MySQL中的GTID复制(理论篇)【转】

    转自:https://blog.csdn.net/wmq880204/article/details/53160078 一.GTID的概述: 1.全局事物标识:global transaction i ...

  8. (5.14)mysql高可用系列——级联复制与多主一从

    目录: [0]实验需求 级联复制,201为主库,202为从库/同时为203的主库,203为202的从库[1]实验环境 级联:A->B->C 实践思路: (1)直接拿A的xtrabackup ...

  9. (5.4)mysql高可用系列——MySQL异步复制(实践)

    关键词:mysql复制,mysql异步复制,mysql传统异步复制 [1]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数 ...

随机推荐

  1. MessagePack Java Jackson Dataformat - 安装

    中文标题[MessagePack 的 Jackson 数据格式] 本页面中的所有示例程序,请到代码库 https://github.com/cwiki-us-demo/serialize-deseri ...

  2. Ubuntu完全删除nginx

    1.删除nginx,-purge包括配置文件 sudo apt-get --purge remove nginx 2.移除全部不使用的软件包 sudo apt-get autoremove 3.罗列出 ...

  3. python中reversed()函数的用法

    reversed(a) # 返回一个反转的迭代器 举例 a = [1, 2, 3, 4, 5] b = reversed(a) # b是一个迭代器 # print(list(b)) = [5, 4, ...

  4. 修改 Idea 终端 Terminal 为 GitBash

    Terminal "C:\Program Files\Git\bin\sh.exe" -login -i

  5. Android中关于回调概念的笔记

    一.回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调 ...

  6. python3爬取拉钩招聘数据

    使用python爬去拉钩数据 第一步:下载所需模块 requests 进入cmd命令 :pip install requests 回车 联网自动下载 xlwt 进入cmd命令 :pip install ...

  7. [CSP-S模拟测试]:那一天她里我而去(堆优化Dijkstra)

    题目传送门(内部题3) 输入格式 每个测试点有多组测试数据.第一行有一个正整数T表示数据组数.接下来对于每组数据,第一行有两个正整数n,m分别代表图的点数和边数.接下来有m行,每行三个整数u,v,d表 ...

  8. Android学习_Fragment

    Fragment 使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理.从而可以更加方便的在运行过程中动态地更新Activity的用户界面.另外Fragment并不能单独 ...

  9. Spring boot 读取resource目录下的文件

    背景:最近做项目重构将以前的ssh + angular js架构,重构为spring boot + vue.项目是一个数据管理平台,后台涉及到多表关联查询,数据导入导出等. 问题:读取resource ...

  10. IP输出 之 ip_local_out

    概述 将要从本地发出的数据包,会在构造了ip头之后,调用ip_local_out函数,该函数设置数据包的总长度和校验和,然后经过netfilter的LOCAL_OUT钩子点进行检查过滤,如果通过,则调 ...