Linux搭建MySQL主從


實現目標
搭建兩台MySQL服務器(一主一從),一台作為主服務器,一台作為從服務器,主服務器進行寫操作,從服務器進行讀操作。

工作流程概述

  • 主服務器:
    • 開啟二進制日志
    • 配置唯一的server-id
    • 獲得master二進制日志文件名及位置
    • 創建一個用於slave和master通信的用戶賬號
  • 從服務器:
    • 配置唯一的server-id
    • 使用master分配的用戶賬號讀取master二進制日志
    • 啟用slave服務

准備工作

  • 主從數據庫版本最好一樣
  • 主從數據庫內數據保持一致
  • 主數據庫:192.168.244.201 : 3306
  • 從數據庫:192.168.244.202 : 3306

開始配置

  1. 配置 Master 主服務器
  • 找到主數據庫的配置文件my.cnf(Windows中是my.ini),我的在/etc/my.cnf
    在[mysqld]部分插入如下兩行:
[mysqld]
log-bin=mysql-bin #開啟二進制日志
server-id=201 #設置server-id,唯一值,標識主機
  • 重啟mysql服務
    systemctl restart mysqld
  • 創建用於主從同步的賬號/密碼
    進入MySQL : mysql -u root -p 回車輸入密碼。
    我創建的用戶名叫“master_root”密碼是“MySql@6688”
    【注意:由於之前把密碼改成支持簡單密碼123456的了,導致這里新建用戶出現一些問題,說密碼不符合策略等,后來干脆我重裝mysql,使用默認復雜密碼了,就沒有這么多問題了。習慣就好其實。】
    下面我都用的%,沒有寫具體ip,你可以自行決定。
#創建用戶(IP為可訪問該master的IP,任意IP就寫'%')
mysql> CREATE USER 'master_root'@'192.168.244.202' IDENTIFIED BY 'MySql@6688';
#分配權限(IP為可訪問該 master的IP,任意IP就寫'%')
mysql> GRANT REPLICATION SLAVE ON *.* TO 'master_root'@'192.168.244.202';
 #刷新權限
mysql>flush privileges;  
  • 查看master狀態,記錄二進制文件名(mysql-bin.000001)和位置(154).后面配從庫要用。
    show master status;
  1. 配置 Slave 主服務器
  • 修改my.cnf 文件。
    vim /etc/my.cnf
[mysqld]
server-id=202 #設置server-id,唯一值,唯一標識從庫
  • 重啟mysql服務 systemctl restart mysqld
  • 登錄進入mysql,執行同步sql語句(主服務器名,用於主從的用戶名,密碼,二進制文件名,位置)
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.244.201',
    -> MASTER_USER='master_root',
    -> MASTER_PASSWORD='MySql@6688',
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=154;
  • 啟動slave同步進程
    mysql>start slave;
  • 查看slave狀態 show slave status\G
    注意后面不要分號;否則最后一行顯示報錯如下:
    ERROR: No query specified
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.244.201
                  Master_User: master_root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000007
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             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: 154
              Relay_Log_Space: 531
              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: 201
                  Master_UUID: 7dd766bb-f005-11e9-81ba-000c29a69f1b
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.01 sec)

我也不知道為啥我這里這么長一段,網上的教程都是好短一段。管他呢,反正到這也對了。
當Slave_IO_Running和Slave_SQL_Running都為YES的時候就表示主從同步設置成功了。
特別注意:

  • 可能遇坑:Slave_IO_Running :no ,並不是yes,為什么呢??
    打開mysql的錯誤日志,不出意外在最后幾行(看時間最新的記錄),最后有這么一行:
    2019-10-16T12:59:09.987976Z 1 [ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
    意思master和slave的UUID相同了,應該不同才對的【如果你也是克隆的主機生成從機,就會出現這個問題】
    解決辦法:去mysql的data目錄中,找到auto.cnf文件(不知道data目錄的去my.cnf文件中看‘datadir=/var/lib/mysql’),然后刪除該文件,接着重啟mysql服務,就會自動重新生成一個新的auto.cnf文件(注意,此時操作的都是slaver,不是master。)

接下來就可以進行一些驗證了,比如在主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
如之前查看master狀態時就可以看到只記錄了test庫,忽略了manual和mysql庫。


免責聲明!

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



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