AWS DMS - MYSQL 上的 CDC 作为源端点的微秒级精度
AWS DMS - Microsecond precision for CDC on MYSQL as source EndPoint
我正在使用 AWS DMS 从 MYSQL 作为源端点和 S3 作为目标端点迁移数据。
我想跟踪来自源的更新,所以在配置期间,我启用了 TimestampColumnName 属性(列名:event_timestamp)。
在结果(下面列出)中,我得到了 records/events 的时间戳,但 NOT 微秒精度。
我希望微秒级精度在此基础上构建序列逻辑。
我调查了源端点和目标的 属性,但没有得到想要的结果。这是示例输出:
。
如果我遗漏了 属性.
有人可以看一下并提出建议吗
输出格式:我在 S3 中的文件是 parquet。
不幸的是,AWS DMS S3 TimestampColumnName
添加了 DATETIME 列,用于 从 MySQL 源 [=] 更改数据捕获 (CDC) 加载55=] 将有 只有第二个精度.
因为二进制日志中的事务时间戳MySQL只有秒.
最简单的解决方案是添加到 MySQL table 新列 - timestamp with microsecond precision with default value to be set on insert or / and update automatically 并将此列用作 event_timestamp
.
ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
此外,检查 AWS DMS 到 S3 setting ParquetTimestampInMillisecond
是否为 False
(或不存在/未设置,默认为 false)。
AWS DMS S3 TimestampColumnName
设置将带有时间戳的列添加到输出。
在 'static' 中读取 - 它将生成当前时间戳:
For a full load, each row of this timestamp column contains a timestamp for when the data was transferred from the source to the target by DMS.
对于 CDC,它将从数据库事务日志中读取事务时间:
For a change data capture (CDC) load, each row of the timestamp column contains the timestamp for the commit of that row in the source database.
其精度将是数据库事务日志中的时间戳之一:
...the rounding of the precision depends on the commit timestamp supported by DMS for the source database.
CDC 模式本质上是 replication。应适当配置源数据库以写入此类事务日志。数据库写入此日志事务信息以及事务/提交时间戳。
在 MySQL 的情况下,这是 the binary log. And MySQL binlog timestamp 只有 32 位 - 只需几秒钟。
此外,此事务时间戳可能并不总是与事务的实际顺序一致,或者顺序更改实际上是在 (link 1, ) 提交的。
这个问题已经存在一年多了,但我遇到了 same/similar 问题,我想我会解释一下我是如何解决它的,以防它能帮助到其他人。
我在 RDS 中有 table,我正在使用 DMS 将它们从 RDS 迁移到 S3。在 DMS 任务设置中,我启用了时间戳列和 parquet 文件格式。我想使用存储在 S3 中的 CDC 文件更新插入到我的数据湖中。因此,为了做到这一点,我需要通过获取对 RDS table 中特定记录的最新操作来对行进行重复数据删除。但是就像您遇到的问题一样,我注意到时间戳列的精度不高,因此选择具有最大时间戳的行不起作用,因为它会 return 多行。所以我添加了一个新的 row_number 列,按时间戳列排序,按 id 分组,并选择 MAX(row_number)。这给了我应用到我的 table.
的 CDC 行的最新操作
table.withColumn("row_number", row_number().over(Window.partitionBy("table_id").orderBy("dms_timestamp")))
以上是 pyspark 代码,因为这是我用来处理镶木地板文件的框架,但您可以在 SQL 中执行相同的操作。我注意到当记录按时间戳列排序时,即使时间戳相同,它们也会保持原来的顺序。
希望这可能对您要实现的顺序逻辑有所帮助。
我正在使用 AWS DMS 从 MYSQL 作为源端点和 S3 作为目标端点迁移数据。
我想跟踪来自源的更新,所以在配置期间,我启用了 TimestampColumnName 属性(列名:event_timestamp)。
在结果(下面列出)中,我得到了 records/events 的时间戳,但 NOT 微秒精度。
我希望微秒级精度在此基础上构建序列逻辑。
我调查了源端点和目标的 属性,但没有得到想要的结果。这是示例输出:
如果我遗漏了 属性.
有人可以看一下并提出建议吗
输出格式:我在 S3 中的文件是 parquet。
不幸的是,AWS DMS S3 TimestampColumnName
添加了 DATETIME 列,用于 从 MySQL 源 [=] 更改数据捕获 (CDC) 加载55=] 将有 只有第二个精度.
因为二进制日志中的事务时间戳MySQL只有秒.
最简单的解决方案是添加到 MySQL table 新列 - timestamp with microsecond precision with default value to be set on insert or / and update automatically 并将此列用作 event_timestamp
.
ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
此外,检查 AWS DMS 到 S3 setting ParquetTimestampInMillisecond
是否为 False
(或不存在/未设置,默认为 false)。
AWS DMS S3 TimestampColumnName
设置将带有时间戳的列添加到输出。
在 'static' 中读取 - 它将生成当前时间戳:
For a full load, each row of this timestamp column contains a timestamp for when the data was transferred from the source to the target by DMS.
对于 CDC,它将从数据库事务日志中读取事务时间:
For a change data capture (CDC) load, each row of the timestamp column contains the timestamp for the commit of that row in the source database.
其精度将是数据库事务日志中的时间戳之一:
...the rounding of the precision depends on the commit timestamp supported by DMS for the source database.
CDC 模式本质上是 replication。应适当配置源数据库以写入此类事务日志。数据库写入此日志事务信息以及事务/提交时间戳。
在 MySQL 的情况下,这是 the binary log. And MySQL binlog timestamp 只有 32 位 - 只需几秒钟。
此外,此事务时间戳可能并不总是与事务的实际顺序一致,或者顺序更改实际上是在 (link 1,
这个问题已经存在一年多了,但我遇到了 same/similar 问题,我想我会解释一下我是如何解决它的,以防它能帮助到其他人。
我在 RDS 中有 table,我正在使用 DMS 将它们从 RDS 迁移到 S3。在 DMS 任务设置中,我启用了时间戳列和 parquet 文件格式。我想使用存储在 S3 中的 CDC 文件更新插入到我的数据湖中。因此,为了做到这一点,我需要通过获取对 RDS table 中特定记录的最新操作来对行进行重复数据删除。但是就像您遇到的问题一样,我注意到时间戳列的精度不高,因此选择具有最大时间戳的行不起作用,因为它会 return 多行。所以我添加了一个新的 row_number 列,按时间戳列排序,按 id 分组,并选择 MAX(row_number)。这给了我应用到我的 table.
的 CDC 行的最新操作table.withColumn("row_number", row_number().over(Window.partitionBy("table_id").orderBy("dms_timestamp")))
以上是 pyspark 代码,因为这是我用来处理镶木地板文件的框架,但您可以在 SQL 中执行相同的操作。我注意到当记录按时间戳列排序时,即使时间戳相同,它们也会保持原来的顺序。
希望这可能对您要实现的顺序逻辑有所帮助。