MySQL主从同步+binlog

[复制链接]
发表于 2025-11-1 11:52:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、简介

MySQL内建的复制功能是构建大型,高性能应用步伐的底子 通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新实验一遍来实验 复制过程中一台服务器充当主服务器,而其他一个或多个其他服务器充当从服务器
1.1主从复制原理

紧张基于MySQL二进制日志日志 紧张包罗三个线程(2个I/O线程,1个SQL线程)
LNMP(centos7,mysql5.6)
vmware workstation pro设置了3个捏造机,均安装了LNMP情况:
master:  192.168.0.105       
slave:     192.168.0.106 、192.168.0.107
 
二、原理
(1)主数据库master举行增编削利用后,相应利用纪录的语句(好比 create database test)会纪录到binlog日志日志文件中(binlog日志日志文件一样寻常和数据库data文件夹在一起)。
(2)从数据库Slave会哀求主数据库的binlog日志文件,拷贝到Slave的中继日志中,然后在自己的从数据库上自动实验类似的利用语句,进而实现主从的同步。
注:这里,我们所须要设置的只是主从情况以及开启binlog日志,其他的mysql会自动完成。
 
二、设置主从同步

2.1情况预备

克隆三台没有下过mysql的捏造机(或规复快照)
ip为  master   192.168.1.112 
        slave1     192.168.1.113
        slave2     192.168.1.114
下载mysql:yum install mysql-server -y
不会下载大概下载报错:MySQL数据库安装---离线下载_mysql 离线下载安装-CSDN博客
2.2主从设置

2.2.1【master】(主服务器)
1.)推举112为主服务器
  1. vim /etc/my.cnf
  2. [client]
  3. user=root
  4. password=ABc1234
  5. [mysqld]
  6. datadir=/var/lib/mysql
  7. socket=/var/lib/mysql/mysql.sock
  8. log-error=/var/log/mysqld. log
  9. pid-file=/var/run/mysqld/mysqld.pid
  10. server_id=11 #可以是任意正整数,一般比slave大
复制代码
然后开启MySQL服务
 
2.)在数据库中创建用户,以及授权,修改master库的暗码加密方式
repl 你所创建的用户名
MySQL@123 用户暗码
  1. mysql> create user repl@'%'identified with mysql_native_password by 'MySQL@123'
  2.     -> ;
  3. Query OK, 0 rows affected (0.00 sec)
  4. mysql> grant replication slave on *.* to repl@'%';
  5. Query OK, 0 rows affected (0.00 sec)
复制代码
检察主设置状态:show master status;

3 )关闭防火墙,禁用SElinux 
  1. [root@openeuler-1 ~]  systemctl stop firewalld
  2. [root@openeuler-1 ~]  setenforce 0
  3. setenforce: SELinux is disabled  #已被禁用
  4. [root@openeuler-1 ~]  getenforce #查看SElinux状态
  5. Disabled
复制代码
2.2.2【slave】从服务器
【slave1】和【slave2】
1.)设置主设置文件,添加一个server_id(唯一标识)
vim /etc/my.cnf
slave1的   113slave2的   114
 
设置后开启/重启mysql服务:systemctl start mysql.service/systemctl restart mysql.service
 
 
 
 
 
2.)在从mysql上举行摆设,毗连主库(由于毗连的是同一个主库,两个slave利用一样)
ps:如果start slave后,要重新毗连主库(change maste to), 必须先stop slave
        从库指向主库创建的host,用户名,暗码,二进制文件,以及节点
  1. mysql> change master to
  2.     -> master_host='192.168.1.112',
  3.     -> master_user='repl',
  4.     -> master_password='MySQL@123',
  5.     -> master_log_file='binlog.000001',
  6.     -> master_log_pos=980;
  7. Query OK, 0 rows affected, 8 warnings (0.01 sec)
复制代码
 3.)开启主从
  1. mysql> start slave;
  2. Query OK, 0 rows affected, 1 warning (0.00 sec)
复制代码
4.) 关闭防火墙,禁用SElinux  
  1. [root@openeuler-1 ~]  systemctl stop firewalld
  2. [root@openeuler-1 ~]  setenforce 0
  3. setenforce: SELinux is disabled  #已被禁用
  4. [root@openeuler-1 ~]  getenforce #查看SElinux状态
  5. Disabled
复制代码
 5.) 检察是否乐成并测试

 

 
三、基于binlog的主从同步

3.1【主服务器】
1.) 开启binlog
在id反面添加两行
  1. [root@openeuler-1 Mysql]# vim /etc/my.cnf
  2. server_id=11
  3. gtid_mode=ON
  4. enforce-gtid-consistency=ON
  5. [root@openeuler-1 Mysql]# systemctl restart mysqld.service
复制代码

 3.2【从服务器】
1.)停息slave,进入设置文件添加两行,重启服务(重启更改后的设置才会收效)
  1. mysql> stop slave;
  2. Query OK, 0 rows affected, 1 warning (0.01 sec)
  3. mysql> \q
  4. Bye
  5. [root@openeuler-1 Mysql]# vim /etc/my.cnf
  6. server_id=113
  7. gtid_mode=ON
  8. enforce-gtid-consistency=ON
  9. [root@openeuler-1 Mysql]# systemctl restart mysqld.service
复制代码
2.)测试gid是否开启
  1. mysql> show variables like '%gtid%';
复制代码

3.) 停息slave,毗连主库
  1. mysql> stop slave;
  2. Query OK, 0 rows affected, 1 warning (0.00 sec)
  3. mysql> change master to
  4.     -> master_host='192.168.1.112',
  5.     -> master_user='repl',
  6.     -> master_password='MySQL@123',
  7.     -> master_auto_position=1;        #使用 GTID 自动定位。
  8. Query OK, 0 rows affected, 7 warnings (0.00 sec)
  9. mysql> start slave;
  10. Query OK, 0 rows affected, 1 warning (0.02 sec)
复制代码
3.3 GTID 从库误写入利用处置处罚
从库一样寻常是不须要写入数据的,如果不警惕写入一样寻常会报错
Last_SQL_Error: Error 'Can't create database 'db4'; database exists' on query. Default database: 'db4'. Query: 'create database db4'
Retrieved_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-3                #分析gid3报错
Executed_Gtid_Set:  71bfa52e-4aae-11e9-ab8c-000c293b577e:1-2,
7ca4a2b7-4aae-11e9-859d-000c298720f6:1
办理方法:注入空变乱
  1. 暂停salve:
  2. stop slave;
  3. #3是报错的ID号
  4. set gtid_next='99279e1e-61b7-11e9-a9fc-000c2928f5dd:3';
  5. begin;commit;
  6. set gtid_next='AUTOMATIC';
  7.    
  8. 这里的xxxxx:N 也就是你的slave sql thread报错的GTID,或者说是你想要跳过的GTID。
复制代码
最好的办理方案:重新构建主从情况
3.4  IO进程错误
发现IO进程错误,查抄日志,清除故障:
tail localhost.localdomain.err
 
常见错误:各个复制的捏造机server_id不能类似
办理方法:修改id,重启mysql
 

四、延时同步

4.1简介
是我们人为设置的一种特别同步,从库和主库同步延时N小时
为什么要有延时同步?
        数据库有两种故障:
                物理破坏:可以用主从复制办理。主库rm删除,直接将应用切换到从库
                逻辑破坏:平凡主从同步无法办理。eg:主库drop database ns,从库也没了
4.2设置延时同步
主库加一个参数即可,其他稳固
 change master to master_delay=300;  #延时300s
4.3故障模拟规复

1.)主库数据利用
  1. mysql> stop slave;
  2. Query Ok, 0 rows affected, l warning(0.00 sec)
  3. mysal> change master to master_delay=300;  #延时300s
  4. Query OK, 0 rows affected, 2 warnings (0.0l sec)
  5. mysql> start slave;
  6. Query OK, 0 rows affected, 1 warning (0.02 sec)
  7. mysq1> show slave status \G
  8. SQL_Delay: 300
  9. SQL_Remaining_Delay: NULL
复制代码
 2.)克制从库SQL线程
  1. stop slave sql_thread;
复制代码
3.) 找relaylog的截取点和止境
出发点:
        Relay_Log_File:db01-relay-bin.000002
        Relay_Log_Pos:482
止境:

4.)  从库规复relaylog
  1. source /tmp/relay.sq1
复制代码
5.)  从库身份清除
  1. db0l [relay]>stop slave ;
  2. db0l [relay]>reset slave all
复制代码
 
 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表