mysql主从同步产生的 Error_code = 1062 或 1032问题

mysql主从同步导致1062和1032问题

事情起因

不知道为什么mysql的数据库所在磁盘空间满了。导致主从出现数据不一致。可是我并不知道是空间满了引起的,各种办法使用了,mysql却停不了。登陆mysql也没办执行命令。然后就

```
    kill -9 mysql's pid
```

结果就悲剧了。mysql的主从被破坏。(这个是时候才想起来看一下磁盘空间问题,已经晚了)想了很多方式,还是没办法解决。最后决定重新做一下从库。进入主题。


==友情提示:千万不要 kill -9 谁用谁知道==


下面是我操作的具体步骤

  1. 拉取主库的备份文件。恢复从库数据。
  2. 设置从库的binlog日志和pos点。
  3. 启动重复,开启复制。

悲剧开始

  1. 主从出现问题,输入:show slave status \G; 这个时候出现了Error_code: 1062的错误。附上当时的主从的状态和错误日志。

    Slave_IO_Running: Yes
    Slave_SQL_Running: No
    2016-06-09 00:07:07 23352 [ERROR] Error reading packet from server: Lost connection to MySQL server during query ( server_errno=2013)
    2016-06-09 00:07:07 23352 [Note] Slave I/O thread killed while reading event
    2016-06-09 00:07:07 23352 [Note] Slave I/O thread exiting, read up to log 'mysql-bin-190.000667', position 9049889
    2016-06-09 00:07:07 23352 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
    2016-06-09 00:07:07 23352 [Warning] Slave SQL: If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0
    2016-06-09 00:07:07 23352 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin-190.000666' at position 2935199, relay log './mysql3306-relay-bin.000002' position: 2935366
    2016-06-09 00:07:07 23352 [Note] 'SQL_SLAVE_SKIP_COUNTER=1' executed at relay_log_file='./mysql3306-relay-bin.000002', relay_log_pos='2935366', master_log_name='mysql-bin-190.000666', master_log_pos='2935199' and new position at relay_log_file='./mysql3306-relay-bin.000002', relay_log_pos='2935750', master_log_name='mysql-bin-190.000666', master_log_pos='2935583' 
    2016-06-09 00:07:07 23352 [Note] Slave I/O thread: connected to master '[email protected]:3306',replication started in log 'mysql-bin-190.000667' at position 9049889
    2016-06-09 00:07:08 23352 [ERROR] Slave SQL: Could not execute Write_rows event on table asy.pm_camera_recordrate; Duplicate entry '913df478e36f4f888505874ddec59240' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin-190.000666, end_log_pos 2944382, Error_code: 1062
    2016-06-09 00:07:08 23352 [Warning] Slave: Duplicate entry '913df478e36f4f888505874ddec59240' for key 'PRIMARY' Error_code: 1062

    解决方式:在my.cnf文件中加入如下代码到[mysqld]。重启mysql

    slave-skip-errors = 1062
  2. 执行完第一步。由于数据问题,又出现了。Error_code: 1032错误。

解决方式:在my.cnf文件中加入如下代码到[mysqld]。重启mysql

```
slave-skip-errors = 1062,1032
```

如果能预估到错误数据比较少。也可以用如下代码。每次执行只跳过一个事务。

```
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 ;
start slave ;
```

可能出现的问题

跳过1062和1032错误 。可能会导致日志中出现警告信息。所以在在my.cnf文件中加入如下代码到[mysqld]。重启mysql可解决问题。

```
binlog_format=mixed
```

反思问题起因

  1. 在从库由于使用了 kill -9 杀掉了mysql线程。可能导致了mysql的事务回滚。也有可能导致了mysql中继日志出现问题。
  2. 在拉取备份文件恢复的时候。由于拉取了最新的备份数据。恢复数据的时候。只是重设了同步的binlog文件和pos点。并没有修改中继日志的起点。导致了中继日志中的数据应该是比数据库中的备份点数据更早了。然后产生了1062主键冲突和1032删除数据不存在的错误。

以上类容纯属猜想,并未真正验证,如有理解错误,欢迎大家指正,谢谢!

你可能感兴趣的:(MySQL,mysql,数据库,磁盘,同步,数据)