我们的奴隶,只是用于备份,是不同步的。 它已经撞上了一个关键的限制。
我想find一种方式来重新同步奴隶,而不需要主人离线,我知道我可以这样做,但我相信有可能不会。
我拥有“高性能MySQL”,它指向了maatkit的方向,特别是mk-table-sync。
对于我的生活,我不能让mk表同步工作。
我在奴隶上如此运行:
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不同步。 但从我可以告诉的forms,输出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)在主数据库( mydb )我想创build下表:
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
当我尝试运行同步命令之前在从服务器上运行checksum replicate命令时,根本没有任何操作。
在我的例子中连接和工作的从站,我也禁用外键检查,因为我们正在使用INNODB,并在运行同步时获得外键约束问题。
也许这会帮助你,如果你把从属服务器:
mysql> STOP SLAVE; mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; mysql> START SLAVE;
从机的数据在完成追踪后会有所不同。 首先在master上运行mk-table-checksum –replicate,然后在slave上运行mk-table-sync –replicate(文档中有一个例子)。
我不清楚你从–dry-run的输出中了解到你的slave的状态,但是-dry-run不能比较任何数据。 它只是告诉你它将检查什么表和什么同步algorithm。
我认为需要更清楚地说明干什么,所以我创build了一个function请求: http : //code.google.com/p/maatkit/issues/detail ?id=691
我欢迎您的意见和Maatkit邮件列表!
我有类似的情况,我需要定期validation我的主从站之间的数据一致性。
我写了一个脚本来处理这个问题,我把它投入到crontab中,并在每个星期天都运行,当时我知道不会有太多的数据被写入复制的数据块。
我应该注意到这是用PHP编写的,而且从站/主站与主站驱动器上托pipe的NFS位于同一个networking上@ / home / sharefiles /
我相信有些人可能会对这样做有些抱怨,但它能很好地满足我的需求,只需要几秒钟的时间。
/ *此脚本每周运行以停止复制,删除数据库,将它们从主复制到从属* /
/ *然后再次开始复制。 不要触摸这个脚本! * /
//停止奴隶奴隶
$ slave = mysql_connect(“slave”,“user”,“pw”);
mysql_query(“STOP SLAVE”,$ slave);
//重置位置
mysql_query(“RESET SLAVE”,$ slave);
//获取主信息,位置等
$ master = mysql_connect(“localhost”,“user”,“pw”);
$ masterinfo = mysql_fetch_assoc(mysql_query(“SHOW MASTER STATUS”,$ master)); // $ masterinfo [文件],$ masterinfo [位置]
// DBS被复制
$ dbArray = array(“db1”,“db2”,“db3”,“db4”);
//转储每个分贝并复制到奴隶
foreach($ dbArray as $ 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 ='复制',MASTER_PASSWORD ='replicationuserpassword',MASTER_LOG_FILE ='$ masterinfo [文件]',MASTER_LOG_POS = $ masterinfo [Position]”,$ slave);
mysql_query(“START SLAVE”,$ slave);