【发布时间】:2015-10-22 18:17:38
【问题描述】:
我有一个主数据库,并且正在定期将数据从该数据库移动到第二个数据仓库。
我不想每次都迁移整个表,而只想迁移自上次运行进程以来已更改的行。使用 WHERE 子句很容易做到这一点。但是,假设在主数据库中删除了一些行。我没有很好的方法来检测哪些行不再存在,因此我也可以在数据仓库中删除它们。有没有好的方法来做到这一点? (而不是每次都重新加载整个表,因为表很大)
【问题讨论】:
标签: mysql etl data-warehouse
我有一个主数据库,并且正在定期将数据从该数据库移动到第二个数据仓库。
我不想每次都迁移整个表,而只想迁移自上次运行进程以来已更改的行。使用 WHERE 子句很容易做到这一点。但是,假设在主数据库中删除了一些行。我没有很好的方法来检测哪些行不再存在,因此我也可以在数据仓库中删除它们。有没有好的方法来做到这一点? (而不是每次都重新加载整个表,因为表很大)
【问题讨论】:
标签: mysql etl data-warehouse
可以按照以下步骤完成,假设在这个示例中我使用的是客户表:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
创建 CDC:
CREATE TABLE CUSTOMERS_CDC(
ID INT NOT NULL,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
在源表上触发如下删除事件:
CREATE TRIGGER TRG_CUSTOMERS_DEL
ON CUSTOMERS
FOR DELETE
AS
INSERT INTO CUSTOMERS_CDC (ID, LAST_UPDATED)
SELECT ID, getdate()
FROM DELETED
在您查询更改源的 ETL 流程中,通过 UNION 添加已删除的记录信息或创建单独的流程,如下所示:
SELECT ID, NAME, AGE, ADDRESS, LAST_UPDATED, ‘I/U’ STATUS
FROM CUSTOMERS
WHERE LAST_UPDATED > @lastpulldate
UNION
SELECT ID, null, null, null, LAST_UPDATED, ‘D’ STATUS
FROM CUSTOMERS_CDC
WHERE LAST_UPDATED > @lastpulldate
【讨论】:
如果您只是触发更新查询,那么它不会更新行。
我看到的方式:假设您有自己的方式来执行 where 子句。 Youd 将其作为更新查询的一部分,除非您正在执行 csv 导出。如果您对要更新的行进行 mysql 转储并在主数据库中创建一个新的 tempTable,
然后
UPDATE mainTable WHERE id = (SELECT id from tempTable WHERE id >0 and id <1000)
如果没有对应的匹配,则不运行更新,也不会发生错误,使用 id 限制作为参数。
【讨论】: