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
相关文章:
MySQL主从架构
MySQL主从架构 MySQL REPLICATION 在实际生产环境中,如果对数据库的读和写都在一个数据库服务器中操作。无论是在安全性、高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(…...
基于ros2与gazebo的导航仿真案例
文章目录 前言操作1、创建docker容器2、安装ROS23、Gazebo安装4、Nav2安装5、测试 前言 导航的入门小案例 参考: Ubuntu24.04 ROS2 Jazzy Gazebo Harmonic安装教程Docs / Gazebo Harmonic 注意选择版本 ROS 2 documentation 操作 1、创建docker容器 sudo docke…...
《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO
《Python实战进阶》专栏 第3集:Django 项目结构解析与入门DEMO 在本集中,我们将深入探讨 Django 的项目结构,并实际配置并运行一个入门DEMO博客网站,帮助你在 Web 开发中更高效地使用 Django。Django 是一个功能强大的 Python Web…...
基于WebGIS技术的校园地图导航系统架构与核心功能设计
本文专为IT技术人员、地理信息系统(GIS)开发者、智慧校园解决方案架构师及相关领域的专业人士撰写。本文提出了一套基于WebGIS技术的校园地图导航系统构建与优化方案,旨在为用户提供高效、智能、个性化的导航体验。如需获取校园地图导航系统技…...
开源且免费的CMS系统有哪几个可以放心用?
既开源又免费的两全其美的CMS不多见,不过总会存在一些个例,给用户们带来更具有建设性的选择,以下是一些开源免费且值得信赖的CMS系统,可以根据你的需求选择合适的平台: 1、WordPress ▷ 特点:全球最流行的…...
逻辑架构与软件架构在PREEvision中的设计关系
1 Introduction 在如今汽车电子系统的开发过程中,系统架构设计是至关重要的环节。无论是汽车控制系统、信息娱乐系统,还是电动驱动系统,架构设计都决定了整个系统的功能、性能以及后期的可维护性和可扩展性。 在往期文章中,我们…...
DeepSeek vs ChatGPT:AI 领域的华山论剑,谁主沉浮?
一、引言 在当今科技飞速发展的时代,人工智能(AI)已然成为推动各领域变革的核心力量。而在人工智能的众多分支中,自然语言处理(NLP)因其与人类日常交流和信息处理的紧密联系,成为了最受瞩目的领…...
现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能
现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能,每个人都可以通过手机实时拍照上传到大屏幕上,同时还可以发布留言内容,屏幕上会同步滚动播放展示所有人的照片和留言。相比校传统的照片直播功能更加灵活方便,而…...
AF3 _process_single_hit 函数解读
AlphaFold3 中templates模块的_process_single_hit函数处理单个 HHsearch 比对的模板 TemplateHit,并从相应的 mmCIF 文件中提取模板特征,返回包含模板位置信息、比对质量等特征的 SingleHitResult 对象。它是 AlphaFold3 在模板模块中生成模板特征结构输入的重要步骤。 源代…...
go 模块管理
go version 查看版本 go version go1.21.12 windows/amd64 需要保证:go的版本升级为1.11以上,go mod依赖的最底版本 go env 查看go的环境变量 go env 开启go mod # 标识开启go的模块管理 set GO111MODULE=on GO111MODULE有三个值:off, on和auto(默认值)。 GO111M…...
23种设计模式 - 命令模式
模式定义 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为独立对象,使请求的发送者与接收者解耦。通过将操作抽象为命令对象,支持命令的存储、传递、撤销和重做,增强系统的灵活性和可扩展性…...
php-fpm
摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI进程,提升PHP应用的性能和稳定性 php-fpm是一个高性能的php FastCGI管理器,提供了更好的php进程管理方式,可以有效的控制内存和进程,支…...
Visual Studio 2022配置网址参考
代码格式化和清理冗余代码选项的配置: 代码样式选项和代码清理 - Visual Studio (Windows) | Microsoft Learn 调试时传递参数: 调试时传递命令行参数(C) - Visual Studio (Windows) | Microsoft Learn...
【含文档+PPT+源码】基于Django的新闻推荐系统的设计与实现
项目介绍 本课程演示的是一款基于Django的新闻推荐系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.…...
2025年02月21日Github流行趋势
项目名称:source-sdk-2013 项目地址url:https://github.com/ValveSoftware/source-sdk-2013项目语言:C历史star数:7343今日star数:929项目维护者:JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…...
后端开发:开启技术世界的新大门
在互联网的广阔天地中,后端开发宛如一座大厦的基石,虽不直接与用户 “面对面” 交流,却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域,负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…...
Apache Doris 实现毫秒级查询响应
1. 引言 1.1 数据分析的重要性 随着大数据时代的到来,企业对实时数据分析的需求日益增长。快速、准确地获取数据洞察成为企业在竞争中脱颖而出的关键。传统的数据库系统在处理大规模数据时往往面临性能瓶颈,难以满足实时分析的需求。例如,一个电商公司需要实时监控销售数据…...
【Python项目】基于Python的语音数据及标注核对审核系统
【Python项目】基于Python的语音数据及标注核对审核系统 技术简介: 采用Python技术、MySQL数据库、Django框架等实现。 系统简介: 语音数据及标注核对审核系统是一个基于B/S架构的语音数据处理平台,旨在通过自动化的方式对语音数据进行标…...
路由基本配置
学习目标 • 根据拓扑图进行网络布线。 • 清除启动配置并将路由器重新加载为默认状态。 • 在路由器上执行基本配置任务。 • 配置并激活以太网接口。 • 测试并检验配置。 • 思考网络实施方案并整理成文档。 任务 1:网络布线 使用适当的电缆类型连接网络设备。…...
从WebRTC到EasyRTC:嵌入式适配的视频通话SDK实现低延迟、高稳定性音视频通信
WebRTC最初是为浏览器之间的实时通信设计的,其资源需求和复杂性可能对嵌入式设备的性能提出较高要求,因此在嵌入式系统中应用时面临一些挑战: 1)资源消耗较高 CPU和内存占用:WebRTC是一个功能强大的实时通信框架&…...
【Blender】二、建模篇--05,阵列修改器与晶格形变
阵列修改器是bender里面一个比较常用的修改器,所以我们单独开口来讲,我们会先从几片树叶出发,然后我们用阵列修改器把这几片树叶变成这样的造型和这样的造型。这两个造型分别就代表着阵列修改器最常用的两种偏移方法,我们现在就开始我们先来做几个树叶。 1.树叶建模 首先…...
Python爬虫实战:获取12306特定日期、城市车票信息,并做数据分析以供出行参考
注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 核心思路 需求:获取明天(2025 年 2 月 21 日)从北京到上海的车次、票价、出发时间、硬卧二等卧信息,并保存到 CSV 文件,然后分析出价格最低的 10 趟车次。目…...
C++ 设计模式-策略模式
支付策略 #include <iostream> #include <memory> #include <unordered_map> #include <vector> #include <ctime>// 基础策略接口 class PaymentStrategy { public:virtual ~PaymentStrategy() default;virtual std::string name() const 0;…...
数据结构:哈希表(unordered_map)
unordered_map 是 C 标准库中的一种哈希表实现,它提供了基于键值对(key-value)的存储,提供了常数时间复杂度的查找、插入和删除键值对的操作。 初始化代码示例: #include <unordered_map> using namespace std…...
鸿蒙-自定义布局-实现一个可限制行数的-Flex
文章目录 前提onMeasureSizeselfLayoutInfoconstraintchildren onPlaceChildren 实现思路属性准备测量组件布局小结 刷新 千呼万唤始出来的自定义布局功能终于可以用了,这就给了我们更多自由发挥创造的空间,不再局限于使用已有组件做组合。当然ÿ…...
安装可视化jar包部署平台JarManage
一、下载 下载地址:JarManage 发行版 - Gitee.com 🚒 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器,解压进入目录 🚚 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...
1、Window Android 13模拟器 将编译的映像文件导入Android Studio
1、环境准备 编译环境:Ubuntu-18.04.5编译版本:android13-release下载地址:清华大学开源软件镜像站AOSP # 下载repo # 同步代码:repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…...
力扣27. 移除元素(快慢指针)
Problem: 27. 移除元素 文章目录 题目描述思路Code 题目描述 思路 定义快慢指针均指向数组起始位置,当fast指针指向的元素不等于val时将fast指针指向的元素赋值给slow并让slow指针向前移动,fast指针一直向前移动 时间复杂度: O ( n ) O(n) O(n); 空间复杂…...
Unity学习part4
1、ui界面的基础使用 ui可以在2d和矩形工具界面下操作,更方便,画布与游戏窗口的比例一般默认相同 如图所示,图片在画布上显示的位置和在游戏窗口上显示的位置是相同的 渲染模式:屏幕空间--覆盖,指画布覆盖在游戏物体渲…...
前端面试之Flex布局:核心机制与高频考点全解析
目录 引言:弹性布局的降维打击 一、Flex布局的本质认知 1. 两大核心维度 2. 容器与项目的权力边界 二、容器属性深度剖析 1. 主轴控制三剑客 2. 交叉轴对齐黑科技 三、项目属性关键要点 1. flex复合属性解密 2. 项目排序魔法 四、六大高频面试场景 1. 经…...
关系数据理论
一、函数依赖 若t1(X)t2(X),必有t1(Y)t2(Y),那么我们称属性组X函数确定属性组Y,或者说Y函数依赖于X。记为X->Y,其中X叫决定因素,Y叫依赖因素。 平凡函数依赖与非平凡函数依赖: 二、1-BCNF 评价关系模式“好坏”的理论标准就…...
低代码与开发框架的一些整合[2]
1.分析的项目资源说明 经过近期的的不断分析与运行对比,最终把注意力集中在了以下几个框架: 01.dibootdiboot.diboot: 写的更少, 性能更好 -> 为开发人员打造的低代码开发平台。Mybatis-plus关联查询,关联无SQL,性能高10倍&a…...
网络空间安全(1)web应用程序的发展历程
前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷,从简单的文档共享系统到如今复杂、交互式、数据驱动的平台,经历了多个重要阶段。 一、起源与初期发展(1989-1995年) Web的诞生: 1989年,欧洲…...
Android 之 AIDL for HAL
Android AIDL for HAL 的作用与实现 作用: Android AIDL for HAL(Android Interface Definition Language for Hardware Abstraction Layer)旨在统一 HAL 开发接口,替代 HIDL(Hardware Interface Definition Language…...
Python爬虫基础文件操作
文件操作 引言 爬虫爬取的一切内容都是在内存进行的,这样会有什么问题吗?如果一旦短电或着发生意外电脑关机了那么你的工作成果将瞬间消失。所以,我们还缺少数据在本地文件系统进行持久化的能力,简单的来说就是文件读写操作。文…...
OpenGauss MySQL兼容库迁移
OpenGauss 提供了从MySQL到OG的迁移工具,虽然安装在起来及其繁琐,也不怎么好用,不过我现在需要的是,从MySQL到OG的MySQL兼容库,可以理解成从MySQL到MySQL的迁移。 但是很不幸的是,OG的MySQL的兼容模式&…...
SOME/IP--协议英文原文讲解10
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.2 Req…...
linux shell 当命令执行出现错误立即退出的方法
在 Linux 脚本中,如果你想在整个脚本执行完毕后检查是否有错误发生,可以通过以下几种方式实现: 1. 使用 $? 检查上一条命令的退出状态 每个命令执行后,Shell 会将其退出状态存储在特殊变量 $? 中。$? 的值为 0 表示成功&#…...
Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读
前言 在自然语言处理领域,随着大语言模型(LLMs)不断拓展其阅读、理解和生成文本的能力,如何高效处理长文本成为一项关键挑战。近日,Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…...
vue2 和 vue3 中 computer 计算属性的用法
Vue 2 中的 computed 在 Vue 2 中,计算属性是响应式的,并且基于 getter 进行缓存,只有依赖的响应式数据发生变化时才会重新计算。 基本用法 <template><div><p>原始消息:{{ message }}</p><p>反…...
Python爬虫入门到精通:从零开始的数据采集之旅
一、网络世界的"小蜘蛛":什么是爬虫? 想象一下,你是一只勤劳的小蜘蛛,每天在互联网这张巨大的网上爬来爬去。你不需要自己织网,只需要顺着别人织好的网络路径,把有价值的信息收集到自己的小篮子里。这就是爬虫最形象的比喻——一个自动化的信息采集程序。 Py…...
Python+Selenium+Pytest+POM自动化测试框架封装
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一些高…...
【JMeter使用-2】JMeter中Java Request采样器的使用指南
Apache JMeter 是一款功能强大的性能测试工具,支持多种协议和测试场景。除了内置的采样器(如HTTP请求、FTP请求等),JMeter还允许通过 Java Request采样器 调用自定义的Java代码,从而实现更复杂的测试逻辑。本文将详细介…...
IntelliJ IDEA中Maven配置全指南
一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文:环境配置 1.2 IDEA配置步骤 打开设置面板:File → Settings → Build → Build Tools → Maven 关键配置项: Maven home path E:\apache-maven-3.9.9 (…...
自学Java-AI结合GUI开发一个石头迷阵的游戏
自学Java-AI结合GUI开发一个石头迷阵的游戏 准备环节1、创建石头迷阵的界面2、打乱顺序3、控制上下左右移动4、判断是否通关5、统计移动步骤,重启游戏6、拓展问题 准备环节 技术: 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…...
NetLogon 权限提升漏洞
参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip:192.168.72.158,host:WIN10-01 攻击者 kali…...
UDP和TCP
UDP协议 报文中应该包含 源IP,源端口号目的IP,目的端口号UDP/TCP 一个进程是否可以绑定多个端口号? 可以。多个进程是否可以绑定一个端口号? 不可以,因为端口号的主要作用是唯一标识一台计算机上的一个特定服务或应…...
2025 年 1 月公链行业研报:比特币主导地位强化
2025 年 1 月公链行业研报 作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 公链研究页面 2025 年 1 月,加密市场总市值增长 7.2% 至 2.8 万亿美元,主要区块链平台表现分化。在新的监管政策与人工智能基…...
在低功耗MCU上实现人工智能和机器学习
作者:Silicon Labs 人工智能(AI)和机器学习(ML)技术不仅正在快速发展,还逐渐被创新性地应用于低功耗的微控制器(MCU)中,从而实现边缘AI/ML解决方案。这些MCU是许多嵌入式…...
新数据结构(11)——Java类的产生和反射
反射是获取类信息的一种能力 类信息包括属性、方法、构造器、父类、接口等 类信息的来源 来自类的加载器,这是从.class文件到内存中的java虚拟器(JVM)中间的一个阶段(如下图) 类的加载器里,用Field数组存…...