MySQL主从常见问题收集汇总

  1. 问题:Last_Error: Error 'Operation DROP USER failed for 'guest'@'localhost'' on query. Default database: 'work'. Query: 'drop user 'guest'@'localhost''
    现象:今天,所有MySQL从服务器上的主从复制都被异常中断了,登陆到其中一台上执行show slave status\G,发现如下错误:
    --
    Last_Error: Error 'Operation DROP USER failed for 'guest'@'localhost'' on query. Default database: 'work'. Query: 'drop user 'guest'@'localhost''
    --
    分析:也就是说,是 drop user 'guest'@'localhost' 这条命令导致的,而这样的操作我们通常都只会在Master上进行,并且该操作应该只会影响到“mysql”这个系统数据库。之前这种操作进行了很多次,可为什么唯独这一次会出问题呢?
    经过一番调查之后,最终找到了问题的根源,那就是,
    “binlog-do-db, binlog-ignore-db, replicate-do-db, replicate-ignore-db” 这一类参数,并非想象中可靠!通常,我们会以为只要设定了以上参数,MySQL的主从复制就会只对我们设定的数据库生效。但事实上,MySQL不是根据内容来判断的,而是很傻瓜的根据你执行了“use work”或在初始连接时指定的数据库来判断的。
    而这次,我们在执行drop user之前,因为需要从“work”数据库select一些数据,就use work进入到了work数据库,而大家都知道在执行drop user的时候是不需要进入“mysql”这个系统数据库的,所以就直接执行了drop user,但因为MySQL的判断我们是在use work之后执行的,所以认为是针对“work”数据库的操作就同步了下去,而从服务上都是没有guest@localhost这样的用户的,所以就造成了错误,导致主从复制的中断。因此,在有主从复制架构的MySQL服务器环境中,我们要尽量避免这样的跨库操作,确保是在执行了正确的use dbname之后再执行命令。解决方案:这类故障的恢复方案很简单,就是跳过这一条SQL。

    stop slave;
    set global sql_slave_skip_counter=1;
    start slave;
    show slave status\G
    

    参考资料:
    http://www.mysqlperformanceblog.com/2009/05/14/why-mysqls-binlog-do-db-option-is-dangerous/

  2. 问题:Last_SQL_Error: Error 'Duplicate entry '822873' for key 'PRIMARY'' on query. Default database: '7477_com_home'. Query: 'INSERT INTO `mygame_member` (`email`,`username`,`uid`,`user_status`) VALUES ('bclhen120819@7477.com','bclhen120819',822873,3)'
    现象:重启主MySQL后,登录到从MySQL执行show slave status\G,发现如下错误:
    Last_SQL_Error: Error 'Duplicate entry '822873' for key 'PRIMARY'' on query. Default database: '7477_com_home'. Query: 'INSERT INTO `mygame_member` (`email`,`username`,`uid`,`user_status`) VALUES ('bclhen120819@7477.com','bclhen120819',822873,3)'
    分析:主库重启导致从库数据不同步而且主键冲突
    解决方案:修改从库的/etc/my.cnf文件
    在里面的[mysqld]下面加入了一行
    slave-skip-errors = 1062 (忽略所有的1062错误)
    重启下从库的mysql /etc/init.d/mysqld restart
    再 show slave status \G;一下发现正常了
    参考资料:
    http://storysky.blog.51cto.com/628458/259280
    http://blog.csdn.net/u012708106/article/details/17228435
  3. 问题:MySQL主从数据不一致
    解决方案:参考:
    MySQL主从数据不一致可能的原因整理:http://www.3mu.me/mysql%E4%B8%BB%E4%BB%8E%E6%95%B0%E6%8D%AE%E4%B8%8D%E4%B8%80%E8%87%B4%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0%E6%95%B4%E7%90%86/
  4. 问题:运行:”show slave status\G;“时,出现”ERROR: No query specified“的错误提示
    解决方案: ”show slave status\G“ \G就是结束  再加一个";" 就多余了,所以才报错,这2个结束符号别重复使用就是了
发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据