主备切换

  • 主库产生问题之后怎么办,切换备库后,要指定其他的从库的主库为新上来的主库(之前的备库)
  • 需要执行一条命令,change master
CHANGE MASTER TO 
MASTER_HOST=$host_name 
MASTER_PORT=$port 
MASTER_USER=$user_name 
MASTER_PASSWORD=$password 
//以上是新主库的ip 端口 用户名和密码
MASTER_LOG_FILE=$master_log_name 
MASTER_LOG_POS=$master_log_pos  
//上面两个是指要从主库的master_log_name文件的master_log_pos位置开始同步日志

如何获取同步位点

第一方式

等待新主库a吧中转日志全部同步完成

  • 在a上执行show master status,或者当前a的最新的file和position
  • 取原A故障的时间T
  • 用mysqlbinlog工具解析a的file,获取T时刻的位点
mysqlbinlog File --stop-datetime=T --start-datetime=T
  • 但是这个方法不准确,因为这个点上的可能已经有数据了,再从新的主库来同步,可能会有主键冲突的错误
如何解决这些错误
  • 跳过这个事务
set global sql_slave_skip_counter=1;
start slave;
  • 跳过指定的错误:把slave_skip_errors:1062(唯一键冲突),1032(删除数据时找不到行)
    之后记得把这个参数设置为空,
第二种方式GTID(5.6之后)
  • 全局事务id,分为两部分GTID=server_uuid(实例启动时自动生成,全局唯一)+gno(初始值为1,事务提交时+1)
  • 启动时加上参数:gtid_mode= on和enforce_gtid_consistency=on就可以
GTID的两种生成方式
  • 如果 gtid_next=automatic,代表使用默认值。这时,MySQL 就会把 server_uuid:gno 分配给这个事务。
    • a. 记录 binlog 的时候,先记录一行
SET@@SESSION.GTID_NEXT=‘server_uuid:gno’;
  • b. 把这个 GTID 加入本实例的 GTID 集合。
  • 如果 gtid_next 是一个指定的 GTID 的值,比如通过 set gtid_next='current_gtid’指定为
    current_gtid,那么就有两种可能:
    • a. 如果 current_gtid 已经存在于实例的 GTID 集合
      中,接下来执行的这个事务会直接被系统忽略;
    • b. 如果 current_gtid 没有存在于实例的
      GTID 集合中,就将这个 current_gtid 分配给接下来要执行的事务,也就是说系统不需
      要给这个事务生成新的 GTID,因此 gno 也不用加 1。

基于GTID的主备切换

CHANGE MASTER TO 
MASTER_HOST=$host_name 
MASTER_PORT=$port 
MASTER_USER=$user_name 
MASTER_PASSWORD=$password 
//前四个和之前的一样
master_auto_position=1 

你可能感兴趣的:(mysql)