【實操筆記】MySQL主從同步功能實現

寫在前邊:

這兩天來了個需求,配置部署兩臺服務器的MySQL數據同步,折騰了兩天查了不少相關資料,一直連不上,後來發現實際上是數據庫受權的ip有問題,咱們用的服務器是機房中的虛擬機加上反向代理出來的,坑的不行。看了好多博客,寫的怎麼說呢,寫的好的是太好了太詳細了;寫的很差的,配置什麼的都講的不清楚,剛接觸這塊的時候不曉得原理,一味的複製粘貼,後來看到有個博主寫的好文,瞬間醍醐灌頂,也有了本身的思路,我就簡單的記錄下操做步驟和一些細節的註釋,原理就直接搬運了,原理圖也畫了份,就不獻醜了,有寫錯的地方,還望各位大佬不吝賜教,在下感激涕零!html

配置MySQL的主從同步有什麼好處?

 1--數據分佈 (Data distribution )
    2--負載平衡(load balancing)
    3--數據備份(Backups) ,保證數據安全(最主要的做用)
    4--高可用性和容錯行(High availability and failover)
    5--實現讀寫分離,緩解數據庫壓力java

MySQL主從同步實現原理(參考博文點這裏):

master服務器將數據的改變記錄二進制binlog日誌,當master上的數據發生改變時,則將其改變寫入二進制日誌中;salve服務器會在必定時間間隔內對master二進制日誌進行探測其是否發生改變,若是發生改變,則開始一個I/OThread請求master二進制事件,同時主節點爲每一個I/O線程啓動一個dump線程,用於向其發送二進制事件,並保存至從節點本地的中繼日誌中,從節點將啓動SQL線程從中繼日誌中讀取二進制日誌,在本地重放,使得其數據和主節點的保持一致,最後I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。
注意幾點:
     1--master將操做語句記錄到binlog日誌中,而後授予slave遠程鏈接的權限(master必定要開啓binlog二進制日誌功能;一般爲了數據安全考慮,slave也開啓binlog功能)。
     2--slave開啓兩個線程:IO線程和SQL線程。其中:IO線程負責讀取master的binlog內容到中繼日誌relay log裏;SQL線程負責從relay log日誌裏讀出binlog內容,並更新到slave的數據庫裏,這樣就能保證slave數據和master數據保持一致了。
     3--Mysql複製至少須要兩個Mysql的服務,固然Mysql服務能夠分佈在不一樣的服務器上,也能夠在一臺服務器上啓動多個服務。
     4--Mysql複製最好確保master和slave服務器上的Mysql版本相同(若是不能知足版本一致,那麼要保證master主節點的版本低於slave從節點的版本)
     5--master和slave兩節點間時間需同步mysql

Mysql複製的流程圖以下:

MySQL是怎樣同步的?

 1--基於語句的複製: 在主服務器上執行的SQL語句,在從服務器上執行一樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現無法精確複製時,會自動選着基於行的複製。 
    2--基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
    3--混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製。sql

實現環境:

| System   | mysql      |  ip        |數據庫

|:----     |:----        |:----vim

|win7      | mysql-5.6.24   | 192.168.1.129 |centos

|centos 6.7  | mysql-5.6.39   | 192.168.1.128 |安全

注:從服務器的mysql版本最好和主服務器相同,或者大於主服務器版本服務器

MySQL主從同步的實現部分:

首先是Master(主節點)的配置:app

#主Master服務器配置:

1.進入mysql的安裝目錄,新建一個log文件夾(這個是存儲binary log的路徑)

2.主服務器開啓log_bin,需修改my.ini,配置以下:

#*********************master my.ini配置文件開始*****************************************
#路徑均爲當前服務器的實際路徑
basedir = D:\\apps\\mysql-5.6.24-win32 datadir = D:\\apps\\mysql-5.6.24-win32\\data port = 3306

#生成記錄文件位置,同步必須,請勿手動刪除,格式位置爲 :log-bin=mysql安裝路徑/log/mysql-bin.log
log-bin=D:\\apps\\mysql-5.6.24-win32\\log\\mysql-bin.log
#服務ID,用於區分服務,範圍1~2^32-1,須要與從服務器不一樣
server_id= 1
#MySQL 磁盤寫入策略以及數據安全性
#每次事務提交時MySQL都會把log buffer的數據寫入log file,而且flush(刷到磁盤)中去
innodb_flush_log_at_trx_commit=1

#當sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日誌binary log時,會使用fdatasync()函數將它的寫二進制日誌binary log同步到磁盤中去。
sync_binlog 的默認值是0,像操做系統刷其餘文件的機制同樣,MySQL不會同步到磁盤中去而是依賴操做系統來刷新binary log。 sync_binlog= 1 #同步數據庫,若是多庫,就以此格式另寫幾行便可 binlog-do-db=test #無需同步的數據庫,如下幾行基本同樣,無需改動 binlog-ignore-db = cluster binlog-ignore-db = mysql binlog-ignore-db = performance_schema binlog-ignore-db = information_schema #mysql複製模式,三種:SBR(基於sql語句複製),RBR(基於行的複製),MBR(混合模式複製) #混合模式複製 binlog_format=MIXED #binlog過時清理時間 expire_logs_days=7 #binlog每一個日誌文件大小 max_binlog_size=20M #*********************master my.ini配置文件結束*****************************************

3.重啓mysql服務,mysql命令行執行:

show master status;#記錄文件名以及緊跟的當前行數數字

4.建立並受權用戶,後兩個slave分別是用戶名和密碼

grant replication slave ,replication client on *.* to slave@'192.168.1.128' identified by "slave";
flush privileges; #權限修改當即生效
flush tables with read lock; #鎖定數據庫爲只讀,確保備份數據一致性

5.退出mysql命令行,執行備份命令

#備份當前全部數據庫,能夠參考備份單庫
mysqldump -u root -p --all-databases --master-data > dbdump.sql

6.將sql腳本在從服務器執行
7.從服務器啓動slave(前提是配置好從服務器)
8.從服務器啓動完畢後關閉表鎖

unlock tables;

 

#從服務器的配置

1.停掉slave服務

service mysqld stop

2.修改配置文件:

vim /etc/my.cnf
#從數據庫(Slave)配置:
#***********************************slave my.cnf配置開始******************************
#從庫日誌記錄文件位置或名稱前綴
log_bin = /var/lib/mysql/mylogbin.log
#同步日誌記錄的頻率,1爲每條都記錄,安全但效率低
sync_binlog = 1
#server的id,不能與相同id的mysql主從鏈接
server-id=2
#從庫日誌忽略的數據庫名稱,不記錄
#這裏記錄從庫的binlog是爲了安全,若是以爲不必,能夠去掉從庫binlog的配置 binlog-ignore-db = cluster binlog-ignore-db = mysql binlog-ignore-db = performance_schema binlog-ignore-db = information_schema #此處添加須要同步的數據庫名稱,那麼它會只接收這個數據庫的信息,多個數據庫需同步按照此格式另寫幾行便可
#這裏同步數據有兩種思路,一種是主服務器只發從庫須要的,在主庫指定;一種是主服務器把全部數據同步過來,從庫按需過濾接收
#爲了讓配置更詳細些,此處配置了從庫過濾接收的配置 replicate-do-db=test #忽略接收的庫名 replicate-ignore-db = cluster replicate-ignore-db = mysql replicate-ignore-db = performance_schema replicate-ignore-db = information_schema #跳過全部錯誤繼續 slave-skip-errors=all #設置延時時間 slave-net-timeout=60 #mysql複製模式,三種:SBR(基於sql語句複製),RBR(基於行的複製),MBR(混合模式複製) binlog_format=MIXED #混合模式複製 expire_logs_days=7 #binlog過時清理時間 max_binlog_size=20M #binlog每一個日誌文件大小 #***********************************slave my.cnf配置結束******************************

3.保存退出:wq

4.啓動mysqld服務

service mysqld start

5.刪除多餘數據庫,導入數據,刪除部分不予演示,sql的位置請自行指定

mysqldump -u root -p < ~/dbdump.sql #這裏演示就是上傳到了root的根目錄,具體請使用「find / -name sql腳本名」 命令查詢

6.從服務器指定master

CHANGE MASTER TO
MASTER_HOST='192.168.1.129',
MASTER_USER='slave',
MASTER_PASSWORD='slave',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=593;

注:最後兩行是以前在主服務器show master status 所記錄的數據

  若是以前已經啓動了一個slave進程,那麼以上的命令會失效,並提示stop slave first,因此先stop slave; 而後重試

7.啓動slave

start slave; show slave status\G #注意,沒有分號

 輸出以下,顯示兩個都爲yes即成功,能夠測試一下

mysql> show slave status;

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.129
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 593
               Relay_Log_File: mysql-relay-log.000004
                Relay_Log_Pos: 441
        Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 52360
              Relay_Log_Space: 597
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
"""

8.去主服務器開啓表只讀鎖

unlock tables;

--------------------------------實現部分到此結束--------------------------------------

完全解除主從複製關係
1)stop slave;
2)reset slave; #或直接刪除master.info和relay-log.info這兩個文件;
3)修改my.cnf刪除主從相關配置參數。

4)Delete FROM user Where User='slave' and Host='192.168.1.128';#刪除主服務器配置的鏈接slave用戶


 

本文參考博文列表:

Mysql主從同步(1)-主從/主主環境部署梳理

MySQL5.7 添加用戶、刪除用戶與受權

mysql設置指定ip訪問,用戶權限相關操做

win7下mysql5.6與centos下mysql5.6主從複製

mysql5.6 主從複製同步詳細配置(圖文)

MySQL5.6 數據庫主從(Master/Slave)同步安裝與配置詳解

centos 7下mysql5.7 主從數據庫同步配置

MySql 5.7.18 數據庫主從(Master/Slave)同步安裝與配置詳解

mysql從庫Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'報錯處理

【MySQL】Last_IO_Errno: 1593 server-uuid重複致使slave報錯 

【MySQL】MySQL5.6數據庫基於binlog主從(Master/Slave)同步安裝與配置詳解

Window 下mysql binlog開啓及查看,mysqlbinlog

mysql主從複製-CHANGE MASTER TO 語法詳解

[trouble] error connecting to master 'repl@192.168.1.107:3306' - retry-time: 60 retries: 86400

相關文章
相關標籤/搜索