备库:同步主库的binlog,当主库出问题时,备库切换为主库。一般不提供读服务。
从库:同步主库的binlog,只对外提供读服务。
首先我们知道,设置从库时的命令
CHANGE MASTER TO MASTER_HOST=$host_name MASTER_PORT=$port MASTER_USER=$user_name MASTER_PASSWORD=$password MASTER_LOG_FILE=$master_log_name MASTER_LOG_POS=$master_log_pos
master_log_file和master_log_pos 表示从主库的这个文件的pos位置开始同步,
那如何获取这个pos位置呢?
一种取同步位点的方法是这样的:
通过命令show master status
可以得到file和pos。这里的pos是最新的,从库同步的话,是需要找故障时刻T的位点,执行 mysqlbinlog File --stop-datetime=T --start-datetime=T
获取到end_log_pos 作为通步的位点。
这种取同步位点的方法是不精确的,往往在执行的时候,需要执行一些辅助命令来跳过某些错误。
set global sql_slave_skip_counter=1; start slave;
缺点是没遇到一个错误,就需要手动执行一次。
set slave_skip_errors = "1032,1062"; start slave;
在执行主备切换时,有这么两类错误,是经常会遇到的:
千万注意,主备切换后,要将这个参数设置为空
MySQL 5.6版本引入了GTID,将自动找位点的这一步骤完全自动化了。
那什么是GTID?
GTID 的全称是 Global Transaction Identifier,也就是全局事务 ID,是一个事务在提交的时候生成的,是这个事务的唯一标识。
GTID=server_uuid:gno
1, server_uuid 是一个实例第一次启动时自动生成的,是一个全局唯一的值
2. gno 是一个整数,初始值是 1,每次提交事务的时候分配给这个事务,并加 1。
gtid_next=automatic
代表使用默认值。
如果设置gtid_next=current_gtid
, 如果current_gtid已经在实例的gtid集合中,接下来这个事务会被直接跳过,否则分配current_gtid给接下来的事务执行。注意:每个MySQL实例都维护了一个GTID集合,用来对应执行过的所有事务
命令差不多
CHANGE MASTER TO MASTER_HOST=$host_name MASTER_PORT=$port MASTER_USER=$user_name MASTER_PASSWORD=$password master_auto_position=1
主要是master_auto_position 表示这个主备关系使用的是GTID协议。
模拟以下GTID的主备切换。实例A的gtid集合为set_a, 实例B的gtid集合为set_b.