复制中的重要参数
master上的参数
- log-bin
- server-id #必须 建议端口+ip
- server-uuid #在$datadir/auto.cnf中,5.6后才有的
- log-bin-index #mysql-bin.index
- binlog_format
- binlog_cache_size
- max_binlog_size
- sync_binlog
- expire_logs_days
- log_bin_trust_function_creators
参数解析
- server_id
- 是唯一区别ID,同一个集群内不可重复,可动态修改,从5.6开始
- 可以动态修改
- log-bin-index
- 索引文件前缀名,和log-bin一样,也可以是fullpath
- 不可动态修改
- binlog_format
- 是binlog日志格式,有statement,row,mixed三种
- 可动态修改
- binlog_cache_size
- 是binlog写入buffer,1-2M
- max_binlog_size
- 限制单个binlog大小
- 默认情况下是1G,binlog控制最小生成时间间隔要大于2分钟,不能太小,默认1G有点大不好解析,推荐128M,或者256M
- 可动态修改
- sync_binlog=N
- 交易系统为了安全:设置成1
- 意思是多少个SQL之后,调用fdatasync()函数刷新binlog到disk
- 可动态修改
- fsync()是完全刷新到磁盘,fdatasync()指刷新数据,不刷新metadata
- expire_logs_days=n
- 推荐保存7天
- n天后自动删除binlog
- 可动态修改
- log_bin_trust_function_creators=1
- 设置成1就可以了
- 开启binlog时,是否允许创建存储程序(除非有super群贤,或者指定DETERMINISTIC,READS SQL DATA,NO SQL)
- 可动态修改
- 功能性参数
- binlog_row_image :5.6.2后出现
- 默认是full,binlog写入全部列
- minimal #binlog写入改变的列,不改变的列不写入
- noblob #写入全部的列,除了没更新的BLOB和TEXT这种大字段的列
- Binlog_rows_query_log_events :5.6.2后出现
- 开启后会将用户原始输入的SQL记录到binlog中,方便审计,按需开启
- 早期参数名Binlog_impossiable_mode,5.7以后为binlog_error_action
- 当不能写binlog时,当值为ABORT_SERVER可以报错
- 默认没开启:IGNORE_ERROR,可以改成ABORT_SERVER
- binlog_row_image :5.6.2后出现
特殊说明
- log_warnings
- 如果这个值设置的大于1,会在错误日志里看到异常断开的连(Aborted connection)或是被拒绝的请求
- Crash Recovery
- 基于MySQL5.6GTID的Crash Recovery是MySQL5.6.21支持,5.6.23开始稳定
- 传统复制也可以支持,需要修改两个参数
- master_info_repository改成table
- relay_log_info_repository改成table
- 这个特性的原理是当从库crash后,重新启动起来不在将自己的relay-log执行完再去主库拉取日志,是查看relay-master-log-file和exec-master-log-pos这两个值,直接去主库拉取这个值后面的日志载执行复制
- 传统复制也可以支持,需要修改两个参数
- 基于MySQL5.6GTID的Crash Recovery是MySQL5.6.21支持,5.6.23开始稳定
- MySQL5.6.5和MySQL5.7.5以后binlog变成了v2格式,因为引进了GTID和binlog_checksum
- 如果有需求从5.5升级到5.6或者5.7是可以升级的,但要回滚版本就会出问题了,需要将两个参数设置
- binlog_checksum = none
- log_bin_use_v1_row_events = on #binlog用v1版本的
- 如果之后升到5.6之后,最好还是改回去
- 如果有需求从5.5升级到5.6或者5.7是可以升级的,但要回滚版本就会出问题了,需要将两个参数设置
master其他参数
- auto_increment_increment
- 每次自增的步长
- auto_increment_offset
- 自增起始偏移量
- binlog-do-db(特别声明:所有的过滤条件规则不建议在主库设置)
- binlog记录db,除此外,其他db上的binlog都不记录,存在风险
- binlog-do-db=hetan情况下
- use mysql;update hetan.t1 set user='user2' where id=1;这个记录会记录到binlog中吗?
- SBR模式下,这个SQL不会记录到binlog,这会导致主从不一致,而在RBR模式下则会被记录
- binlog-ignore-db
- 和上面的规则相反
- binlog-ignore-db=hetan
- use hetan;update mydb.t1 set user='user2' where id=1;
- SBR:不记录,RBR记录
- max_binlog_cache_size
- binlog最大的cache size,有大SQL写入时需要用到,或者大数据load data时
- binlog_stmt_cache_size
- 用于cache那些事物中非事物表产生的SQL语句,如果经常在事物中涉及到非事物表,需要加大该参数
- max_binlog_stmt_cache_size
- 用于cache那些事物中非事物表产生的SQL语句,最大cache
- binlog_direct_non_transaction_updates
- 事物中既有事物表,也有非事物表,发生数据变更时,非事物表会直接写binlog,而不是也和事物表一样缓存在buffer中
- 这个参数只影响SBR模式,RBR,MBR都不受影响
- 针对gtid的参数
- gtid_mode
- 用于控制是否启用GTID
- 如果设置成on,则必须是log-bin,log-slave-updates,enforce_gtid_consistency也要启动
- enforce_gtid_consistency
- 如果开启GTID必须要把这个选项打开
- 用于控制只有事物安全的语句才能被记录到log中
- gtid_next
- 用来指定下一个要执行的事物,设置这个变量需要有super权限
- gtid_purged
- 用于指定那个事物从binlog忽略了,reset master这个值会被清空
- gtid_executed
- 执行到的GTID号及所有执行过得gtid号,和Executed_Gtid_set输出的这列意思是一样的
- Reset master这个值会被清空
- gtid_mode
slave上的参数
- server-id
- 同上
- server-uuid
- 同上
- relay-log
- io thread读取过来存储到本地的日志
- relay-log-index
- relaylog索引文件前缀名,和relay-log一样,也可以是fullpath
- 不可动态修改
- read-only
- 设置从库为只读,但对super权限的用户不起作用
- 可动态修改
- log_slave_updates
- 将master传输过来的变更操作,再次记录成本地的binlog,用于做二次复制,当做中继分发点
slave其他参数
- log-slow-slave-statements
- slave复制产生的slow log,是否要记录的慢日志
- max_relay_log_size
- 限制relay log的大小,一般128M就可以
- master-info-file/relay-log-info-file
- 记录relay log的最新信息,master.info
- sync_master_info=n
- 多少个事物/事件后调用fdatasync()刷新master.info文件
- relay_log_purge
- relay应用完后,是否自动立即删除
- relay_log_recovery
- slave崩溃或正常重启时,未应用完的relay log会被删掉,重新从master请求binlog,再次生成relay log
- replicate-same-server-id
- slave复制是否应用和自己相同server-id的binlog,和log-slave-updates选项互斥
- skip-slave-start
- mysqld实例启动时,不跟着启动slave线程
- slave_load_tmpdir
- slave复制中遇到load data file 时使用的tmpdir
- slave_transaction_retries
- slave复制中,如果因为innodb死锁或者锁超时导致复制线程执行非事物失败重试次数,一般保持默认就可以
- slave_parallel_workers
- 库并发控制
- 默认是关闭的
- relay_log_space_limit
- 防止relay_log过多将磁盘占满,可以设置这个参数,一般没有问题就不需要设置
- 以下三个参数和早期版本的show slave hosts有关,5.7版本不设置也可以查看,建议不设置
- report_password #建议不配置
- report_port #建议不配置
- report_user #建议不配置
slave过滤参数
- 可以在线修改
- change replication filter语句
- replicate-do-table
- 只复制指定的表
- replicate-ignore-table
- 忽略指定的表
- replicate-rewrite-db
- 如果master和slave有个库同名了,那么可以采用rewrite规则,将这个库上的复制重写到另一个新的库名上
- replicate-wild-do-table
- 以通配符形式指定复制哪些table
- replicate-wild-ignore-table
- 以通配符的形式指定不复制哪些table
- replicate-do-db
- 只复制指定的库
- replicate-ignore-db
- 忽略指定的库
- slave_net_timeout
- slave连接master超时时长
- 建议调成20-30秒
- slave_skip_errors
- slave复制中,忽略某些错误
- 常见的有:
- 1032
- 1053
- 1062
- 1050
- 1051
- 1054
- 1146
- all #全部错误
- sql_slave_skip_counters
- 忽略多少个复制事件,遇到个别错误(主键冲突,记录不存在等)时,可以忽略这些事件,继续复制进程
为了使用crash-safe replication功能,必须使用:
- relay_log_info_repository=table
- relay-log-recovery=1
- 使用支持事物的引擎
- 在slave故障挂掉起来后,在设置了relay-log-recovery=1时,会清理掉已经存在的relay-log,从relay_log_info_repository里读到的同步位置,重新请求一份relay-log,实际上是做了一次:把Read_Master_Log_Pos设置为Executed_Master_Log_Pos,Master_Log_file设置成Relay_Master_log_file