MySQL8主從複製技術
MySQL的主從複製技術首先要滿足一些條件:
1、兩臺伺服器能相互ping通,代表著可以相互通訊
2、開始主從複製操作之前,要將主資料庫的資料備份,在從資料庫上恢復。或者滿足兩臺伺服器上都沒有可用資料---> 主從資料庫內資料保持一致
3、 主從資料庫版本最好一致,避免後期資料自動複製是出現一些問題
簡訴主從複製技術的優點: 主從複製(Master-Slave)來同步資料,再通過讀寫分離(MySQL-Proxy)來提升資料庫的併發負載能力
在一主多從的資料庫體系中,多個從伺服器採用非同步的方式更新主資料庫的變化,業務伺服器在執行寫或者相關修改資料庫的操作是在主伺服器上進行的,讀操作則是在各從伺服器上進行。如果配置了多個從伺服器或者多個主伺服器又涉及到相應的負載均衡問題,關於負載均衡具體的技術細節還沒有研究過,今天就先簡單的實現一主一從的主從複製功能。
Mysql主從複製的實現原理圖大致如下(來源網路):
MySQL之間資料複製的基礎是二進位制日誌檔案(binary log file)。一臺MySQL資料庫一旦啟用二進位制日誌後,其作為master,它的資料庫中所有操作都會以“事件”的方式記錄在二進位制日誌中,其他資料庫作為slave通過一個I/O執行緒與主伺服器保持通訊,並監控master的二進位制日誌檔案的變化,如果發現master二進位制日誌檔案發生變化,則會把變化複製到自己的中繼日誌中,然後slave的一個SQL執行緒會把相關的“事件”執行到自己的資料庫中,以此實現從資料庫和主資料庫的一致性,也就實現了主從複製。
MySQL主從複製的操作過程
- 主伺服器:
- 開啟二進位制日誌
- 配置唯一的server-id
- 獲得master二進位制日誌檔名及位置
- 建立一個用於slave和master通訊的使用者賬號
- 從伺服器:
- 配置唯一的server-id
- 使用master分配的使用者賬號讀取master二進位制日誌
- 啟用slave服務
一、場景描述:
主資料庫伺服器:172.16.7.129,MySQL已經安裝,並且無應用資料。
從資料庫伺服器:172.16.7.128,MySQL已經安裝,並且無應用資料。
強調:在一個網段,可相互ping通
二、主資料庫master修改:
1.修改mysql配置
找到主資料庫的配置檔案my.cnf(或者my.ini),我的在/etc/mysql/my.cnf,在[mysqld]部分插入如下兩行:
[mysqld]
log-bin=mysql-bin #開啟二進位制日誌
server-id=1 #設定server-id
2.重啟mysql,建立用於同步的使用者賬號
開啟mysql會話shell>mysql -hlocalhost -uname -ppassword
建立使用者並授權:使用者:Link密碼:slavepass
mysql >CREATE USER 'repl'@'172.16.7.128' IDENTIFIED BY 'slavepass';#建立使用者
mysql> GRANT REPLICATION SLAVE ON *.* TO 'Link'@'172.16.7.128';#分配許可權
mysql>flush privileges; #重新整理許可權
注:mysql8的密碼規則與之前版本的不同,所以在這裡要確定建立的連線使用者密碼規則為:mysql_native_password
3.檢視master狀態,記錄二進位制檔名(mysql-bin.000001)和位置(2366):
mysql > SHOW MASTER STATUS;
三、從伺服器slave修改:
1.修改mysql配置
同樣找到my.cnf配置檔案,新增server-id
[mysqld]
server-id=2 #設定server-id,必須唯一
2.重啟mysql,開啟mysql會話,執行同步SQL語句(需要主伺服器主機名,登陸憑據,二進位制檔案的名稱和位置):
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.16.7.129',
-> MASTER_USER='Link',
-> MASTER_PASSWORD='slavepass',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=2366;
3.啟動slave同步程序:
mysql>start slave;
4.檢視slave狀態:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 182.92.172.80
Master_User: rep1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 11662
Relay_Log_File: mysqld-relay-bin.000022
Relay_Log_Pos: 11765
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
...
當Slave_IO_Running和Slave_SQL_Running都為YES的時候就表示主從同步設定成功了。接下來就可以進行一些驗證了,比如在主master資料庫的test資料庫的一張表中插入一條資料,在slave的test庫的相同資料表中檢視是否有新增的資料即可驗證主從複製功能是否有效,還可以關閉slave(mysql>stop slave;),然後再修改master,看slave是否也相應修改(停止slave後,master的修改不會同步到slave),就可以完成主從複製功能的驗證了。
附錄:
還可以用到的其他相關引數:
master開啟二進位制日誌後預設記錄所有庫所有表的操作,可以通過配置來指定只記錄指定的資料庫甚至指定的表的操作,具體在mysql配置檔案的[mysqld]可新增修改如下選項:
# 不同步哪些資料庫
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
# 只同步哪些資料庫,除此之外,其他不同步
binlog-do-db = game
錯誤總結:
有可能在 三.4.檢視slave狀態:出現
Slave_IO_Running: connecting
Slave_SQL_Running: Yes
這說明從資料庫並沒有連到主資料庫,無法讀主資料庫的日誌檔案
原因:1、從資料庫ping不通主資料庫
a>主資料庫的防火牆沒關----->把防火牆關了
b>主從資料庫不在一個網段
2、mysql8特有的密碼規則問題
建立的連線使用者的密碼規則為caching_sha2_password
解決方法:ALTER USER 'Link'@'172.16.7.128' IDENTIFIED WITH mysql_native_password BY 'slavepass';
密碼規則修改為:mysql_native_password
關於主從資料庫不在一個網段問題:
我用的是VMware虛擬機器,建了兩個虛擬機器,做的這個實驗
解決方案:網路連線採用NAT模式,在虛擬機器的網路編輯器內設定成與主機相同的網段
編輯—>虛擬網路編輯器—>更改設定(右下角)—>然後到下圖頁面—>點選VMnet8,修改子網IP
感謝:https://blog.csdn.net/baidu_27055141/article/details/80974701
http://www.cnblogs.com/DavidYan/articles/2531181.html