MySQL Replication控制

控制Master

1. SHOW相關

show binary logs;/*至關於*/show master logs;
show binlog events;
show master status;
show slave hosts;

圖片描述
圖片描述
圖片描述

2. binary logs清除

語法:mysql

PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }

log_name或者datetime_expr以前的日誌文件將會被刪除,此處binary和master是同義詞。
datetime_expr日期格式必須爲'YYYY-MM-DD hh:mm:ss'。
例子:sql

PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';

當slave正在從master上覆制時,上述的語句的執行也是安全的,若是要刪除的文件正在被slave讀取,那麼這個文件將不會被刪除。
若是刪除了slave還未複製的日誌文件,那麼slave沒法同步這部分被刪除的數據。安全

當要清楚binary logs時,如下步驟是最佳實踐:服務器

  • 在每一個slave上用show slave status查看正在同步哪一個binary log。
  • 在master上執行show binary logs查看日誌文件列表
  • 在列表中,找出全部slave正在同步的binary log中那個最靠前的,準備刪除這個log以前的logs。
  • 爲即將被刪除的Logs做備份(非必須,但建議這麼作)
  • 最後用purge命令清除日誌。

purge命令是根據.index文件裏所列的日誌文件來進行刪除的(.index的前綴就是binlog的名字,這個文件是由mysqld維護的),若是一個日誌文件在操做系統中不存在(例如被人爲地經過rm命令刪除),而.index文件裏又記錄了這個日誌文件,那麼purge命令會報錯。微信

3. 重置Master

語法:session

reset master;

這個命令會刪除.index文件裏所列舉的全部binary logs,清空.index文件併產生一個新的空的binary log文件。函數

這個命令還會重置gtid_purged gtid_executed這兩個系統變量爲空字符串(會話範圍內的變量值不會被重置),而且從MySQL5.7.5開始,這個命令還會清空mysql.gtid_executed表。測試

reset命令和purge命令的區別
當有slave正在進行數據同步時,不該該使用(也不支持)reset master命令,可能帶來未知的後果,不過purge命令則能夠在slave運行時安全地使用。

當在測試環境中,須要常常初始化設置master和slave時,使用reset master的好處多多,能夠按如下步驟初始master-slave:ui

  • 分別啓動master和slave,並啓動replication
  • 在master上執行一些語句
  • 檢查master的更新是否同步到slave
  • 若是slave正確同步了master的數據,在slave上執行stop slave命令,而後執行reset slave,並確認數據是否刪除了數據。
  • 在master上執行reset master命令

經過以上步驟,在測試的時候,就能夠清空master的binary log,而且從新開始replication的測試。spa

4. 暫停replication

命令:

set sql_log_bin=0|1;

0, 不一樣步至slave
1, 同步至slave

能夠在session內進行設置,也能夠在全局範圍內設置(設置後新建的session會有影響,但已經存在的session不會受影響)

控制Slave

1. SHOW相關

show slave status;
show relaylog events;

2. 指向Master

語法:

CHANGE MASTER TO option [, option] ... [ channel_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}
| MASTER_TLS_VERSION = 'protocol_list'
| IGNORE_SERVER_IDS = (server_id_list)

channel_option:
    FOR CHANNEL channel

server_id_list:
    [server_id [, server_id] ... ]

CHANGE MASTER TO用來從新設置slave,使其指向新的master,或者僅僅是改變一些上面提到的option。這個命令在MySQL5.7.4及其以上版本增長了許多特性,例如channel的概念等等。待補充。

3. replication過濾

CHANGE REPLICATION FILTER 語法

CHANGE REPLICATION FILTER filter[, filter][, ...]
filter:
REPLICATE_DO_DB = (db_list)
| REPLICATE_IGNORE_DB = (db_list)
| REPLICATE_DO_TABLE = (tbl_list)
| REPLICATE_IGNORE_TABLE = (tbl_list)
| REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
| REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
| REPLICATE_REWRITE_DB = (db_pair_list)
db_list:
db_name[, db_name][, ...]
tbl_list:
db_name.table_name[, db_table_name][, ...]
wild_tbl_list:
'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]
db_pair_list:
(db_pair)[, (db_pair)][, ...]
db_pair:
from_db, to_db

從MySQL5.7.3開始,CHANGE REPLICATION FILTER命令用來爲slave設置一個或多個複製過濾規則,好比說`--
replicate-do-db或者 --replicate-wild-ignore-table,這些選項不像服務器選項,重置後還須要重啓mysql才生效,這些選項能夠動態修改,只須要先中止slave的SQL線程,設置後,再重啓SQL線程(start|stop slave sql_thread`)。

各個選項的做用,待補充。

4. MASTER_POS_WAIT()

確切來講,這個一個函數,而非SQL語句 。

SELECT MASTER_POS_WAIT('master_log_file', master_log_pos [, timeout][, channel])

這裏的file和pos對應主庫show master status獲得的值,表明執行位置。 函數邏輯是等待當前從庫達到這個位置後返回, 返回期間執行的事務個數。
參數timeout可選,若缺省則無限等待,timeout<=0時與缺省的邏輯相同。若爲正數,則等待這麼多秒,超時函數返回-1.
其餘返回值:若當前slave爲啓動或在等待期間被終止,返回NULL; 若指定的值已經在以前達到,返回0。

5. 重置slave

語法

RESET SLAVE [ALL] [channel_option]
channel_option:
FOR CHANNEL channel

這個命令清除了slave保存的關於master和relay log的信息,刪除全部的relay log。使用這個命令,slave的replication線程必須先停下來。

這個命令還有影響到channel,待補充。

reset slave不會改變slave與master的鏈接信息,好比master的ip地址,端口,用戶名和密碼等,reset slave all將會重置鏈接的信息,所以這意味着須要重啓slave的mysqld進程。

6. 跳過執行

SET GLOBAL sql_slave_skip_counter = N

7. start slave

語法:

START SLAVE [thread_types] [until_option] [connection_options] [channel_option]

thread_types:
[thread_type [, thread_type] ... ]
    thread_type:
    IO_THREAD | SQL_THREAD
until_option:
    UNTIL { {SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS} = gtid_set
    | MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
    | RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
    | SQL_AFTER_MTS_GAPS }
    
connection_options:
[USER='user_name'] [PASSWORD='user_pass'] [DEFAULT_AUTH='plugin_name'] [PLUGIN_DIR='plugin_dir']

channel_option:
    FOR CHANNEL channel
gtid_set:
uuid_set [, uuid_set] ...
| ''
uuid_set:
    uuid:interval[:interval]...
uuid:
    hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh
h:
    [0-9,A-F]
interval:
    n[-n]
    (n >= 1)

不指定thread_type時,IO線程和SQL線程都會被啓動,IO線程從master讀取日誌,SQL線程讀取relay log並執行。

8. stop slave

語法

STOP SLAVE [thread_types]

thread_types:
    [thread_type [, thread_type] ... ]
        
thread_type: IO_THREAD | SQL_THREAD

channel_option:
    FOR CHANNEL channel

當中止slave服務器時,應先執行stop slave中止slave功能。

執行這個命令時,還須要考慮是基於行的replication仍是基於語句的replication,存儲引擎,以及事務型表和非事務型表。

控制Group複製

start group_replication;
stop group_replication;

Reference

mysql ref5.6
mysql ref5.7

掃一掃關注個人微信公衆號

相關文章
相關標籤/搜索