MySQL第九讲 MySQL集群主从搭建指定数据库同步数据

article/2025/8/25 17:33:08
1、全库同步与部分同步
之前提到,我们目前配置的主从同步是针对全库配置的,而实际环境中,一般并 不需要针对全库做备份,而只需要对一些特别重要的库或者表来进行同步。那如何 针对库和表做同步配置呢?
首先在Master端:
        在my.cnf中,可以通过以下这些属性指定需要针对哪些库或者哪 些表记录binlog
#需要同步的二进制数据库名 
binlog-do-db=testdemo
#只保留7天的二进制日志,以防磁盘被日志占满(可选) 
expire-logs-days = 7
#不备份的数据库 
binlog-ignore-db=information_schema 
binlog-ignore-db=performation_schema 
binlog-ignore-db=sys
然后在Slave端:在my.cnf中,需要配置备份库与主服务的库的对应关系。
#如果salve库名称与master库名相同,使用本配置 
replicate-do-db = testdemo
#如果master库名[testdemo]与salve库名[testdemo01]不同,使用以下配置[需要做映射] 
#replicate-rewrite-db = testdemo -> testdemo01
#如果不是要全部同步[默认全部同步],则指定需要同步的表 
#replicate-wild-do-table=testdemo.user
#replicate-wild-do-table=testdemo.demotable
配置完成了之后,在show master status指令中,就可以看到Binlog_Do_DB和 Binlog_Ignore_DB两个参数的作用了

 重启服务后,再次查看主库

 可以看到我们配置的主库需要同步的数据库以及忽略的数据库

再查看从库的状态

 另外需要注意一点的是:目前我们的这个MySQL主从集群是单向的,也就是只能从主服务同

步到从服务,而从服务的数据表更是无法同步到主服务的。 所以,在这种架构下,为了保证数据一致,通常会需要保证数据只在主服务上 写,而从服务只进行数据读取。这个功能,就是大名鼎鼎的读写分离。但是这里要 注意下,mysql主从本身是无法提供读写分离的服务的,需要由业务自己来实现。 这也是我们后面要学的ShardingSphere的一个重要功能。

    到这里可以看到,在MySQL主从架构中,是需要严格限制从服务的数据 写入的,一旦从服务有数据写入,就会造成数据不一致。并且从服务在 执行事务期间还很容易造成数据同步失败。
     如果需要限制用户写数据,我们可以在从服务中将read_only参数的值设 为1( set global read_only=1 ; )。这样就可以限制用户写入数据。
但是这个属性有两个需要注意的地方:
1、read_only=1设置的只读模式,不会影响slave同步复制的功能。 所 以在MySQL slave库中设定了read_only=1后,通过 "show slave status\G" 命令查看salve状态,可以看到salve仍然会读取master上的日 志,并且在slave库中应用日志,保证主从数据库同步一致;
2、read_only=1设置的只读模式, 限定的是普通用户进行数据修改的操 作,但不会限定具有super权限的用户的数据修改操作。 在MySQL中设 置read_only=1后,普通的应用用户进行insert、update、delete等会 产生数据变化的DML操作时,都会报出数据库处于只读模式不能发生数 据变化的错误,但具有super权限的用户,例如在本地或远程通过root用 户登录到数据库,还是可以进行数据变化的DML操作; 如果需要限定 super权限的用户写数据,可以设置super_read_only=0。另外 如果要 想连super权限用户的写操作也禁止,就使用"flush tables with read lock;",这样设置也会阻止主从同步复制!

ok,我们接着测试下上面指定同步数据库的操作,我们在主库上再创建一个数据库,看看从库是否同步主库的数据,另外在从库上再创建一个数据库,查看从库是否会同步新建的数据库。

主库在testdemo数据库新建一个表user,查看从库是否会同步表

mysql> create table user(id int not null, userName varchar(200));
Query OK, 0 rows affected (0.04 sec)

现在查看从库testdemo库的表数据 

 现在继续在主节点上创建一个新的数据库orders

查看从库是否通不了新建的数据库orders 

 

 可以看到主节点新建的orders库是没有同步到从库的。

其他集群方式

    我们到这里搭建出了一个一主一从的MySQL主从同步集群,具有了数据同步的基 础功能。而在生产环境中,通常会以此为基础,根据业务情况以及负载情况,搭建 更大更复杂的集群。
       例如为了进一步提高整个集群的读能力,可以扩展出一主多从。而为了减轻主节 点进行数据同步的压力,可以继续扩展出多级从的主从集群。 为了提高整个集群的高可用能力,可以扩展出多主的集群。 我们也可以扩展出互为主从的互主集群甚至是环形的主从集群,实现MySQL多活
部署。 搭建互主集群只需要按照上面的方式,在主服务上打开一个slave进程,并且指向
slave节点的binlog当前文件地址和位置。

GTID同步集群

上面我们搭建的集群方式,是基于Binlog日志记录点的方式来搭建的,这也是最 为传统的MySQL集群搭建方式。可以看到有一个 Executed_Grid_Set列,暂时还没有用上。实际上,这就是另外一种搭建主从同步的 方式,即GTID搭建方式。这种模式是从MySQL5.6版本引入的。

GTID是对一个已经提交事务的编号,并且是全局唯一的。GTID是由UUIDTID组成的。UUIDMySQL实例的唯一标识,TID代表该实例上已经提交的事务数量,随着事务提交数量递增。举个例子:3E11FA47-71CA-11E1-9E33-C80AA9429562:23,冒号前面是UUID,后面是TID

GTID 工作原理:

  • 主库 master 提交一个事务时会产生 GTID,并且记录在 binlog 日志中
  • 从库 salve I/O 线程读取 master 的 binlog 日志文件,并存储在 slave 的 relay log 中。slave 将 master 的 GTID 这个值,设置到 gtid_next 中,即下一个要读取的 GTID 值。
  • slave 读取这个 gtid_next,然后对比 slave 自己的 binlog 日志中是否有这个 GTID
  • 如果有这个记录,说明这个 GTID 的事务已经执行过了,可以忽略掉
  • 如果没有这个记录,slave 就会执行该 GTID 事务,并记录到 slave 自己的 binlog 日志中。在读取执行事务前会先检查其他 session 持有该 GTID,确保不被重复执行。
  • 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
    GTID的本质也是基于Binlog来实现主从同步,只是他会基于一个全局的事务ID来 标识同步进度。GTID即全局事务ID,全局唯一并且趋势递增,他可以保证为每一个 在主节点上提交的事务在复制集群中可以生成一个唯一的ID 。 在基于GTID的复制中,首先从服务器会告诉主服务器已经在从服务器执行完了哪 些事务的GTID值,然后主库会有把所有没有在从库上执行的事务,发送到从库上进 行执行,并且使用GTID的复制可以保证同一个事务只在指定的从库上执行一次,这 样可以避免由于偏移量的问题造成数据不一致。 他的搭建方式跟我们上面的主从架构整体搭建方式差不多。只是需要在my.cnf中 修改一些配
在主节点上:
#开启gtid模式
gtid_mode=on
#强制gtid一致性,开启后对于特定create table不被支持
enforce_gtid_consistency=on
log_bin=on
log-slave-updates=true
binlog_format=row
server_id= 单独设置一个

#relay log

skip_slave_start=1

在从节点上:
gtid_mode=on
enforce_gtid_consistency=on
log-bin=slave-binlog
log-slave-updates=true
server_id= 单独设置一个
#强烈建议,其他格式可能造成数据不一致
binlog_format=row

#relay log

skip_slave_start=1

然后分别重启主服务和从服务,就可以开启GTID同步复制方式。  

检查GTID是否开启:

show variables like '%gtid%';

slave连接到master:

CHANGE MASTER TO  
MASTER_HOST='master的IP',    
MASTER_USER='用户名',    
MASTER_PASSWORD='密码',    
MASTER_PORT=端口号,    
# 1 代表采用GTID协议复制
# 0 代表采用老的binlog复制
MASTER_AUTO_POSITION = 1;


http://chatgpt.dhexx.cn/article/mmXx9JpV.shtml

相关文章

Python数据库同步神器(一键同步)

1.背景: 最近公司项目的用户中心模块经常出现线上问题,测试人员需要将线上真实数据导入到测试环境中去复现Bug。公司有3套测试环境,来回切换并校验数据比较麻烦,于是就有了如下的数据库同步神器。 2.界面: 3.源代码&…

分布式数据库同步

分布式部署时数据库之间的数据同步 数据的同步原理就是同步binlog日志到需要复制的其他的数据库上,其他数据库根据binlog日志里面的ddl和dml语句,执行该语句同步到当前数据库,就能保证多个数据库的数据的一致性。 Binlog日志主要是的数据库执行的ddl、…

异构数据库同步方案

目录 1 概述 2 原理 3 参数 1 概述 为减轻生产库负载,避免在其上直接运行分析应用拖垮系统,需要将生产系统产生的业务数据实时同步到大数据分析平台。 凭借异构(主从库不同类型、主从对象不同属主模式)数据处理能力&#xff…

IDEA 之because it is included into a circular dependency循环依赖的解决办法

问题场景: 今天启动项目的时候突然遇到这个错误导致无法启动 Information:2019/8/26 11:34 - Compilation completed with 1 error and 0 warnings in 6 s 52 ms Error:Cannot build artifact aws_multi_branch_1.0.0:war exploded because it is included into a…

Maven dependencyManagement 详解

dependencyManagement(以下简称:《依赖管理器》) 《依赖管理器》简介 Maven中的《依赖管理器》元素提供了一种管理依赖版本号的方式。在《依赖管理器》元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包…

Maven之dependencyManagement

1. 父项目的dependencyManagement 最开始,知道dependencyManagement是管理jar包版本的,如果在父项目中的该节点下声明了包的版本,子项目中在Dependencies中引用该包时就不需要声明版本了,这样保证多个子项目能够使用相同的包版本…

dependency-track 初始化源码解析

因项目的关键因素,需查看dependency-check源码流程。个人学习用。自己读代码可以根据web.xml的几个listener来debug。 1、org.dependencytrack.RequirementsVerifier 校验java版本,内存等运行时环境。 2、org.dependencytrack.upgrade.UpgradeInitiali…

Maven中的dependencyManagement 详解

Maven中的dependencyManagement 详解 大家好,我是酷酷的韩金群~ 1.作用: 在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。 2.pom.xml文件中,jar的版本判断的两种途径: (1)如果dependencies里的dependency自己…

dependency walker工具简介及使用

dependency walker工具 简介使用 简介 官方概述: Dependency Walker is a free utility that scans any 32-bit or 64-bit Windows module (exe, dll, ocx, sys, etc.) and builds a hierarchical tree diagram of all dependent modules. For each module found, …

pytest.mark.dependency用例依赖

这是一个pytest第三方插件,主要解决用例之间的依赖关系。如果依赖的上下文失败后续的用例会被标识为跳过执行,相当于执行了pytest.mark.skip。 1.安装 安装命令如下: pip install pytest-dependency执行上述命令后,再执行pip i…

dependencyManagement使用简介

dependencyManagement使用简介 Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有…

Dependency-check

文章目录 前言工具简介工具原理原理检测过程NVDCVSS 工具安装工具地址环境依赖工具安装Jenkins PluginCommand LineOn *nixOn WindowsOn Mac (rec) Maven PluginAnt Task 使用示例命令行方式(Mac)插件方式 报告解读CSV格式报告HTML格式报告 工具对比参考 前言 公司…

maven中dependency的属性(依赖)配置

groupId,artfactId,version,type,classifier,scope,systemPath,exclusions,optional 是 maven的9种依赖属性, 其中groupId,artfactId,version是三…

Maven -- dependency详解

PS&#xff1a;部分来源官网文档&#xff0c;翻译不到位&#xff0c;请移步官网 一 &#xff1a;type&#xff1a;个人理解&#xff1a;依赖<dependency>通过其子标签 定位了某个特定的唯一构件&#xff0c;所以type--依赖类型&#xff0c;更准确的说应该是依赖的构件…

MySQL中“full outer join“的实现

一: 先创建两个表 二: 使用【left join】 union 【right join】 select t1.dim_a, t1.qty qty_a, t2.dim_a dim_b, t2.qty qty_b from ta t1 left join tb t2 on t1.dim_at2.dim_a union select t1.dim_a, t1.qty qty_a, t2.dim_a dim_b, t2.qty qty_b from ta t1 right join…

left join 和 left outer join 的区别

通俗的讲&#xff1a; A left join B 的连接的记录数与A表的记录数同 A right join B 的连接的记录数与B表的记录数同 A left join B 等价B right join A table A: Field_K, Field_A 1 a 3 b 4 c table B: …

SQL中inner join、outer join和cross join的区别

缺省情况下是inner join,开发中使用的left join和right join属于outer join,另外outer join还包括full join.下面我通过图标让大家认识它们的区别。 现有两张表&#xff0c;Table A 是左边的表。Table B 是右边的表。其各有四条记录&#xff0c;其中有两条记录name是相同的&…

SQL Server中CROSS APPLY和OUTER APPLY应用

1.Cross Apply和Outer Apply的理解 新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行。 它不像JOIN那样先计算哪个表表达式都可以&#xff0c;APPLY必选先逻辑地计算左表达式。这种计算输入的逻辑顺序允许把右表达式关联到左表表达式。 APPLY有两种形式&#xff0…

深夜学习:有关Inner、Outer等相关词汇的理解

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈引流关键词: 内存屏障, DSB,DMB,ISB,inner,outer,memory barrier,Non-cacheable,Cacheable, non-shareable,inner…

外连接(OUTER JOIN)

9.3.4 外连接&#xff08;OUTER JOIN&#xff09; 不管是内连接还是带WHERE子句的多表查询&#xff0c;都组合自多个表&#xff0c;并生成结果表。换句话说&#xff0c;如果任何一个源表中的行在另一个源表中没有匹配&#xff0c;DBMS将不把该行放在最后的结果表中。 而外连…