1. 程式人生 > >資料庫學習--主從複製

資料庫學習--主從複製

在實際生產環境中,單臺mysql資料庫是完全不能滿足實際需求,無論安全,高可用性,高併發等各個方面的要求。mysql主從複製是滿足這些要求的基礎,主要用於實時備份,高可用,讀寫分離的場景

原理

  • master伺服器將資料的改變記錄二進位制日誌,當master上的資料發生改變時,則將其改變寫入二進位制日誌中。
  • salve伺服器會在一定時間間隔內對master二進位制日誌進行探測其是否發生改變,如果發生改變,則開始一個I/OThread請求master二進位制事件
  • 同時主節點為每個I/O執行緒啟動一個dump執行緒,用於向其傳送二進位制事件,從節點儲存至中繼日誌。
  • 從節點將啟動SQL執行緒從中繼日誌中讀取二進位制日誌,在本地重放,使得其資料和主節點的保持一致。
  • 最後I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。

過程

基本要求

  • 兩臺伺服器
  • 兩臺伺服器版本一致(主節點低於從節點)
  • 兩臺伺服器防火牆關閉
  • 雙方資料庫使用者的使用者,要具有遠端訪問的許可權【參考遠端】

主伺服器

修改主伺服器的mysql配置檔案 (wind:my.ini,linux(my.cnf)),放在mysqld下面

[mysqld]
有重複的選項,將設定的欄位保證不會被覆蓋
#mysql唯一id
server-id = 1
#二進位制日誌檔案,此項為必填項,否則不能同步資料;
log-bin = "mysql-bin"
#指定二進位制錯誤檔案
log-error="mysql-error"
#需要同步的資料庫,如果需要同步多個數據庫;
binlog-do-db = 庫名
#binlog-do-db = 庫名
#binlog-do-db = 庫名
#不需要同步的資料庫
binlog-ignore-db = mysql

給從資料庫授權

8.0版本以下

GRANT REPLICATION SLAVE ON *.* to 'root'@'172.16.168.142' identified     by '123456';

8.0版本

CREATE USER 'root'@'192.168.43.152' IDENTIFIED WITH
mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.43.152';

最後幾步

#重新整理許可權
flush privileges;
#重啟服務
service mysql restart;重啟 (linux上: /etc/init.d/mysql restart)
#查詢二進位制資訊
show master status 查詢主伺服器二進位制資訊

從伺服器配置

[mysqld]
server-id=2    #預設是1改成2
log-bin="mysql-bin"    #這行本身有
replicate-do-db=uek_demo    #需要同步的資料庫
replicate-ignore-db=mysql    #不同步系統資料庫
read_only     #設只讀許可權,一般不寫

重啟mysql服務

執行同步sql語句

[mysqld]
change master to
master_host='主機域名'
master_user='root'
master_password='密碼'
master_log_first='主伺服器的二進位制地址'
master_log_pos='主伺服器的pos'

#例項
change master to master_host='192.168.43.192',master_user='root',master_password='lz1022',master_log_file='mysql-bin.000008',master_log_pos=154;

開啟同步

start slave

判斷是否成功

show slave status\G;
i/o    sql值是否為yes

沒有表/庫,手動建立***

其中Slave_IO_Running 與 Slave_SQL_Running 的值都必須為YES,才表明狀態正常