MySQL 的主從複製(高階篇)

huxiaobai_001發表於2020-04-11

首先要明白為什麼要用mysql的主從複製:

1–在從伺服器可以執行查詢工作(即我們常說的讀功能),降低主伺服器壓力;(主庫寫,從庫讀,降壓)
2–在從主伺服器進行備份,避免備份期間影響主伺服器服務;(確保資料安全)
3–當主伺服器出現問題時,可以切換到從伺服器。(提升效能)

來說一下主從複製的實現原理

mysql複製過程分為三步(如上圖所示):

1.mster將改變記錄到二進位制日誌(binary log)當中 這些記錄過程叫做二進位制日誌事件 binary log events;
2.slave將master的binary log events拷貝到它的中繼日誌(relay log)當中;
3.slave重做中繼日誌中的事件 將改變應用到自己的資料庫當中 mysql複製是非同步的且序列化的3.slave重做中繼日誌中的事件 將改變應用到自己的資料庫當中 mysql複製是非同步的且序列化的

複製的基本原則:

  1. 每個slave只有一個master
  2. 每個slave只能有一個唯一的伺服器id
  3. 每個master可以有多個slave

複製的最大問題:
從主機複製資料達到從機可能會有延時!

都說master主機和slave從機的mysql版本號要一致 我就沒一致
master主機上是5.6 slave從機上是5.7一樣搞
拿過來一臺伺服器你不得先找mysql嗎?mysql在哪裡 配置檔案在哪裡?
執行命令:

which mysql
/usr/bin/mysql --verbose --help | grep -A 1 'Default options'

結果如圖所示:
mysql的主從複製(高階篇)
先去找/etc/my.cnf再去找/etc/mysql/my.cnf 然後就是後邊
我的是在/etc/my.cnf
修改my.cnf配置檔案如下:
mysql的主從複製(高階篇)
重啟mysql伺服器執行命令:

service mysqld restart;

解釋:
server-id=1 //複製組中的每臺伺服器都要配置唯一的Server ID,取值範圍是1到(232)−1,你自己決定取值
log-bin=master-bin //日誌檔名以“master-bin”作為字首
binlog-do-db=finance_online //要同步的finance_online資料庫
如要同步多個資料庫,就多加幾個replicate-db-db=資料庫名
binlog-ignore-db=mysql //要忽略的資料庫
read-only //主機 讀寫都可以(必須)
登入上mysql 然後執行:

show master status;

結果如下:
mysql的主從複製(高階篇)
記住裡面的File和Position的值 待會會用到!

在主資料中建立一個同步賬號(可不建立使用現有的),如果僅僅為了主從複製建立賬號,只需要授予REPLICATION SLAVE許可權
建立一個賬號,賬號:zcfz 密碼: 123456
這個賬號是專門用來搞主從複製用的哈

CREATE USER 'zcfz'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
GRANT REPLICATION SLAVE ON *.* TO 'zcfz'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

上述 主伺服器配置完成

slave從伺服器配置開始:
mysql的主從複製(高階篇)
重啟mysql伺服器:

service mysqld restart;

進入到slave從機的mysql命令列執行命令:

stop  slave;
CHANGE MASTER TO MASTER_HOST='10.10.20.120',
MASTER_USER='zcfz',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000005',
MASTER_LOG_POS=3878614;

解釋:
MASTER_HOST 就是master主伺服器的ip
MASTER_USER 就是master主伺服器裡面的專門複製複製的使用者 zcfz
MASTER_PASSWORD 就是zcfz賬戶的密碼
MASTER_LOG_FILE 就是我們上邊讓您儲存的file對應的值
MASTER_LOG_POS 就是我們上邊讓您儲存的Position的值
然後執行命令:

show slave status\G

結果如圖所示:
mysql的主從複製(高階篇)
wating for master to send evnet 說明已經在待命狀態了
另外必須注意的是 slave_io_runing 以及 slave_sql_runing 都同時必須為yes才行!!!
截止到此刻說明主從複製的道路打通了!
然後執行命令:

start slave;

驗證階段:
執行命令建立資料庫:

CREATE DATABASE finance_online DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

這個時候master 和 slave 上都有了資料庫
然後你再匯入資料到master主機上的finance_online 那麼 slave從機上也就有了然後你再匯入資料到master主機上的finance_online 那麼 slave從機上也就有了

另外如果你不想複製這個庫了 想換一個
那麼去修改master主機上的my.cnf當中的binlog-do-db=tprbac 然後重啟mysql服務
然後show master status 看看file 和positon
然後再去linux伺服器上停止slave 在mysql當中執行 stop slave;
然後再執行:
CHANGE MASTER TO MASTER_HOST=’10.10.20.120’,
MASTER_USER=’zcfz’,
MASTER_PASSWORD=’123456’,
MASTER_LOG_FILE=‘你看到的file’,
MASTER_LOG_POS=你看到的positon;
然後在start slave;
就完事了!
這樣就會主從複製你想要複製的資料庫了!!!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

胡軍

相關文章