mysql-8.0.12主從復制


mysql主從復制的原理是什么?

(1)Slave上面的IO線程連接上Master,並請求從指定Binary log文件的指定位置(或者從最開始的日志)之后的日志內容;

(2)Master接收到來自Slave的IO線程的請求后,通過負責復制的IO線程根據請求信息讀取指定日志指定位置之后的日志信息,返回給Slave端的IO線程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息在Master端Binary log文件的名稱以及在Binary log中的位置;

(3)Slave的IO線程收到信息后,將接收到的日志內容依次寫入到Slave端的RelayLog文件(mysql-relay-lin.xxxxx)的最末端,並將讀取到的Master端的bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的告訴master“我需要從某個bin-log的哪個位置開始往后的日志內容,請發給我”

(4)Slave的SQL線程檢測到Relay Log中新增加了內容后,會馬上解析該Log文件中的內容成為在Master端真實執行時候的那些可執行的查詢或操作語句,並在自身執行那些查詢或操作語句,這樣,實際上就是在master端和Slave端執行了同樣的查詢或操作語句,所以兩端的數據是完全一樣的。

 

binlog輸出線程。每當有從庫連接到主庫的時候,主庫都會創建一個線程然后發送binlog內容到從庫。
對於每一個即將發送給從庫的sql事件,binlog輸出線程會將其鎖住。一旦該事件被線程讀取完之后,該鎖會被釋放,即使在該事件完全發送到從庫的時候,該鎖也會被釋放。

 

在從庫里,當復制開始的時候,從庫就會創建兩個線程進行處理:

 

從庫I/O線程。當START SLAVE語句在從庫開始執行之后,從庫創建一個I/O線程,該線程連接到主庫並請求主庫發送binlog里面的更新記錄到從庫上。
從庫I/O線程讀取主庫的binlog輸出線程發送的更新並拷貝這些更新到本地文件,其中包括relay log文件。

 

從庫的SQL線程。從庫創建一個SQL線程,這個線程讀取從庫I/O線程寫到relay log的更新事件並執行。

 

可以知道,對於每一個主從復制的連接,都有三個線程。擁有多個從庫的主庫為每一個連接到主庫的從庫創建一個binlog輸出線程,每一個從庫都有它自己的I/O線程和SQL線程。

 

從庫通過創建兩個獨立的線程,使得在進行復制時,從庫的讀和寫進行了分離。因此,即使負責執行的線程運行較慢,負責讀取更新語句的線程並不會因此變得緩慢。比如說,如果從庫有一段時間沒運行了,當它在此啟動的時候,盡管它的SQL線程執行比較慢,它的I/O線程可以快速地從主庫里讀取所有的binlog內容。這樣一來,即使從庫在SQL線程執行完所有讀取到的語句前停止運行了,I/O線程也至少完全讀取了所有的內容,並將其安全地備份在從庫本地的relay log,隨時准備在從庫下一次啟動的時候執行語句

 

 

Mysql主從同步實踐

環境:

主mysql:172.16.1.21/24

從mysql:172.16.1.22/24

 

需知:

1.主從服務器操作系統版本和位數一致;

2.Master 和 Slave 數據庫的版本要一致;

3.Master 和 Slave 數據庫中的數據要一致;

4.Master 開啟二進制日志, Master 和 Slave 的 server_id 在局域網內必須唯一;

 

主數據庫

開啟log-bin功能,並指定server_id為1.這里log-bin必須指定,不然的話bin-log日志會根據主機名來命名,假如主庫的主機名改變了,那主從復制就失效了。

vim /etc/my.cnf

[mysqld]

log-bin=mysql-bin

log-bin-index=master-bin.index

server-id=1

重啟服務

 

創建一個用於讓從數據庫連接的用戶

mysql> CREATE USER 'copy'@'%' IDENTIFIED WITH mysql_native_password BY 'tqw961110';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'copy'@'%';

 

刷新授權表信息

mysql> flush privileges;

 

獲取主節點當前binary log文件名和位置(position)

mysql> SHOW MASTER STATUS;

 

從數據庫 (同主庫,必須指定中繼日志的名稱)

修改server_id

vi /etc/my.cnf

[mysqld]

server-id=2

relay-log=relay-log

relay-log-index=relay-log.index

重啟服務

 

在從(Slave)節點上設置主節點參數

mysql> CHANGE MASTER TO
MASTER_HOST='172.16.1.21',
MASTER_USER='copy',
MASTER_PASSWORD='tqw961110',
MASTER_LOG_FILE='binlog.000012',
MASTER_LOG_POS=631746;

 

查看主從同步狀態

mysql> show slave status\G;

開啟主從同步

start slave;

再次查看主從同步狀態

mysql> show slave status\G;

Slave_IO_Running和Slave_SQL_Running的狀態都為YES才表示同步成功!!!!

 

若有錯誤,可在下方查看報錯信息

一般io的報錯,都是server_id重復了

查看server_id的方法

show variables like 'server_id';

 

至此,主從同步完成。可自行測試同步效果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM