损坏的从属服务器(MySQL 复制)

损坏的从属服务器(MySQL 复制)

昨晚,一位开发人员在主机上运行了错误的 mySQL 语句(查询插入具有重复主键的行)。突然,到从机的复制停止了。从机开始将其写入 mysql_relay_logs,在我们监控和修复它之前,磁盘空间不足了。

Master 配置为保存最近 3 天的 bin_logs,因此我们还没有完全丢失复制。有人能帮我解决这个问题吗?

我的大师身份:

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000017
Position: 30844254
Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

从属状态:mysql

> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
             Slave_IO_State: 
                Master_Host: 192.168.140.110
                Master_User: replication_user
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000014
        Read_Master_Log_Pos: 61132382
             Relay_Log_File: mysqld-relay-bin.000037
              Relay_Log_Pos: 1405976
      Relay_Master_Log_File: mysql-bin.000014
           Slave_IO_Running: No
          Slave_SQL_Running: No
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 1062
                 Last_Error: Error 'Duplicate entry '13676-1-2' for key 1' on query. Default database: 'XXX'. Query: 'YYY'
               Skip_Counter: 0
        Exec_Master_Log_Pos: 1405839
            Relay_Log_Space: 8974037551
            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: NULL
1 row in set (0.00 sec)

有人可以给我确切的命令让一切恢复正常吗?正如我所说,我确信我们已经丢失了从属服务器上的数据,因为它的磁盘空间不足,但我们一定在主服务器上有数据。

我的下一个问题是:如何确保这种情况不再发生。

非常感谢 Sparsh Gupta

答案1

最直接的做法是清除从服务器上的数据,然后重新开始复制​​主服务器。可以使用 mysqldump 或通过 rsync 之类的工具复制主服务器。根据数据库的大小,您可能会遇到停机时间。这种方法总是有效的。

如果您清除从属驱动器的空间,则有可能可以使用以下命令从发生错误的地方开始复制(从 mysql 内部):

start slave

如果主服务器的 bin.log 文件已就位,则复制可能会立即启动。我遇到过这种情况的次数不多。

我上次这样做是当开发人员向数据库添加新表时,但没有先在从属服务器上创建它。我创建了表,并且必须使用 sql_slave_skip_counter 跳过 bin.log 中丢失的位。然后我手动插入了我跳过的 20 行数据。

答案2

只需停止从属,然后跳过使用 ( 产生重复条目的 sql 语句http://dev.mysql.com/doc/refman/5.0/en/set-global-sql-slave-skip-counter.html

mysql> stop slave;
mysql> SET GLOBAL sql_slave_skip_counter = 1;
mysql> start slave;

如果运行上述命令后错误不同,只需重复该命令直到从属服务器工作。但如果这种方式不起作用,您必须从头开始重新创建从属服务器。

相关内容