mysql 數據庫主從同步


1、簡介

      寫這篇文章是網上找到的相關主從同步的都不夠完全,本人第一次搭建主從同步,完全看着網上的文章來搭建的,結果你懂的,踩了很多坑。所以特地把踩到的坑寫出來,新手切勿直接布置到正式環境,請於測試環境測試完成再布置與正式環境。本文僅供自己或者有需要的參考,僅供參考。

2、環境說明

    為了更貼切於實際環境,本人直接采用的真機,壕吧,這里不采用真實IP。下文全部采用IPXXX代替。

 一台阿里雲ECS(1G1核):IPC193 

 一台阿里雲輕量應用服務器(2G1核): IPC248

 系統全裝的CentOS 7.4 64位

3、數據庫版本

  安裝包下載地址:http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz

4、數據庫的安裝就不再本文說了,開始搞事情吧。

  4.1  安裝

    安裝數據庫,我這里是安裝在/usr/local/mysql的

   4.2  配置  

    注意:二進制日志必須開啟,因為數據的同步實質上就是其他的MySQL數據庫服務器將這個數據變更的二進制日志在本機上再執行一遍。

    vim /usr/local/mysql/my.cnf

    在頁面最下方添加 log-bin=mysql-bin 開啟二進制日志

    C248  為主數據庫服務器 

    C129  為從數據庫服務器

   4.3  開始搭建主從復制
      主數據庫C248需要做的操作

    在主數據庫創建一個從數據庫能夠登錄的賬號

    #創建具有復制權限的用戶

    mysql>GRANT REPLICATION SLAVE ON *.* TO '賬號名'@'從服務器IP地址' IDENTIFIED BY '密碼';

    #mysql 新設置用戶或更改密碼后需用flush privileges刷新MySQL的系統權限相關表,否則會出現拒絕訪問

    mysql>FLUSH PRIVILEGES;

    創建測試賬號:c193slave ,測試密碼是c193slave@123456

 

    查看主數據庫保存的二進制文件名與位置

    mysql>SHOW MASTER STATUS;

     

      上圖顯示的File 對應的binlog.000004 跟Position對應的102219就是從服務器需要用到的,

      我這個數據庫並不是新數據庫,所以Position不是從0開始的,默認File是從000001開始。

       從數據庫C129需要做的操作

         #####CHANGE MASTER TO MASTER_HOST='主數據庫IP地址',

          MASTER_USER='剛才在主數據庫添加的賬號',

          MASTER_PASSWORD='數據庫密碼',

          MASTER_LOG_FILE='上圖對應的File下面的文件名字',

          MASTER_LOG_POS=上圖圖片對應的Position下面數字;

         mysql>CHANGE MASTER TO MASTER_HOST='C248',

          MASTER_USER='c193slave',

          MASTER_PASSWORD='c193slave@123456',

          MASTER_LOG_FILE='binlog.000004',

          MASTER_LOG_POS=102219;

        

            mysql>START SLAVE;   #開啟復制

            mysql>SHOW SLAVE STATUS\G   #查看主從復制是否配置成功

        

         如上圖的主數據庫IP,賬號,等等如果都對應着說明配置成功

5、查看主從復制執行進程

(從服務器)mysql> show processlist; #查看正在執行中的進程,如果出現下圖兩條則說明從數據庫正常

 

   (主服務器)mysql> show processlist; #查看正在執行中的進程,如果出現下圖一條則說明主服務器正常

 

  主從復制到此就完成了。

6、在這說一下遇到的坑

  白天主從是正常的,但是第二天發現從服務器的position與主服務器並不一致,手動修改了下主服務器數據庫,發現從服務器並沒有更新,說明主從不正常了。

  使用show processlist;查看從數據庫線程時,從數據庫線程還在,查看主數據庫線程時,進程已丟失。反正不知道啥原因丟失了。

  經檢查,知道了一個叫心跳的東西

  

在 MySQL 主從復制時,有時候會碰到這樣的故障:

在 Slave 上 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes,

Slave_SQL_Running_State 顯示 Slave has read all relay log; waiting for the slave I/O thread to update it ,看起來狀態都正常,但實際卻滯后於主,Master_Log_File 和 Read_Master_Log_Pos 也不是實際主上最新的位置。

一種可能是 Master 上的 binlog dump 線程掛了(我就是線程掛了)。但有時候,在 Master 上檢查也是完全正常的。那 Slave 的延誤又是怎么造成的呢?

在 MySQL 的復制協議里,由 Slave 發送一個 COM_BINLOG_DUMP 命令后,就完全由 Master 來推送數據,Master、Slave 之間不再需要交互。如果 Master 沒有更新,也就不會有數據流,Slave 就不會收到任何數據包。但是如果由於某種原因造成 Master 無法把數據發送到 Slave ,比如發生過網絡故障或其他原因導致 Master 上的 TCP 連接丟失,由於 TCP 協議的特性,Slave 沒有機會得到通知,所以也沒法知道收不到數據是因為 Master 本來就沒有更新呢還是由於出了故障。

好在 MySQL 5.5 開始增加了一個復制心跳的功能。

 (C129)mysql> stop slave; #關閉主從

 (C129)mysql> change master to master_heartbeat_period = 10; #修改心跳為10秒一次

 (C129)mysql> set global slave_net_timeout = 25; #修改超時時間

 (C129)mysql> start slave; #再次開啟主從復制

 (C129)mysql> show status like 'slave%'; 

 

  再次測試主從,數據同步在正常。



    

 

    

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM