mysql-主從複製

MySQL主從複製

一,binlog(二進制日誌)

binlog 記錄了所用的DDL語句(數據定義語言)和DML語句(數據操作語言),但是不包括數據查詢語句,此日誌對於災難恢復起着及其重要的作用,MySQL的主從複製就是通過binlog實現的。

binlog默認是沒有開啓的,需要MySQL的配置文件中開啓,並配置MySQL日誌的格式。

配置文件位置;/etc/my.cnf

日誌存放位置 : 配置時,給定了文件名但是沒有指定路徑,日誌默認寫入Mysql的數據目錄。

#配置開啓binlog日誌, 日誌的文件前綴爲 mysqlbin 
#生成的文件名如 :mysqlbin.000001,mysqlbin.000001 
log_bin=mysqlbin

#配置二進制日誌的格式
binlog_format=MIXED

日誌格式:

STATEMENT

該日誌格式在日誌文件中記錄的都是SQL語句(statement),每一條對數據進行修改的SQL都會記錄在日誌文件中,通過Mysql提供的mysqlbinlog工具,可以清晰的查看到每條語句的文本。主從複製的時候,從庫(slave)會將日誌解析爲原文本,並在從庫重新執行一次。

ROW

該日誌格式在日誌文件中記錄的是每一行的數據變更,而不是記錄SQL語句。比如,執行SQL語句 : update tb_book set status=‘1’ , 如果是STATEMENT 日誌格式,在日誌中會記錄一行SQL文件; 如果是ROW,由於是對全表進行更新,也就是每一行記錄都會發生變更,ROW 格式的日誌中會記錄每一行的數據變更。

MIXED

這是目前MySQL默認的日誌格式,即混合了STATEMENT 和 ROW兩種格式。MySQL默認情況下采用STATEMENT,MIXED 格式能儘量利用兩種模式的優點

日誌的讀取:

由於日誌以二進制方式存儲,不能直接讀取,需要用mysqlbinlog工具來查看

mysqlbinlog log-file;

日誌的刪除:

1, 通過 Reset Master 指令刪除全部 binlog 日誌,刪除之後,日誌編號,將從 xxxx.000001重新開始 。

2, 執行指令 purge master logs to 'mysqlbin.******',該命令將刪除 ******編號之前的所有日誌

3, 執行指令 purge master logs before 'yyyy-mm-dd hh24:mi:ss',該命令將刪除日誌爲 “yyyy-mm-dd hh24:mi:ss” 之前產生的所有日誌 。

4, 設置參數 --expire_logs_days=# ,此參數的含義是設置日誌的過期天數, 過了指定的天數後日志將會被自動刪除

log_bin=mysqlbin
binlog_format=MIXED
--expire_logs_days=# 

二,環境準備:

主機 master:192.168.137.26

從機 slave:192.168.137.27

三,主從複製過程:

在這裏插入圖片描述

master接受到寫請求

1,第一種情況是寫請求到master上後,master執行完寫請求後,在事務提交時,會把數據變更作爲時間 Events 記錄在二進制日誌文件 Binlog 中。第二種情況是Slave上面的IO進程連接上Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)之後的日誌內容

2,Master負責複製的IO進程根據請求信息讀取指定日誌指定位置之後的日誌信息,發給Slave的IO進程。發送信息中除了日誌所包含的信息之外,還包括Master端的bin-log文件的名稱以及bin-log的pos位置;

3,Slave的IO進程接收到信息後,將接收到的日誌內容依次添加到Slave端的中繼日誌(relay-log)文件的最末端,並將讀取到的Master端的bin-log的文件名和位置記錄到master.info文件中,這樣slaver便知道下次從哪裏繼續同步日誌;

4,Slave的sql進程檢測到relay-log中新增加了內容後,會馬上解析relay-log的內容成爲在Master端真實執行時候的那些可執行的內容,並在自身執行。

四,主從複製的優點

1,主庫出現問題可以切換到從庫提供服務

2,寫操作在主庫上執行,查詢操作在從庫上執行,實現讀寫分離,降低主庫的訪問壓力

3,可以在從庫執行備份操作,可以避免備份期間影響主庫的服務

五,搭建環境

1,master

1)在master的配置文件my.cng中

#mysql 服務ID,保證整個集羣環境中唯一
server-id=1

#mysql binlog 日誌的存儲路徑和文件名
log-bin=/var/lib/mysql/mysqlbin

#錯誤日誌,默認已經開啓
#log-err

#mysql的安裝目錄
#basedir

#mysql的臨時目錄
#tmpdir

#mysql的數據存放目錄
#datadir

#是否只讀,1 代表只讀, 0 代表讀寫
read-only=0

#忽略的數據, 指不需要同步的數據庫
binlog-ignore-db=mysql

#指定同步的數據庫
#binlog-do-db=db01

2)執行完後重啓mysql服務

service mysql restart

3)向master添加遠程登錄的授權用戶

1,授權:
#第一種:可遠程登錄Master,僅用於主從複製沒有其它任何select insert update等權限
grant replication slave on *.* to 'slave'@'192.168.137.27' identified by '123';	
#第二種:對用戶不但可遠程登錄Master,還可擁有對Master包括主從複製的其它所有select insert update等權限
grant all on *.* to 'slave'@'192.168.137.27' identified by '123';

2,刷新授權列表
flush privileges;

3,查看授權結果
show grants for 'slave'@'192.168.137.27';

4,測試在slave端登錄master

5,在master上查看所有連接登錄本機的客戶端情況
show processlist \G

4)查看master狀態

show master status;

2,slave

1) 在 slave 端配置文件中,配置如下內容:

#mysql服務端ID,唯一
server-id=2

# 確認binlog日誌格式爲mixd混合類型
binlog_format=mixed  

#指定binlog日誌
log-bin=/var/lib/mysql/mysqlbin

【可選配置】

1.只想複製某(些)個庫:
      replicate_do_db=test1                   # 追加複製test1庫
      replicate_do_db=test2                   # 追加只複製test2庫

2.只想複製某(些)個庫(的所有表)
      replicate_wild_do_table=test1.%         # 追加複製test1庫的所有表
      replicate_wild_do_table=test2.%         # 追加複製test2庫的所有表

3.只想複製某(些)個庫(的部分表)
      replicate_wild_do_table=test1.user      # 追加test1.user表
      replicate_wild_do_table=test2.role      # 追加test2.role表

4.想忽略對mysql和test數據庫的複製
      replicate_ignore_db=mysql               # 追加mysql庫爲忽略
      replicate_ignore_db=test                # 追加test庫爲忽略
    
5.想忽略對某些庫的某些表的複製
      replicate_wild_ignore_table=test1.user  # 追加test1.user表爲忽略
     
6.“主-->從-->從”的鏈式架構,因爲在默認情況下,from主(Master)機copy過來的數據不會寫入從(Slave)機的binlog日誌裏,而是寫入中繼日誌(localhost-relay-bin.00000x)裏,所以本機如果還需要充當其它機器的主機,就將從主機複製來的數據寫入從庫時同時也顯式地寫入本地binlog日誌,添加如下配置:
      log-slave-updates =1

2) 執行完畢之後,需要重啓Mysql:

service mysql restart;

3) 執行如下指令 :

change master to master_host= '192.168.137.26', master_user='master', master_password='123', master_log_file='mysqlbin.000001', master_log_pos=413;

指定當前從庫對應的主庫的IP地址,用戶名,密碼,從哪個日誌文件開始的那個位置開始同步推送日誌。

 常用選項:
       master_host='192.168.137.26' 遠程主(Master)機IP      
       master_user='master',        登錄遠程主(Master)機 用戶名
       master_password='123',       登錄遠程主(Master)機 密碼

不常用選項:      
 	   MASTER_LOG_FILE='mysql-bin.000001' 指定從哪個binlog文件複製(如果不加此參數默認是最早的binlog日誌)
       MASTER_LOG_POS=107                 指定從哪個binlog文件的哪個pos點開始複製(如果不加此參數默認是最早的pos點)
       MASTER_PORT=3306,                  遠程主(Master)機端口
       MASTER_HEARTBEAT_PERIOD=60         多長時間探測一次主服務器是否在線 單位:秒
       MASTER_CONNECT_RETRY=10;           無法連接主服務器的時候重試連接的間隔時間 單位:秒

4) 開啓同步操作

start slave;

show slave status \G;

如果看到如下狀態說明同步成功:

​ Slave_IO_Running: Yes

​ Slave_SQL_Running: Yes

​ Seconds_Behind_Master: 0

5) 停止同步操作

stop slave;

開啓同步操作

start slave;

show slave status \G;

如果看到如下狀態說明同步成功:

​ Slave_IO_Running: Yes

​ Slave_SQL_Running: Yes

​ Seconds_Behind_Master: 0

5) 停止同步操作

stop slave;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章