1.主从复制故障分析:

1.1监控方法

show slave status \G

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

1.2 IO线程

1.2.1正常状态:

Slave_IO_Running: Yes

1.2.2非正常状态:

Slave_IO_Running:

NO/Connecting

1.2.3故障原因:

连接主库:

(1)网络,防火墙,端口

(2)用户 密码 权限

replication slave

(3)主库连接数上限

mysql> select @@max_connections;

| @@max_connections |

|              151 |

请求日志,接收日志

(4)版本不统一  5.7 native  8.0 sha2

故障模拟:

主从中的线程管理:

start slave;

stop slave;

单独开启线程:

start  slave sql_thread;#单独启动sql线程

start  slave io_thread;#单独启动io线程

start  stop sql_thread;#单独关闭sql线程

start  stop io_thread;#单独关闭io线程

解除从库身份:

reset slave all;

故障模拟:change master  密码写错误

io线程连接connectioning状态

故障处理: 手工连接

直接用repl 用户进行登陆 看是否报错。

1.密码错误

2.连接数超过上限  too many connection

5)请求日志,接收日志

故障原因:

(1)主库二进制日志不完整,损坏,不连续

(2)从库请求的起点问题

(3)主从的server_id(server_uuid)相同

(4)relaylog 问题

模拟故障:

主库 reset master;清除了binlog.

生产中如果要 reset  master ;

如果业务繁忙期间做,有可能会导致数据hang。

如果要恢复主从,需要重新搭建主从。

++++++++++++正确的姿势+++++++++++++++

1.找业务不繁忙期间,停业务5分钟。

2.等待从库重放完所有的主库日志

3.主库reset  master;

4.从库重新同步主库日志

1)stop slave;

2)reset slave all;

3)change master to

......

......

4)start slave;

第三方工具 pt

1.3 SQL线程故障

1.3.1 主要做什么工作?

回放relay-log中的日志。可以理解为执行relay-log SQL:

1.3.2SQL线程故障本质?

为什么SQL线程执行不了SQL语句。

1.3.3原因整理。

创建的对象已经存在。

需要操作的对象不存在。

约束冲突。

SQL_MODE

参数,版本

以上问题:大几率出现在从库写入或者双主

结构中容易出现。

参数,版本

1.3.4 故障模拟

(1)从库创建oldguo数据库。

(2)主库创建oldguo数据库。

(3)检查从库slave状态

Slave_SQL_Running:No

从库报错,停止复制。

1.3.5 处理故障

(1)思路1:一切以主库为准

将从库进行反操作一下,重启线程。

从库:drop databases oldguo;

从库: start slave ;

(2)思路2:以从库为准,跳过此次复制错误

方法一:

stop slave;

set global sql_slave_skip_counter = 1;

start slave;

仅限于比较简易的操作环境。

第三方工具(后面实操):帮助我们检查主从是否一致,并修复数据一致。

方法二:暴力方法,遇到自动跳过

/etc/my.cnf

slave-skip-errors=1032,1062,1007

常见错误代码:

1007:对象已存在

1032:无法执行DML

1062:主键冲突,或约束冲突

(3)思路3:

重新搭建主从,备份恢复+重新构建。

问题:

1.主库出了问题怎么办?

#物理

1.看主库是否能ssh上。

2.检查binlog是否完整。

3.手工追加日志到最新位置。

4.从库替代主库工作。

#逻辑 drop

只能通过备份去恢复

2.双主情况下,一个宕机,另一个也有问题。

只能备份+binlog恢复。

从库怎么当主库?

1.恢复最新状态

2.取消从库身份

3.清空binlog日志信息

扩展:

1.从库只读

select @@read_only;  #普通用户只读

select @@super_read_only; #普通管理员只读

2.中间件(读写分离)