--Slave_SQL_Runing:NO 复制出现问题的解决办法

-------------------------------------------------------2014/05/21

Slave_SQL_Running: No mysql同步故障解决
     今天检查数据库发现一台MySQL Slave未和主机同步,查看Slave状态:
mysql> show slave status\G
  Slave_IO_Running: Yes
  Slave_SQL_Running: No
  Last_Errno: 1062 .... Seconds_Behind_Master:NULL
原因: 1.程序可能在slave上进行了写操作 2.也可能是slave机器重起后,事务回滚造成的.
解决办法I:
1.首先停掉Slave服务:slave stop
2.到主服务器上查看主机状态: 记录File和Position对应的值。
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000020 | 135617781 | |
| +------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
3.到slave服务器上执行手动同步:
mysql> change master to
  > master_host='master_ip',
  > master_user='user',
  > master_password='pwd',
  > master_port=3307,
  > master_log_file='mysql-bin.000020',
  > master_log_pos=135617781;
1 row in set (0.00 sec)
mysql> slave start; 1 row in set (0.00 sec) 再次查看slave状态发现:
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes ...
  Seconds_Behind_Master: 0
 
方法一是强制性从某一个点开始同步,会有部分没有同步的数据丢失,后续主服务器上删除记录同步也会有一些错误信息,不会影响使用.
 
解决办法II:
使用SQL_SLAVE_SKIP_COUNTER参数
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
 
关于此参数的说明。

背景知识1:

    在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=N以跳过命令。常用的且不易用错的是N=1的情况,但N>1时,则不那么顾名思义,本文详细介绍N的意义,及使用注意事项。

    背景知识2:

    MySQL从库从主库上复制binlog文件内容到本地执行。在binlog上命令以event的形式存在,并非一个命令对应一个event。以一个insert语句为例(引擎InnoDB、binglog_format=statement), 在binlog中实际上有三个event,分别为begin\insert\commit 。 命令类型都是Query_log_event.

而set global sql_slave_skip_counter=N的意思,即为在start slave时,从当前位置起,跳过N个event。每跳过一个event,则N--.

    与实际情况不符?

    看到这里有同学就会问,这是有问题的。如果当前的执行位置是某个insert语句开头,那使用 N=1实际上是从begin\insert\commit的第二个开始执行,这个insert语句还是不能被跳过?

实际上这里还有两个策略:

1、若N=1且当前event为BEGIN, 则N不变,跳过当前event继续。

2、若N=1且当前event处于一个事务之内(BEGIN之后,COMMIT之前),则N不变,跳过当前event继续。

说明:其实上面两个策略合起来就是一句话,当N=1时,会连续跳过若干个event,直到当前所在的事务结束。

当然如果N>1,则每跳过一个event都要N--.

    命令举例:

    所以我们平时最常用的N=1的情况,都是下一个事务

假设某个Pos之后执行如下命令( 引擎InnoDB、binglog_format=statement),

insert into t values(x1);

begin;

insert into t values(x2);

insert into t values(x3);

commit;

insert into t values(x4);

你的从库stop在Pos上,假设你要跳过前面几个命令直接执行插入x4的操作,则你的N设置为 4或5或6或7均可。(X1语句为3个event)

其他说明:

上面举例中都特别说明了在innodb引擎和statement模式下。其他情况区别如下:

1、若引擎为myisam(等不支持事务的引擎),且在statement下,则binlog中不会有begin和commit,每个命令都是一个event;

2、row模式的binlog里,一个insert语句实际上是两个event(Table_map_event和 Row_log_event), 计算时应与statement不同。

3、在row模式下,不论引擎是否支持事务,一个insert语句都会加上BEGIN和commit,也即变成4个event。

4、基于InnoDB引擎表的insert/delete/update操作都有显式样的BEGIN /COMMIT.

上面举的这个例子中,若为row模式,则要直接执行X4语句需要设置的N为 5~10均可。

   小结:

   1、set global sql_slave_skip_counter=N中的N是指跳过N个event

2、最好记的是N被设置为1时,效果跳过下一个事务

3、跳过第N个event后,位置若刚好落在一个事务内部,则会跳过这整个事务

4、一个insert/update/delete不一定只对应一个event,由引擎和日志格式决定

Slave_SQL_Runing:NO 复制出现问题的解决办法的更多相关文章

  1. SQL Server跨库复制表数据错误的解决办法

    SQL Server跨库复制表数据的解决办法   跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...

  2. Windows远程桌面(mstsc)不能复制粘贴的解决办法

    原来通过mstsc远程连接Windows能够直接在本地和服务器之间复制.粘贴一些文字和文件,最近突然无法直接复制粘贴了,只能通过远程映射的本地磁盘方式交换文件,太为繁琐. 已经确认远程桌面连接选项“本 ...

  3. wincc项目移植和复制解决办法

    wincc项目复制 wincc项目不支持直接复制,部分的后台数据库在活跃状态,直接复制wincc项目,会提示跳过活跃状态的数据库,当跳过活跃数据库时,复制的项目也是无效的.在wincc项目管理器中打不 ...

  4. [MySQL复制] SQL_ERROR 1032解决办法(non-gtid env)

    一.缘由: 在主主同步的测试环境,由于业务侧没有遵循同一时间只写一个点的原则,造成A库上删除了一条数据,B库上在同时更新这条数据. 由于异步和网络延时,B的更新event先到达A端执行,造成A端找不到 ...

  5. Oracle SQL Developer 编辑区不能删除,后退,空格,复制粘贴等功能都失效的解决办法

    Oracle SQL Developer 编辑区不能删除,后退,空格,复制粘贴等功能都失效的解决办法 解决: 打开菜单并选择Tools-prefrence-Accelerators-Load Pres ...

  6. 兼容各个浏览器的jquyer zclip复制文本插件 无效的解决办法

    项目中使用点击文本复制功能,用了这个兼容各个浏览器的插件,但是发现放在最前面正常,放到嵌套的html中就失效. 解决办法: <span style="position: relativ ...

  7. vim复制粘贴导致多行出现#号解决办法

    在vim内复制多行假如复制的行带有#号会导致其他不带#号的行自动加# 解决办法,输入一下命令再粘贴即可 :set paste

  8. Eclipse部署Maven web项目到tomcat服务器时,没有将lib下的jar复制过去的解决办法

    我们在做web开发是,经常都要在eclipse中搭建web服务器,并将开发中的web项目部署到web服务器进行调试,在此,我选择的是tomcat服务器.之前部署web项目到tomcat进行启动调试都很 ...

  9. 【原】Eclipse部署Maven web项目到tomcat服务器时,没有将lib下的jar复制过去的解决办法

    我们在做web开发是,经常都要在eclipse中搭建web服务器,并将开发中的web项目部署到web服务器进行调试,在此,我选择的是tomcat服务器.之前部署web项目到tomcat进行启动调试都很 ...

随机推荐

  1. Python3 面向对象程序设计(类)

    一.自定义类 1.属性与方法 格式: class classname: def __init__(self,a,b): self.a=a   self.b=b def ... >一般都有一个__ ...

  2. winform制作小工具的技巧

    在使用winfrom制作一些工具的时候,一些基本设置都是去属性里面找来找去,一段时间就忘了,记录记录以备不时之需. 一.窗体绘制的常用设置 窗体的设置应当在窗体构造函数中InitializeCompo ...

  3. gulp inline

    在html中所有需要内敛的文件 script link 后面都要写上inline 这样才能够,内敛到文件中.

  4. JavaScript 第一课

    今天进入到了js的阶段,了解到了JavaScript是一个很重要的阶段,所以要好好的理清每一个知识点 JavaScript的使用:   在<head>标签里应用<script> ...

  5. 总结两种动态代理jdk代理和cglib代理

    动态代理 上篇文章讲了什么是代理模式,为什么用代理模式,从静态代理过渡到动态代理. 这里再简单总结一下 什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原 ...

  6. maven工程中pom.xml的错误

    更新maven工程,出现如下错误信息. Could not calculate build plan: Failure to transfer org.apache.maven.plugins:mav ...

  7. 1. MongoDB 安装和启动

    1. MongoDB是一个Document Database.A record in MongoDB is a document,MongoDB documents are similar to JS ...

  8. Tkinter开发第一个桌面程序HelloWorld

    在Python3中是tkinter,Python2中是Tkinter Tkinter是Python 官方承认的标准 GUI 方案(de-facto standard),因为是Python自带安装,决定 ...

  9. C# 实现语音听写

    本文系原创,禁止转载. 分享如何使用c#对接科大讯飞语音听写服务,简单高效地实现语音听写. 实现语音听写主要分为录音和语音识别两部分:录音是指获取设备声卡端口的音频数据并将之保存为音频文件,语音识别就 ...

  10. Python基础之模块、数据类型及数据类型转换

    一.模块 1.标准库 不需要安装,直接调入使用的模块. import sys模块: import sys print(sys.path) #打印环境变量绝对路径 print(sys.argv) #打印 ...