清除二进制日志(二进制日志是一组文件,其中包含有关MySQL服务器进行的数据修改的信息。该日志由一组二进制日志文件和一个索引文件组成)
删除指定索引文件名或日期之前的日志索引文件中列出的所有二进制日志文件,删除的日志文件也将从记录在索引文件中的列表中删除
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26';
BINARY和MASTER相同
复制副本时,此语句可以安全运行,无需停止副本。如果副本正在进行,语句不会删除复制进程正在读取和晚于读取日志的日志文件,会删除之前的文件;如果副本已停止,删除了副本尚未读取的日志文件那么副本启动后将无法复制
不会重置编号文件编号
安全清除二进制日志文件:
- 在每个副本上,用SHOW SLAVE STATUS检查它正在读取的日志文件
- 使用SHOW BINARY LOGS来获取复制源服务器上二进制日志文件的列表
- 确定所有副本中最早的日志文件。这是目标文件。如果所有副本都是最新的,则这是列表上的最后一个日志文件
- 对要删除的所有日志文件进行备份
- 清除所有日志文件,但不包括目标文件
RESET MASTER
对于启用了二进制日志的服务器,删除所有现有的二进制日志文件并重置二进制日志索引文件,创建一个新的空二进制日志文件重新启动二进制日志记录
对于正在使用GTID的服务器,将重置GTID执行历史记录
首次设置源和副本时,重置源和副本并确保源或副本中没有残留通过测试生成的不需要的数据或二进制日志文件
RESET MASTER不能再副本运行时使用
SET sql_log_bin = {OFF|ON}
控制是否启用二进制日志,默认值为ON
设置此变量为OFF防止将GTID分配给二进制日志中的事务
如果使用GTID进行复制,则意味着即使稍后再次启用二进制日志记录这些事务会丢失
全局sql_log_bin变量是只读的,无法修改。全局范围已弃用,并将在将来的MySQL版本中删除
CHANGE MASTER TO
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 = 'source_log_name'
| MASTER_LOG_POS = source_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语句将失败,这种情况下的解决方案是发出START SLAVE UNTIL sql_after_mts_gap,这确保间隙被关闭
FOR CHANNEL:添加一个新通道用于从源数据库复制数据,不指定则应用默认通道,有多个通道时必须指定的
MASTER_PASSWORD:指定源数据库密码
MASTER_USER:指定源数据库用户
MASTER_HOST:指定源数据库ip或主机名
MASTER_PORT:指定源数据库端口
MASTER_HEARTBEAT_PERIOD:心跳间隔;副本没有数据时从源获取数据的时间间隔,每当使用事件更新源的二进制日志时,都会重置等待时间。默认60s
MASTER_CONNECT_RETRY:连接源失败后,重新连接源的重试间隔,默认60s
MASTER_RETRY_COUNT:连接源失败后,重新连接源次数,默认86400次
MASTER_DELAY:副本延迟于源的时间;从源接收到的事件要比在源上执行的事件至少晚interval秒钟后才执行。默认0s,有效值0 至 2^31-1;可以复制SQL线程停止时使用
MASTER_BIND:用于在具有多个网络接口的副本上使用,并确定选择哪个副本的网络接口来连接到源。
MASTER_LOG_FILE:指定从源读取的二进制文件
MASTER_LOG_POS:指定从源读取的二进制文件坐标
RELAY_LOG_FILE:指定当前副本的中继日志文件
RELAY_LOG_POS:指定当前副本的中继日志文件的坐标
MASTER_AUTO_POSITION = 1:指定副本使用GTID的方式连接源,仅当复制SQL线程和复制I/O线程都停止时才可以使用
IGNORE_SERVER_IDS:
- 以逗号分隔的0或多个服务器ID的列表,除了日志轮换和删除事件(仍记录在中继日志中)外,将忽略源自相应服务器的事件。不能包含自身的id
- 在循环复制中,原始服务器通常充当其自身事件的终结者,因此不会多次应用这些事件。
- 假设您有一个包含4个服务器,服务器ID为1、2、3和4的循环复制设置,并且服务器3发生故障。
- 通过从服务器2到服务器4的复制来弥合差距时,您可以在服务器4上发出CHANGE MASTER TO IGNORE_SERVER_IDS = (3)的语句,
- 该语句告诉它使用服务器2而不是服务器3作为它的源。这样做会导致它忽略并不传播从服务器发出的、不再使用的任何语句。
- 要清除忽略的服务器列表,必须使用带有空列表的选项:
- CHANGE MASTER TO IGNORE_SERVER_IDS = ();
- MySQL 5.7.5及更高版本中,RESET SLAVE ALL可以清除IGNORE_SERVER_IDS
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:
(from_db, to_db)[, (from_db, to_db)][, ...]
在副本上设置一个或多个复制过滤规则。需要先重启复制SQL线程
无法在为组复制配置的MySQL服务器实例上设置复制过滤器,因为在某些服务器上过滤事务将使该组无法就一致状态达成协议
REPLICATE_DO_DB:基于数据库名称更新。等同于 --replicate-do-db。
REPLICATE_IGNORE_DB:根据数据库名称排除更新。等同于 --replicate-ignore-db。
REPLICATE_DO_TABLE:基于表名更新。等同于 --replicate-do-table。
REPLICATE_IGNORE_TABLE:根据表名排除更新。等同于 --replicate-ignore-table。
REPLICATE_WILD_DO_TABLE:基于通配符模式匹配表名称更新。等同于 --replicate-wild-do-table。
REPLICATE_WILD_IGNORE_TABLE:排除基于通配符模式匹配表名称的更新。等同于 --replicate-wild-ignore-table。
REPLICATE_REWRITE_DB:将副本上的新名称替换为源上的指定数据库后,对副本进行更新。等同于 --replicate-rewrite-db。
SELECT MASTER_POS_WAIT('source_log_file', source_log_pos [, timeout][, channel])
这实际上是一个函数,而不是语句。它确保副本已读取并执行了事件,直到源二进制日志中的给定位置为止
RESET SLAVE [ALL] [FOR CHANNEL channel]
清除其在源二进制日志中的复制位置,清除复制元数据存储库,删除所有中继日志文件,并启动新的中继日志文件,MASTER_DELAY重置为0。用于全新启动
对GTID执行历史没有影响
必须停止复制线程才能使用
指定ALL将清除复制连接参数,例如源的主机名和端口,复制用户帐户名及其密码,IGNORE_SERVER_IDS;如果需要使用副本需要重新配置
START SLAVE [thread_types] [until_option] [FOR CHANNEL channel]
thread_types:
[IO_THREAD | SQL_THREAD [, 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 }
IO_THREAD:I/O进程
SQL_THREAD:复制进程
UNTIL SQL_BEFORE_GTIDS = gtid_set:复制SQL线程开始处理事务直到到达gtid_set中的第一个事务
UNTIL SQL_AFTER_GTIDS = gtid_set:复制线程处理所有事务,直到两个线程都处理了gtid_set中的最后一个事务
UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos:直到复制SQL线程到达源的二进制日志中的给定点或副本的给定点为止
UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos:直到复制SQL线程到达源的中继日志中的给定点或副本的给定点为止
UNTIL SQL_AFTER_MTS_GAPS:使多线程副本的工作线程仅运行,直到在中继日志中找不到更多间隙为止,然后停止,它对复制I / O线程没有影响可以与SQL_THREAD一起使用
UNTIL不能与IO_THREAD一起使用
UNTIL中的各项不能同时使用
STOP SLAVE [thread_types] [FOR CHANNEL channel]
停止副本复制线程
会隐式提交正在进行的事务
显示当前在源中注册的副本列表
SHOW SLAVE HOSTS
提供有关源二进制日志文件的状态信息
SHOW MASTER STATUS