如何在不同的 mysql 数据库服务器上的两个数据库之间同步表的子集?

如何在不同的 mysql 数据库服务器上的两个数据库之间同步表的子集?

我有一个主 MySQL 数据库,其中一个 car 表中包含以下列:

 +---------------+-----------------+------+
 |carId          |name             |model |   
 +---------------+-----------------+------+
 |1              |ford             |focus |
 |2              |Toyota           |Yaris |
 +---------------+-----------------+------+ 

以下是我想要实现的目标:

我想在其他 msql 服务器中创建新的数据库,并希望创建与上面相同的表,并希望在新的 car 表中添加以下列

+---------------+-----------------+------------+-----------+------------+
|carId          |name             |model       |make       |workHistory |
+---------------+-----------------+------------+-----------+------------+
|1              |ford             |focus       |2001       |yes         |
|2              |Toyota           |Yaris       |2002       |no          |
+---------------+-----------------+------------+-----------+------------+
  1. 我希望新数据库表从主 SQL 数据库 car 表中获取carIdnamemodel列的数据。并且只想自己在新数据库 car 表中插入列 ( makeworkHistory) 的数据。因此,这个新 car 表将结合主 MySQL 数据库和新数据库的数据。
  2. 如果主数据库汽车表有任何变化,我希望这些变化与新数据库中的汽车表同步。例如,如果我们删除了主数据库汽车表中的 ID,它也应该从新汽车表中删除。

答案1

这与复制无关 - 只需使用附加表:

CREATE TABLE car_more (
    carId INT NOT NULL,
    make INT,
    workHistory
    PRIMARY KEY (carId)
);

如果您引用的数据库(您指的是数据库还是表?)位于 mysql 的单独实例上,则使用联合引擎提供对现有表的远程访问。然后,您可以使用...访问数据。

SELECT a.carId, a.name, a.model, b.make, b.workHistory
FROM car a
LEFT JOIN car_more b
ON (a.carId=b.carId);

如果它们在同一个 mysq 实例上,那么只需在表名前加上数据库名称作为前缀:

SELECT a.carId, a.name, a.model, b.make, b.workHistory
FROM maindb.car a
LEFT JOIN alternatedb.car_more b
ON (a.carId=b.carId);

(您可以使用 mysql amster-master 复制来维护汽车表的本地副本 - 但这要复杂得多)

答案2

首先,数据库设计。 为什么您只想要从属数据库中的makeworkHistory列吗?在我看来,它们是相关的,并且与其他列中的数据是一一对应的关系。从逻辑上讲,数据应该放在一起...为什么要分开呢?

在数据库管理方面,拥有所有被复制数据的一份规范副本会更容易。

第二,你打算写作到第二个数据库还是只从中读取?只读更易于管理。


假设您想要一个只读的从属服务器,请按正常方式设置复制并确保从属服务器上的权限仅允许SELECT

如果您不想在主表中添加额外的列,请使用 创建第二个表carIdmodel然后workHistory创建一个看法让他们加入到carId


如果您想要写入从服务器,则需要多主复制或类似的东西。这更复杂。如果您想要的话,我会添加更多内容。

相关内容