Mysql主從復制技術

jopen 12年前發布 | 17K 次閱讀 MySQL 數據庫服務器

開始配置:
    第一步:創建復制帳號
        每個slave使用標準的MySQL用戶名和密碼連接master。進行復制操作的用戶會授予REPLICATIONSLAVE權限。
     用戶名的密碼都會存儲在文本文件master.info中。假如,你想創建repl用戶,如下
    mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO repl@'192.168.1.%' IDENTIFIED BY '123456';
    第二步:配置My.cnf
    配置Master的My.cnf,該文件默認位置為/etc/my.cnf

        接下來對master進行配置,包括打開二進制日志,指定唯一的servr ID。例如,在配置文件加入如下值:
        [mysqld]
        server-id=1
        log-bin=mysql-bin

        重啟mysql,service mysql restart ,
        登錄mysql -uroot -p
        運行SHOW MASTER STATUS,輸出如下:
+------------------+----------+--------------+------------------+
        | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
        +------------------+----------+--------------+------------------+
        | mysql-bin.000002 |      106 |              |                  |
        +------------------+----------+--------------+------------------+
        1 row in set (0.00 sec)

    配置Slave的My.cnf,該文件默認位置為/etc/my.cnf
        Slave的配置與master類似,你同樣需要重啟slave的MySQL。如下: 
        server-id = 2
        log-bin = mysql-bin
        relay_log = mysql-relay-bin 
        log_slave_updates = 1 
        read_only = 1 
        server-id是必須的,而且唯一。slave沒有必要開啟二進制日志,但是在一些情況下,必須設置,例如,如果slave為其它slave的 master,必須設置bin_log。在這里,我們開啟了二進制日志,而且顯示的命名(默認名稱為hostname,但是,如果hostname改變則會出現問題)。 
relay_log配置中繼日志,log_slave_updates表示slave將復制事件寫進自己的二進制日志(后面會看到它的用處)。 
有些人開啟了slave的二進制日志,卻沒有設置log_slave_updates,然后查看slave的數據是否改變,這是一種錯誤的配置。所以,盡量使用read_only,它防止改變數據(除了特殊的線程)。但是,read_only并是很實用,特別是那些需要在slave上創建表的應用。
        重啟mysql,service mysql restart ,
        登錄mysql -uroot -p

    第三步:啟動slave

        接下來就是讓slave連接master,并開始重做master二進制日志中的事件。你不應該用配置文件進行該操作,而應該使用CHANGE MASTER TO語句,該語句可以完全取代對配置文件的修改,而且它可以為slave指定不同的master,而不需要停止服務器。如下:
        mysql>CHANGE MASTER TO MASTER_HOST='192.168.60.73',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=0;
        MASTER_LOG_POS的值為0,因為它是日志的開始位置。然后,你可以用SHOW SLAVE STATUS語句查看slave的設置是否正確:
        mysql> SHOW SLAVE STATUS\G
*** 1. row ***
             Slave_IO_State:
                Master_Host: server1
                Master_User: repl
                Master_Port: 3306
              Connect_Retry: 60
             Master_Log_File: mysql-bin.000001
             Read_Master_Log_Pos: 4
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 4
             Relay_Master_Log_File: mysql-bin.000001
            Slave_IO_Running: No
            Slave_SQL_Running: No
                             ...omitted...
        Seconds_Behind_Master: NULL
        Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running表明slave還沒有開始復制過程。日志的位置為4而不是0,這是因為0只是日志文件的開始位置,并不是日志位置。實際上,MySQL知道的第一個事件的位置是4。

為了開始復制,你可以運行:
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
運行SHOW SLAVE STATUS查看輸出結果:
*** 1. row ***
        Slave_IO_State: Waiting for master to send event
                Master_Host: server1
                Master_User: repl
                Master_Port: 3306
               Connect_Retry: 60
               Master_Log_File: mysql-bin.000001
               Read_Master_Log_Pos: 164
              Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 164
              Relay_Master_Log_File: mysql-bin.000001
              Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
                             ...omitted...
      Seconds_Behind_Master: 0
注意,slave的I/O和SQL線程都已經開始運行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味著一些事件被獲取并執行了。如果你在master上進行修改,你可以在slave上看到各種日志文件的位置的變化,同樣,你也可以看到數據庫中數據的變化。

你可查看master和slave上線程的狀態。在master上,你可以看到slave的I/O線程創建的連接:

mysql> show processlist \G
*** 1. row ***
     Id: 1
   User: root
   Host: localhost:2096
     db: test
Command: Query
   Time: 0
 State: NULL
   Info: show processlist
*** 2. row ***
     Id: 2
   User: repl
   Host: localhost:2144
     db: NULL
Command: Binlog Dump
   Time: 1838
 State: Has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL
2 rows in set (0.00 sec)
基本到這里就完成,至于后期的加強操作,我會在另行添加。


Mysql復制的時候可以做到限制復制(主)
binlog-do-db=work      #只復制
binlog_ignore_db=mysql    #不允許復制
 
Replicate_Do_DB=mysql
replicate-ignore-db=mysql
另外還有幾條常用的命令
flush mater;  #清除垃圾
flush slave;  #清除垃圾
start slave;  #開始服務
reset slave;  #重設服務
stop slave;   #停止服務
 
上面復制方式是假設在新設Master和slave的情況下,實際環境并不十分實用,例如,你在一組運行了很久的Master中加入一個新的slave呢?
這樣我們就需要優先進行數據處理。
1.現將Master的數據庫鎖定,以免數據復制的時候出現差異。
FLUSH TABLES WITH READ LOCK;

  1. 在另一個連接用mysqldump創建一個你想進行復制的數據庫的轉儲:
    shell> mysqldump --all-databases --lock-all-tables >dbdump.db
  2. 對表釋放鎖。 
    mysql> UNLOCK TABLES;
    上面方法中,第2部需要將數據庫復制到新slave中還原,這樣,Master和新Slave的數據源就一致。
    其實第2部的方法有很多,也可以使用Mysql軟件進行同步,例如:Navicat for Mysql 
    方法不是唯一,只要結果一致即可。
    4.完成舊數據同步后,Master中輸入
    mysql> show master status;
    ##得到:
    +------------------+----------+--------------+---------------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB          |
    +------------------+----------+--------------+---------------------------+
    | mysql-bin.000024 |    38113 |              | mysql,test |

    1 row in set (0.00 sec)
    5.然后在根據上表中內容輸入上文啟動Slave步驟的內容。
    CHANGE MASTER TO MASTER_HOST='192.168.60.73',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=0;
    6.啟動slave
    START SLAVE;
    7.啟動完成后進行檢查。
    mysql> SHOW SLAVE STATUS\G                                                        *** 1. row ***
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.1.171
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000024
                  Read_Master_Log_Pos: 38255
                   Relay_Log_File: mysql-relay-bin.000002
                    Relay_Log_Pos: 393
                  Relay_Master_Log_File: mysql-bin.000024
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB:
              Replicate_Ignore_DB: mysql,wdcpdb,mysql,wdcpdb
               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: 38255
                  Relay_Log_Space: 548
                  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:
    1 row in set (0.00 sec)
    完成

    測試過程要主要的問題:

    1.請先配置好Mysql
    2.開通復制前請將Mysql的庫和表的框架復制過去。
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!