Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2446494
  • 博文数量: 540
  • 博客积分: 11289
  • 博客等级: 上将
  • 技术积分: 6160
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-11 20:27
个人简介

潜龙勿用,见龙在田

文章分类

全部博文(540)

文章存档

2018年(2)

2013年(5)

2012年(24)

2011年(104)

2010年(60)

2009年(217)

2008年(128)

分类: Mysql/postgreSQL

2008-12-31 10:58:35

slave复制错误

Description:

...
Slave_IO_Running: Yes
Slave_SQL_Running: No
        Last_Errno: 1008
        Last_Error: Error 'Can't drop database 't2'; database doesn't exist' on query. Default database: ''. Query: 'drop database t2'
...
Seconds_Behind_Master: NULL

Resolve Solution:

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> set global sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.3.21
                Master_User: slave
                Master_Port: 3307
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000006
        Read_Master_Log_Pos: 98
             Relay_Log_File: mysqld-relay-bin.000018
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000006
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 98
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)

当show slave status\G出现类似database doesn't exist'的error时,都优先考虑使用如下三个步骤来恢复:
stop slave;set global sql_slave_skip_counter=1;start slave

-------------------------2009-04-17--------------------------------------------
上面解决方法是错的,因为就这样忽略会导致slave丢失从发生错误以来的对该库的所有更新,并且只要有对该库有写操作,slave将不停地报错。


场景模拟举例:

1. master上创建了一个db testslave成功复制后,我使用管理员权限帐号登录slave mysql,并drop掉这个库。这个时候slave还不会报错的,因为test没有变化。


2. 但是此时master又在test库上创建了一个表pet,那么slave接收到这个操作语句后,它会发现test db不存在,就报错了。


解决方法:


解决这个问题首先要解决的是如何保证slavetest 数据库的数据与master保持一致,也即要知道slave出错以来test db都发生了什么变化。如果真要去弄清楚test db在此期间做了哪些更新操作,那么可能问题变得十分复杂。我觉得最快让slave恢复工作的方法是从master server上将test db复制过来,这很可能要停库,因为这个错误已经不能让slave正常复制数据了,是一个非常严重的问题。


还有,此类错误,代码不一定都是1008,我后来的实验中错误代码是1049,1051。


通过这个实验,slave上帐号权限管理须得小心,对于线上的db server,除非有特殊需要(如对mysql等不进行异步复制的数据库进行更新操作),否则不要对slave进行任何写操作。

-------------------------2009-04-17--------------------------------------------------




阅读(2877) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~