首页 > 数据库 >.MySQL数据库主从复制

.MySQL数据库主从复制

时间:2024-08-19 10:52:54浏览次数:11  
标签:主从复制 log backup 数据库 MySQL master sql mysql root

数据库主从复制

Mysql的主从架构模式,是很多企业⼴泛使⽤,并且是⼴为熟知的⼀种架构模式,这是 DBA 所应该熟练掌握的技

能。

1.mysql主从复制主要⽤途

a.⽤于备份,避免影响业务

b.实时灾备,⽤于故障切换

c.读写分离,提供查询服务

2.mysql主从复制存在的问题

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

b.主库写压⼒⼤, 复制可能会延时

3.mysql主从复制解决⽅法

a. 半同步复制 、或者 全同步复制 .要求: Mysql5.7版本

b. 并⾏复制 , 解决从库复制延迟的问题. 建议: 5.7版

半同步复制是指主库在把数据写⼊⼆进制⽇志之前,等待⾄少⼀个从库确认收到数据。

全同步复制是指主库在把数据写⼊⼆进制⽇志之前,等待所有从库确认收到数据。这种⽅法需要MySQL

5.7版本以上⽀持。

4 .mysql主从复制原理

0.依赖 主库必须打开binlog

1.在主库上把将更改 DDL DML DCL 记录到⼆进制⽇志 Binary Log 中。

2.备库 I/O 线程将主库上的⼆进制⽇志复制到⾃⼰的中继⽇志 Relay Log 中。

3.备库 SQL 线程读取中继⽇志中的事件,将其重放到备库数据库之上。

.MySQL****数据库传统主从复制

192.168.107.133 master1

192.168.107.134 slave1

//1.配置⽂件/etc/my.cnf

log-bin

server-id = 1

//2.重启mysql服务⽣效

[root@Master ~]# /etc/init.d/mysqld restart

//3.模拟线上数据库

mysql> create database winglinuxdb;

mysql> use winglinuxdb;

mysql> create table t1(id int, name varchar(20));

mysql> insert into t1 values (1,'wing');

mysql> insert into t1 values (2,'wingsre');

mysql> select * from t1;

vx: WingspanGo

vx: WingspanGovx: WingspanGo

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

| id | name |

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

| 1 | wing |

| 2 | wingsre |

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

//4.授权, 允许能够远程连接的主机(replicaiton)

mysql> grant replication slave, replication client on *.*

to 'rep'@'10.1.106.%' identified by 'WingRep@123';

mysql> flush privileges;

//5.导出当前数据

[root@Master ~]# mysqldump -uroot -p'Wing@123' \

--all-databases \

--single-transaction \

--master-data=1 \

--flush-logs > /backup/db-$(date +%F)-all.sql

//6.重置 binlog,如果是新数据库不需要重制binlog,此步骤在⽣产谨慎执⾏

mysql> reset master;

Query OK, 0 rows affected (0.01 sec)

//7.将备份⽂件传送⾄Slave

[root@Master ~]# scp /backup/db-$(date +%F)-all.sql [email protected]:/backup/

//1.检查是否能使⽤远程账户登录

[root@slave ~]# mysql -hmaster1 -urep -pWingRep@123

//2.修改配置⽂件/etc/my.cnf, 从需开启binlog

server-id=2

//3.重启mysql数据库服务

[root@slave ~]#/etc/init.d/mysqld restart

//4.导⼊数据,追master的bin_log

[root@Slave ~]# mysql -uroot -p'Wing@123' -e "source /backup/db-$(date +%F)-all.sql"

//5.指向Master,⽆需指定binlogfile和pos

[root@Slave ~]# sed -n '22p' db-2023-05-31-all.sql

CHANGE MASTER TO MASTER_LOG_FILE='sql_106_70.000024', MASTER_LOG_POS=154;

// 如果master是新的数据库执⾏,这⾥跟上⽂reset master做关联,模拟是⼀个新的数据库

mysql> change master to

master_host='master1',

master_user='rep',

master_password='WingRep@123';

//如果master已经运⾏很久了 需要查找binlog位置进⾏配置

mysql> change master to

master_host='master1',

master_user='rep',

master_password='WingRep@123',

master_log_file='sql_106_70.000005',

master_log_pos=154;

//6.启动slave⻆⾊

mysql> start slave;

//7.查看⻆⾊是否同步

 mysql -uroot -p'zgw123' -e "source /backup/db-$(date +%F)-all.sql"
[root@zgw backup]# ll
总用量 840
-rw-r--r-- 1 root root 858208 8月  18 19:25 db-2024-08-18-all.sql
[root@zgw backup]#  sed -n '22p' db-2024-08-18-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='sql_107_133.000004', MASTER_LOG_POS=154;

image-20240818225256443

MySQL数据库Gtid****复制

MySQL GTID(Global Transaction ID)复制是⼀种基于事务ID的复制⽅式,它可以解决主从复制中的⼀些问题,

例如主从复制延迟和数据丢失等。

在MySQL GTID复制中,每个事务都有⼀个全局唯⼀的ID,称为GTID。主库将GTID记录到⼆进制⽇志中,从库通

过读取主库的⼆进制⽇志,获取GTID并在⾃⼰的GTID集中记录。从库使⽤GTID集来跟踪其已经复制的事务,从⽽

保证不会重复复制或者漏掉任何⼀个事务。

当从库连接到主库时,主库会将⾃⼰的GTID集发送给从库,从⽽使从库能够确定⾃⼰需要复制的数据。如果从库与

主库之间的连接中断,从库可以使⽤⾃⼰的GTID集来确定从哪个点继续复制数据。

使⽤GTID复制可以避免主从复制中的⼀些问题,例如 主从复制延迟 和 数据丢失 等。同时,GTID复制还可以简化主

从复制的配置和管理,提⾼数据库的可靠性和可维护性。

Master 配置

10.1.106.70 master1

10.1.106.66 Slave1

//1.配置⽂件/etc/my.cnf

log-bin

server-id=1

gtid_mode = ON

enforce_gtid_consistency=1

//2.重启mysql服务⽣效

[root@Master ~]# /etc/init.d/mysqld restart

//3.模拟线上数据库

mysql>SET sql_log_bin=0;

mysql> drop database winglinuxdb;

mysql>SET sql_log_bin=1;

mysql> create database winglinuxdb;

mysql> use winglinuxdb;
mysql> create table t1(id int, name varchar(20));
mysql> insert into t1 values (1,'wing');
mysql> insert into t1 values (2,'wing1');
mysql> select * from t1;
+------+-------+
| id | name |
+------+-------+
| 1 | wing |
| 2 | wing1 |
+------+-------+
//4.授权, 允许能够远程连接的主机(replicaiton)
mysql> grant replication slave, replication client on *.*
to 'rep'@'10.1.106.%' identified by 'WingRep@123';
mysql> flush privileges;
//5.导出当前数据
[root@Master ~]# mysqldump -uroot -p'Wing@123' \
--all-databases \
--single-transaction \
--master-data=1 \
--flush-logs > /backup/db-$(date +%F)-all.sql
//5.将备份⽂件传送⾄Slave
[root@Master ~]# scp /backup/db-$(date +%F)-all.sql root@slave1:/backup/

Slave 配置

//1.检查是否能使⽤远程账户登录

[root@slave ~]# mysql -hmaster1 -urep -p'WingRep@123'

//2.修改配置⽂件/etc/my.cnf

server-id=2

gtid_mode = ON

enforce_gtid_consistency=1

[可选,保存连接信息⾄表中]

\#log-info-repository=TABLE

\#relay-log-intp-repository=TABLE

//3.重启mysql数据库服务

[root@slave ~]# /etc/init.d/mysqld restart

//4.导⼊数据,追master的bin_log

[root@Slave ~]# mysql -uroot -p'Wing@123' -e "source /backup/db-$(date +%F)-all.sql"

//4.指向Master,gtid⾃动协商同步

mysql> change master to

master_host='master1',

master_user='rep',
master_password='WingRep@123',
master_auto_position=1;
//7.启动slave⻆⾊
mysql> start slave;
//8.查看⻆⾊是否同步
mysql> show slave status\G

image-20240819103540405

image-20240819103602335

Gtid M-M复制, 基于主从模式,演变为双主

[root@sql ~]# cat /etc/hosts

#mysql

10.1.106.70 master1

10.1.106.66 master2 slave1

//1.配置⽂件/etc/my.cnf

server-id = 1

log-bin = /log/mysql/bin/sql_106_70

expire_logs_days = 30

gtid_mode = ON

enforce_gtid_consistency=1

//2.重启mysql服务⽣效

[root@Master ~]# /etc/init.d/mysqld restart

//3.授权, 允许能够远程连接的主机(replicaiton)

mysql> grant replication slave, replication client on *.*

to 'rep'@'10.1.106.%' identified by 'WingRep@123';

mysql> flush privileges;

//4.导出当前数据

[root@Master ~]# mysqldump -uroot -p'Wing@123' \

--all-databases \

--single-transaction \

--master-data=1 \

--flush-logs > /backup/db-$(date +%F)-all.sql

//5.将备份⽂件传送⾄Master2

[root@Master ~]# scp /backup/db-$(date +%F)-all.sql root@master2:/backup/
//1.检查是否能使⽤远程账户登录
[root@slave ~]# mysql -hmaster1 -urep -p'WingRep@123'
//2.修改配置⽂件/etc/my.cnf
server-id = 2
gtid_mode = ON
enforce_gtid_consistency=1
log-bin = /log/mysql/bin/sql_106_66
[可选,保存连接信息⾄表中]
#log-info-repository=TABLE
#relay-log-intp-repository=TABLE
//3.重启mysql数据库服务
[root@slave ~]# /etc/init.d/mysqld restart
//4.导⼊数据
[root@Slave ~]vim /backup/db-$(date +%F)-all.sql
#注释这⼀段内容
24 -- SET @@GLOBAL.GTID_PURGED='56490b35-ff03-11ed-94dc-00505694c38d:1-2';
30 -- CHANGE MASTER TO MASTER_LOG_FILE='sql_106_70.000002', MASTER_LOG_POS=194;
[root@Slave ~]# mysql -uroot -p'Wing@123' -e "source /backup/db-$(date +%F)-all.sql"

image-20240819103907849

image-20240819103919491

image-20240819103933970

标签:主从复制,log,backup,数据库,MySQL,master,sql,mysql,root
From: https://www.cnblogs.com/zgw03/p/18366875

相关文章

  • 小白系列:数据库基础知识解析
    前言今天,我打算用简单明了的语言来讲解一下数据库的基本概念。总体上,这些内容与我在视频中讲解的基本一致。如果你发现视频的讲解有些难以理解,不妨看看这篇文字版的解释,希望能够更快速地帮助你掌握数据库的相关知识。需要注意的是,本文讨论的数据库主要指的是关系型数据库。数据......
  • MySQL 组复制故障恢复的有效策略
    没有MGR环境,只是学学别人经验。原文地址:https://www.percona.com/blog/effective-strategies-for-recovering-mysql-group-replication-from-failures/ 组复制是一种容错/高可用复制拓扑结构,可确保在主节点宕机时,由其他候选成员或辅助成员之一接管,从而使写入和读取操作不间断......
  • 不是 PHP 不行了,而是 MySQL 数据库扛不住啊
    大家好,我是码农先森。大多数的业务场景下PHP还没有达到性能瓶颈,然而MySQL数据库就先行驾崩了。但我们总是不分青红皂白,一股脑的把原因归结于是PHP语言不行了,每当遇到这种情形我就会感叹到PHP的命真苦啊。PHP作为一门优秀的开源编程语言,在编程语言界一直享有「PHP是世界......
  • 如何为MySQL数据库设置有效的账户权限管理策略?
    为MySQL数据库设置有效的账户权限管理策略是确保数据库安全的关键步骤。以下是一些最佳实践:1.**最小权限原则**:  -只为用户分配完成其任务所必需的最小权限集。例如,如果一个用户只需要从特定表中读取数据,就只为他们授予该表的`SELECT`权限。2.**用户账户隔离**:  -......
  • 使用SSMS操作AdventureWorks 示例数据库
    简介AdventureWorks示例数据库,官方文档:https://learn.microsoft.com/zh-cn/sql/samples/adventureworks-install-configure?view=sql-server-ver16&tabs=ssms 下载备份文件OLTP数据适用于大多数典型的联机事务处理工作负载。数据仓库(DW)数据适用于数据仓库工作负载。轻......
  • 【图数据库系列】Cypher查询语句:常用语法指南
    ......
  • 使用EFCore连接达梦数据库
    为了快速验证EFCore连接达梦数据库,执行简单的查询语句,以下通过控制台程序来测试。这里的Demo项目,是比较早之前新建的,框架版本是.net6.0。1、项目添加EFCore和DM数据库的nuget包,添加成功之后查看项目文件的包引用(这里用到的是和6.0匹配的版本,其他版本相应升级依赖包即可)<Packa......
  • Linux, shell编程备份数据库详解,带你读懂命令行指令
    目录先看最终代码再解释[!-d"${BACKUP}/${DATETIME}"]解析mysqldump-u${DB_USER}-p${DB_PW}--host=${HOST}-q-R--databases${DATABASE}|gzip>${BACKUP}/${DATETIME}/$DATETIME.sql.gz解析 tar-zcvf$DATETIME.tar.gz${DATETIME}解析先看最终代码再解......
  • 第二章---MySQL部署
    Windows系统1、安装#1.先到官方进行下载http://dev.mysql.com/downloads/mysql/#2.解压如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64#3.添加环境变量【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》......
  • Abp vNext+SqlServer+MySqlServer
    目前项目使用的是ABPvNext版本8.2.0加上SQLServer。由于业务需求,我们需要与MySQL数据库进行对接,这意味着项目的主要功能将继续使用SQLServer,而部分特定功能将需要与MySQL数据库交互。步骤1.在项目“XXX.XXX.EntityFrameworkCore”中安装MySql包dotnetaddpackag......