mysql结构复制从master到slave,slave数据完整

Posted

技术标签:

【中文标题】mysql结构复制从master到slave,slave数据完整【英文标题】:mysql structural replication from master to slave with slave data intact 【发布时间】:2012-09-02 11:28:51 【问题描述】:

这是我想要实现的目标

    我想建立一个只保存表的主数据库 结构,没有数据。 从属数据库将采用主数据库的结构。 只有从数据库会包含数据 任何结构更改(例如更改表、删除表等) master 应该更新到 slave 数据库而不丢失数据

如何实现这一点,因为现在我需要在每个数据库上手动运行查询,以保持结构同步,这不是一个好的选择。我想自动化这个过程,以便任何可以帮助我的人。非常感谢任何可以让我实现这一目标的建议或任何教程的链接

【问题讨论】:

删除表而不丢失数据?真的吗? 丢失的数据部分是针对 alter 命令而不是 drop.. 如果我想删除表,我不想保存数据 【参考方案1】:

这实际上无法完成,但您可以通过某种方式破解。首先设置普通的从站。同步后,它们将具有与单个主控相同的架构。现在的诀窍是在主服务器上进行查询,这些查询传播到从服务器,但不要在主服务器上留下数据。首先像往常一样进行查询,确保每个表都有一个自动增量键:

INSERT INTO tbl (col1, col2, col3) VALUES (val1, val2, val3);
SELECT LAST_INSERT_ID();

当您进行查询时,记录时间,并将最后一个插入 id 保存在应用程序级别的队列中。间歇性地在从属服务器上进行查询(例如,10 秒,具体取决于您的负载):

SHOW SLAVE STATUS;

并从当前系统时间中减去 Seconds_Behind_Master 值(调用此时间 t1)。现在遍历旧查询队列,只要该元素上的时间大于 t1,就删除第一个元素。每次删除队列中的元素时,您都希望从主设备中删除该记录,但将其保留在从设备上(您已经知道它是因为自从您进行所述查询以来它们已经更新)。所以现在清除主数据库(在给定时间将有大约 10 秒的数据)而不清除从属数据库:

SET sql_log_bin=0;
DELETE FROM tbl WHERE autoincrement_key=last_insert_id;
SET sql_log_bin=1;

其中 last_insert_id 是存储的 LAST_INSERT_ID() 以供查询清除。

【讨论】:

感谢您的回复,一定会尝试并告诉您进展如何

以上是关于mysql结构复制从master到slave,slave数据完整的主要内容,如果未能解决你的问题,请参考以下文章

在mysql中将数据从slave更新到master

MySQL主从复制-GTID原理

MySQL复制常用拓扑结构详解

在centos上创建MariaDB/Mysql主从(Master/Slave)

mysql怎么实现主从复制

MySQL主从复制原理