Broken Slave(MySQL 复制)

Spa*_*pta 2 mysql mysql-replication mysql5

昨晚,其中一位开发人员在主机上运行了错误的 mySQL 语句(查询插入具有重复主键的行)。突然,复制到它的从站停止了。Slave 开始将它写入 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)
Run Code Online (Sandbox Code Playgroud)

从站状态: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)
Run Code Online (Sandbox Code Playgroud)

有人能给我确切的命令让一切恢复正常吗?正如我所说,我确信我们已经丢失了从磁盘上的数据,因为它的磁盘用完了,但我们必须在主上有数据。

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

非常感谢 Sparsh Gupta

Chr*_*ing 5

直接的做法是清除从站上的数据,然后从主站的新副本重新开始。可以使用 mysqldump 或通过诸如 rsync 之类的东西来复制 master。根据您的数据库有多大,您可能会遇到停机时间。这将始终有效。

如果您清除从驱动器上的空间,则有可能通过使用(从 mysql 内部)从发生错误的位置开始复制:

start slave

如果 master 的 bin.log 文件就位,复制就有可能立即开始。我没有太多的经历发生这种情况。

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