mysql主從復制-CHANGE MASTER TO 語法詳解


1 簡介
    配置mysql主從復制時,在從機上需要進行CHANGE MASTER TO操作,以確定需要同步的主機IP,用戶名,密碼,binlog文件,binlog位置等信息。
    主從同步的詳細配置可參考我前面的文章【http://blog.csdn.net/jesseyoung/article/details/41894521】
2 基本語法與實例
    2.1 CHANGE MASTER TO的語法如下:

    CHANGE MASTER TO option [, option] ...
     
     
    option:
        MASTER_BIND = 'interface_name'
      | MASTER_HOST = 'host_name'
      | MASTER_USER = 'user_name'
      | MASTER_PASSWORD = 'password'
      | MASTER_PORT = port_num
      | MASTER_CONNECT_RETRY = interval
      | MASTER_RETRY_COUNT = count
      | MASTER_DELAY = interval
      | MASTER_HEARTBEAT_PERIOD = interval
      | MASTER_LOG_FILE = 'master_log_name'
      | MASTER_LOG_POS = master_log_pos
      | MASTER_AUTO_POSITION = {0|1}
      | RELAY_LOG_FILE = 'relay_log_name'
      | RELAY_LOG_POS = relay_log_pos
      | MASTER_SSL = {0|1}
      | MASTER_SSL_CA = 'ca_file_name'
      | MASTER_SSL_CAPATH = 'ca_directory_name'
      | MASTER_SSL_CERT = 'cert_file_name'
      | MASTER_SSL_CRL = 'crl_file_name'
      | MASTER_SSL_CRLPATH = 'crl_directory_name'
      | MASTER_SSL_KEY = 'key_file_name'
      | MASTER_SSL_CIPHER = 'cipher_list'
      | MASTER_SSL_VERIFY_SERVER_CERT = {0|1}
      | IGNORE_SERVER_IDS = (server_id_list)
     
     
    server_id_list:
        [server_id [, server_id] ... ]

    change master to配置和改變slave服務器用於連接master服務器的參數,以便slave服務器讀取master服務器的binlog及slave服務器的relay log。同時也更新master info及relay log info信息庫。執行該語句前如果從機上slave io及sql線程已經啟動,需要先停止(執行stop slave)。
    change master to后面不指定某個參數的話,該參數保留原值或默認值。所以后續如果某些參數沒有更改的話,change master to后無需帶該參數,例如我們只改變了用於復制的用戶密碼,那么change master to只需針對MASTER_PASSWORD選項作出修改即可,例如:

    mysql> stop slave;
    mysql> change master to master_password='new_password';
    mysql> start slave;

    2.2 應用實例如下:

mysql> CHANGE MASTER TO MASTER_HOST = '10.*.*.36', MASTER_USER = 'repl', MASTER_PASSWORD = 'replpassword', MASTER_PORT = 3306, MASTER_AUTO_POSITION = 1, MASTER_RETRY_COUNT = 0, MASTER_HEARTBEAT_PERIOD = 10000;

3 參數解釋
    MASTER_HOST, MASTER_USER, MASTER_PASSWORD,MASTER_PORT四個選項提供了slave從機連接到master主機的信息。
    MASTER_HOST 與 MASTER_PORT:
    分別代表master主機名(或IP地址)及mysql實例端口號。
    注意: 復制不能使用unix socet文件,必須使用tcp/ip 連接到master。
    如果我們指定MASTER_HOST 與 MASTER_PORT參數,slave會認為master與之前的不是同一個(即便MASTER_HOST 與 MASTER_PORT所帶的參數與之前相同),之前指定的master的binlog文件名及位置將不再適用。所以如果我們在后面不明確指定MASTER_LOG_FILE 和 MASTER_LOG_POS 的參數值,那么MASTER_LOG_FILE='' 以及 MASTER_LOG_POS=4 將會默認的追加到后面。
    設置MASTER_HOST為空(MASTER_HOST=' ')與不設置該參數是不同的,mysql5.5開始,將MASTER_HOST設為空將會失敗並報錯【驗證】
    MASTER_USER 與 MASTER_PASSWORD:
    連接到master主機復制賬戶所對應的用戶名及密碼。
    mysql5.6.4及其后續版本,MASTER_USER不能設置為空;當明確設置MASTER_PASSWORD參數時,MASTER_USER 不能設置為空或不進行設置【驗證2.1實例】。
    MASTER_PASSWORD參數對應的密碼長度最大為32位字符【驗證】,如果字符超長(超過32位),語句會執行成功,但超出的長度會被截取掉,mysql復制的這個問題在mysql5.7版本中得到了修復。
    MASTER_LOG_FILE 與 MASTER_LOG_POS:
    這兩項確定slave的io線程下次開始執行時從master開始讀取的位置坐標,RELAY_LOG_FILE 與 RELAY_LOG_POS這兩項確定slave的sql線程下次開始執行時從relay log開始讀取的位置坐標。如果我們指定了MASTER_LOG_FILE 或 MASTER_LOG_POS中的任意一項,就不能再指定RELAY_LOG_FILE 或 RELAY_LOG_POS,也不能指定MASTER_AUTO_POSITION = 1 (mysql5.6.5及其后續版本)。如果二者都沒有指定,slave使用上次slave sql線程保存的位置。
    RELAY_LOG_FILE 與 RELAY_LOG_POS:
    change master to操作刪除所有relay log文件並創建一個新的,除非我們指定RELAY_LOG_FILE 或 RELAY_LOG_POS。如果全局變量relay_log_purge設置為0(默認為ON),relay log也將會保持。
    mysql5.6.2之前,RELAY_LOG_FILE需要配置絕對路徑,mysql5.6.2及其后續版本,可以配置相對路徑(相對mysql的data目錄)。
    MASTER_AUTO_POSITION:
    該參數在mysql5.6.5版本引入,如果進行change master to時使用MASTER_AUTO_POSITION = 1,slave連接master將使用基於GTID的復制協議。
    使用基於GTID協議的復制,slave會告訴master它已經接收到或執行了哪些事務。計算這個集,slave需要讀取全局參數gtid_executed以及通過show slave status獲取的參數Retrieved_gtid_set。
    結果集作為初次握手的一部分,發送到master,master發回它已經執行的且不在結果集這部分的所有事務。如果這些事務在master的binlog文件中已經被清除,master將會發送一個ER_MASTER_HAS_PURGED_REQUIRED_GTIDS錯誤信息到slave,復制將不會開啟。
    使用基於GTID的復制時(MASTER_AUTO_POSITION = 1),首先要開啟gtid_mode(在my.cnf中設置gtid-mode = ON),MASTER_LOG_FILE 與 MASTER_LOG_POS也不能使用,否則會報錯。
    使用GTID后想要恢復到老的基於文件的復制協議,在change master to時需要指定MASTER_AUTO_POSITION = 0以及MASTER_LOG_FILE 或 MASTER_LOG_POSITION中至少一項。
    MASTER_CONNECT_RETRY:
    重連到master時的超時等待時間,默認為60秒。
    MASTER_RETRY_COUNT:
    mysql5.6.1引入該參數,限制重連次數以及更新show slave status輸出的Master_Retry_Count列。默認值是24 * 3600 = 86400。MASTER_RETRY_COUNT主要用於替代mysqld服務器參數 --master-retry-count(該參數在mysql5.6.1及其后續版本廢除)。MASTER_RETRY_COUNT = 0表示重連次數無限制。
    MASTER_HEARTBEAT_PERIOD:
    設置復制心跳的周期,取值范圍為0 到 4294967秒。精確度可以達到毫秒,最小的非0值是0.001秒。心跳信息由master在主機binlog日志文件在設定的間隔時間內沒有收到新的事件時發出,以便slave知道master是否正常。
    slave連接到master后,該參數可通過mysql.slave_master_info表查看。

mysql> select * from mysql.slave_master_info \G


    默認值為slave_net_timeout的值除以2,設置為0表示完全的禁用心跳。
    MASTER_DELAY:
    默認值為0,取值范圍為0至2^31–1,表示slave至少落后master的復制時間。來自master的事件不直接執行,而是至少等到master執行完該該事件MASTER_DELAY所指定的時間間隔后才執行。
    MASTER_BIND:
    在slave復制從機多網絡接口的情況下使用,以確定用哪一個slave網絡接口連接到master。該參數在mysql5.6.2版本加入,同時也支持MySQL Cluster NDB 7.3.1及其后續版本。
    該參數可通過show slave status的Master_Bind列進行查看,如果啟動mysql時指定了--master-info-repository=TABLE,也可通過mysql.slave_master_info表查看(Bind列)。
    IGNORE_SERVER_IDS = (server_id_list):
    server_id_list: [server_id [, server_id] ... ]
    后面接以逗號分隔的0個或多個server-id,主要用於多主復制或環形復制的情況,處於復制鏈條中間的服務器異常,可以通過

mysql> CHANGE MASTER TO MASTER_HOST=xxx IGNORE_SERVER_IDS= [server_id [, server_id] ... ]

跳過出問題的MySQL實例。
    清除忽略的主機列表使用如下命令:

mysql> CHANGE MASTER TO IGNORE_SERVER_IDS = ();

    MASTER_SSL*:
    該選項提供使用ssl連接的信息。它們保存在master的信息表,即使slave沒有使用SSL選項編譯,這些參數依然可以更改,只不過會被忽略。MASTER_SSL_CRL 與 MASTER_SSL_CRLPATH 在 MySQL 5.6.3版本加入。


免責聲明!

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



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