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

devtools/2024/9/25 11:00:11/

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/devtools/116932.html

相关文章

Ollama在Windows安装,使用,简单调用API

一、安装ollama 1、安装 在Windows本地安装ollama&#xff0c;官方网页&#xff1a;https://ollama.com/download/windows 下载完安装包&#xff0c;安装就好&#xff0c;默认应该是C盘。应该是没办法改&#xff0c;如果有小伙伴能改&#xff0c;也请告知一下。 2、验证安装…

OpenCV特征检测(6)对初步检测到的角点位置进行亚像素级别的精炼函数cornerSubPix()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 细化角点的位置。 该函数迭代以找到角点或径向鞍点的亚像素级准确位置&#xff0c;如 93中所述&#xff0c;并如下图所示。 亚像素级准确的角点…

Spring Cloud :Hystrix实现优雅的服务容错

目录 Hystrix概述&#xff1a;第一个Hystrix程序步骤1&#xff1a;创建父工程hystrix-1步骤2&#xff1a;改造服务提供者步骤3&#xff1a;改造服务消费者为Hystrix客户端&#xff08;1&#xff09;添加Hystrix依赖&#xff08;2&#xff09;添加EnableHystrix注解&#xff08;…

C# CS1612 尝试修改集合中值类型的情况

在C#中&#xff0c;发现尝试直接修改集合中值类型的中的值发生报错 提示“它不是变量”&#xff0c;通过官方索引的链接可知&#xff0c;尝试修改某一值类型&#xff0c;但是该值类型作为中间表达式的结果生成但不存储在变量中&#xff0c;会发生报错。 正确做法是将其赋值给局…

银从初级个人理财_05_第二章第二节

一、单选题 个人独资企业解散时&#xff0c;投资人自行清算的&#xff0c;应当在清算前()日内书面通知债权人。 10 15 20 30 二、多选题 夫妻在婚姻关系存续期间所得的财产中&#xff0c;归夫妻共同所有的是()。 一方因身体受到伤害获得的医疗费、残疾人生活补助费等费…

vulnhub-prime1

目录 靶场环境解题过程 靶场环境 项目ip靶机&#xff08;prime&#xff09;未知攻击机&#xff08;kali&#xff09;10.128.129.128 解题过程 打开靶机&#xff0c;我们只能看见一个登录界面&#xff0c;上面只有半截提示 我们首先要做的是主机发现&#xff0c;因为是网络适…

C#和数据库高级:密封类和方法覆盖

文章目录 一、密封类关键字&#xff1a;sealed方法覆盖 面向对象三大特性总结 一、密封类 关键字&#xff1a;sealed 方法覆盖 面向对象三大特性总结

前端面试题(三)

11. Web API 面试题 如何使用 fetch 发起网络请求&#xff1f; fetch 是现代浏览器中用于发起网络请求的原生 API。它返回一个 Promise&#xff0c;默认情况下使用 GET 请求&#xff1a;fetch(https://api.example.com/data).then(response > response.json()).then(data &g…