Mysql—主从复制的slave添加及延迟回放

ops/2024/9/25 5:14:41/

MySQL 主从复制是什么?

​ MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

MySQL 主从复制原理

​ (1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;

​ (2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件

​ (3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

如何实现主从复制

我这里用两台虚拟机(Linux)演示,172.25.254.10为主(Master) ,172.25.254.20为从(Slave)

在172.25.254.10(Master)主机上进行配置

[root@nginx ~]# vim /etc/my.cnf
server-id=10  #设置id为10
[root@nginx ~]# /etc/init.d/mysqld restart 
Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@nginx ~]# mysql -uroot -p -e "SELECT @@server_id"

生成二进制文件mysql-bin.000001

[root@nginx ~]# vim /etc/my.cnf
log-bin=mysql-bin
[root@nginx mysql]# /etc/init.d/mysqld restart
[root@nginx mysql-5.7.44]# cd /data/mysql/
[root@nginx mysql]#ls

建立用户repl@'%'使用远程连接,密码OpenXXX123!

这个权限允许用户作为复制从属服务器(slave)接收主服务器(master)的二进制日志事件并应用这些事件。

mysql> CREATE USER repl@'%' IDENTIFIED BY 'OpenXXX123!';#确保每台SLAVE都能连得上MASTERmysql> GRANT REPLICATION SLAVE ON . TO repl@'%';

mysql> SHOW MASTER status;

mysql> show master status\G;

172.25.254.20(Slave)主机上进行配置

[root@nginx ~]# vim /etc/my.cnf
server-id=20
[root@nginx ~]# /etc/init.d/mysqld restart 
Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@nginx ~]# mysql -uroot -p -e "SELECT @@server_id"[root@nginx ~]# vim /etc/my.cnf
log-bin=mysql-bin
[root@nginx mysql]# /etc/init.d/mysqld restart
[root@nginx mysql-5.7.44]# cd /data/mysql/
mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='OpenXXX123!',master_log_file='mysql-bin.000001',master_log_pos=595;mysql> start slave;mysql> show slave status\G;

当在172.25.254.10主机上创建timinglee库

mysql> create database timinglee;

再次创建timinglee.userlist表

mysql> create table timinglee.userlist(-> username varchar(10) not null,-> password varchar(50) not null);

在表中插入内容

mysql> INSERT INTO timinglee.userlist values('lee','123');

172.25.254.20主机上可以查看到timinglee库,表timinglee.userlist

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| timinglee          |
+--------------------+
mysql> SELECT * FROM timinglee.userlist;
+----------+----------+
| username | password |
+----------+----------+
| lee      | 123      |
+----------+----------+

自此主从复制配置完成

slave添加

在slave阶段中默认情况下是开启了写功能的,但是建议关闭slave节点的写功能来保证数据一致性

创建虚拟主机id为172.25.254.30充当slave2

完成基础配置

[root@mysql-node3 ~]# vim /etc/my.cnf[mysqld] 
datadir=/data/mysql 
socket=/data/mysql/mysql.sock 
symbolic-links=0 
server-id=30

在生产环境的时候需要对用户消息进行备份

从master(172.25.254.10)节点备份数据

[root@nginx ~]# mysqldump -uroot -p timinglee > timinglee.sql
Enter password: 
[root@nginx ~]# scp timinglee.sql root@172.25.254.30:/mnt/
root@172.25.254.30's password: 
timinglee.sql                                          100% 1952     1.6MB/s   00:00 

将文件的内容传入到172.25.254.30的主机

172.25.254.30主机上面存在文件信息

利用master节点中备份出来的timinglee.sql在slave2(172.25.254.30)中拉平数据

[root@nginx ~]# mysql -uroot -p123 -e "create database timinglee;"[root@nginx ~]# mysql -uroot -p123 timinglee < /mnt/timinglee.sql

172.25.254.10和172.25.254.30必须一致

mysql> show master status;change master to master_host="172.25.254.10",master_user='relp',master_password='123',master_log_file="mysql-bin.00001",master_log_pos=1272;

当发现connnecting时为连接错误

mysql> stop slave;#停掉后进行更改mysql>change master to master_host='172.25.254.10',master_user='repl',master_password='OpenXXX123!',master_log_file='mysql-bin.000002',master_log_pos=154;#记得重启slavemysql> start slave;#使用命令进行查看mysql> show slave status\G;

显示为YES,则slave添加成功

172.25.254.10主机上进行验证

mysql> SELECT * FROM timinglee.userlist;

172.25.254.10主机上插入用户数据时

mysql> INSERT INTO timinglee.userlist values('lee1','123');

172.25.254.30主机上看到172.25.254.10插入的信息

mysql> SELECT * FROM timinglee.userlist;

延迟复制

延迟复制时用来控制sql线程的和i/o线程无关

这个延迟复制不是i/o线程过段时间复制,i/o是正常工作的

是日志已经保存在slave段,那个sql要等多久进行回放

当master端操作失误了,可以在salve端进行数据备份

在172.25.254.30进行数据备份

mysql> stop slave sql_thread;mysql> change master to master_delay=60;mysql> start slave sql_thread;mysql> show slave status\G;

在172.25.254.10主机上模拟误删操作

mysql> select * from timinglee.userlist;
+----------+----------+
| username | password |
+----------+----------+
| lee      | 123      |
| lee1     | 123      |
+----------+----------+
mysql>  delete from timinglee.userlist where username='lee1';
Query OK, 1 row affected (0.00 sec)mysql> select * from timinglee.userlist;
+----------+----------+
| username | password |
+----------+----------+
| lee      | 123      |
+----------+----------+
1 row in set (0.00 sec)

在172.25.254.30主机上查看表

60秒内信息还存在,过了60秒后信息不再存在

慢程序语句

慢查询,顾名思义,执行很慢的查询 当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个 SQL语句就是需要优化的 慢查询被记录在慢查询日志里 慢查询日志默认是不开启的 如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。

在172.25.254.10主机上查看慢查询功能是否开启

mysql>SHOW variables like "slow%";

开启慢查询功能

mysql> SET GLOBAL slow_query_log=ON;

再次使用命令进行查看

mysql> show variables like 'slow%';

查看慢查询时间,时间为10s

mysql> SHOW VARIABLES like "long%";
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

测试慢查询,结果显示为10秒


http://www.ppmy.cn/ops/115629.html

相关文章

探索OpenAI的全新里程碑:o1模型

近期&#xff0c;人工智能领域迎来了一项重要突破——OpenAI发布了其最新的语言模型o1。作为一款专为解决复杂问题设计的新一代大语言模型&#xff08;LLM&#xff09;&#xff0c;o1标志着该公司在智能推理能力方面迈出了重要的一步。尽管这个新系统仍处于初步阶段&#xff0c…

Go语言流程控制

Go语言流程控制 1.IF-ELSE2.Switch-Caseswitch 语句Type Switch 3.select 语句4.循环语句 1.IF-ELSE Go 编程语言中 if 语句的语法如下&#xff1a; if 布尔表达式 {/* 在布尔表达式为 true 时执行 */ }例如&#xff1a; package mainimport "fmt"func main() {va…

网站建设中常见的网站后台开发语言有哪几种,各自优缺点都是什么?

市场上常见的网站后台开发语言有PHP、Python、JavaScript、Ruby、Java和.NET等。这些语言各有其独特的优缺点&#xff0c;适用于不同的开发场景和需求。以下是对这些语言的具体介绍&#xff1a; PHP 优点&#xff1a;PHP是一种广泛用于Web开发的动态脚本语言&#xff0c;特别适…

通过document获取节点元素

1.层级节点 <ul><li id"li1">1</li><li>2</li><li id"li3">3</li><li>4</li><li>5</li></ul><script>//获取id名为li1的元素赋值给li1let li1document.getElementById(li…

java中的位运算

位运算是对整数的二进制位进行操作的一种运算。在java中long, int, short, char和byte类型都可以使用位运算。 位运算的过程如下&#xff1a;首先将十进制整数转换成二进制表示形式&#xff0c;然后将位运算符应用于每个二进制数位&#xff0c;并计算结果。最后&#xff0c;将…

29. RabbitMQ队列模型

1. 前言 因为生产环境存在不同的消息分发要求,例如对于注册流程,同一条注册消息需要发送到短信模块和邮箱模块,而对于请求削峰场景,同一条消息只需要发送到业务服务后端即可。我们可以通过配置 RabbitMQ 工作模式来决定发送单个队列还是多个队列,以及配置特定的路由规则。…

无人机之航线规划篇

无人机的航线规划是一个复杂但至关重要的过程&#xff0c;它确保了无人机在飞行过程中的安全、高效以及任务的顺利完成。以下是对无人机航线规划的详细解析&#xff1a; 一、定义与目的 无人机航线规划是指依据无人机任务分配&#xff0c;规划出符合安全条件的飞行航线。这一过…

Java基础|多线程:多线程分页拉取

前言&#xff1a; 通常我们都会遇到分页拉取的需求&#xff0c;比如与第三方系统同步数据&#xff0c;定时拉取全量数据做缓存&#xff0c;下面我们简单介绍下多线程分页写法 需求&#xff1a; 全量同步第三方系统数据&#xff0c;并在全部数据同步完后&#xff0c;统一做缓存…