MySQL主從複製原理與實操
一、引言
在工作中,對資料庫的資料進行備份是毫無疑問的事情,而資料庫的備份方式又分好多種(此處就不做介紹),最基本的就是一主一從,從機需要不斷的讀取主機的資料二進位制日誌記錄來備份主機的資料,這是資料庫主從複製的第一個應用場景。主從複製的第二個應用場景就是在分散式的系統中,一個數據庫肯定是不行的,這就需要分多個庫,庫與庫之間也需要做資料的同步。So,下面就來實操一下資料庫的主從複製。
二、環境搭建
為了模擬資料庫的主從複製,需要搭建一個主資料庫和一個從資料庫,從資料庫需要備份主機的資料。本文的主資料庫是在Win7下的MySQL,從資料庫放在虛擬機器中,使用MySQL的Docker映象,很方便,但是有需要注意的地方。重點需要注意:主從資料庫的版本要求一致。
1、啟動Docker映象注意事項
(1)、在Docker所在的宿主機上建立MySQL的兩個資料夾:config和db,在config下建立my.cnf,命令如下:
cd /
mkdir docker/mysql
cd docker/mysql
mkdir config
mkdir db
my.cnf內容:
[mysqld]
user=mysql
(2)、掛載volume卷
因為要對從資料庫進行一些配置,這就需要修改從機的配置檔案。為了方便修改MySQL映象中的MySQL配置檔案,我們要將映象裡的MySQL配置檔案與宿主機裡的MySQL配置檔案做繫結,這樣我們只要改宿主機中的MySQL配置檔案,映象裡的MySQL就可以生效了。使用如下命令:
docker run -p 3306:3306 --name mysql -v=/docker/mysql/config/my.cnf:/etc/my.cnf
-v=/docker/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.24
(3)、在主從資料庫中,分別建立使用者(用root使用者不行)
建立使用者命令:
CREATE USER 'username'@'host' IDENTIFIED BY 'password'; //建立一個pig使用者,密碼為123456,執行任意ip地址訪問 eg:CREATE USER 'pig'@'%' IDENTIFIED BY '123456';
授權命令:
GRANT privileges ON databasename.tablename TO 'username'@'host'
//為pig使用者授予所有操作許可權
eg:GRANT ALL ON *.* TO 'pig'@'%';
三、主從複製基本原理和實戰配置:
1、主從複製的基本原理
slave 會從 master 讀取 binlog 來進行資料同步,原理圖:
(1)、MySQL複製過程分成三步驟:
第一步:
master 將改變記錄到二進位制日誌檔案(binary log),這些記錄過程叫做二進位制日誌事件,binary log events;
第二步:
slave 將 master 的 binary log events 拷貝到它的中繼日誌(relay log);
第三步:
slave 重做中繼日誌中的事件,將改變應用到自己的資料庫中,MySQL複製是非同步的且序列化的;
2、主從複製的的基本原則
(1)、每個 slave 只有一個 master
(2)、每個 slave 只能有一個唯一的伺服器ID
(3)、每個 master 可以有多個slave
3、配置的基本步驟(☆☆☆☆☆)
(1)、前提說明
i. MySQL 版本一致且後臺服務執行;
ii. 主從都配置在 [mysqld] 結點下,且都是小寫;
(2)、主機修改 my.ini 配置檔案(主機為Windows下的MySQL)
i. 主伺服器唯一ID(必須):service-id=1;
ii. 啟用二進位制日誌(必須):
log-bin=自己本地的路徑/mysqlbin
eg:log-bin=D:/mysql/mysql-5.7.24-winx64/data/mysqlbin
iii.啟用錯誤日誌(可選):
log-err=自己本地的路徑/mysqlerr
eg:log-err=D:/mysql/mysql-5.7.24-winx64/data/mysqlerr
iv.根目錄(可選):
basedir=”自己本地路徑”
eg:basedir=D:/mysql/mysql-5.7.24-winx64
v.臨時目錄(可選):
tmpdir=”自己本地路徑”
eg:tmpdir=D:/mysql/mysql-5.7.24-winx64
vi.資料目錄(可選):
datadir=”自己本地路徑/Data/”
eg:datadir=D:/mysql/mysql-5.7.24-winx64/data
vii.read-only=0:主機,讀寫都可以
viii.設定不要複製的資料庫(可選):
binlog-ignore-db=mysql
ix.設定需要複製的資料庫(可選):
biglog-do-db=需要複製的主資料庫名字
(3)、從機修改 my.cnf 配置檔案
i.從機伺服器唯一ID(必須):service-id=2;
ii.啟用二進位制日誌(可選)
log-bin=mysql-bin
(4)、因修改過配置檔案,主機和從機都需要重啟後臺mysql服務
(5)、主機從機都關閉防火牆
i.Windows手動關閉;
ii.Linux關閉虛擬機器防火牆:systemctl stop firewalld:(不同系統版本,命令有差別)
(6)、在 windows 主機上建立賬戶並授權 slave;
i.授權:grant replication slave on *.* to '[email protected]'192.168.1.106' identified by '123456';
ii.重新整理:flush privileges;
iii.查詢master的狀態,並記錄下 File 和 Position 的值;(從資料庫需要從這個位置開始複製資料!!!!!!)
iv.show master status
注意:執行完此步驟後不要再操作主伺服器MySQL,防止主伺服器狀態變化;
(7)、在Linux從機上配置需要複製的主機;
i.授權:
change master to master_host='192.168.1.104',
master_user='scorpio',
master_password='123456',
master_log_file='mysqlbin.000002',
master_log_pos=2417;
ii.啟動從伺服器複製功能:start slave;
iii.show slave status\G;
iv.下面兩個引數都是yes,則說明主從配置成功!
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
引數說明:
master_host=‘主機Ip’:主機的IP
master_user=‘使用者名稱’:主機資料庫使用者名稱
master_password=‘123456’:密碼
master_log_file=‘File名字’:上文用show master status命令查出來的File值
master_log_pos=position數字:上文用show master status命令查出來的Position值
(8)、主機新建庫、新建表、insert記錄,從機複製;
(9)、如何停止從機的複製功能;
stop slave;
四、小結
1、在搭建環境時需要注意:
(1)、主從MySQL的大版本要一致,比如5.7的,要統一;
(2)、主從資料庫的賬號不能用root許可權,不然在從伺服器中用show slave status命令檢視狀態時,會一直連線不上主資料庫;
(3)、Docker中的MySQL映象的配置檔案,要和宿主機中的配置檔案繫結;
(4)、主從複製的配置流程,就如上文所述。