复制中的参数介绍

复制中的重要参数

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

特殊说明

  • 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.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之后,最好还是改回去

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这个值会被清空

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

推荐阅读更多精彩内容