MySQL數據庫復制

文章目錄

  • MySQL數據庫復制
    • 一、復制的原理
    • 二、復制的搭建
      • 1.編輯配置文件
      • 2.在主庫上創建復制的用戶
      • 3.獲取主庫的備份
      • 4.基于從庫的恢復
      • 5.建立主從復制
      • 6.開啟主從復制
      • 7.查看主從復制狀態

MySQL數據庫復制

MySQL作為非常流行的數據庫,支撐它如此出彩的因素主要有兩個,InnoDB存儲引擎和復制。InnoDB存儲引擎支持事務、行級別鎖、MVCC。基于此,MySQL能實現高并發。而復制可以將主庫的數據同步到另一個實例,基于此我們可以實現讀寫分離和數據容災。

一、復制的原理

MySQL主從復制的核心原理是通過二進制日志(binlog)實現的,熟悉Oracle的同學會問:MySQL不是有redo log嗎?為什么不直接基于redo log來實現呢?
實際上redo log是InnoDB存儲引擎獨有的,作為一個支持可插撥存儲引擎的數據庫,MySQL不僅支持InnoDB存儲引擎,還支持MyISAM、CSV、Memory等存儲引擎,對于這些存儲引擎的操作同樣需要持久化到binlog中。

在這里插入圖片描述

MySQL的復制主要涉及以下3個線程:

  • 主庫 binlog dump 線程
  • 從庫 I/O 線程
  • 從庫 SQL 線程

MySQL的復制其運作流程大致如下:

  1. 從庫執行完START SLAVE命令后,會創建兩個線程:I/O線程SQL線程
  2. I/O線程會建立一個到主庫的連接,相應地,主庫會創建一個binlog dump線程來響應這個連
  3. 接的請求。此時,對于主庫來說,從庫的1/O線程就是一個普通的客戶端。
  4. I/O線程首先告訴主庫應該從何處開始發送二進制日志事件。
  5. 主庫的binlog dump線程開始從指定位置點讀取二進制日志事件,并發送給I/O線程。
  6. I/O線程接收到二進制日志事件后,會將其寫入relay log
  7. SQL線程讀取relay log中的二進制日志事件,然后進行重放。

二、復制的搭建

實驗版本為 MySQL 8.0.41,部署MySQL異步復制,機器環境如下, 需要分別提前安裝數據庫軟件以及初始化好數據庫實例,可以參考我之前的《MySQL數據庫安裝》的文章

角色IP
主庫192.168.50.121
從庫192.168.50.122

1.編輯配置文件

主庫編輯/etc/my.cnf文件

[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
socket = /data/mysql/3306/data/mysql.sock
server-id = 1
log-bin = mysql-bing
user = mysql
port = 3306
log-error = /data/mysql/3306/data/mysqld.err
log-timestamps = system

從庫/etc/my.cnf文件

[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
socket = /data/mysql/3306/data/mysql.sock
server-id = 2
log-bin = mysql-bing
user = mysql
port = 3306
log-error = /data/mysql/3306/data/mysqld.err
log-timestamps = system

這里給出的只是搭建復制最簡單的參數:

  • log-bin 開啟 binlog , 這里的mysql-binbinlog文件的前綴(8.0之后的版本可以不用配置該數,但會習慣性的進行設置)
  • server-id 是服務端ID, 在一個復制組內必需全局唯一,有效值為 1~2^32^-1

注意事項:

  • server-id 支持在線調整,但開啟binlog 需要重啟實例
  • MySQL8.0之前,binlog默認是關閉的,不顯示設置log-bin參數,則不開啟binlog。而在MySQL8.0中,binlog默認是開啟的,如果要關才binlog,需要顯示設置skip_log_bindisable_log_bin

2.在主庫上創建復制的用戶

在MySQL 8.0 之前可以直接使用第二第命令會隱式創建用戶,但官方不推薦這種方式。

create user 'repl'@'192.168.50.122' identified by 'test123';grant replication slave on *.* to 'repl'@'192.168.50.122';

創建用戶后在從庫環境驗證帳號是否能正常登陸

mysql -urepl -ptest123 -h 192.168.50.121

3.獲取主庫的備份

這里使用mysqldump工具進行備份,備份集通過scp命令拷貝到從庫

mysqldump -uroot -ptest123 -S /data/mysql/3306/data/mysql.sock --single-transaction --source-data=2 -E -R --triggers -A > full_backup.sqlscp  full_backup.sql 192.168.50.122:/data

MySQL 8.0.26開始,開始使用 --source-data 代替之前版本的 --master-data 否則備份文件中會寫入以下信息,影響到后續的導入。

WARNING:–master-data is deprecated and will be removed in a future version.use --source-data instead.

4.基于從庫的恢復

在從庫對備份文件進行導入

mysql -uroot -ptest123 -S /data/mysql/3306/data/mysql.sock < /data/full_backup.sql

5.建立主從復制

在從庫執行 CHANGE MASTER TO命令創建主從關系

change master to
master_host='192.168.50.121',
master_port=3306,
master_user='repl',
master_password='test123',
master_log_file='mysql-bing.000001',
master_log_pos=717;

參數具體含義:

參數作用
master_host主庫的主機信息,可以為主機名或IP
master_port主庫端口,若不指定則默認為3306
master_use復制的用戶名
master_password復制用戶的密碼
master_log_file從庫I/O線程啟動時,應該從主庫的哪個binlog由這個參數決定
master_log_posI/O線程確定binlog后,從哪個位置開始讀取二進制日志事件.

我們在備份的時候通過 mysqldump 指定的 --source-data=2 (舊版本用--master-data=2) 他會將備份時的binlog位置信息記錄到備份文件中,內容如下

--
-- Position to start replication or point-in-time recovery from
---- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bing.000001', MASTER_LOG_POS=717;

當從庫執行完CHANGE MASTER TO命令后,復制的相關信息會保存在兩張表中:mysqL.slave_master.infomysql.slave_relay_.log_info

mysql.slave_master_.info主要記錄了兩類信息:

  • 主庫的連接信息,包括主庫的IP、端口、復制用戶和密碼;
  • I/O線程讀取的主庫binlog的位置點信息。

注意,這個位置點不是實時更新的,它的更新頻率與sync_master_.info參數有關。該參數默認為10000,即I/O線程每寫入10000個事務會更新mysql.slave_.master_info一次。

mysql.slave_relay_log_info主要記錄了以下信息:

  • SQL線程重放relay log的位置點信息。

事務每次提交時都會更新mysqL.slave._relay._log_info

這兩張表是MySQL5.6引入的。在此之前復制的相關信息保存在master.info(對應mysql.slave_master.info表)和relay-log.info(對應mysql.slave_.relay_.log_info表)文件中,這兩個文件默認位于從庫的數據目錄下。復制的相關信息是保存在文件還是系統表中由master_info_repository參數決定,其中,FILE代表文件,TABLE代表系統表。從MySQL8.0.2開始,該參數的默認值由FILE調整為TABLE。

6.開啟主從復制

在從庫上執行如下以下命令

mysql> start slave;

7.查看主從復制狀態

重點關注 Slave_IO_RunningSlave_SQL_Running 的結果均為YES代表主從復制搭建成功

mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.50.121Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bing.000001Read_Master_Log_Pos: 717Relay_Log_File: mysql02-relay-bin.000003Relay_Log_Pos: 327Relay_Master_Log_File: mysql-bing.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 717Relay_Log_Space: 696Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 1Master_UUID: cdc9afd5-fcd8-11ef-9d33-000c29ea0d0aMaster_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:Master_public_key_path:Get_master_public_key: 0Network_Namespace:1 row in set, 1 warning (0.00 sec)

在上面使用 SHOW SLAVE STATUS 命令時,提示了warning通過 show warnings 可以看到,SHOW SLAVE STATUS 已被棄用, 代用SHOW REPLICA STATUS替代。

  • 實際上在MySQL 8.0.22 開始 start slavestop slaveshow slave stausshow slave hostsreset slave 命令都補棄用了,取而代之的是 start replicastop rplicashow replica statusshow replicasreset replica
  • MySQL8.O.23開始,CHANGE MASTER TO命令被棄用,取而代之的是CHANGE REPLICATION SOURCE TO
  • MySQL8.0.26開始,標識符(如系統參數、狀態變量)中的MASTER、SLAVEMTS(multithreadedslave的縮寫)將分別被SOURCE、REPLICAMTA(multithreaded applier的縮寫)替換,這一點需要注意。
mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                           |
+---------+------+-------------------------------------------------------------------------------------------------------------------+
| Warning | 1287 | 'SHOW SLAVE STATUS' is deprecated and will be removed in a future release. Please use SHOW REPLICA STATUS instead |
+---------+------+-------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

在主庫上執行 show processlist 命令,可以看到 ID為23 連接對應的即是 binlog dump線程。

mysql> show processlist\G;*************************** 3. row ***************************Id: 23User: replHost: 192.168.50.122:52016db: NULL
Command: Binlog DumpTime: 152State: Source has sent all binlog to replica; waiting for more updatesInfo: NULL

在從庫是執行 show processlist 命令, 5和6 的連接分別為 I/O線程和SQL線程

mysql>  show processlist\G;
*************************** 1. row ***************************Id: 5User: system userHost: connecting hostdb: NULL
Command: ConnectTime: 226State: Waiting for source to send eventInfo: NULL
*************************** 2. row ***************************Id: 6User: system userHost:db: NULL
Command: QueryTime: 226State: Replica has read all relay log; waiting for more updatesInfo: NULL

至此一個簡單的異步復制環境搭建完畢。

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

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

相關文章

Sourcetree——使用.gitignore忽略文件或者文件夾

一、為何需要文件忽略機制&#xff1f; 1.1 為什么要會略&#xff1f; 對于開發者而言&#xff0c;明智地選擇忽略某些文件類型&#xff0c;能帶來三大核心優勢&#xff1a; 倉庫純凈性&#xff1a;避免二進制文件、編譯產物等污染代碼庫 安全防護&#xff1a;防止敏感信息&…

基于yolov8+streamlit實現目標檢測系統帶漂亮登錄界面

【項目介紹】 基于YOLOv8和Streamlit實現的目標檢測系統&#xff0c;結合了YOLOv8先進的目標檢測能力與Streamlit快速構建交互式Web應用的優勢&#xff0c;為用戶提供了一個功能強大且操作簡便的目標檢測平臺。該系統不僅具備高精度的目標檢測功能&#xff0c;還擁有一個漂亮且…

分享vue好用的pdf 工具實測

vue3-pdf-app&#xff1a; 帶大綱&#xff0c;帶分頁&#xff0c;帶縮放&#xff0c;帶全屏&#xff0c;帶打印&#xff0c;帶下載&#xff0c;帶旋轉 下載依賴&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置類&#xff1a; 創建文件 pdfConfig.ts /…

基于微信小程序開發的寵物領養平臺——代碼解讀

項目前端 一、項目的技術架構概況 一句話概括&#xff1a;該項目是基于微信小程序開發的寵物領養平臺&#xff0c;采用原生小程序框架進行用戶界面的構建&#xff0c;使用 wx.request 進行 API 請求&#xff0c;并通過 getApp() 和本地存儲來管理全局狀態和用戶信息。 一&am…

最完美的WPF無邊框設計!

常規的無邊框方法設計 常規的WPF無邊框設計方法都是通過AllowsTransparency="True"和WindowStyle=“None”,并且使用WindowChrome樣式來實現,但是這樣會有問題就是,窗體最大化的時候將底部任務欄給擋住了,另外最大化的時候不能拖動窗體。參考這個大佬的設計@ 若…

【區塊鏈】btc

學習視頻源鏈接&#xff1a; https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根據肖老師的視頻進行的筆記記錄 一、 cryptographic hash function 1.1. collision resistance抗碰撞性 &#xff1a; collision 指的是hash碰撞 抗碰撞性 (Collision Resistance) 是密碼…

C語言【數據結構】:時間復雜度和空間復雜度.詳解

引言 詳細介紹什么是時間復雜度和空間復雜度。 前言&#xff1a;為什么要學習時間復雜度和空間復雜度 算法在編寫成可執行程序后&#xff0c;運行時需要耗費時間資源和空間(內存)資源。因此衡量一個算法的好壞&#xff0c;一般是從時間和空間兩個維度來衡量的&#xff0c;即時…

QT:文件讀取

問題&#xff1a; 在文件讀取&#xff0c;判斷md5值時&#xff0c;遇到py文件讀取轉String后&#xff0c;再轉byte&#xff0c;md5前后不一致問題。 解決方法&#xff1a; python文件讀取要使用QTextStream&#xff0c;避免\t 、\r、\n的換行符跨平臺問題&#xff08;window…

32單片機——LED

LED原理圖如圖所示&#xff1a; 代碼 DS0和DS1每過500ms一次交替閃爍&#xff0c;實現類似跑馬燈的效果 GPIO輸出配置步驟 &#xff08;1&#xff09;使能對應GPIO時鐘 STM32在使用任何外設之前&#xff0c;我們都要先使能其時鐘&#xff08;下同&#xff09;。本實驗用到…

貪心算法和遺傳算法優劣對比——c#

項目背景&#xff1a;某鋼管廠的鋼筋原材料為 55米&#xff0c;工作需要需切割 40 米&#xff08;1段&#xff09;、11 米&#xff08;15 段&#xff09;等 4 種規格 &#xff0c;現用貪心算法和遺傳算法兩種算法進行計算&#xff1a; 第一局&#xff1a;{ 40, 1 }, { 11, 15…

【Java篇】一法不變,萬象歸一:方法封裝與遞歸的思想之道

文章目錄 Java 方法的使用&#xff1a;從基礎到遞歸的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定義1.3 方法調用的執行過程1.4 實參和形參的關系1.5 沒有返回值的方法 二、方法重載2.1 為什么需要方法重載2.2 方法重載的概念2.2.4 C 和 Java 的比較&…

深入理解 HTML 中的<div>和元素:構建網頁結構與樣式的基石

一、引言 在 HTML 的世界里&#xff0c;<div>和元素雖看似普通&#xff0c;卻扮演著極為關鍵的角色。它們就像網頁搭建過程中的萬能積木&#xff0c;能夠將各種 HTML 元素巧妙地組合起來&#xff0c;無論是構建頁面布局&#xff0c;還是對局部內容進行樣式調整&#xff…

《大語言模型》學習筆記(一)

一、什么是大語言模型 大語言模型是指在海量無標注文本數據上進行預訓練得到的大型預訓練語言模型&#xff0c;例如GPT-3&#xff0c;PaLM和LLaMA。大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一種基于深度學習的自然語言處理模型&#xff0c;能…

電力行業中分布式能源管理(Distributed Energy Management System, DEMS)的實現

以下是電力行業中分布式能源管理(Distributed Energy Management System, DEMS)的實現方案,涵蓋系統架構、關鍵技術、核心功能及實施路徑,結合典型場景與代碼示例: 一、系統架構設計 采用云-邊-端三層架構,實現分布式能源的高效協同管理: 1. 終端層(感知層) 設備組…

實驗5 邏輯回歸

實驗5 邏輯回歸 【實驗目的】掌握邏輯回歸算法 【實驗內容】處理樣本&#xff0c;使用邏輯回歸算法進行參數估計&#xff0c;并畫出分類邊界 【實驗要求】寫明實驗步驟&#xff0c;必要時補充截圖 1、參照“2.1梯度下降法實現線性邏輯回歸.ipynb”和“2.2 sklearn實現線性邏輯…

思維訓練讓你更高、更強 |【邏輯思維能力】「刷題訓練筆記」假設法模式邏輯訓練題(1-5)

每日一刷 思維訓練讓你更高、更強&#xff01; 題目1 誰在說謊&#xff0c;誰拿走了零錢&#xff1f; 姐姐上街買菜回來后&#xff0c;就隨手把手里的一些零錢放在了抽屜里&#xff0c;可是&#xff0c;等姐姐下午再去拿錢買菜的時候發現抽屜里的零錢沒有了&#xff0c;于是&…

【愚公系列】《高效使用DeepSeek》004-DeepSeek的產品形態和功能詳解

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

用python代碼將excel中的數據批量寫入Json中的某個字段,生成新的Json文件

需求 需求&#xff1a; 1.將execl文件中的A列賦值給json中的TrackId&#xff0c;B列賦值給json中的OId 要求 execl的每一行&#xff0c;對應json中的每一個OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…

【Python】dash-fastapi前后端搭建

概述 項目中需要快速搭建一個前后端系統&#xff0c;涉及到dash-fastapi架構的時候&#xff0c;對該架構的時候進行總結。本文主要總結的是對該架構的基本使用&#xff0c;后續再對該架構的項目源碼進行總結分析 此處實現一個小的demo&#xff0c;迷你任務管理器&#xff0c;…

IDEA中鏈接使用mysql數據庫

一、連接mysql 1. 打開idea&#xff0c;在右上角側邊欄有數據庫database插件&#xff0c;打開側邊欄點擊加號->數據源&#xff0c;可以看到支持很多數據庫&#xff0c;選擇mysql。 2. 首次使用需要下載驅動程序&#xff0c;不然連接數據庫會報錯。找到mysql&#xff0c;點擊…