第三十二节、主库出问题了,从库怎么办?

一主多重的切换正确性:

1、基于位点的主备切换

通常情况下,在切换任务的时候,要先主动跳过这些错误,有两种常用的方法:

1、主动跳过一个事物,跳过的命令的写法是:

set global sql_slave_skip_counter=1;

start slave;

因为切换过程中,可能会不止重复执行一个事物,所以需要在从库持续观察,每次碰到这些错误就停下来,执行一次跳过命令,直到不再出现停下来的情况,以此来跳过可能涉及的所有事务。

2、通过设置slave_skip_errors参数,直接设置跳过指定的错误:

在执行主备切换时,有这么两类错误,是经常会遇到的:

1062 错误是插入数据时唯一键冲突;

1032错误是删除数据时找不到行。

因此,可以把slave_skip_errors设置为“1032,1062”,这样中间碰到这两个错误时就直接跳过



2、GTID

通过sql_slave_skip_counter跳过事务和通过slave_skip_errors 忽略错误的方法,虽然都最终可以建立从库B和主库A'的主备关系,但这两种操作都很复杂,而且容易出错,所以MySQL5.6版本引入了GTID,彻底解决了这个困难。

GTID的全程是Global Transaction Identifier,也就是全局事务ID,是一个事务在提交的时候生成的,是这个事务的唯一标识。它由两部分组成,格式是:GTID=server_uuid:gno.

其中:server_uuid是一个实例第一次启动时自动生成的,是一个全局唯一的值;

gno是一个整数,初始值是1,每次提交事务的时候分配给这个事务,并加1.

在MySQL的官方文档里,GTID格式是这么定义的:

GTID=source_id:transaction_id

GTID模式的启动:在启动一个MySQL实例的时候,加上参数gtid_mode=on 和enforce_gtid_consistency=on。

在GTID模式下,每个事务都会跟一个GTID——对应。这个GTID有两种生成方式,而使用哪种方式取决于session变量gtid_next的值。

1、如果gtid_next=automatic,代表使用默认值。这时,MySQL就会把server_uuid:gno分配给这个事务   。

    a、记录binlog的时候,先记录一行 SET @@SESSION.GTID_NEXT='server_uuid:gno';

    b、把这个GTID加入本实例的GTID集合。

2、 如果gtid_next是一个指定的GTID的值,比如通过set gtid_next='current_gtid'指定为current_gtid,那么就有两种可能:

    a、如果current_gtid已经存在于实例的GTID集合中,接下来执行的这个事务会直接被系统忽略;

    b、如果current_gtid没有存在于实例的GTID集合中,就将这个current_gtid分配给接下来要执行的事务,也就是说系统不需要给这个事务生成新的GTID,因此gno也不用加1

GTID实例:

CREATE TABLE `t` (

  `id` int(11) NOT NULL,

  `c` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB;

insert into t values(1,1);

假设,现在这个实例X是另外一个实例Y的从库,并且此时在实例Y上执行了下面这条语句:

insert into t values(1,1);

并且,这条语句在实例Y上的GTID是: aaaaaaaa-cccc-dddd-eeee-ffffffffffff:10.

那么,实例X作为Y的从库,就要同步这个事务过来执行,显然会出现主键冲突,导致实例X的同步线程停止。

处理方法就是,可以执行下面的这个语句序列:

set gtid_next='aaaaaaaa-cccc-dddd-eeee-ffffffffffff:10'; 

begin; commit; 

set gtid_next=automatic; 

start slave;   

其中,前三条语句的作用,是通过提交一个空事务,把这个GTID加到实例X的GTID集合中。这样,再执行start slave命令让同步县城执行起来的时候,虽然实例X上还是会继续执行实例Y传过来的事务,但是由于 'aaaaaaaa-cccc-dddd-eeee-ffffffffffff:10'已经存在于实例X的GTID集合中了,所以实例X就会直接跳过这个事务,就不会再出现主键冲突的错误。

在上面的这个语句序列中,start slave命令之前还有一句 set gtid_next=automatic。这句话的作用是“恢复GTID的默认分配行为”,也就是说如果之后有新的事务再执行,就还是按照原来的分配方式,继续分配gno=3.




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259