mysql数据复制详解(两种方法:基于二进制日志+基于gtid 三种模式:异步+半同步+全同步)

安装mysql: redhat7.5

##mysql安装包:官网上可以下到
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm

##安装:
yum install -y *.rpm

初始化:

systemctl start mysqld		//开启mysql
cat /var/log/mysqld.log | grep password		//查看初始化密码
mysql_secure_installation	//使用初始化密码登陆进行初始化

一、异步复制

环境:

serevr1172.25.60.1mysql:master(主)
server2172.25.60.2mysql:slave(从)

1.基于二进制文件的复制

(1)server1/2修改配置文件:/etc/my.cnf

##添加下面的内容
log-bin=mysql-bin		//主需要这个参数,从不需要
server-id=1		//主为1,从设为2

systemctl restart mysqld	

在这里插入图片描述 在这里插入图片描述

(2)登陆主数据库(server1),做以下设定:

mysql -uroot -p
CREATE USER 'repl'@'172.25.60.%' IDENTIFIED BY 'YLZ123+a';	//创建新用户,并指定密码
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.60.%';		//授予此用户复制所需的权限
flush privileges;	//刷新授权表
show master status;	//查看当前的二进制日志文件名称和位置

在这里插入图片描述

(3)登陆从数据库(server2),做以下设定:

mysql -uroot -p
mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.25.60.1',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='YLZ123+a',
    -> MASTER_LOG_FILE='mysql-bin.000002',
    -> MASTER_LOG_POS=1011;
start slave;		//开启复制
show slave status\G		//查看slave信息

在这里插入图片描述
在这里插入图片描述
(4)测试:

create database westos;		//建立库
use westos;					//使用(进入)库
mysql> create table usertb (
    -> username varchar(10) not null,
    -> password varchar(20) not null);		//创建表
desc usertb;				//查看表的结构
insert into usertb values ('user1','123');	//插入数据
select * from usertb;		//查看数据

在server1(master)上创建库,创建表,插入数据,都可以在server2(slave)查看到。
在这里插入图片描述
在这里插入图片描述

2.基于gtid的复制

(1)server1/2修改配置文件:/etc/my.cnf

##添加下面的内容
gtid_mode=ON
enforce-gtid-consistency=true

systemctl restart mysqld	

在这里插入图片描述
在这里插入图片描述
(2)上面基于二进制的复制已经做好了主从,接下来只需要修改server2(slave)复制模式即可。

stop slave		//停止复制再修改
change master to master_host='172.25.60.1',master_user='repl',master_password='YLZ123+a',master_auto_position=1;
start slave		//打开
show slave status\G	//查看--两个yes

注: 如果是全新的环境,做上面基于二进制文件的(2)(3)步即可。
在这里插入图片描述
在这里插入图片描述

(3)测试:

在server1(master)创建一个用户表,插入数据,然后在server2(slave)上查看。

在这里插入图片描述在这里插入图片描述
注: 复制完成之后,可以看到记录。

show slave status\G
产生新数据前:空;复制后:如下(gtid号)

在这里插入图片描述
还可以查看gtid号:

select * from mysql.gtid_executed;

在这里插入图片描述

二、半同步

做完基于gtid的复制之后,只需要做以下修改即可

(1)server1:

##下载master端插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
##查看插件
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
##设置自启动
SET GLOBAL rpl_semi_sync_master_enabled=1;
##查看:
show variables like 'rpl_semi_sync%';
show status like '%rpl%';

在这里插入图片描述
在这里插入图片描述
(2)server2:

##下载slave端插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
##查看插件
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';	
##自启动
SET GLOBAL rpl_semi_sync_slave_enabled=1;
##关闭线程,重新开启
STOP slave IO_THREAD;
START slave IO_THREAD;
##查看
show variables like 'rpl_semi_sync%';

在这里插入图片描述
(3)测试:
和前面一样,server1生成数据,server2查看即可。

注: 与异步不同的在于下面
slave–>stop后,master无法半同步,默认等待10秒后,会自动转化为异步,下一次就不会等待了。当再次开启slave后,数据会接着之前的同步,也会再次恢复半同步。

servre2关闭复制:

stop slave

server1:
在这里插入图片描述

三、全同步

环境: 开启三台虚拟机,都安装mysql

server1172.25.60.1
server2172.25.60.2
server3172.25.60.3

(1).配置三台虚拟机mysql环境
a. 全新环境(刚装上mysql,没做过实验的):安全初始化即可(server3)
b. 之前做过mysql实验的,做以下设定即可:

systemctl stop mysqld		//关闭mysql
cd /var/lib/mysql			//进入mysql的数据目录
rm -fr *					//删除所有数据
systemctl start mysqld		//开启mysql
##从新设置超户密码即可(也可从新初始化)
cat /var/log/mysqld.log | grep password
mysql -uroot -p
alter user root@localhost identified by 'YLZ123+a';	

(2)修改server1/2/3的配置文件,两处不同我在下面已经说明了。

server_id=1		//server1=1,server2=2...
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="98979348-b04a-11e9-aab5-525400356eac"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.60.1:33061"	//本地ip,是什么就写什么
loose-group_replication_group_seeds= "172.25.60.1:33061,172.25.60.2:33061,172.25.60.3:33061"		
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.60.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF

重启mysql

systemctl restart mysqld

(3)配置server1/2/3的mysql数据库:

SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'YLZ123+a';	//创建复制用户
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';		//给复制权限
FLUSH PRIVILEGES;			//刷新授权表
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='YLZ123+a' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';	//下载组复制插件
SHOW PLUGINS;			//查看

##三台mysql只需要有一台(server1)发起组复制即可,其他两台只需要开启组复制即可!!
SET GLOBAL group_replication_bootstrap_group=ON;	//允许发起组复制(server2/3不需要)
START GROUP_REPLICATION;		//开启组复制
SET GLOBAL group_replication_bootstrap_group=OFF;	//关闭(server2/3不需要)

(3)测试: 组复制设置ok的现象,使用下面的命令查看

SELECT * FROM performance_schema.replication_group_members;	

在这里插入图片描述

总结: 正常情况做完上面的步骤就可以了,但由于环境问题,也会出现报错。下面是我遇到的报错,以及我的解决办法。
(1)报错一: server2/3加入组复制是报错,解决办法如下

set global group_replication_allow_local_disjoint_gtids_join=on;

在这里插入图片描述
(2)报错二: 加入后状态不对(不是ONLINE,而是RECOVERING)
在这里插入图片描述
解决办法:

cd /var/lib/mysql	//备份server1(发起组复制端)的数据
mysqldump --all-databases --single-transaction --routines --events \
--host=127.0.0.1 --port=3306 --user=root --password=YLZ123+a > dbdump.db

##发送给server2/3
scp dbdump.db 172.25.60.2:/root
scp dbdump.db 172.25.60.3:/root

##server2/3
mysql -p < dbdump.db		//导入数据库,如果出错,请阅读报错三

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='YLZ123+a' \
FOR CHANNEL 'group_replication_recovery';
start group_replication;
SELECT * FROM performance_schema.replication_group_members;

(3)报错三: 导入数据时报错

a. ERROR 1290 (HY000) at line 31: The MySQL server is running with the --super-read-only option so it cannot execute this statement.
(MySQL服务器使用–super-read-only选项运行,因此无法执行此语句) 解决办法:关闭mysql再开启就ok

b. ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty. (@@
GLOBAL.GTID_PURGED只能在@@ GLOBAL.GTID_EXECUTED为空时设置。)
解决办法:登陆数据库,执行reset master即可

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值