迁移数据时如何检测删除的行

How to detect deleted rows when migrating data

我有一个主数据库,并定期将数据从该数据库移动到第二个数据仓库。

我不想每次都迁移整个 table,而是只想迁移自上次 运行 过程以来发生更改的行。使用 WHERE 子句很容易做到这一点。但是,假设主数据库中的某些行已被删除。我没有好的方法来检测哪些行不再存在,因此我也可以在数据仓库中删除它们。有没有好的方法来做到这一点? (与每次重新加载整个 table 相反,因为 table 很大)

如果您只是触发更新查询,那么它不会更新行。

我的看法:假设您有自己的方式来执行 where 子句。 Youd have that as part of update query,除非你正在进行csv导出。如果您对要更新的行进行 mysql 转储并在主数据库中创建一个新的临时表,

然后

UPDATE mainTable WHERE id = (SELECT id from tempTable WHERE id >0 and id <1000) 

如果没有对应的匹配项,则不会更新 运行,并且不会发生错误,通过使用 id 限制作为参数。

可以按照以下步骤完成,假设在这个例子中我使用的是客户 table:

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)
);
  1. 创建 CDC:

    CREATE TABLE CUSTOMERS_CDC( 
    ID   INT              NOT NULL,
    LAST_UPDATED DATETIME,
    PRIMARY KEY (ID)
    );
    
  2. 在源 table 上触发删除事件,如下所示:

    CREATE TRIGGER TRG_CUSTOMERS_DEL 
    ON CUSTOMERS
    FOR DELETE
    AS
         INSERT INTO CUSTOMERS_CDC (ID, LAST_UPDATED)
         SELECT ID, getdate()
         FROM DELETED
    
  3. 在查询源更改的 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