(5.3)mysql高可用系列——mysql复制之复制的参数

参考:https://www.iteye.com/blog/shift-alt-ctrl-2269539

 

详情

【1】参数

#【1.1】基本参数

bind-address=192.168.1.201

server_id=2013306    #主从不相同,建议IP+端口

#skip_name_resolve=off  #跳过主机名/域名解析

transaction-isolation=read-committed  #事务隔离级别设置成RC

#【1.2】binlog二进制日志参数

log_bin=/mysql/log/3306/binlog/mysql-bin

log_bin_index=/mysql/log/3306/binlog/mysql-bin.index

binlog_format=row  #行格式,必须

binlog_row_query_log_events=on  #二进制日志中记录更详细的SQL操作

sync_binlog=1  #默认,MySQL每次提交事务之前会将二进制同步到磁盘上

innodb_flush_log_at_trx_commit=1  #默认,每次事务提交时MySQL都会把log Buffer写入log fiel,并且flush到磁盘。

log_bin_trust_function_creators=1  #默认为0,该参数是同步函数和存储过程

max_binlog_size=2048M  #默认为1024M

expire_logs_days=7  #binlog保留多少天,看具体安排

binlog_cacahe_size=1M  #默认32K,binlog缓存大小,设置时要当心,根据业务繁忙情况建议1-4M。

innodb_support_xa=1  #这个参数是在主库上设置的,默认自动开启。分布式事务参数。

            #这个参数确保事务日志写入binlog的顺序是与事务的time-line是一致的。

# 【1.3】关于relay_log中继日志参数

 

relay_log=/mysql/log/3306/relaylog/mysql-relay.log

relay-log-recover=1

#该参数为了实现 ,I/O thread crash safe  #IO线程安全

#打开replication中继日志崩溃恢复模式,replication支持中继日志的自我修复功能。

#当slave从库宕机后,如果replay-log发生损坏,导致一部分中继日志没有处理,就自动放弃未执行的replay-log。

#slave崩溃或正常启动时,未应用完的relay_log会被删掉,重新从master请求binlog再次生成自上一个完全应用点后的位置拉取relay_log

 

relay_log_info_repository=table

#该参数为了实现,SQL thread crash safe  #SQL线程安全

#默认是file,SQL线程的数据回放是写数据库操作,relay-info是写文件操作,这2个操作很难保证一致性,relay-info将写入到 mysql.slave_relay_log_info 这张表

master_info_repository=table

#默认是file,io线程也是接受一个个的event,将接收到的event,通过设置参数#master_info_repository可以将master-info信息写到什么位置,性能上比设置为file有很高的提升,可靠性也得到保证。

#设置为table后,master-info将信息保存到mysql.slave_master_info

 

#【1.4】关于同步方式的参数

loose_rpl_semi_sync_master_enabled=1  #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled)

loose_rel_semi_sync_slave_enabled=1  #MySQL5.6开启从的半同步复制

loose_repl_semi_sync_master_timeout=5000  #超时5秒,切回异步

rpl_semi_sync_master_wait_for_slave_count=1  #有多少个从返回标识就可以提交:一主多从的情况下只要有1个slave的ACK返回给了主库,就会进行commit

rpl_semi_sync_master_wait_point=AFTER_SYNC  #MySQL 5.7的方法,AFTER_SYNC(default,增强半同步) & AFTER_COMMIT(传统半同步)

#rpl_semi_sync_master_wait_point=  #MySQL 5.7的方法:开启半同步复制

 

#【1.5】关于GTID的参数

[master]>show global variables like '%gtid%';
1、enforce_gtid_consistency:开启gtid的一些安全限制(介意开启)。
 
2、gtid_executed:全局和seeeion级别都可以用。用来保存已经执行过的GTIDs。
贴士:show  master status\G;输出结果中的Executed_Gtid_Set和gitd_executed一致。reset master时,此值会被清空。
 
3、gtid_owned:全局和session级别都可用,全局表示所有服务器拥有GTIDs,session级别表示当前client拥有所有GTIDs。(此功能用的少)
 
4、gtid_mode:是否开启GTID功能。
 
5、gtid_purged:全局参数,设置在binlog中,已经purged的GTIDs,并且purged掉的GTIDs会包含到gtid_executed中。
贴士:从而导致slave不会再去master请求这些GTIDs,并且Executed_Gtid_Set为空时,才可以设置此值。
 
6、gtid_next:这个时session级别的参数:
[master]>show session variables like '%gtid_next%';

 

gtid_mode=on  #开启GTID

        #(1)on:产生GTID,slave只接受带GTID的事务  (2)on_permissive:产生GTID,slave接受不带GTID的事务也接受带GTID的事务

        #(3)off:不产生GTID,slave只接受不带参GTID的事务  (4)off_permissive:不产生GTID,slave接受带GTID也接受不带GTID的事务

log_slave_updates=1  #从库relay log中的重做记录在从库的binlog上记录,如果多个从库在主从切换时建议关掉,避免传输重复日志导致同步错误

enforce_gtid_consistency=1  #on:当发现语句/事务不支持GTID时,返回错误信息  WARN:发现不支持返回警告  #off:不检查

gtid_next:automatic  #获取指定的GTID下一个值

session_track_gtids  #捕获跟踪GTID事务信息,默认off,OWN_GTID:返回当前事务的GTID,ALL_GTIDS:返回系统执行的所有GTID(GTID_EXECUTED)

binlog_gtid_simple_recovery=1 #5.7.6以下默认off,5.7.6以上默认on

1. 这个变量用于在MySQL重启或启动的时候寻找GTIDs过程中,控制binlog 如何遍历的算法?
2. 当binlog_gtid_simple_recovery=FALSE 时:
    为了初始化 gtid_executed,算法是: 从newest_binlog -> oldest_binlog 方向遍历读取,如果发现有Previous_gtids_log_event , 那么就停止遍历
    为了初始化 gtid_purged,算法是:   从oldest_binlog -> newest_binlog 方向遍历读取, 如果发现有Previous_gtids_log_event(not empty)或者 至少有一个Gtid_log_event的文件,那么就停止遍历
3. 当binlog_gtid_simple_recovery=TRUE 时:
    为了初始化 gtid_executed , 算法是: 只需要读取newest_binlog
    为了初始化 gtid_purged, 算法是: 只需要读取oldest_binlog
4. 当设置binlog_gtid_simple_recovery=TRUE , 如果MySQL版本低于5.7.7 , 可能会有gitd计算出错的可能,具体参考官方文档详细描述

 

 

#【1.6】关于复制过滤参数

主:

binlog-do-db=db_name  #binlog只把该库的操作记录到binlog,每一行一个数据库,多个数据库需要另起行

binlog-ignore-db=db_name  #表示忽略某个数据库,除了这个数据库之外都复制,每一行一个数据库,多个数据库需要另起行

 

从:

replicate_do_db=db_name  #只复制某个库,每个库一行,多个库需要另起行

replicate_do_db=db_name  #不复制某个库,每个库一行,多个库需要另起行

replicate_do_table=table_name  #只复制某个表

replicate_wild_do_table=table_name  #解决跨库更新问题,需要与 replicate_do_table 同时使用

replicate_ignore_table     #不复制某个表

replicate_wild_ignore_table  #解决跨库更新问题,需要与 replicate_ignore_table同时使用

  #原因是,设置relicate_do_db或relicate_ignore_db后,MySQL执行sql前检查的是当前默认的数据库,所以跨库更新语句会在slave上被忽略。

   #如果从库是要在线复制过滤,stop slave;     CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('erp_ivedeng_com.T_BRAND','erp_ivedeng_com.T_DEPARTMENT_FEE_ITEMS'); 

replicate_rewrite_db=fandb->dudb   #复制到不一样名字的从库
replicate_rewrite_db=a->b  #多条要写多个
 

7.其他重要参数

slave-parallel-type=LOGICAL_CLOCK

slave-parallel-workers=4

read_only=1

slave_skip_errors=ddl_exist_errors

slave_preserve_commit_order=1

#mysql5.7GA 版本推出的 Enhanced Multi-threaded Slaves功能

#彻底解决了之前版本主备数据复制延迟的问题,开启并行复制(multi-threaded slave)

--------------------------------------------参数释义-----------------------------------

slave-parallel-type=LOGICAL_CLOCK  

区别了解参考:https://www.cnblogs.com/langdashu/p/6125621.html

  #(1)DATABASE:兼容MySQL5.6基于 schema级别的并发复制  

  #(2)MySQL5.7 默认值是基于库的并行复制方式。即 LOGICAL_CLOCK:基于组提交的并行复制方式;组提交,是一堆食物的集合,减轻IO压力。

slave-parallel-workers      # 4个SQL Thread 来进行并行复制(应用回放线程,即应用relay log的线程),可以动态调整复制线程数(直接设置此全局变量,且一定要重启slave线程)

read_only 与 super_read_only   #在slave设置之后只能读不能写但super可以,除非设置super_read_only,super_read_only 包含 read_only

slave_skip_errors        

  #默认为off,选项一共有4个,off,all,ErrorCode,ddl_exist_errors(mysql5.6、mysql cluster ndb7.3后添加该参数).

  #ddl_exist_errors 包含了一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)等

slave_preserve_commit_order   # Slave 上 commit的顺序保持一致,必须为1,否则可能会有GAP锁产生

posted @ 2019-08-17 14:58  郭大侠1  阅读(392)  评论(0编辑  收藏  举报