Openflow Connector for Oracle:选择使用 时默认使用的角色和仓库。配置 Oracle 数据库

备注

此连接器受 Snowflake 连接器条款 的约束。

备注

除标准连接器服务条款外,Openflow Connector for Oracle 还需遵守其他服务条款。有关更多信息,请参阅 Openflow Connector for Oracle 附录

本主题介绍如何为 Openflow Connector for Oracle 设置 Oracle 数据库。

备注

Oracle 数据库设置取决于组织的安全策略和数据库架构。例如,表是否位于容器数据库 (CDB)、可插入数据库 (PDB)、多个 PDBs 或其组合中。

本主题中提供的步骤仅为示例。请根据您的环境需要进行修改。

作为 Oracle 数据库管理员,请对源数据库执行以下程序:

  1. 配置存档重做日志的保留期

  2. 启用 XStream 和补充日志记录

  3. 创建 XStream 管理员用户

  4. 授予 XStream 管理员权限

  5. 配置 XStream 服务器连接用户

  6. 创建 XStream 出站服务器

  7. 设置 XStream 出站服务器连接用户

  8. 设置 XStream 出站服务器捕获用户

  9. (可选):ref:label-configure_ssl_connections

备注

本主题中的步骤针对具有一个容器数据库 (CDB) 和一个或多个可插入数据库 (PDB) 的多租户架构。如果您的 Oracle 数据库使用单租户架构,请参阅 为单租户数据库设置 XStream

配置存档重做日志的保留期

您必须启用 ARCHIVELOG 模式,以确保变更数据可用于复制。

如果您使用 AWS RDS for Oracle,则还必须配置存档重做日志的保留期。根据源数据库中的变更量和您的存储容量来确定此期限。

要设置保留期(例如设置为 24 小时),请按照下表中的程序操作:

数据库版本

过程

AWS RDS (Standard)

运行以下命令:

begin
    rdsadmin.rdsadmin_util.set_configuration(
        name  => 'archivelog retention hours',
        value => '24');
end;
/
commit;

有关更多信息,请参阅 保留存档重做日志 (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.CommonDBATasks.RetainRedoLogs.html)。

AWS RDS Custom

  1. 创建名为 /opt/aws/rdscustomagent/config/redo_logs_custom_configuration.json 的文本文件。

  2. 按照以下格式向此文件添加 JSON 对象:{"archivedLogRetentionHours" : "24"}

有关更多信息,请参阅 恢复 RDS Custom for Oracle 实例 (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-backup.pitr.html)。

启用 XStream 和补充日志记录

备注

XStream 已包含在 Oracle 数据库中,不需要任何额外软件。

要启用并配置 XStream 复制以捕获并流式传输变更数据,请运行以下命令:

  1. 启用 XStream 复制:

ALTER SYSTEM SET enable_goldengate_replication=TRUE SCOPE=BOTH;

ALTER SYSTEM SET STREAMS_POOL_SIZE = 2560M;

备注

Snowflake 建议将流池大小设置为 2.5 GB。此分配涵盖以下内容:

  • 用于捕获的 1 GB

  • 用于应用的 1 GB

  • 额外的 25% 缓冲区

要启用补充日志记录以确保重做日志捕获逻辑复制所需的信息,请运行以下命令:

  1. 确认数据库处于 ARCHIVELOG 模式,如下例所示:

    SELECT LOG_MODE, FORCE_LOGGING FROM V$DATABASE;
    

    Snowflake 建议在数据库或表空间级别强制执行日志记录。

  2. 将容器设置为根容器,并向数据库添加补充日志记录:

    ALTER SESSION SET CONTAINER = CDB$ROOT;
    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
    

    或者,您可以仅对特定表启用日志记录,如下例所示:

    ALTER TABLE schema_name.table_name ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
    

创建 XStream 管理员用户

管理 XStream 组件(包括创建和更改出站服务器)需要 XStream 管理员用户。您可以为此目的创建一个专用用户,也可以使用现有用户,前提是已授予必要的 XStream 管理权限(请参阅下一部分)。

以下示例详细介绍了在 CDB 的根容器中设置专用 XStream 管理员用户的步骤。

备注

以下示例假设数据库还有一个包含待复制表的 PDB。

以 SYSDBA 或具有适当权限的用户身份连接,并运行以下命令:

-- Switch to the root container.
ALTER SESSION SET CONTAINER = CDB$ROOT;

--  Create a tablespace for the XStream administrator user.
CREATE TABLESPACE xstream_adm_tbs DATAFILE '/path/to/your/cdb/xstream_adm_tbs.dbf'
   SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

-- Switch to the Pluggable Database (PDB) and create a tablespace there.
ALTER SESSION SET CONTAINER = YOUR_PDB_NAME;

CREATE TABLESPACE xstream_adm_tbs DATAFILE '/path/to/your/pdb/xstream_adm_tbs.dbf'
   SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

-- Switch back to the root container to create the common user.
ALTER SESSION SET CONTAINER = CDB$ROOT;

-- Create the XStream administrator user.
-- Note  'c##' prefix indicates a common user in a CDB environment, and CONTAINER=ALL grants privileges across all containers.
-- Replace "YOUR_XSTREAM_ADMIN_PASSWORD" with a strong, secure password.

CREATE USER c##xstreamadmin IDENTIFIED BY "YOUR_XSTREAM_ADMIN_PASSWORD"
   DEFAULT TABLESPACE xstream_adm_tbs
   QUOTA UNLIMITED ON xstream_adm_tbs
   CONTAINER=ALL;

授予 XStream 管理员权限

根据您的 Oracle 数据库版本,向 XStream 管理员用户授予所需权限。

  • 对于 Oracle Database 19c 和 21c

    1. 以 SYSDBA 或具有适当权限的用户身份连接。

    2. 通过运行以下命令,向 XStream 管理员授予必要的系统权限:

      GRANT CREATE SESSION, SET CONTAINER, EXECUTE ANY PROCEDURE, LOGMINING TO c##xstreamadmin CONTAINER=ALL;
      
      -- Grant XStream administration privileges using DBMS_XSTREAM_AUTH.
      -- This procedure grants the necessary permissions to manage XStream capture processes across all containers.
      
      BEGIN
        DBMS_XSTREAM_AUTH.GRANT_ADMIN_PRIVILEGE(
          grantee                 => 'c##xstreamadmin',
          privilege_type          => 'CAPTURE',
          grant_select_privileges => TRUE,
          container               => 'ALL');
      END;
      /
      
  • 对于 Oracle Database 23c

    1. 以 SYSDBA 或具有适当权限的用户身份连接。

    2. 通过运行以下命令,为 Oracle Database 23c 授予必要的系统权限和 XStream 角色:

      GRANT CREATE SESSION, SET CONTAINER, EXECUTE ANY PROCEDURE, LOGMINING, XSTREAM_CAPTURE
        TO c##xstreamadmin CONTAINER=ALL;
      

配置 XStream 服务器连接用户

Snowflake Openflow Connector 利用专用连接用户建立与 XStream 出站服务器的连接并接收变更数据。此用户需要特定权限才能进行复制:

  • 从 XStream 出站服务器读取:用户必须能够访问来自配置的 XStream 出站服务器的变更数据流。

  • 从数据字典视图中选择:连接用户需要对各种数据字典视图具有 SELECT 访问权限。这可以通过授予 SELECT_CATALOG_ROLE 或 SELECT ANY DICTIONARY 来实现。如果出于公司策略不希望授予 SELECT ANY DICTIONARY,则用户特别需要对以下视图具有 SELECT 访问权限:

    • ALL_USERS

    • ALL_TABLES

    • ALL_TAB_COLS

    • ALL_CONS_COLUMNS

    • ALL_CONSTRAINTS

    • V$DATABASE

  • 从源表中选择:用户必须对所有打算复制的表具有 SELECT 权限。

以下是如何在 CDB 的根容器中设置此类用户的示例。示例假设数据库还有一个包含待复制表的 PDB。

-- Connect as SYSDBA or a user with appropriate privileges
-- Switch to the root container.

ALTER SESSION SET CONTAINER = CDB$ROOT;

-- Create the connect user.
-- Replace "YOUR_CAPTURE_USER_PASSWORD" with a strong, secure password.
CREATE USER c##connectuser IDENTIFIED BY "YOUR_CAPTURE_USER_PASSWORD"
    CONTAINER=ALL;

-- Grant necessary privileges to the connect user.
-- You can choose to grant access to specific tables
-- instead of SELECT ANY TABLE for more granular control,
-- for example, GRANT SELECT ON schema.table TO c##connectuser;
GRANT CREATE SESSION, SELECT_CATALOG_ROLE TO c##connectuser CONTAINER=ALL;
GRANT SELECT ANY TABLE TO c##connectuser CONTAINER=ALL;
GRANT LOCK ANY TABLE TO c##connectuser CONTAINER=ALL;

创建 XStream 出站服务器

XStream 出站服务器从重做日志中捕获变更,供 Openflow Connector 使用。定义要复制的架构或表。有关更多信息,请参阅 DBMS_XSTREAM_ADM.CREATE_OUTBOUND文档 (https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_XSTREAM_ADM.html#GUID-A602ED86-0F5A-4A27-92A0-55D5ADC0AF0D):

复制范围的重要注意事项:

  • 如果表包含在 XStream 出站筛选规则命令中,它将不会被复制。

  • 此处包含的表或架构还必须在连接器参数中定义,才能进行复制。您可以在服务器筛选规则中包含整个架构,稍后在连接器参数中,仅指定该架构中的某些表进行复制。

备注

XStream 出站服务器只能从根容器创建。但是,从 Oracle Database 版本 23ai 开始,也可以在 PDB 级别创建。

To avoid a significant hit to your CPU and network, and to prevent your queues from being filled with irrelevant data, it's essential to use a granular approach. The best way to do this is with the DBMS_XSTREAM_ADM.ADD_TABLE_RULES procedure, which lets you choose only the specific tables you need.

The following examples show how to set up the XStream Outbound Server based on different replication needs. In practice, when setting up your XStream Outbound Server on your production environment, you should be selective about what changes you capture. Capturing everything can have serious consequences for your database's performance and resource usage.

For information on how to configure XStream Outbound Server, see Configuring XStream Out (https://docs.oracle.com/en/database/oracle/oracle-database/19/xstrm/configuring-xstream-out.html#GUID-A1C8430E-565B-4F66-8E00-495F283AAAFB).

示例 1: 捕获根容器和所有 PDBs 中所有架构的所有表

-- Connect as a user with XStream admin privileges to the root container.
-- Ensure serveroutput is enabled to see messages from the PL/SQL block.
SET SERVEROUTPUT ON;

DECLARE
    tables  DBMS_UTILITY.UNCL_ARRAY;
    schemas DBMS_UTILITY.UNCL_ARRAY;
BEGIN
   -- To replicate all tables in all schemas across all containers, set both to NULL.
   tables(1) := NULL;
   schemas(1) := NULL;
   DBMS_XSTREAM_ADM.CREATE_OUTBOUND(
       server_name => 'XOUT1',
       table_names => tables,
       schema_names => schemas,
       include_ddl => TRUE
   );
   DBMS_OUTPUT.PUT_LINE('XStream Outbound Server created.');
   EXCEPTION
   WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE('Error creating XStream Outbound Server: ' || SQLERRM);
       RAISE;
END;
/

示例 2: 从可插入数据库 (PDB) 中的单个架构捕获所有表

-- Connect as a user with XStream admin privileges to the root container.
-- Ensure serveroutput is enabled to see messages from the PL/SQL block.
SET SERVEROUTPUT ON;

DECLARE
    tables  DBMS_UTILITY.UNCL_ARRAY;
    schemas DBMS_UTILITY.UNCL_ARRAY;
BEGIN
    -- To replicate all tables in a schemas in the single PDB, set source_container_name.
    tables(1) := NULL;
    schemas(1) := 'schema_name';
    DBMS_XSTREAM_ADM.CREATE_OUTBOUND(
        server_name => 'XOUT1',
        table_names => tables,
        schema_names => schemas,
        include_ddl => TRUE,
        source_container_name => 'YOUR_PDB_NAME'
    );
    DBMS_OUTPUT.PUT_LINE('XStream Outbound Server created.');
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error creating XStream Outbound Server: ' || SQLERRM);
      RAISE;
END;
/

设置 XStream 出站服务器连接用户

在 XStream 出站服务器上设置连接用户。这可确保先前创建的连接用户与 XStream 出站服务器 (XOUT1) 相关联,从而允许其接收变更数据。

备注

以下示例假设连接用户为 c##connectuser。

BEGIN
    DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name  => 'XOUT1',
        connect_user => 'c##connectuser');
   END;
/

设置 XStream 出站服务器捕获用户

备注

If you want the data to be captured by the same user that created the server (the administrator), skip this section.

If you configured a separate capture user, configure the XStream Outbound Server to run as this user. This ensures that the dedicated capture user is associated with the XStream Outbound Server (XOUT1), allowing that user to capture change data.

BEGIN
    DBMS_XSTREAM_ADM.ALTER_OUTBOUND(
        server_name  => 'XOUT1',
      capture_user => 'yourcaptureuser');
END;
/

为单租户数据库设置 XStream

Oracle 12c 及更高版本的默认架构是具有一个容器数据库 (CDB) 和一个或多个可插入数据库 (PDB) 的多租户架构。

如果您的 Oracle 数据库使用单租户架构,请注意在设置 XStream 时的以下差异:

  • 请勿使用 ALTER SESSION SET CONTAINER 命令。在单租户数据库中只有一个实例,因此不涉及容器切换。

  • 仅创建一个 xstream_adm_tbs 表空间。请勿在 PDB 中创建第二个表空间。

  • 请勿在用户名上使用 C## 前缀。例如,创建 xstreamadmin``(而非 ``c##xstreamadmin),以及创建 connectuser``(而非 ``c##connectuser)。C## 前缀仅在多租户环境中需要。

  • 请勿在任何命令中包含 CONTAINER=ALLcontainer => 'ALL'。这些子句授予跨多个容器的权限,不适用于单租户数据库。

配置 SSL 连接(可选)

Openflow Connector for Oracle 支持使用 TCPS(带有 SSL 的 TCP)协议与 Oracle 数据库建立加密的 SSL 连接。启用 SSL 后,数据库连接和 XStream 连接都使用加密通信。

要使用 SSL,您必须执行以下操作:

  1. 在 Oracle 数据库上启用 TCPS

  2. 创建客户端钱包

在 Oracle 数据库上启用 TCPS

您必须配置 Oracle 数据库以接受使用 TCPS 协议的连接。根据您的数据库环境按照程序操作。

本地/OCI

  1. 使用服务器证书创建 SSL 服务器钱包。

  2. 配置 listener.ora 以包含 TCPS 端点(默认端口 2484)。

  3. 配置 sqlnet.ora 以引用服务器钱包。

  4. 重新启动监听器。

有关更多信息,请参阅 配置传输层安全加密 (https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/configuring-transport-layer-security-encryption.html)。

AWS RDS (Standard)

  1. 将 Oracle SSL 选项添加到与 DB 实例关联的选项组中。

  2. 指定 SSL 端口(例如 2484)。

有关更多信息,请参阅 Oracle Secure Sockets Layer (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.SSL.html)。

创建客户端钱包

在数据库上启用 TCPS 后,创建一个包含服务器受信任证书的 Oracle 自动登录钱包 (cwallet.sso)。此钱包提供给连接器,以便其在 SSL 握手期间验证服务器。

  1. 将服务器证书从 Oracle 数据库服务器导出为 PEM 文件。

  2. 使用 Oracle orapki 实用工具创建客户端钱包并导入服务器证书:

    orapki wallet create -wallet /path/to/client/wallet -pwd <wallet_password> -auto_login
    
    orapki wallet add -wallet /path/to/client/wallet -pwd <wallet_password> \
       -trusted_cert -cert /path/to/server-cert.pem
    
  3. 将生成的 cwallet.sso 文件复制到 Openflow 运行时可访问的位置。

备注

对于 AWS RDS,请从 AWS 下载根证书,而不是从数据库服务器导出。有关更多信息,参阅 使用 SSL 连接到 RDS for Oracle DB 实例 (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.SSL.Connecting.html)。

有关详细信息,请参阅 使用 orapki 实用工具管理 PKI 元素 (https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/using-the-orapki-utility-to-manage-pki-elements.html)。

后续步骤

配置连接器