复制中的隔离级别

本页面介绍如何在 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 Connector 1.3 版。

Cloud Data Fusion 中的 Oracle 来源

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

后续步骤