MySQL主从架构

MySQL主从架构

MySQL REPLICATION 

    在实际生产环境中,如果对数据库的读和写都在一个数据库服务器中操作。无论是在安全性、高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(master-slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施。

一、什么是MySQL REPLICATION(MySQL主从复制)

1、主从复制是指当master(主)库的数据发生变化的时候,变化会实时的同步到一个或多个slave(从)库。

2、默认情况下属于异步复制,无需维持长连接。

3、通过配置,可以复制所有的库或者几个库,甚至库中的一些表。

4、replication是MySQL内建的,本身自带。

二、MySQL REPLICATION的原理

    简单的说就是master将数据库的更新操作写入二进制日志,slave同步这些二进制日志中的数据更新事件并写入中继日志文件中,然后读取relay日志,把二进制的日志解析成SQL语句,并执行这些SQL语句,使其与master中的数据一致。

注:

DML:SQL操作语句,update, insert,delete等数据更新操作语句。

Relay log :中继日志

三、MySQL REPLICATION的作用

1、读写分离,提供查询服务

    使用主从复制,让主库负责写,从库负责读。这样,即使主库进行数据更新操作出现了锁表的情景,通过读从库也可以保证业务的正常运作。

2、实时灾备,用于故障切换。

    当系统中某个节点发生故障时,可以方便的故障切换,实现高可用(HA)。例如,做数据的热备,slave作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。

3、水平扩展数据库的负载能力

    随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能。

四、MySQL REPLICATION支持的复制类型

    Statement:即基于语句的复制,会将对数据库操作的sql语句写入到binlog中,效率比较高。

row:即基于行的复制,会将每一条数据的变化写入到binlog中。

    mixed:即混合模型的复制,statement与row的混合,MySQL会根据执行的SQL语句选择日志保存方式。即交替使用行和语句、由MySQL服务器自行判断。

五、 MySQL REPLICATION如何工作

整体上来说,复制的工作过程有3个步骤:

        (1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

(2) slave将master的binary log events拷贝到它的中继日志(relay log);

    (3) slave根据中继日志中的事件,对salve数据库做相应的操作,使其与master中的数据一致。

六、MySQL REPLICATION常见方案:

1、 一主一从

        

2、 一主多从

        

    一主一从和一主多从是最常见的主从架构,实施起来简单并且有效,不仅可以实现HA,而且还能读写分离,进而提升集群的并发能力。

    一主多从,Master负责写操作,其他slave负责读,这种架构最大问题I/O压力集中,多台slave需要从master上同步数据,影响master的IO性能。

3、 级联复制(M-S-S)

    级联复制模式下,部分slave的数据同步不连接主节点,而是连接从节点。因为如果主节点有太多的从节点,就会损耗一部分性能用于replication,那么我们可以让3~5个从节点连接主节点,其它从节点作为二级或者三级与从节点连接,这样不仅可以缓解主节点的压力,并且对数据一致性没有负面影响。

    例如,使用一台slave作为中继,分担Master的压力,slave中继需要开启bin-log,并配置log-slave-updates

4、 双主互备 (互为主从)

    双主复制,也就是互做主从复制,每个master既是master,又是另外一台服务器的slave。这样任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

    很多人误以为这样可以做到MySQL负载均衡,实际没什么好处,每个服务器需要做同样的同步更新,破坏了事物的隔离性和数据的一致性。

5、 多主一从(从5.7开始支持)

    多主一从可以将多个MySQL数据库备份到一台存储性能比较好的服务器上。

七、 MySQL主从复制原理

    MySQL主从复制涉及到三个线程,一个运行在主节点(binlog dump thread),其余两个(I/O thread, SQL thread)运行在从节点,如下图所示:

    

l主节点 binary log dump 线程

当从节点连接主节点时,主节点会创建一个binlog dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,在发送给从节点之前,锁会被释放。

l从节点I/O线程

    当从节点上执行`START  REPLICA; `命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 线程发来的更新之后,保存在本地relay-log中。

l从节点SQL线程

    SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

    注:对于每一个主从连接,都需要三个线程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 线程,而每个从节点都有自己的I/O线程,SQL线程。

主从复制的工作过程:

    步骤一:主库上数据库的更新事件(update、insert、delete)被写到binlog

    步骤二:从库启动之后,创建一个I/O线程,从库发起连接,连接到主库

    步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库

    步骤四:从库的I/O线程读取主库传过来的binlog内容并写入到relay log.

    步骤五:从库还会创建一个SQL线程,从relay log里面读取内容,并执行读取到的更新事件,将更新内容写入到slave的数据库。

    注:要实施复制,首先必须打开Master 端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。

八、MySQL 主从复制模式

l异步模式(MySQL async-mode)

    MySQL主从复制默认是异步的模式,异步模式如下图所示,这种模式下,master事务的提交不需要经过slave的确认,slave是否接收到master的binlog,master并不关心。slave接收到master binlog后先写relay log,最后异步地去执行relay log中的sql应用到自身。这样就会有一个问题,由于master的提交不需要确保slave relay log是否被正确接受,当slave接受master binlog失败或者relay log应用失败,master无法感知。

    假设master发生宕机并且binlog还没来得及被slave接收,而切换程序将slave提升为新的master,就会出现数据不一致的情况!另外,在高并发的情况下,传统的主从复制,从节点可能会与主产生较大的延迟(当然MySQL后续版本陆续做了优化,推出了并行复制,以此降低异步复制的延迟)

l半同步模式(MySQL semi-sync)

    基于传统异步存在的缺陷,MySQL在5.5版本推出半同步复制。可以说半同步复制是传统异步复制的改进,在master事务的commit之前,必须确保一个slave收到relay log并且响应给master以后,才能进行事务的commit。但是slave对于relay log的应用仍然是异步进行的,原理如下图所示:

    相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,所以,半同步复制最好在低延时的网络中使用。

    半同步模式不是MySQL内置的,从MySQL 5.5开始集成,需要master 和slave 安装插件开启半同步模式。

l全同步模式

    指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

九、部署MySQL主从同步(一主一从)

1、 环境准备:

 主机名

       IP

 系统版本/MySQL版本

 角色

 localhost

192.168.30.11

 RHEL9.4/8.4.0

 Master

 Cong12

 192.168.30.12

 RHEL9.4/8.4.0

 slave

2、 配置时间服务器

建立时间同步环境,在主节点上搭建时间同步服务器。

配置好本地yum源(略)。

具体搭建过程参考《Centos9使用chrony服务同步时间》文档。

3、 配置主数据库服务器localhost

MySQL> create database HA;

MySQL> use HA;

MySQL> create table T1(id int,name varchar(20));

MySQL> insert into T1 values(1,'Tom1');

(1)、 创建主从复制的授权用户:

MySQL> create  user slave@192.168.30.12  identified by '123456';

MySQL> grant replication client,replication slave on *.* to slave@192.168.30.12;

MySQL> flush privileges;

(2) 配置my.cnf:

[root@localhost ~]# vim /etc/my.cnf 添加一下内容

[MySQLd]

…………..    //省略部分内容

log-bin=/data/MySQL/log/MySQL-bin  #启用二进制日志

server-id=1   #数据库服务器ID标识

binlog-do-db=HA #可以被从服务器复制的库, 即二进制需要同步的数据库名

(3) 重启MySQL

[root@localhost ~]# systemctl restart MySQLd

(4) 查看master状态信息:

MySQL>SHOW BINARY LOG STATUS;  //显示主服务器的当前binlog文件及事件位置

(5) 查看二进制日志:

(6) 导出数据库

复制前要保证同步的数据库一致

[root@localhost ~]# MySQLdump  -uroot  -pAbcd1234  HA >HA.sql  #可以导出数据库

将导出的数据库传给从服务器

[root@localhost ~]# scp HA.sql root@192.168.30.12:~

4、 配置从数据库服务器cong12

(1)两台数据库服务器MySQL版本要一致

MySQL> show variables like '%version%';

(2)测试连接到主服务器是否成功

[root@cong12 ~]#  MySQL -uslave -pAbcd1234 -h 192.168.30.11

MySQL> show databases;  #只有复制的权限, 是看不到其他库的。正常

(3)导入数据库,和主数据库服务器保持一致

[root@cong12 ~]# MySQL -uroot -pAbcd1234 -e "create database HA;"

[root@cong12 ~]# MySQL -uroot -pAbcd1234 HA<HA.sql

(4)修改从服务器配置文件:

从服务器没必要开启bin-log日志

(5)关闭MySQL

[root@cong12 ~]# systemctl stop MySQLd

(6)修改my.cnf配置文件

[root@cong12 ~]# vim /etc/my.cnf

    server-id = 2  #从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。这些ID值能唯一识别复制服务器群集中的每个服务器实例

relay-log=/data/MySQL/log/relay-log-bin  //中继日志文件的路径名称

relay-log-index=/data/MySQL/log/slave-relay-bin.index  //中继日志索引文件的路径名称

(7)重启服务

[root@cong12 ~]# systemctl start MySQLd

(8)MySQL数据库里从配置

[root@cong12 ~]# MySQL -uroot -pAbcd1234

MySQL> START REPLICA;    #停止slave

MySQL>CHANGE REPLICATION SOURCE TO

SOURCE_HOST='192.168.30.11', 

SOURCE_USER='slave',

SOURCE_PASSWORD='123456',

SOURCE_PORT=3306,

GET_SOURCE_PUBLIC_KEY=1,

SOURCE_LOG_FILE='MySQL-bin.000001',

SOURCE_LOG_POS=909; 

MySQL> START REPLICA;    #启动slave

MySQL> SHOW REPLICA STATUS\G;  //查看slave的状态

Slave_IO_Running :该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I/O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log。

Slave_SQL_Running:该线程读取I/O线程写入的relay log。并且根据relay log的内容对slave数据库做相应的操作。

看到2个yes说明设置成功

如何在master、slave上查看上述的线程?

在主服务器上查看binlog dump线程

[root@localhost ~]# MySQL -uroot -pAbcd1234

MySQL>  show processlist \G;

在从服务器上查看I/O线程和SQL线程

5、 主服务器插入数据测试同步:

MySQL> use HA;

MySQL> insert into T1 values(1,'tom2');

MySQL> select * from T1;

+------+------+

| id   | name |

+------+------+

|    1 | Tom1 |

|    1 | tom2 |

+------+------+

2 rows in set (0.00 sec)

在从服务器查看数据是否同步

MySQL> use HA;

MySQL> select * from T1;

+------+------+

| id   | name |

+------+------+

|    1 | Tom1 |

|    1 | tom2 |

+------+------+

2 rows in set (0.00 sec)

从上面的结果可以看到数据同步成功。

配置小结:

lMaster端

1、同步Master端的原始数据到所有Slave端

2、开启binlog日志,保持server-id唯一

3、配置Slave验证授权用户,权限replication slave

Slave端

1、开启relay日志,保持server-id唯一

2、执行change master语句,生成master.info文件

3、启动Slave复制(START  REPLICA; )

Master端全备数据库同步到Slave端

    在开始做主从复制之前(START  REPLICA; 前),需要把Master原有的数据都先同步到所有的Slave,否则在做同步复制之时,因为原有数据不一致导致同步失败。(注意,如果使用原来备份时间点,比如昨天凌晨的全备数据同步所有Slave数据时,还需要把当前时间点之前的所有binlog增量备份同步,使在主从复制时间点时,Master和所有Slave的数据保持一致)

6、 排错:记一次MySQL主从数据库不同步的排查

如果遇到MySQL的主从数据库没有同步 

先上Master库: 

MySQL>show processlist; 查看下进程是否Sleep太多。发现很正常。 

MySQL>SHOW BINARY LOG STATUS; 也正常。 

再到Slave上查看 

MySQL> SHOW REPLICA STATUS\G;

Slave_IO_Running: Yes 

Slave_SQL_Running: No 

可见是Slave不同步

下面介绍两种解决方法: 

方法一:忽略错误后,继续同步 

该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 

解决: 

MySQL> stop REPLICA; 

#表示跳过一步错误,后面的数字可变 

MySQL> set global sql_slave_skip_counter =1; 

MySQL> start REPLICA; 

之后再用MySQL>  SHOW REPLICA STATUS\G; 查看: 

Slave_IO_Running: Yes 

Slave_SQL_Running: Yes 

ok,现在主从同步状态正常了。。。

方式二:重新做主从,完全同步 

该方法适用于主从库数据相差较大,或者要求数据完全统一的情况 

解决步骤如下: 

1.先进入主库,进行锁表,防止数据写入 

使用命令: 

MySQL> flush tables with read lock; 

注意:该处是锁定为只读状态,语句不区分大小写

2.进行数据备份 

#把数据备份到MySQL.bak.sql文件 

[root@cong1 ~]#MySQLdump -uroot -p dbname> MySQL.bak.sql 

这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失

查看master 状态 

MySQL>SHOW BINARY LOG STATUS;   //记下当前binlog文件和position

4.把MySQL备份文件传到从库机器,进行数据恢复 

#使用scp命令 

[root@localhost ~]# scp MySQL.bak.sql root@192.168.30.12:/tmp/ 

5.停止从库的状态 

MySQL> STOP REPLICA;  

6.然后到从库执行MySQL命令,导入数据备份 

MySQL> source /tmp/MySQL.bak.sql 

7.设置从库同步,注意该处的同步点,就是主库SHOW BINARY LOG STATUS信息里的| File| Position两项 

MySQL> CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.30.11',

SOURCE_USER='slave',SOURCE_PASSWORD='123456',SOURCE_PORT=3306,

GET_SOURCE_PUBLIC_KEY=1,SOURCE_LOG_FILE='MySQL-bin.000001',

SOURCE_LOG_POS=909; 

8.重新开启从同步 

MySQL> START  REPLICA; 

9.查看同步状态 

MySQL>  SHOW REPLICA STATUS\G; 查看: 

Slave_IO_Running: Yes 

Slave_SQL_Running: Yes 

好了,同步完成啦。

主库解除锁表操作

MySQL>unlock tables;

(1) I/O线程出错

1、网络连通问题

2、防火前没有放开端口

3、对应的主机 IP地址写错了

(2)SQL线程出错

主从服务器数据库结构不统一

6、 部署MySQL主主双向主从复制 M-M(可选)

1、 实验环境

通过MySQL主主复制:进行MySQL 双向同步数据库HA的配置

主机名

IP

系统版本/MySQL版本

角色

 localhost

192.168.30.11

 RHEL9.4/8.4.0

Master/slave

 Cong12

 192.168.30.12

 RHEL9.4/8.4.0

 Slave/master

在上面主从的基础上进行配置

2、 配置cong12为主服务器

它有两种身份:

身份1: localhost的从。 身份2: localhost的主

(1) 配置my.cnf

[root@cong12 ~]# vim /etc/my.cnf

……….    //省略部分内容

server-id = 2

log-bin=/data/MySQL/log/MySQL-bin

binlog-do-db=HA

(2)创建主从复制的授权用户:

MySQL> create  user   slave@'192.168.30.%'  identified by '123456';

MySQL> grant replication client,replication slave on *.* to slave@'192.168.30.%';

MySQL> flush privileges;   #记得刷新授权表

(3)重启MySQL

[root@cong12 ~]# systemctl restart MySQLd

MySQL>SHOW BINARY LOG STATUS;

注:关闭防火墙或创建允许数据库连接规则

[root@cong12 ~]# systemctl stop firewalld

[root@cong12 ~]# systemctl disable firewalld

3、 配置localhost为cong12的从服务器

(1)测试从帐号登陆

[root@localhost ~]# MySQL -uslave -pAbcd1234 -h 192.168.30.12

(2)修改my.cnf

[root@localhost ~]# vim /etc/my.cnf

……….   //省略部分内容

relay-log=/data/MySQL/log/relay-log-bin

relay-log-index=/data/MySQL/log/slave-relay-bin.index

(3)重启服务器

[root@localhost ~]# systemctl restart MySQLd

(4)MySQL数据库里从配置

MySQL> STOP REPLICA; 

MySQL> CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.100.10', SOURCE_USER='slave',SOURCE_PASSWORD='123456',SOURCE_PORT=3306,GET_SOURCE_PUBLIC_KEY=1,SOURCE_LOG_FILE='MySQL-bin.000001',SOURCE_LOG_POS=154;

MySQL> START  REPLICA; 

MySQL>  SHOW REPLICA STATUS\G;

4、 插入数据测试:

(1)在localhost上插入数据,cong12上查看

MySQL> use HA;

MySQL> insert into T1 values(4,'li4');

[root@cong12 ~]# MySQL -uroot -pAbcd1234

MySQL> use HA;

MySQL> select * from T1;   #在cong12查看数据OK

(2)在cong12上插入数据,localhost上查看

MySQL> insert into T1 values(5,'li5');

MySQL> select * from T1;  #在localhost上查看数据OK

7、 部署M-S-S联级复制(可选)

(1)实验环境:

恢复实验快照

 主机

 IP

 系统版本

角色

 localhost

 192.168.30.11

 RHEL9.4/8.4.0

 Master/NTP

 Cong12

 192.168.30.12

 RHEL9.4/8.4.0

 Slave中继

 Cong13

 192.168.30.13

 RHEL9.4/8.4.0

 Slave

(2) 部署MASTER localhost

注:确保三台服务器时间一致,关闭防火墙。

(3)在主服务上授权用户:

[root@localhost ~]# MySQL -uroot -pAbcd1234

MySQL> create  user  repl@'192.168.30.%' identified by '123456';

MySQL> grant replication client,replication slave on *.* to repl@'192.168.30.%' ;

MySQL> flush privileges;

(4)创建数据库

MySQL> create database HA;

MySQL> use HA;

MySQL> create table T1(id int,name varchar(20));

MySQL> insert into T1 values(1,'tom1');

(5)修改配置文件

[root@localhost ~]# vim /etc/my.cnf

[MySQLd]

………省略部分内容

server-id=1

binlog-do-db=HA

log-bin=/data/MySQL/log/MySQL-bin-master

sync-binlog=1

binlog-format=row

参数说明:

sync-binlog:此参数表示每写缓冲多少次就同步到磁盘;sync_binlog=1表示同步写缓冲和磁盘二进制日志文件,不使用文件系统缓存,在使用innodb事务引擎时,在复制环境中,为了保证最大的可用性,都设置为“1”,但会对影响io的性能。

(6)重启服务

[root@localhost ~]# systemctl restart MySQLd

(7) 查看master状态信息

MySQL>SHOW BINARY LOG STATUS;  //显示主服务器的当前binlog文件及事件位置

(8)导出主服务器HA库完整备份, 拷贝到 中继服务器 和slave服务器

[root@localhost ~]# MySQLdump -uroot -pAbcd1234 -B HA>ha.sql

[root@localhost ~]# scp ha.sql root@192.168.30.12:~

[root@localhost ~]# scp ha.sql root@192.168.30.13:~

(9)部署SLAVE中继 cong12

(10)导入数据库ha.sql

[root@cong12 ~]# MySQL -uroot -pAbcd1234 <ha.sql

(11)配置my.cnf  

修改主配置文件也要开启bin-log:

[root@cong12 ~]# vim /etc/my.cnf#修改主配置文件也要开启bin-log:

…………   //省略部分内容

server-id=2

log-slave-updates=1 //此参数控制slave数据库是否把从master接受到的binlog并在本slave执行的内容记录到slave的二进制日志中,在级联复制环境中,这个参数是必须的

log-bin=/data/MySQL/log/MySQL-bin-slave1

relay-log=/data/MySQL/log/relay-log-bin

relay-log-index=/data/MySQL/log/slave-relay-bin.index

#把它从relay-log当中读取出来的二进制日志并且这本机上执行的操作也记录这自己的二进制日志里面,这样才能使第三台slave通过中继slave读取到相应数据变化

(12)重启MySQL

[root@cong12 ~]# systemctl restart MySQLd

(13)配置从服务器

将cong12配置为localhost的从服务器

[root@cong12 ~]# MySQL -uroot -pAbcd1234

MySQL> STOP REPLICA; 

MySQL>CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.100.10', SOURCE_USER='repl',SOURCE_PASSWORD='123456',SOURCE_PORT=3306,GET_SOURCE_PUBLIC_KEY=1,SOURCE_LOG_FILE='MySQL-bin-master.000001',SOURCE_LOG_POS=154;

MySQL> START  REPLICA; 

(14)查看中继服务的状态

MySQL> SHOW REPLICA STATUS\G;

(15)再授权一个用户给slave(cong13):

MySQL> create  user  repl@'192.168.30.%' identified by '123456';

MySQL> grant replication client,replication slave on *.* to repl@'192.168.30.%' ;

MySQL> flush privileges;

MySQL>SHOW BINARY LOG STATUS;  //显示slave中继服务器的当前binlog文件及事件位置

(16)部署SLAVE cong13

(17)导入数据库ha.sql

[root@cong13 ~]#  MySQL -uroot -pAbcd1234 <ha.sql

(18)配置my.cnf 

[root@cong13 ~]# vim /etc/my.cnf

[MySQLd]

………省略部分内容

server-id = 3

relay-log=/data/MySQL/log/relay-log-bin 

relay-log-index=/data/MySQL/log/slave-relay-bin.index

(19)重启MySQL

[root@cong13 ~]# systemctl restart MySQLd

(20)指定cong12中继服务作为cong13的主:

[root@cong13 ~]# MySQL -uroot -pAbcd1234

MySQL> STOP REPLICA; 

MySQL>CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.30.12', SOURCE_USER='repl',SOURCE_PASSWORD='123456',SOURCE_PORT=3306,GET_SOURCE_PUBLIC_KEY=1,SOURCE_LOG_FILE='MySQL-bin-slave1.000001',SOURCE_LOG_POS=448;

MySQL> START  REPLICA; ;

(21)查看从服务的状态

MySQL> SHOW REPLICA STATUS\G;

(22)在MASTER上插入数据测试:

(23)master插入数据

MySQL> insert into T1 values(2,'tom2');

MySQL> insert into T1 values(3,'tom3');

(24) 然后分别在slave中继,与slave上查看

Cong12中继查看:

MySQL> select * from HA.T1;

Cong13 slave查看:

MySQL> select * from HA.T1;

8、 排错:

1、 模拟故障1:

1.1、 问题场景

    由于历史遗留问题,MySQL主从库的表结构不一致,主库的某个表tableA比从库表tableA少了一个字段

    当尝试在主库上更改表结构时,这行alter语句会随着binlog同步到从库,如果从库执行这行语句时出错,主从同步线程就会自动停止,那样只能人为手动处理错误,然后再启动slave上的主从同步线程。场景大概是下面这个样子:

1.2、 先在cong13从库添加这个字段:

MySQL> alter table T1 add age int default 0 after name;

1.3、 再在localhost主库添加这个字段:

MySQL> alter table T1 add age int default 0 after name;

修改主库上的表结构,添加一个字段

从库会同步主库的,但是从库已经存在了这个字段

1.4、 查看slave状态

MySQL>  SHOW REPLICA STATUS\G;

1.5、 解决方法1:

跳过错误的事物

Cong13从库上执行:

MySQL> STOP REPLICA; 

MySQL> set global sql_slave_skip_counter=1;

MySQL> START  REPLICA; ;

MySQL>  SHOW REPLICA STATUS\G;   #恢复正常

1.6、 解决方法2:

slave比较少的时候还可以,但是当从库有几十台时,逐台去处理既费时又容易出错,怎样在主库这一侧一劳永逸地避免呢?

那很简单,我们不要让主库将alter语句记录到binlog中就行

我们直接这主库中关闭binlog记录

MySQL> set sql_log_bin=off;

然后我们再执行alter语句

MySQL> alter table T1 add age int default 0 after name;

再开启bin-log

MySQL> set sql_log_bin=on;

2、 错误2:

主从的binlog日志文件对不上

2.1、 查看从的状态

MySQL>  SHOW REPLICA STATUS\G;

2.2、 到它的主上查看状态

Slave上不对应

2.3、 Slave上操作:

MySQL> STOP REPLICA; 

MySQL>CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.30.12', SOURCE_USER='repl',SOURCE_PASSWORD='123456',SOURCE_PORT=3306,GET_SOURCE_PUBLIC_KEY=1,SOURCE_LOG_FILE='MySQL-bin-slave1.000002',SOURCE_LOG_POS=415;

MySQL> START  REPLICA; 

查看slave的binlog

MySQL>  SHOW REPLICA STATUS\G;

附加知识点:

MySQL主从复制存在的问题:

l主库宕机后,数据可能丢失

l从库只有一个sql Thread,主库写压力大,复制很可能延时

解决方法:

l半同步复制—解决数据丢失的问题

l并行复制—解决从库复制延迟的问题

MySQL并行复制:

设置:

set global slave_parallel_workers=10;  //设置sql线程数为10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23662.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6层高速PCB设计入门第1~10讲

第一讲 课程介绍 无痛入门&#xff01;6层高速PCB设计&#xff01;_哔哩哔哩_bilibili 第二讲 逻辑派原理图分析 开发板资料文档&#xff1a;https://wiki.lckfb.com/zh-hans/fpga-ljpi/ 最需要注意的信号就是FPGA与DDR3、HDMI交互的信号&#xff0c;其次是GD32读写TF Card的…

Mesh自组网技术及应用

前言&#xff1a; Mesh自组网随着无线技术发展&#xff0c;在消费领域最近比较有热度。当然应用的场景不限于普通消费领域&#xff0c;在工业、军事领域被也是越来越重要。 一、什么是无线Mesh技术 1.1 无线自组网概念 无线Mesh是一种智能、自组织、多跳、移动、对等、去中心…

Python游戏编程之赛车游戏6-3

1 “敌人”汽车类的创建 在创建玩家汽车类之后&#xff0c;接下来创建“敌人”汽车类。“敌人”汽车类与玩家类一样&#xff0c;也是包含两个方法&#xff0c;一个是__init__()&#xff0c;另一个是move()。 1.1 __init__()方法 “敌人”汽车类的__init__()方法代码如图1所示…

垂类大模型微调(二):使用LLaMA-Factory

上一篇博文和大家一起安装了LLaMA-Factory工具,并下载了大模型在上面进行了简单的加载和推理,今天尝试通过LoRa技术对大模型进行微调; 一、训练集准备 1.1 介绍训练集结构 这里演示对Qwen2.5-0.5B-Instruct-GPTQ-Int4模型进行LoRA微调, 大家可以根据垂类大模型微调(一)…

什么是MySql的主从复制(主从同步)?

主页还有其他面试题总结&#xff0c;有需要的可以去看一下&#xff0c;喜欢的就留个三连再走吧~ 1.什么是MySql的主从复制原理&#xff1f; 主从复制的核心就是二进制binlog&#xff08;DDL&#xff08;数据定义语言&#xff09;语句和DML&#xff08;数据操纵语言&#xff09…

坐标变换及视图变换和透视变换(相机透视模型)

文章目录 2D transformationScaleReflectionShear&#xff08;切变&#xff09;Rotation around originTranslationReverse变换顺序复杂变换的分解 齐次坐标&#xff08;Homogenous Coordinates&#xff09;3D transformationScale&TranslationRotation Viewing / Camera t…

文字语音相互转换

目录 1.介绍 2.思路 3.安装python包 3.程序&#xff1a; 4.运行结果 1.介绍 当我们使用一些本地部署的语言模型的时候&#xff0c;往往只能进行文字对话&#xff0c;这一片博客教大家如何实现语音转文字和文字转语音&#xff0c;之后接入ollama的模型就能进行语音对话了。…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 &#xff08;1&#xff09;提取较亮区域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

PING命令TTL解析

在 ping 命令中&#xff0c;TTL&#xff08;Time to Live&#xff0c;生存时间&#xff09; 是 IP 数据包的核心字段之一&#xff0c;用于控制数据包在网络中的生命周期。以下是针对 TTL 的简明解析&#xff1a; 1. TTL 的核心作用 防循环机制&#xff1a;TTL 是一个计数器&a…

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

(七)趣学设计模式 之 适配器模式!

目录 一、 啥是适配器模式&#xff1f;二、 为什么要用适配器模式&#xff1f;三、 适配器模式的实现方式1. 类适配器模式&#xff08;继承插座 &#x1f468;‍&#x1f469;‍&#x1f467;‍&#x1f466;&#xff09;2. 对象适配器模式&#xff08;插座转换器 &#x1f50c…

【NLP】注意力机制

目录 一、认识注意力机制 1.1 常见注意力计算规则 1.2 注意力机制的作用 1.3 注意力机制代码实现 二、注意力机制原理 2.1 attention计算过程 2.2 attention的计算逻辑 2.3 有无attention模型对比 2.3.1 无attention机制的模型 2.3.2 有attention机制的模型 三、Se…

Spring Boot 整合 Druid 并开启监控

文章目录 1. 引言2. 添加依赖3. 配置数据源4. 开启监控功能5. 自定义 Druid 配置&#xff08;可选&#xff09;6. 访问监控页面7. 注意事项8. 总结 Druid 是一个由阿里巴巴开源的高性能数据库连接池&#xff0c;它不仅提供了高效的连接管理功能&#xff0c;还自带了强大的监控…

红帽7基于kickstart搭建PXE环境

Kickstart 文件是一种配置文件&#xff0c;用于定义 Linux 系统安装过程中的各种参数&#xff0c;如分区、网络配置、软件包选择等。system-config-kickstart 提供了一个图形界面&#xff0c;方便用户快速生成这些配置文件。 用户可以通过图形界面进行系统安装的详细配置&…

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…

MongoDB 简介

MongoDB 是一种高性能、开源的 NoSQL 数据库&#xff0c;以其灵活的文档模型和强大的扩展性而闻名。 1.MongoDB 是什么 MongoDB 是一种 NoSQL 数据库&#xff0c;采用 文档模型 存储数据&#xff0c;支持灵活的 JSON 格式文档。它无需预定义表结构&#xff0c;能够动态调整数据…

记录首次安装远古时代所需的运行环境成功npm install --save-dev node-sass

最开始的报错&#xff1a; 最后根据报错一步步 安装所需要的pythong之类的环境&#xff0c;最后终于成功了&#xff0c;得以让我在github上拉的vuehr项目&#xff08;狗头18年还是20年的远古项目&#xff09;成功本地运行&#xff0c;最后附上本地运行成功的贴图。如果大家也在…

华为guass在dbever和springboot配置操作

下面记录华为guass在dbever和springboot配置操作&#xff0c;以备忘。 1、安装dbeaver-ce-23.2.0-x86_64-setup.exe和驱动程序 Download | DBeaver Community 2、配置高斯数据库驱动 3、新建数据库连接 4、操作指引 opengauss官方文档 https://docs-opengauss.osinfra.cn/zh…

今日运维之-Mac笔记本python环境问题

1. 问题&#xff1a;MAC升级系统后git报错&#xff1f; Error: Cant create update lock in /usr/local/var/homebrew/locks! Fix permissions by running:sudo chown -R $(whoami) /usr/local/var/homebrew Traceback (most recent call last):11: from /usr/local/Homebrew/…

c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)

数据库连接池是在应用程序启动时创建一定数量的数据库连接&#xff0c;并将这些连接存储在池中。当应用程序需要与数据库通信时&#xff0c;它可以向池中请求一个连接&#xff0c;使用完后将连接归还给池&#xff0c;而不是关闭连接。这样可以减少创建和关闭连接的开销&#xf…