mysql-主從同步原理

AB復制(重點)

一、什么是主從復制?

1、主從同步也叫AB復制,是用來建立一個和主數據庫完全一樣的數據庫環境,稱為從數據庫;主數據庫一般是準實時的業務數據庫。

2、主從復制的作用

1.做數據的熱備,作為后備數據庫,主數據庫服務器故障后,可切換到從數據庫繼續工作,避免數據丟失。
2.架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
3.讀寫分離,使數據庫能支撐更大的并發。1--在從服務器可以執行查詢工作(即我們常說的讀功能),降低主服務器壓力;(主庫寫,從庫讀,降壓)2--在從服務器進行備份,避免備份期間影響主服務器服務;(確保數據安全)
為什么要搞主從同步?
因為只有一個服務器 上面跑著mysql 萬一發生故障 數據會丟失 業務訪問無法正常運行,業務量過大的情況下,對服務器的壓力也是很大的,所以要考慮到服務要高可用,既降低服務器壓力又提高可用性寫庫(寫入)專門放一個數據庫 主庫負責寫入
查詢(select)在專門放一個庫 從庫負責查詢AB復制也叫讀寫分離

二、主從同步原理(面試題)

主服務器把數據修改之后,會放入到二進制日志中(binary log)中,然后通過內部進程機制把日志傳遞到從服務器(從服務器在通過IO線程寫入到中繼日志)中并表示為中繼日志(中繼日志在通過sql線程傳輸給從服務器并執行),從而達到了主從一致
從服務器有倆個線程(I/O線程和SQL線程)I/O線程負責把主服務器上的日志拉取過來,slq線程是負責把日志執行的,從服務器干的活最多
主服務器寫入數據,從服務器就寫入,主服務器刪除數據,從服務器就會接著刪除數據從服務器不能寫入數據主從同步也叫異步模式,時間會有0.幾毫秒延時,主服務器做好授權 從服務器具有授權的憑證進行把日志傳遞叢庫可以寫數據庫 但是主庫是不會有的
三、M-S 架構GTID 基于事務ID復制
1、什么是GTID?

全局事務標識:global transaction identifiers
是用來代替傳統復制的方法,GTID復制與普通復制模式的最大不同就是不需要指定二進制文件名和位置。

2、GTID工作原理
1、master更新數據時,會在事務前產生GTID,一同記錄到binlog日志中。
2、slave端的i/o 線程將變更的binlog,寫入到本地的relay log中。
3、sql線程從relay log中獲取GTID,然后對比slave端的binlog是否有記錄。
4、如果有記錄,說明該GTID的事務已經執行,slave會忽略。
5、如果沒有記錄,slave就會從relay log中執行該GTID的事務,并記錄到binlog。
3、部署主從復制
-A, --all-databases #備份所有庫
-B, --databases  #備份多個數據庫
-F, --flush-logs #備份之前刷新binlog日志
--default-character-set #指定導出數據時采用何種字符集,如果數據表不是采用默認的latin1字符集的話,那么導出時必須指定該選項,否則再次導入數據后將產生亂碼問題。
--no-data,-d #不導出任何數據,只導出數據庫表結構。
--lock-tables #備份前,鎖定所有數據庫表
--single-transaction #保證數據的一致性和服務的可用性
-f, --force #即使在一個表導出期間得到一個SQL錯誤,繼續。對主庫已有的數據庫不會進行自動同步(可選操作 兩邊的庫要一樣)
邏輯備份 先暫時關閉gtid 
--single-transaction 做一次性檢查
--all-databases 導出所有數據庫mkdir /dackupdb
mysqldump -uroot  -p'123456'  --set-gtid-purged=OFF --single-transaction  --all-databases  > /data/backupdb/all_$(date +%Y%m%d%H%M%S).sql在從庫上導入單個數據庫。
mysql -uroot -p'' 庫名 < /path/dbname.bak
mysql -uroot -p'123456' company < all_20240524195401.sql在從庫上導入多個數據庫
mysql -uroot -p'123456'  < all_20240524195401.sql

部署主從復制詳細流程

開始執行第一步
master操作:
cd /usr/local/mysql/
mkdir bin-log
chown -R mysql:mysql bin-log[root@mysql-master ~]# vim /etc/my.cnf
#在[mysqld]下添加如下內容
server-id=1
log-bin = /usr/local/mysql/bin-log/binlog  //前面是路徑后面是文件名
gtid_mode = on
enforce_gtid_consistency=1
#強制gtid
sync_binlog = 1[root@mysql-master ~]# systemctl restart mysqld檢查一下bin-log文件夾(此時二進制文件已經生成好了)
cd /usr/local/mysql/
cd bin-log/ llreplication  slave  //同步到從服務器
reload //重新加載
super //超級權限
slave //賬號
% //從服務器的id地址和主機
openssl rand -base64 40 | cut -c 2-15
+GVUrydHxuf4FK在主服務器創建授權賬戶:
mysql> grant replication  slave,reload,super on *.*  to 'slave'@'%' identified by '+GVUrydHxuf4FK';
#注:生產環境中密碼采用高級別的密碼,實際生產環境中將'%'換成slave的ip
mysql> flush privileges;
mysql> show master status; //查看狀態注意:如果不成功刪除以前的binlog日志
replication slave:擁有此權限可以查看從服務器,從主服務器讀取二進制日志。
super權限:允許用戶使用修改全局變量的SET語句以及CHANGE  MASTER語句
reload權限:必須擁有reload權限,才可以執行flush  [tables | logs | privileges]
slave操作(從服務器):
[root@mysql-slave ~]# vim /etc/my.cnf  #添加如下配置relay-log-info-repository=TABLE //要不要這個表的數據記錄server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE在重啟服務
[root@mysql-slave ~]# systemctl restart mysqld檢查一下有沒有錯誤的配置文件
cat /usr/local/mysql/mysql.log master_host='' //主服務器是多少
master_user='' //賬號是多少
master_password='+GVUrydHxuf4FK', //主服務器的密碼是多少
master_auto_position=1; //主服務器的標識是幾
[root@mysql-slave ~]# mysql -uroot -p'123456'   #登陸mysqlmysql> change master to
master_host='192.168.171.15',
master_user='slave', 
master_password='+GVUrydHxuf4FK', 
master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)mysql> start slave;   #真實啟動slave(從)角色
mysql> show slave status\G  #查看狀態,驗證sql和IO是不是yes。Slave_IO_Running: Yes  //表示主從同步已經配置成功Slave_SQL_Running: Yes
4、測試同步
在主庫新建數據庫,在從庫查看同步回到主服務器上
mysql> show master status;
創建數據庫
mysql> create database test_db;
主服務器狀態碼會發生變化為773 
mysql> show master status;
回到從服務器上 狀態碼也會發生變化為773 
mysql> show slave status\G 
查看test_db庫是否存在
mysql> show databases;在主服務器上創建庫shuihu
mysql -uroot -p'123456' -e"create database shuihu"; 
回到從服務器上 查看shuihu庫是否存在
mysql> show databases;
查看動態日志
tail -f /usr/local/mysql/mysql.log
5、重設從庫
什么場景需要重設從庫,比如網絡發生異常,主庫地址(position)會發生變化,從庫上方網絡ok就可以做一次從連從庫重設#全在從庫執行(斷開于主庫之間的通信,脫離主從關系)
mysql>stop slave;
mysql>reset slave;
mysql>reset master; 
#從庫的binlog已經無效了,所以要執行這個命令清空binlogmysql> change master to
master_host='192.168.171.15',
master_user='slave', 
master_password='+GVUrydHxuf4FK', 
master_auto_position=1;mysql> start slave;   #啟動slave角色
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G  #查看狀態,驗證sql和IO是不是yes。
6、常見錯誤
ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' first
如果遇到這種錯誤(是因為之前做主從同步的時候有殘留)要先斷開服務
從庫重設#全在從庫執行(斷開于主庫之間的通信,脫離主從關系)
mysql>stop slave;
mysql>reset slave;
mysql>reset master; 
在進行重啟就ok了 
systemctl stop mysqld
systemctl start mysqld常見故障1
Slave has more GTIDs than the master has,using the master's SERVER_UUID
該問題代表從庫獲取到的GTID超過了主庫,比如主庫在未指定binlog文件名的同時修改了系統主機名,導致binlog全部被修改,從庫就會判斷失敗;或者主庫未配置雙1參數時斷電,導致從庫提前獲取到了還未執行的GTID,解決方法如下:
重設從庫
stop slave;
reset slave;
reset master; 
#從庫的binlog已經無效了,所以要執行這個命令清空binlog
change master to
master_host='10.36.107.10',
master_port=3306,
master_user='slave',
master_password='Qf@12345!',
master_auto_position=1;常見故障2
如果從庫未指定relaylog的同時修改了系統主機名,只需要在從庫重新執行一次同步
stop slave;
reset slave;
change master to 
master_host='10.36.107.10',
master_port=3306,
master_user='slave',
master_password='Qf@12345!',
master_auto_position=1;常見故障3
Master_has_purged_require_gtids
主庫提前刪除了還未同步完成的binlog
在主庫上查看master信息
mysql> show master status\G;
*************************** 1. row ***************************File: mylog.000001Position: 465Binlog_Do_DB: Binlog_Ignore_DB: 
Executed_Gtid_Set: 402c0020-4012-11ed-8d7e-000c292b8f0e:1-2
1 row in set (0.00 sec)
#在從庫上手動指定二進制日志文件master_log_file和位置master_log_pos與master上的一致
mysql > stop slave;
mysql > change master to 
master_host='10.36.107.10',
master_user='slave',
master_password='Qf@12345!',
master_log_file='mylog.000001',
master_log_pos=465,
master_auto_position=0;
mysql > start slave;
6、故障切換
叢庫可以創數據庫 但是主庫是不會有的mysql主從,主服務器發生故障,如何進行切換?
主機故障,要把從服務器替換成主服務器1)在從服務器執行:(脫離主從關系)
mysql> stop slave;
mysql> reset master;2)查看是否只讀模式:(此時只讀模式是關閉模式 OFF)
show variables like 'read_only';
關閉只讀模式
vim /etc/my.cnf
read-only=1
并重啟mysql服務
systemctl restart mysqld或者不重啟使用命令關閉只讀,但下次重啟后失效:set global read_only=off;
3)查看show slave status \G;
4)在程序中將原來主庫IP地址改為現在的從庫IP地址,測試應用連接是否正常

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16150.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何用MySQL的SQL語句來讀寫硬盤目錄文件

1.先確保創建表&#xff0c;例如起名Temp CREATE TABLE temp ( id int(11) NOT NULL AUTO_INCREMENT, image mediumblob, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8; 注意這里的image字段用mediumblog&#xff0c;就可以避免出現data too …

27【Aseprite 作圖】盆栽——拆解

1 橘子畫法拆解 (1)淺色3 1 0;深色0 2 3 就可以構成一個橘子 (2)淺色 2 1;深色1 0 (小個橘子) (3)淺色 2 1 0;深色1 2 3 2 樹根部分 (1)底部畫一條橫線 (2)上一行 左空2 右空1 【代表底部重心先在右】 (3)再上一行,左空1,右空1 (4)再上一行,左突出1,…

省市區(輸入code) 轉相應省市區工具類(兩種方式)

方式一 通過調用接口&#xff08;時間高達1s&#xff09; package cn.iocoder.yudao.module.supplier.utils;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element;import java.io.BufferedReader; import java.io.InputStreamReader; i…

Java 泛型基礎

目錄 1. 為什么使用泛型 2. 泛型的使用方式 2.1. 泛型類 2.2. 泛型接口 2.3. 泛型方法 3. 泛型涉及的符號 3.1. 類型通配符"?" 3.2. 占位符 T/K/V/E 3.3. 占位符T和通配符&#xff1f;的區別。 4. 泛型不變性 5. 泛型編譯時擦除 1. 為什么使用泛型 Java 為…

基于深度學習的入侵檢測系統綜述文獻概述

好長時間不發博客了&#xff0c;不是因為我擺爛了&#xff0c;是我換研究方向了&#xff0c;以后我就要搞科研了。使用博客記錄我的科研故事&#xff0c;邀諸君共同見證我的科研之路。 1、研究方向的背景是什么&#xff1f; &#xff08;1&#xff09;互聯網發展迅速&#xff…

Android firebase消息推送集成 FCM消息處理

FirebaseMessagingService 是 Firebase Cloud Messaging (FCM) 提供的一個服務&#xff0c;用于處理來自 Firebase 服務器的消息。它有幾個關鍵的方法&#xff0c;你提到的 onMessageReceived、doRemoteMessage 和 handleIntent 各有不同的用途。下面逐一解釋這些方法的作用和用…

在 C++ 中,p->name 和 p.name 的效果并不相同。它們用于不同的情況,取決于你是否通過指針訪問結構體成員。

p->name&#xff1a;這是指針訪問運算符&#xff08;箭頭運算符&#xff09;。當 p 是一個指向結構體的指針時&#xff0c;用 p->name 來訪問結構體的成員。 student* p &stu; // p 是一個指向 student 類型的指針 cout << p->name << endl; // 通過…

基于ssm的蛋糕商城系統java項目jsp項目javaweb

文章目錄 蛋糕商城系統一、項目演示二、項目介紹三、系統部分功能截圖四、部分代碼展示五、底部獲取項目源碼&#xff08;9.9&#xffe5;帶走&#xff09; 蛋糕商城系統 一、項目演示 蛋糕商城管理系統 二、項目介紹 系統角色 : 管理員、用戶 一&#xff0c;管理員 管理員有…

PICO VR眼鏡定制播放器使用說明文檔videoplayerlib-ToB.apk

安裝高級定制播放器 高級定制播放器下載地址:https://download.csdn.net/download/ahphong/89360454 僅限用于PICO G2、G3、G4、NEO系列VR眼鏡上使用, 用途:用于第三方APP(開發者)調用定制播放器播放2D、3D、180、360全景視頻。 VR眼鏡系統請升級到最新版,可在官網下載,…

Mixed-precision計算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

【排序算法】選擇排序以及需要注意的問題

選擇排序的基本思想&#xff1a;每一次從待排序的數據元素中選出最小&#xff08;或最大&#xff09;的一個元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的數據元素排完 。 第一種實現方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…

【kubernetes】探索k8s集群中金絲雀發布后續 + 聲明式資源管理yaml

目錄 一、K8S常見的發布方式 1.1藍綠發布 1.2灰度發布&#xff08;金絲雀發布&#xff09; 1.3滾動發布 二、金絲雀發布 三、聲明式管理方法 3.1YAML 語法格式 3.1.1查看 api 資源版本標簽 3.1.2查看資源簡寫 3.2YAML文件詳解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

CSS3特殊屬性

特殊屬性 will-change will-change 屬性用于向瀏覽器提供提示,表明某個元素或其特定屬性在未來極有可能發生變化。這有助于瀏覽器提前優化相關渲染流程,提升動畫或其他動態效果的性能。 element {will-change: auto | <animateable-feature> [, <animateable-feat…

C++系列-C/C++內存管理方式

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” C/C內存分布 在這篇文章開始之前&#xff0c;我們先以一道題目來進行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java進階學習筆記27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可變字符串對象&#xff0c;相當于一個容器&#xff0c;它里面裝的字符串是可以改變的&#xff0c;就是用來操作字符串的。 好處&#xff1a; StringBuilder比String更適合做字符串的修改操作&#xff0c;效率會更高&#xff0c;…

在CSDN上成長的感悟,你的粉絲長啥樣?

文章目錄 一、寫作的初衷1. 記錄所學內容2.鞏固所學知識3.分享與幫助4.方便后續查找5.獲取激勵 二、你的粉絲長啥樣&#xff1f;1. 粉絲的特點與困惑2. 關于粉絲&#xff0c;細思極恐 三、繼續前行、堅持初心 在CSDN上寫博文&#xff0c;對于我來說&#xff0c;不僅僅是一個記錄…

OTA在線旅行社系統架構:連接世界的科技紐帶

隨著互聯網的快速發展和人們對旅行需求的不斷增長&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在線旅行社成為了現代旅行業中的重要一環。OTA系統架構的設計和實現將對旅行行業產生深遠影響。本文將探討OTA在線旅行社系統架構的重要性和關鍵組成部分&#xff…

異構圖上的連接預測一

這里寫目錄標題 異構圖&#xff1f;處理數據&#xff1a; 異構圖&#xff1f; 異構圖&#xff1a;就是指節點與邊類型不同的圖。 連接預測&#xff1a;目的是預測圖中兩個節點之間是否存在一條邊&#xff0c;或者是預測兩個節點之間&#xff0c;在未來可能形成的連接。 eg&…

Linux系統如何通過編譯方式安裝python3.11.3

1.切換到/data 目錄 cd /data 2.下載python源碼Python-3.11.3.tgz wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz tar -xzf Python-3.11.0.tgz cd Python-3.11.3 3.配置python的安裝路徑 和 執行openssl的路徑 ./configure --prefix/usr/local/pyth…

Java筑基(三)

Java筑基&#xff08;三&#xff09; 一、final概念1、案例1&#xff1a;采用繼承&#xff1a;2、案例2&#xff1a;final修飾的類不可以被繼承&#xff1a;3、案例3&#xff1a;final修飾的類不能有子類&#xff0c;但是可以有父類4、final修飾構造方法5、final修飾普通方法6、…