mysql主库不可用切换备库为主库,再重建备库的几种思路原创
金蝶云社区-黄辉_2914
黄辉_2914
2人赞赏了该文章 1,214次浏览 未经作者许可,禁止转载编辑于2021年07月08日 18:06:35

  这次主要讨论的场景是主库A突然不可用,切换了备库B为主库,并且备库B已经开始正常跑业务成为了主库,现在是要在原主库A上建立备库。

  这里不分析主库不可用的原因,只分为重启后能启动的情况可mysql是正常的且里面数据也正常的情况和mysql是不正常的情况。

      先简单的普及一下主从复制原理:

          mysql每次的变更数据(由于主从复制行为发生的更改默认不计入binlog)都会记录在binlog日志中,binlog日志的记录模式有三种,本次主要是以row模式为主。

          先使用命令查看一下binlog:

           登陆mysql后执行

           show binary logs  查看目前在册的binlog日志;

image.png

如图所示,binglog文件的标志号是按顺序生成的,主从复制,读完一个binlog就会读下一个。

           show binlog events in 'mysql_bin_30001.000004' ;  简要的查看binlog文档内容

image.png

图中可看到pos这个参数是binglog的日志标记号他是不断增加且不重复的,主从复制就是通过这个pos位置的推进一个个事件进行同步,比如其中的update_row的事件,就是表示有更新语句,完整解析binglog日志命令:

mysqlbinlog -vv --base64-output=decode-rows /data/kdcc_data/mysql/mysql3336/log/mysql_bin_30001.000004


会看到有一条update语句如下

image.png

   如图所见他不会记录我们原来发出的语句而是跟新后和跟新前的全部列,这样有利于回滚某个误操作数据 或是查找修改前的数据。

   show master status;当前数据库写入数据的binglog以及写到binglog的哪一个配置。只要有变更数据库里面的数据这个position就会变大,如果binglog文件的大小达到设定值就会转到新增的binlog文件。

image.png

我们也可以使用flush logs,让他主动的从新的文件开始写。这个操作不会产生任何影响可放心食用;

image.png

  •  情况1:原主库A重启后能启动的情况是:mysql是正常的且里面数据也正常的情况;

           思路1(切换前就做好准备功夫):主库发生故障必须要切备库时,备库肯定不会有任何写入,先在备库上执行命令  flush logs。让他另起一个新的日志文件开始写。然后再切到备库这样情况的好处是我们能够很清楚的查到这个新主库是从新的binlog文件的第一个位置开始写入,接下来如果能恢复原主库就能够使用change maseter 命令指定新的master开始复制的binlog及他的位置。一般情况有可能会发生主键冲突,只需要跳过几个主键冲突的错误(3个以内,若太多了还是使用情况2的做法)。

           思路2(切换前没准备):由于不知道确切的位置,可以根据我上面分析binlog的几个操作,查到对应的binlog位置,具体做法是先根据binlog文件的修改时间和实际发生切换的大致时间,就可以判断出是哪个binlog文件。然后再使用解析binlog文件的命令解析binlog,查看里面的时间就能找到大致的位置。


  •  情况2:mysql已不可用数据都需要重建;

           思路:重新做主从我们要做的是两件事,首先是导出新主库数据,并且新主库数据还能够保证记录到对应的binlog位置。因为在我们导出数据不是一个瞬间就能完成的过程,而在导的过程中binlog的位置很有可能就已经变化了。这里就推荐使用热备工具xtrabackup(8.0以下的版本叫innobackupex),他的工作过程这里不详细讨论,只说他提供给你的是一份数据库数据的完整文件以及对应的binlog位置。他对应的是mysql配置文件中的datedir路径:

image.png

他的目的是导出这个数据目录下的所有数据,我们只需要把导出的数据文件夹拷贝到新备库的对应的datedir下,然后重启数据库。

        在导出的文件中会有binlog位置的记录:

image.png

        只要启动这个备库的mysql然后输入change master的时候输入这个文件的binlog及pos就好。


具体操作方法 :

 主库上运行:

   1,数据备份     xtrabackup --user=kdcc --password=kdcc123 --target-dir=/data/xbackup/(自定义导出数据存放的路径) --backup  (8.0以下

innobackupex --user=root --password=cyats_2016 //data/xbackup/(自定义导出数据存放的路径)

   2,增量数据落盘    xtrabackup --prepare --apply-log-only --target-dir=/data/xbackup/ (8.0以下sudo innobackupex --apply-log /data/xbackup/(自定义导出数据存放的路径

备库上运行:

    1,停止mysql,

     2,重命名原来的datedir的文件夹

     3,重命名从主库拷贝过来的数据文件夹替换原来的。

     4,启动mysql检查service_id不要跟主库冲突

     5,执行change master命令写入正确的binlog位置开始同步

赞 2