【问题标题】:How to detect deleted rows when migrating data迁移数据时如何检测已删除的行
【发布时间】:2015-10-22 18:17:38
【问题描述】:

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

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

【问题讨论】:

    标签: mysql etl data-warehouse


    【解决方案1】:

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

    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. 在源表上触发如下删除事件:

      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
      

    【讨论】:

      【解决方案2】:

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

      我看到的方式:假设您有自己的方式来执行 where 子句。 Youd 将其作为更新查询的一部分,除非您正在执行 csv 导出。如果您对要更新的行进行 mysql 转储并在主数据库中创建一个新的 tempTable,

      然后

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

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

      【讨论】:

        猜你喜欢
        • 2016-04-27
        • 1970-01-01
        • 2021-06-09
        • 2015-11-11
        • 2013-01-26
        • 1970-01-01
        • 2015-09-13
        • 2016-04-13
        • 2015-08-08
        相关资源
        最近更新 更多