MySQL数据库主从双向同步

article/2025/8/27 21:31:13

MySQL数据库主从双向同步

  • 一 环境
  • 二 主从同步
    • 1.主服务器配置
    • 2.从服务器配置
  • 二 双向同步
  • 三 其他相关参数配置
  • 四 后记

一 环境

由于开发需要,需要两台服务器进行负载均衡,两台服务器配置完全相同,均为windows server 2012,且MySQL数据库版本为Mysql5.6,连接工具使用Navicat Premium 12,使用默认安装。
MySql数据库配置文件 My.ini 位于C:\ProgramData\MySQL\MySQL Server 5.6。
假设两台服务器IP分别为:192.168.1.101,192.168.1.102
注意,在以下操作中最好不要有数据的读写,且保证两台服务器上要同步的数据库完全一致

二 主从同步

1.主服务器配置

我们以192.168.1.101为主服务器,以192.168.1.102为从服务器,让102服务器主动来同步101上的内容。
一般情况下,我们使用数据库的二进制日志文件来同步数据。
1.打开主服务器的mysql数据库配置文件my.ini,找到server-id=1这部分内容,在后面添加对应的内容。

# 数据库服务ID,同步时保证不重复即可
server-id=1
# 需要记录日志的数据库,这里记录test数据库的日志,有多个数据库时再来一条即可
binlog-do-db=test1
# 需要同步数据的数据库
replicate-do-db=test1# 不需要同步数据的数据库,有多个数据库时再来一条即可,如果没有则可以不用
replicate-ignore-db=mysql1
# replicate-ignore-db=mysql2# 日志文件的名称
log-bin=mysql_log_bin

修改完成之后保存,然后重启MySQL服务,使用命令或者在服务中重启都可以

net stop MySQL56
net start MySQL56

重启完成之后在MySql终端使用 show master status 查看状态
在这里插入图片描述
此处记录下 FilePosition 的值,分别为 mysql_log_bin.000001157,这两个值是同步成功的关键。
一切就绪好之后,需要添加一个允许进行数据库同步的用户,当然也可以使用其他拥有同步权限的账号,但是这里不推荐,建议创建一个只有同步权限且仅允许要同步的服务器访问。这里添加一个仅允许 192.168.1.102 访问且只有同步权限的用户。

--  添加用户 backuser,密码为 123456
grant replication slave on *.* to 'backuser'@'192.168.1.102' identified by '123456';
-- 刷新权限让其立即生效
flush privileges;

在mysql8.0版本中,下列的SQL语句无法执行,需要拆分成两句

create user 'backuser'@'192.168.1.102' identified by '123456';
grant replication slave on *.* to 'backuser'@'192.168.1.102';
flush privileges;

也可以在数据库连接工具中直接添加,只要赋予对应的权限即可,我是用的是Navicat Premium 12
在这里插入图片描述
在这里插入图片描述
至此,主服务器配置完成

2.从服务器配置

1.打开192.168.1.102的数据库配置文件 my.ini,找到 Server Id 节点,修改为以下内容

# Server Id. 保证不和另一台服务器的Server Id重复即可
server-id=2
# 要同步的数据库
replicate-do-db=test1
# 中继日志,一般情况下它在MySQL主从同步读写分离集群的从节点才开启
relay-log=mysqld-relay-bin

修改完成之后保存,重启数据库服务,然后使用 sql 语句设置需要同步的数据库的信息

-- 
CHANGE MASTER TO 
MASTER_HOST='192.168.1.101', 
MASTER_USER='backuser', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql_log_bin.000001', 
MASTER_LOG_POS= 157;

记录的 FILE 的值就是此处 MASTER_LOG_FILE 的值,Position 的值就是此处 MASTER_LOG_POS 的值。
注意,运行前最好再去主服务器上运行 show master status 查一下 Position 的值,如果设置期间数据库发生过变化,这个值也会变化。
如果已经存在进行中的同步,则先运行 stop slave 停止,再运行以上内容。
最后使用 start slave 开启同步即可。

-- 停止同步
STOP SLAVE;
-- 开启同步
START SLAVE;
-- 使用账号密码启动同步(推荐)
start slave user='backuser' password='123456';
-- 查看同步状态
show slave status

以上步骤全部完成时,使用 show slave status 查看同步的状态。
在这里插入图片描述
如果在cmd窗口中时,则可以使用 show slave status\G; 来查看同步的状态
在这里插入图片描述

如果 Slave_IO_RunningSlave_SQL_Running 的值均为 Yes,则说明数据库主从同步的设置已经完成。
如果不是的话,无非就是密码不对或者Pos值不对,再或者防火墙拦截等原因,仔细检查一下即可解决。
以上内容可用于数据库读写分离时,主数据库负责写入数据,从数据库负责读数据。
Master_Info_File 表示主机的配置数据存放的位置,根据地址,我们可以找到该文件,打开查看主机配置数据
在这里插入图片描述
一起来看看这个 master.info 文件的内容
在这里插入图片描述
虽然一部分内容看得懂,但是大部分内容看起来还是很懵逼,这是因为主机的配置数据默认以 File 的形式保存了。我们现在修改 my.ini文件的内置信息,加上 master-info-repository = TABLE ,然后重启MySQL服务,配置就会生效。
注意:master-info-repository 只有 TABLEFile 两个值。

port=3306
# 禁用IP反向解析域名
skip-name-resolve
# 将Master配置信息写入到表中
master-info-repository = TABLE
# 将中继日志信息写入到表中
relay-log-info-repository = TABLE

重启以后再次查看从机状态
在这里插入图片描述
发现现在master的配置数据被存储到 mysql 数据库的 slave_master_info 的表中了,找到这个表打开看一下。
在这里插入图片描述
发现原先存在于 master.info 中的数据,此时被保存到这里来了,而且原先的 master.info 文件也不见了。而且这张表还自带注释,这样就很容易知道各个参数是做什么的了。
在这里插入图片描述
关于中继日志的配置 relay-log-info-repository,与 master-info-repository 配置一样,配置完成后在 slave_relay_log_info 表中找到相关参数。

二 双向同步

双向同步即在主从同步的基础上调换角色再设置一遍即可,两台服务器互为主从。

三 其他相关参数配置

  1. skip-name-resolve 禁用IP反向解析域名
    数据库错误日志中会提示连接不到xxx.xxx.xxx.xxx的主机,这是由于IP反向解析域名造成的,如果IP未绑定域名,则会提示以上内容,在MySQL.ini中的 [mysqld],下面添加 skip-name-resolve,然后重启MySQL服务,则该提示不会再出现,但是注意,禁用IP反向解析域名后,数据库连接只能使用IP地址去访问,localhost 将不被识别。所以如果你的 root 账户的 Host 如果是 localhost 的话,则需要修改为 127.0.0.1。
[mysqld]
port=3306
# 禁用IP反向解析域名
skip-name-resolve
  1. slave_net_timeout 从机重连超时时间
    简单来说就是当在 slave_net_timeout 时间内主机(master)未向从机(slave)发送任何数据时,从机(slave)就认为连接已断开,然后去重新连接主机(master),使用 show variables like ‘slave_net_timeout’ 可以查看当前 slave_net_timeout 的默认值,以秒数为单位。
    在这里插入图片描述
    可以根据实际情况去设置重连的时间,在MySQL5.7以后默认是60s,前边的版本都是3600s。
-- 重设 slave_net_timeout 值
set global slave_net_timeout=50;
-- 重新查询 slave_net_timeout 的值
show variables like 'slave_net_timeout';
  1. master_heartbeat_period 主机心跳时间
    当主机(master)间隔 master_heartbeat_period 时间未更新数据时,主机(master)会主动向从机(slave)发送一个心跳告知从机(slave),表示主机(master)还健在。master_heartbeat_period 默认是 slave_net_timeout 时间的一半,但是当 slave_net_timeout 修改时,master_heartbeat_period 并不会去修改。

使用 sql 语句来查询几个关键配置参数

select Connect_retry,Heartbeat, Retry_count from mysql.slave_master_info;

在这里插入图片描述
可以看到,现在的 Heartbeat (即master_heartbeat_period)值是 1800s,根据实际实际需求修改即可。
4. master_connect_retry 重连时间间隔
Connect_retry(即master_connect_retry)表示从机(slave)重新连接主机(master)的时间间隔,以秒数为单位。
可以使用 change master to master_connect_retry=xx 修改。

change master to  master_connect_retry=50

还可以在 mysql.slave_master_info 表中直接进行修改,推荐使用命令修改。
5.master_retry_count 最大重试次数
表示从机尝试连接主机的最大尝试次数,可根据实际情况修改。修改方式同上。

change master to  master_retry_count=1000

四 后记

部分细节描述的不够详细,后边有机会再补充。
过程中踩到很多坑,各种搜搜搜,最终以自己的理解编辑一篇,方便查阅。
1.2022.04.20 补充第三节内容,修改、补充前两节中的将master配置信息存储到表中的方式。


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

相关文章

容灾解决方案介绍

1.容灾需求 2.容灾挑战 3. 什么是HA 4.什么是容灾 5.HA和DR的关系 6.容灾和备份的区别 7.衡量容灾系统的主要指标 8.容灾系统的级别 9.灾备系统建设的国际标准 10.华为业务连续性灾备解决方案全景图 11.容灾备份解决方案框架 12.容灾设计模式-同步、异步相结合 13.主备容灾方…

数据库容灾方案

**数据库容灾方案** 场景一 “阵列硬盘坏了,数据库读写文件异常,系统停运啦!”场景二 “不小心执行了TRUNCATE操作,核心业务表被清空,系统关键功能无法使用!”场景三 “在硬件投入变化不大的情况下&#xf…

MySql数据库从库同步的延迟问题及解决方案

1)、MySQL数据库主从同步延迟原理mysql主从同步原理: 主库针对写操作,顺序写binlog,从库单线程去主库顺序读”写操作的binlog”,从库取到binlog在本地原样执行(随机写),来保证主从数据逻辑上一致…

数据同步解决方案-canal

1、canal简介 canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据。 canal是应对阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求而提出的。 阿里系公司开始逐步的尝试基于数据库的日志解析,获…

数据库灾备解决方案

文章目录 行业背景解决方案优势核心产品灾备设计及技术指标DBS冷备热备份同城容灾同城容灾——复制加高可用同城容灾——A-S同城容灾——A-A更多信息 行业背景 数据是企业重要的生产资料,关键数据的丢失可能会给企业致命一击,因为数据是计算机系统存在的…

【解决方案 三十一】Navicat数据库结构同步

最近在开发过程中遇到一个问题:刚经历了一个两个月的长迭代,导致测试库已经被改的面目全非了,最关键的是所有的变更语句都没有记录,这上线的时候怎么办啊,一百多张表呢,幸好组里的老程序猿说用过一个工具&a…

Redis与数据库数据同步解决方案

本文转自:http://3gods.com/2016/06/23/Redis-Sync-DB.html 部分图片来自:http://blog.csdn.net/stubborn_cow/article/details/50586990 数据库同步到Redis 我们大多倾向于使用这种方式,也就是将数据库中的变化同步到Redis,这种…

跨数据库同步方案汇总

Datax 一般比较适合于全量数据同步,对全量数据同步效率很高(任务可以拆分,并发同步,所以效率高),对于增量数据同步支持的不太好(可以依靠时间戳定时调度来实现,但是不能做到实时&…

唯一性约束(unique)

在字段类型后面加一个unique,表示这个字段的值是唯一的,不能够有相同的值出现。 给某一列添加unique 给两个字段加唯一性约束,不同的方式的约束范围不同 联合加约束时只有两个字段的值都是一样的才会出错 单独加约束时,只要有一个…

ORA-00001: 违反唯一约束条件 的解决办法

最近在做项目是测试的时候出现了这种错误:ORA-00001: 违反唯一约束条件 其实说白了这种错误就是 数据库的ID值,小于他的next number 由于表的ID是唯一的,所以用 select max(id) from test 查的该ID大于Sequences里面的开始ID,所以…

ORA-00001: 违反唯一约束条件 -- 解决方法

1、错误 Caused by: java.sql.BatchUpdateException:ORA-00001: 违反唯一约束条件 (SOLEX.SYS_C0012537) 2、分析 ①通过SYS_C0012537找到对应的表 select a.constraint_name,a.constraint_type,b.column_name,b.table_name from user_constraints a inner join user_cons_col…

ORA-00001: 违反唯一约束条件解决方案(oracle 00001)

原因 主要原因是在进行插入INSERT或者更新UPDATE的时候,违反唯一约束,导致操作某行数据时出现重复的值。 解决方案 删除或者更改唯一约束。 修改你使用的插入INSERT或者更新UPDATE的语句。 如果当有多个表进行操作时,你不知道哪个表出现…

ORA-00001: 违反唯一约束条件(SOLEX.SYS_C0012537) --解决方法

1、错误 Caused by: java.sql.BatchUpdateException:ORA-00001: 违反唯一约束条件 (SOLEX.SYS_C0012537) 2、分析 ①通过SYS_C0012537找到对应的表 select a.constraint_name,a.constraint_type,b.column_name,b.table_name from user_constraints a inner join user_cons_colu…

SQL Server唯一约束

SQL Server唯一约束 SQL Server UNIQUE约束简介 SQL Server UNIQUE 约束用于确保存储在列或列组中的数据在表中的行中是唯一的。 以下语句创建一个表: hr.persons ,其 email 邮件列中的数据在表的行中是唯一的: 在此语法中,将 U…

MYSQL 唯一约束

一、唯一约束(UNIQUE) 唯一约束用来保证一列(或一组列)中的数据是唯一的。类似与主键,但是有以下区别: 表可包含多个唯一约束,但每个表只允许一个主键。 唯一约束列可包含 NULL 值。唯一约束列…

oracle ORA-00001: 违反唯一约束条件

在一个平平常常的工作日,被这玩意坑了一下。 在一个日常删除插入的时候居然报了 违反唯一约束条件 的错,打断点也没发现问题,一路运行下去都没错,但是就是在方法的最后一个括号,报错了,搞的我一脸懵逼。 回…

ORACLE updata是提示违反唯一约束条件

如图所示,使用updata语句时提示违反唯一约束条件: 语句如下: update table_name set param1‘xxx’,param2‘xxx’ where param4‘xxx’; 解决办法: 一、能用Navicat for Oracle或者sqlplus连接oracle 这里就不用说…

ORACLE 数据库插入数据违反唯一性约束条件,如何删除约束条件

在同一个oracle 数据库中新建了多个不同的表空间,共享了同一个表空间结构,导致不同表空间产生了同名的约束条件,导致在插入数据的时候报错 违反唯一性约束条件 1.第一步在数据库的客户端查找报错的唯一性约束条件 select * from dba_const…

唯一性约束

目录 唯一性约束 vip.sql脚本文件中的sql语句: select * from t_vip; insert into t_vip(id,name,email) values(4,wangwu,wangwusina.com); insert into t_vip(id) values(4); insert into t_vip(id) values(5); 1. 新需求:name和email两个字段联…

ORA-00001: 违反唯一约束条件 --解决方法

1、错误 Caused by: java.sql.BatchUpdateException:ORA-00001: 违反唯一约束条件 (SOLEX.SYS_C0012537) 2、分析 ①通过SYS_C0012537找到对应的表 select a.constraint_name,a.constraint_type,b.column_name,b.table_name from user_constraints a inner join user_cons_colu…