0
点赞
收藏
分享

微信扫一扫

12、MySQL主从复制

主从复制原理(基于至少二实例,依赖二进制日志来实现的,三个线程)

主从复制原理:
当主节点接收到用户的写操作时,就会更新自己的数据库,提交后写入bin log二进制日志中,dump线程会自动读取新生成的二进制日志,通过网络发送到从节点上的io线程,io线程会把数据转存到中继日志,SQL线程从中继日志中读取数据,并执行到对应的数据库中,完成数据库的更新。

实现主从复制配置流程

主从版本要一样,如果不一样,主节点要低,一般升级时会用,要先升级从服务器

配置一:一主双从

主节点配置:

关闭mysql
第一步:启动二进制日志,8.0默认已启动
[mysqld]
log_bin=/data/mysql/mysql-bin
第二步:为当前节点设置一个全局唯一的ID号
[mysqld]
server-id=#  可以和ip最后的数字相同,确保唯一
启动mysql并登录
第三步:查看主二进制的文件和位置开始进行复制
show master status;    binlog.000001  156
第四步:创建有复制权限的的用户帐号
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';

从节点配置:

关闭mysql
第一步:启动二进制日志,8.0默认已启动
[mysqld]
log_bin=/data/mysql/mysql-bin
第二步:为当前节点设置一个全局唯一的ID号
[mysqld]
server-id=#  可以和ip最后的数字相同,确保唯一
启动mysql并登录
第三步:查看从节点配置和线程
show slave status;查看为空  
show processlist;查看需要的两个线程(io线程和sql线程)
第四步:在主节点的mysql中,help change master to;把下列贴到从节点的mysql中
CHANGE MASTER TO
  MASTER_HOST='10.0.0.150',         #主服务器地址
  MASTER_USER='repluser',           #用户
  MASTER_PASSWORD='123456',         #密码
  MASTER_PORT=3306,       
  MASTER_LOG_FILE='binlog.000001',  #主服务器二进制日志文件名
  MASTER_LOG_POS=156,
  MASTER_CONNECT_RETRY=10;          #网络断了多长时间重试一次(默认60s)
  再次查看从节点配置和线程

show slave status\G          #查看有内容了 (这两个值观察主从复制是否异常,有一个NO就是异常)
Slave_IO_Running:NO
Slave_SQL_Running:NO         #程还没有启动,这两个线程是未来观察主从复制的核心指标,看yes还是no
Seconds_Behind_Master:NULL   #差多长时间能从主节点把数据同步好,时间为0,复制完了

第五步:开启同步
mysql> start slave;
查看状态:show slave status\G
Slave_IO_Running:YES
Slave_SQL_Running:YES

查看主节点线程:发现了dump线程开启以及从节点的连接信息 show processlist;

查看从节点两个线程:发现io线程和sql线程已经开启。

主服务器非新建时,主服务器运行一段时间后,新增从节点服务器(一主双从),需要先备份发到从节点

第一步:在主节点完全备份
mysqldump -uroot -p123456 -A -F --single-transaction --master-data=1 > /backup/mysql_all-`date +%F`.sql
第二步:把导出的文件复制到从节点2上
scp /backup/mysql_all-`date +%F`.sql 10.0.0.152:输入密码
第三步:从节点2启动二进制日志,8.0默认已启动
[mysqld]
log_bin=/data/mysql/mysql-bin
第四步:从节点2为当前节点设置一个全局唯一的ID号
[mysqld]
server-id=#  可以和ip最后的数字相同,确保唯一
第五步:从节点2更改主节点传输过来的文件,找到CHANGE MASTER TO,改为以下形式
vim mysql_all-`date +%F`.sql
CHANGE MASTER TO
  MASTER_HOST='10.0.0.150',         
  MASTER_USER='repluser',          
  MASTER_PASSWORD='123456',        
  MASTER_PORT=3306,       
MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=156, MASTER_CONNECT_RETRY=10;

第六步:从节点2进入mysql临时禁用二进制日志
mysql> set sql_log_bin=0;
第七步:从节点2把文件导入
mysql> source mysql_all-`date +%F`.sql
第八步:开启同步
mysql> start slave;
查看状态:show slave status\G
Slave_IO_Running:YES
Slave_SQL_Running:YES

此时,主节点有两个从节点,进入mysql查看线程,会发现有几个从节点,就会产生几个dump线程
如果在配置从节点主从复制时数据填写出错,可停止从节点,清除主从复制信息,并重新进行主从复制

在从节点清除信息:

停止从服务:stop slave;
清除从服务数据:reset slave all;
重新写入主从复制信息:
开启从服务:start slave;

配置二:双主双从

从原来的从节点上面查询二进制日志,
show master logs;
查询CHANGE MAETER TO;
CHANGE MASTER TO
  MASTER_HOST='10.0.0.151',   
  MASTER_USER='repluser',          
  MASTER_PASSWORD='123456',        
  MASTER_PORT=3306,   
 MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=156,
 把查询到的信息复制到原来的主节点上,做到相互为对方的主,又相互为对方的从
 
主节点配置如下:
mysq> CHANGE MASTER TO
  MASTER_HOST='10.0.0.151',   
  MASTER_USER='repluser',          
  MASTER_PASSWORD='123456',        
  MASTER_PORT=3306,   
 MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=156,
查看slave信息:
show slave status\G;查看信息
开启线程:
start slave;
双主存在问题:
由于两个都可以写,同时插入相同的数据,会产生主键冲突,复制出现问题,show slave status\G可看到异常,并且接下来的复制都会卡在这里
双主模式下,应该让一个主节点直接受写,防止同时写入出现问题

双主复制错误解决方法

可以在从服务器忽略几个主服务器的复制事件,此为global变量,或指定跳过事件的ID

模仿同时对两个实例执行命令
如:insert test (name)values('b');
结果是,双方都可以创建成功,但是复制给对方时,会遇到主键冲突,我也有你也有,都有了,就复制不过去了。
一个实例再往下执行增加任务时,由于上个复制任务失败了,造成堵塞,后面的复制也过不去了
Last_SQL_Error:出现错误
如何跳过错误,解决堵塞?

方法一:
第一步:双方停掉复制线程
stop slave;
第二步:双方跳过一个错误
set global sql_slave_skip_counter=1;
第三步:启动线程
start slave;
如果还有错误,就接着跳


方法二:
找到错误编号:
Last_SQL_Error:1000 在配置文件里跳
[mysqld]
slave_skip_errors=all |编号      all代表全部跳


举报

相关推荐

mysql 主从复制

MySQL主从复制

【MYSQL】主从复制

mysql主从复制

mySQL主从复制

MySQL:主从复制

MYSQL主从复制

0 条评论