简介 mysql主从不一样步的几种状况mysql
一 具体状况
1 主库有memory引擎的内存表
分析 因为memory表的数据存放在内存中,一旦主库数据丢失,从库可能就会发生数据复制异常
2 从库有super权限的用户进行数据操做
分析 5.7以前,哪怕设置从库只读,有super权限的用户仍是能够进行数据修改,一旦在从库进行操做,那么主从数据必将不一致,发生数据复制异常
3 因为binlog格式非row的问题
分析 对于binlog格式非row的状况下,可能某些函数和机制都会形成主从同步异常
4 因为配置文件不一致致使的问题
1 server_id配置一致
2 sql_mode 配置不一致
3 主从信息保存在文件中,而非table级别
4 设置了table/db过滤规则
5 因为主库开启了某种特性形成的问题
分析 常见于event事件
二 解决办法
方案1
改造memory内存表要么去掉,要么改为innodb引擎
方案2
设置从库只读,不容许研发人员操做从库,不提供super帐号
方案3
设置binlog为统一row格式
方案4
保证主从的配置文件大致一致,防止出现问题
方案5
1 对于已经存在的主从, 新创建events没有影响。从别的主库同步过来的event, 自己不会执行。
2 对于新创建的主从,若是有events ,那么须要在从库上把event_scheduler设置为off.不然自己还会执行一遍
三 修复主从不一致的方法
1 跳过主从不一致错误(不推荐),可能致使一系列重复问题
2 利用备份重作从库
3 利用binlog2sql/pt等开源工具对不一致的数据进行修复sql
四 常见 错误补充session
1 变量问题函数
1 Could not execute Write_rows event on table practice.temp_baofoo_unbind; Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again, Error_code: 1197; Writing one row to the row-based binary log failed, Error_code: 1534; handler error HA_ERR_RBR_LOGGING_FAILED; the event's master log binlog.000017, end_log_pos 268602107工具
2 数据错乱 ui
1 Could not execute Delete_rows event on table hcy.t1; Can't find record in 't1', this
2 Could not execute Write_rows event on table hcy.t1; Duplicate entry '2' for key 'PRIMARY'线程
3 binlog定位问题code
1 [ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'server
五 复制参数补充
1 replicate-rewrite-db = employees -> hellodb 复制映射,将原主的DB映射到从的其余库,而并不是本来库
这里要尤为注意,主库作DDL操做 千万不要采用 db.table方式的sql语句,不然可能致使从库复制出现错误
六 GTID模式下的特殊复制错误
错误1 Got fatal error 1236 from master when reading data from binary log: 'Cannot replicate anonymous transaction when AUTO_POSITION = 1
分析 匿名事务(anonymous transaction ) 的生成是没法生成全局GTID的
执行命令
set gtid_model = ON_PERMISSIVE,而后再执行事务
经过分析主库binlog的位点也能够发现 set @@session.GTID_NEXT='anonymous' 和以前的猜测项对应
解决方式: 1 从新在从库执行匿名事务.而后重启slave线程便可 2 严格控制开发行为,不容许手动更改环境变量
错误2 When@@SESSION.GTID_NEXT is set to a GTID, you must explicitly set it to a differentvalue after a COMMIT or ROLLBACK.
分析可能缘由
1 主库执行create table as select * from xx; 致使从库复制错误
分析可能 因为后期加入了GTID的强一致性约束,就不会有这种问题.若是有这种错误,是早期版本,须要用户自我进行约束
七 GTID 补充
1 GTID 复制模型会检测 gtid event的有效性
1 GTID_MODE为 OFF 2 anonymouse +GTID OFF 3 anonymouse + AUTO_POSITION = 1,
咱们能够发现 GTID 复制模型对匿名事务是0容忍的,也是不会写入从库的relay log中的,同时复制就会发生异常
2 GTID model四种模式
OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON 必须依次调整. 只要OFF_ERMISSIVE就会发生匿名事务
3 GTID限制
1 不容许create select语句事务
2 不容许 myisam innodb引擎表在同一个事务内混合应用
3 Temporary tables事务内部不能执行
4 强烈建议启动强一致性约束
5 只要规范使用GTID, GTID自己仍是不多发生复制错误的