MySQL 从服务器与主服务器不同步

MySQL 从服务器与主服务器不同步

我们的从属设备(仅用于备份)不同步。它在一个关键限制上崩溃了。

我想找到一种方法来重新同步从属设备而不使主设备离线,我知道我可以这样做,但我相信不这样做也是可能的。

我面前有“高性能 MySQL”,它将我指向 maatkit 的方向,特别是 mk-table-sync。

我一生都无法让 mk-table-sync 工作。

我在从属服务器上像这样运行它:

root@machine:~# mk-table-sync --sync-to-master --dry-run 127.0.0.1
# Syncing h=127.0.0.1
# DELETE REPLACE INSERT UPDATE ALGORITHM EXIT DATABASE.TABLE
#      0       0      0      0 Chunk     0    database.case_study_product
#      0       0      0      0 Chunk     0    database.case_study_region
#      0       0      0      0 Chunk     0    database.case_study_sector
#      0       0      0      0 Chunk     0    database.contact
#      0       0      0      0 Chunk     0    database.contact_issue
#      0       0      0      0 Chunk     0    database.feedback
#      0       0      0      0 Chunk     0    database.feedback_rating
#      0       0      0      0 Chunk     0    database.feedback_usefulness
#      0       0      0      0 Chunk     0    database.help
#      0       0      0      0 Chunk     0    database.help_issue
#      0       0      0      0 Chunk     0    database.search_weight
#      0       0      0      0 Chunk     0    database.contented_content
#      0       0      0      0 Nibble    0    database.contented_content_index
#      0       0      0      0 Chunk     0    database.contented_content_log

我确实知道 contented_content 和 contented_content_index 不同步。但从我所知道的输出来看,maatkit 认为一切都很好。

以下是从属状态的输出:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.0.40.12
                Master_User: rep1
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000023
        Read_Master_Log_Pos: 25832973
             Relay_Log_File: mysql-relay-bin.000002
              Relay_Log_Pos: 19098703
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          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: 1452

任何帮助、指点……询问更多信息……等等

答案1

经过一番思考并在虚拟环境中尝试之后,我终于设法将从属设备同步到主设备。

1)在数据库中(数据库)在掌握我想要创建下表:

CREATE TABLE checksum (
     db         char(64)     NOT NULL,
     tbl        char(64)     NOT NULL,
     chunk      int          NOT NULL,
     boundaries char(100)    NOT NULL,
     this_crc   char(40)     NOT NULL,
     this_cnt   int          NOT NULL,
     master_crc char(40)         NULL,
     master_cnt int              NULL,
     ts         timestamp    NOT NULL,
     PRIMARY KEY (db, tbl, chunk)
);

2)在掌握运行以下命令:

mk-table-checksum -d mydb --replicate mydb.checksum 127.0.0.1

3)在奴隶运行以下命令:

mk-table-sync -d mydb --replicate mydb.checksum  --sync-to-master --no-foreign-key-checks --execute 127.0.0.1

当我尝试在运行同步命令之前在从属服务器上运行校验和复制命令时,它什么也没做。

在我的示例中,从属设备已连接并正在工作,并且我禁用了外键检查,因为我们正在使用 INNODB,并且在运行同步时出现外键约束问题。

答案2

也许如果你把从属服务器放上去会有所帮助:

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;

答案3

从服务器完成同步后,其数据将有所不同。首先在主服务器上运行 mk-table-checksum --replicate,然后在从服务器上运行 mk-table-sync --replicate(文档中有示例)。

我不清楚您从 --dry-run 的输出中了解到了从属服务器的状态,但 --dry-run 不会比较任何数据。它只是告诉您它将检查哪些表以及使用哪种同步算法。

答案4

我有一个类似的情况,我需要定期验证主服务器和从服务器之间的数据一致性。

我编写了一个脚本来处理这个问题,并将其放入 crontab 中并让它每个星期天运行,因为我知道在这段时间内不会有太多数据被写入复制的数据库。

我应该注意这是用 PHP 编写的,并且从属/主服务器位于同一网络上,并且 NFS 托管在主服务器的驱动器 @ /home/sharefiles/ 上

我确信有些人可能会抱怨这样做的方式,但它很好地满足了我的需求,并且只需要几秒钟即可运行。

/* 此脚本每周运行一次以停止复制、删除数据库、并将其从主服务器复制到从服务器 */

/* 并再次开始复制。不要碰这个脚本!!*/

//停止从站上的从站

$slave = mysql_connect("从属", "用户", "pw");

mysql_query("停止从属服务器", $slave);

//重置位置

mysql_query("重置从属服务器", $slave);

//获取主信息,位置等

$master = mysql_connect("localhost", "用户", "pw");

$masterinfo = mysql_fetch_assoc(mysql_query("显示主状态", $master)); // $masterinfo[文件], $masterinfo[位置]

//需要复制的Dbs

$dbArray = 数组("db1", "db2", "db3", "db4");

//转储每个数据库并复制到从属数据库

foreach($dbArray 作为 $db) {

    system("mysqldump $db > /home/sharefiles/$db.sql");

    system("mysql -h slaveaddress -u root --password=pw --database=$db < /home/sharefiles/$db.sql");

}

mysql_query("将 MASTER 更改为 MASTER_HOST='master', MASTER_USER='replication', MASTER_PASSWORD='replicationuserpassword', MASTER_LOG_FILE='$masterinfo[File]', MASTER_LOG_POS=$masterinfo[Position]", $slave);

mysql_query("启动从服务器", $slave);

相关内容