MySQL Replication控制

控制Master

1. SHOW相关

show binary logs;/*相当于*/show master logs;
show binlog events;
show master status;
show slave hosts;

《MySQL Replication控制》
《MySQL Replication控制》
《MySQL Replication控制》

2. binary logs清除

语法:

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

log_name或者datetime_expr之前的日志文件将会被删除,此处binary和master是同义词。
datetime_expr日期格式必须为’YYYY-MM-DD hh:mm:ss’。
例子:

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

语法:

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:

  • 分别启动master和slave,并启动replication
  • 在master上执行一些语句
  • 检查master的更新是否同步到slave
  • 如果slave正确同步了master的数据,在slave上执行stop slave命令,然后执行reset slave,并确认数据是否删除了数据。
  • 在master上执行reset master命令

通过以上步骤,在测试的时候,就可以清空master的binary log,并且重新开始replication的测试。

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

《MySQL Replication控制》

    原文作者:beanlam
    原文地址: https://segmentfault.com/a/1190000004602829
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞