文章目录

  • 第1章 基于异步主从复制(Gtid+replication)架构
  • 1.1 第一种情况
  • 1.2 第二种情况


第1章 基于异步主从复制(Gtid+replication)架构

1.1 第一种情况

在slave上把默认的mysql库给drop掉了,此时我没做stop slave; 也没有重启角色为slave的mysql实例

当前状态
主从复制正常(正常同步master端的数据且能够应用,就是slave的IO和SQL线程正常),它的状态如下

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.......................................省略
.......................................省略
Retrieved_Gtid_Set: 6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-11    # slave从master端检索到的GTID集
 Executed_Gtid_Set: 6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-11    # slave执行了master端的哪些GTID集

所做操作(在slave上做的操作)
在slave上不小心把自身默认的 mysql 库给 drop 掉了;但我没有做 stop slave;操作,也没重启角色为slave的mysql实例;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.......................................省略
.......................................省略
Retrieved_Gtid_Set: 6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-11   # slave从master端检索到的GTID集
 Executed_Gtid_Set: 1c791984-f25a-11ea-97d0-000c298f04d2:1,     # 自身执行的事务集只有1条,前面drop
                    6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-11   # slave执行了master端的哪些GTID集

带来的后果
01:master端能够正常提供读写,是在产生事务的,假如事务ID是:xxxxxxxxxx:12,slave的状态就会报错,冲突事务就是12

Slave_IO_Running: Yes
Slave_SQL_Running: No
Retrieved_Gtid_Set: 6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-12  # slave从master检索引到的GTID集,可看到是12
 Executed_Gtid_Set: 1c791984-f25a-11ea-97d0-000c298f04d2:1,    # slave自身执行的GTID集,前面drop语句;
	                6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-11  # slave执行了从master检索过来的1-11

02:master端可能还在产生数据(你要考虑到哈),数据依然会同步到slave,slave的IO线程还是存放到中继日志中;

解决方法(主要是在slave上的操作)

-- 首先声明
	01:我每天在slave上有对mysql库做单库逻辑全备,备份工具是mysqlpump工具,在备份时是加了--flush-privileges参数的哈
	
	
-- 第一阶段:(查看gtid的相关变量)
   01:使用 select @@global.gtid_executed; 可看到事务是:6f108d1f-f133-11ea-93a4-000c29e5fcf9:11
   02:因为 slave 只执行到了从master检查过来的GTID标识为11的事务;标识为12的GTID就冲突了;
       

-- 第二阶段:(找到备份的数据--->修改--->导入)
   01:将备份的数据文件找出来,进行编辑后并保存,编辑的内容如下所示:
	   A:文件开头加 set session sql_log_bin=0;
	   B:文件末尾加 set session sql_log_bin=1;
   02:将"02"步骤的文件导入到slave中;
   03:此时你查看复制帐号是有的,权限是有的;
   04:但 mysql.slave_master_info mysql.gtid_executed  mysql.slave_relay_log_info 这三张表都是空的;


-- 第三阶段:
   01:停止slave;使用命令:stop slave;
   02:启动slave,使用命令:start slave;            
       A:此时主从状态正常,能够正常同步数据;
       B: mysql.slave_master_info表和 mysql.slave_relay_log_info表有数据
       C:但mysql.gtid_executed表没有数据
   03:查看slave状态,使用命令:show slave status;  # 以下的状态是最关键的哈
	   Slave_IO_Running: Yes
	   Slave_SQL_Running: Yes
	   Retrieved_Gtid_Set: 6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-12 # slave从master检索引到的GTID集,可看到是12
	   Executed_Gtid_Set: 1c791984-f25a-11ea-97d0-000c298f04d2:1,    # slave自身执行的GTID集,前面drop语句;
	                      6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-12  # slave执行了从master检索过来的 1-12
   04:但还有一个问题:binlog中记录了drop database mysql;命令,万一这台slave是有机会提升为主的呢
   05:清空slave的binlog日志
       A:注意:不要stop slave哈;若stop slave;再清理,后面的处理方法就不同了哈;
       B:set session sql_log_bin=0;  # 当前会话不记录binlog
       C:reset master;               # 清空binlog文件,重新生成binlog文件,同时清空gtid_executed变量的值
       D:setsession sql_log_bin=1;   # 当前会话记录binlog
   06:再查看slave的状态,这个状态是
	   Slave_IO_Running: Yes
	   Slave_SQL_Running: Yes
	   Retrieved_Gtid_Set: 6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-12 # slave从master检索引到的GTID集,可看到是12
	   Executed_Gtid_Set:                                            # 没有执行的,当然我master端没产生事务
   06:重启角色为slave的mysql实例;
       A:停止时:会将Retrieved_Gtid_Set:的值记录到mysql.gtid_executed表中
       B:启动时:读取mysql.gtid_executed表中的值,

1.2 第二种情况

在slave上把默认的mysql库给drop掉了,此时我重启角色为slave的mysql实例

#### 当前状态
主从复制正常(正常同步master端的数据且能够应用,就是slave的IO和SQL线程正常)

#### 所做操作
在slave上不小心把mysql库给drop掉了,但我有重启角色为slave的mysql实例.

#### 带来的后果
角色为slave的mysql实例重启不了;

#### 解决方法
-- 第一阶段(将重启不了的slave进行重新初始化)
	01:将数据目录(datadir)下的文件移走;
    02:用mysqld进行重新实例化;
    03:启动实例,修改超级用户的密码;
    04:清空binlog日志(reset master; 刚初始化的实例,没有数据,放心用这个命令)
     	
-- 第二阶段(在master端操作)
	01:以下是用mysqldump命令备份的命令,我有记录gtid、有加--flush-privileges参数
	   mysqldump --no-defaults -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \
	   --set-gtid-purged=on -F --master-data=2 --single-transaction \
	   -A --flush-privileges --skip-extended-insert -R -E --triggers |gzip >/tmp/master-all-object.sql.gz
    02:尽量在低峰期进行备份
    03:将数据传输至slave服务器上
     
-- 第三阶段(在slave上进行操作)
	01:在将传输过来的数据导入到mysql实例
    02:进行change master
    03:start slave;
    04:show slave status;