复制中的隔离级别

本页介绍了如何在 Cloud Data Fusion 复制作业的 Microsoft SQL Server 和 MySQL 数据库快照中启用事务隔离

为数据库设置复制作业后,该作业会拍摄源表的初始快照。为确保数据一致性,请对这些表加锁。

在初始快照之后,系统会在持续的复制过程中捕获源端的增量更改并将其应用于 BigQuery 目标。

SQL Server

为了捕获 SQL Server 数据库中源表中的更改,复制作业使用 Debezium 连接器。在 snapshotting 阶段,Debezium 会根据配置的 snapshot.isolation.mode 获取锁。

下表比较了复制作业支持的隔离模式。

隔离模式 已获取的锁 数据一致性
read_uncommitted 不需要
read_committed 一次对一批行进行共享锁定 部分支持。添加的记录可能会出现两次:一次是在初始快照中,一次是在流式传输阶段。
repeatable_read
(默认)
对所有行的共享锁 部分支持。添加的记录可能会出现两次:一次是在初始快照中,一次是在流式传输阶段。
snapshot 完整。
exclusive 对所有表的独占锁定 完整。

如需详细了解隔离模式,请参阅设置事务隔离级别

默认情况下,快照隔离模式为 repeatable_read。此模式会对快照阶段读取的所有数据获取共享锁。它可以防止其他事务修改现有行,并且可能会允许插入新记录(请参阅锁升级)。

如果源数据库上已启用快照隔离,建议使用启用了快照隔离的复制,因为这种复制方式无需锁定表即可实现完全数据一致性。如果未启用该功能,请先详细了解 SQL Server 数据库引擎中基于行版本控制的隔离级别的影响,然后再启用该功能。

作为替代方案,您可以使用 read_committed 隔离模式,该模式不会在快照阶段锁定表。

在复制作业中启用快照隔离

  1. 在 SQL Server 数据库中启用快照隔离:

    ALTER DATABASE DATABASE_NAME
    SET ALLOW_SNAPSHOT_ISOLATION ON
    

    DATABASE_NAME 替换为 SQL Server 数据库的名称。

  2. 将运行时参数 snapshot.isolation.mode 设置为 snapshot。如需了解详情,请参阅向复制作业传递运行时参数

MySQL

为了捕获 MySQL 数据库中源表中的更改,复制作业使用 Debezium 连接器。在 snapshotting 阶段,Debezium 会根据配置的 snapshot.locking.mode 获取锁。

默认情况下,快照锁定模式为 minimal。在此模式下,连接器会在读取数据库架构和其他元数据时,保持快照初始部分的全局读取锁。然后,连接器使用 REPEATABLE READ 事务(不会锁定表)通过一致性读取提取所有行。

如需防止任何锁定,请将模式设置为 none

或者,为防止 Cloud SQL 上运行的 MySQL 数据库出现锁定,请从副本(而非事务数据库)复制。

更改 MySQL 快照期间的锁定行为

  • 如需更改 MySQL 数据库中的快照锁定行为,请将运行时参数 snapshot.locking.mode 属性设置为适当的锁定模式值。

如需了解详情,请参阅将 Debezium 参数传递给复制作业

限制

  • Cloud Data Fusion 中的复制功能支持 Debezium 连接器版本 1.3。

Cloud Data Fusion 中的 Oracle 数据源

Cloud Data Fusion 中从 Oracle 来源复制数据由 Datastream 提供支持。Datastream 不会锁定表

后续步骤