最新历史版本 :Oracle环境准备(LogMiner) 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 版本

FineDataLink 版本
功能变动
--
4.1.2支持多租户架构作为管道任务数据来源端
4.2.2.3数据管道源端适配 Oracle 21c

1.2 功能简介

CDC(Change Data Capture),即数据变更抓取,通过为源端数据源开启 CDC,FineDataLink 数据管道可实现数据源的实时数据同步以及数据表的物理删除同步。

FineDataLink 数据管道支持 Oracle 的 XStream 和 LogMiner 两种 CDC 模式,本文主要介绍如何为 Oracle 数据库开启 LogMiner 模式的 CDC 功能。

2. 前置动作编辑

2.1 确认当前使用的数据库版本

数据管道支持读取的 Oracle 数据库版本如下表所示:

数据库类型支持数据库版本
Oracle

Oracle 10g、11g、12c、18c、19c、21c、Oracle RAC集群

以具有 DBA 权限的用户身份登录数据库

例如 Windows 系统中安装的 Oracle,命令提示符中输入:sqlplus / as sysdba 进入数据库操作界面。

同时可以查看到当前数据库的版本,如下图所示:

2.2 数据库是否支持CDB/PDB

Oracle12c 及之后版本引入了多租用户环境,其中包含两个核心概念:容器数据库-CDB(Container Database)和可插拔数据库-PDB(Pluggable Database)。

CDB 是一个包含零个或多个 PDB 的数据库;PDB 是一个独立的数据库,可以插入或拔出 CDB,每个 PDB 都有自己的数据文件和用户数据;CDB 管理多个 PDB,PDB 共享 CDB 中的系统资源,但数据和对象是隔离的。

1742453345153107.png

在使用上二者与非多租户数据库实例没有任何区别,区别主要在于获取数据变更时,只能从CDB中捕获到,基于此要对其进行适配。

数据库版本说明参考步骤
Oracle 10g、11gOracle 12c 以下版本,不支持容器数据库(CDB)第三章、4.1节、第五章
12c、18c、19c、21c、Oracle RAC集群

1)判断当前连接的数据库是否是CDB

以具有 DBA 权限的用户身份登录数据库,使用如下命令查看数据库是否开启多租户:

SELECT CDB FROM V$DATABASE;

1742439286467133.png

如果查询结果中的 CDB 列值为 YES,则当前连接的数据库是容器数据库(CDB)。如果值为 NO,则当前连接的数据库是非容器数据库(非 CDB)

2)判断当前连接的是根容器还是 PDB

SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;

4.png

若返回的是 CDB$ROOT,则表示当前连接的是 CDB 的根容器;若返回的是其他名称,则表示当前连接的是 PDB

1)非多租户:

第三章、4.2节、第五章

2)多租户:

  • 根容器下(CDB):

第三章、4.3节、第五章

  • PDB下:

第三章、4.3节、第六章

3. 开启 Archive Log 编辑

1)以具有 DBA 权限的用户身份登录数据库

2)使用命令查看数据库的 logging mode :

select log_mode from v$database;

如果返回的结果是 ARCHIVELOG , 可以直接操作 4.2.2 节进行操作。

如果返回的结果是 NOARCHIVELOG , 继续按照以下步骤操作:

  • 登录服务端:sqlplus / as sysdba

  • 关闭数据库: 使用命令:shutdown immediate;

  • 启动并挂载数据库: startup mount;

  • 开启存档并打开数据库:

alter database archivelog;
alter database open;

4. 开启 Supplemental Log编辑

必须为捕获的表或数据库启用补充日志记录,以便数据更改能够捕获已更改的数据库行之前的状态。下面将说明如何在表/数据库级别上配置它。 一般建议对库进行启用。

用户根据实际的数据库版本,参考下面文档进行操作。

4.1 Oracle 10g、11g版本开启方式

用户根据实际情况,选择其中一种方案:

方案说明步骤
开启单表补全日志

同步某张表时,就需要开启该表的补全日

优势:操作比较精准

开启单表的全补充得在运行管道任务前,不然有可能会出现数据丢失

劣势:需要一张一张开启

ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
开启全库补全日志

若用户库里的表数据量可控,且希望一劳永逸(不想每同步一张表就开启一次),可开启全库补全日

劣势:会占用较多数据库空间

alter database add supplemental log data;
alter system switch logfile;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
22.png

4.2 Oracle 12c、18c、19c、21c、RAC集群版本的特殊配置方法

使用以下命令,确认 supplemental logging 是否开启:

SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_all FROM v$database;

4.2.1 场景一:如果返回的三列都是 Yes 或者 Implicit 

如果返回的三列都是 Yes 或者 Implicit ,则表示 identification key logging(标识键日志)和 full supplemental logging(全补充日志)已同时开启,可以直接查看第五章数据库账号相关内容。

4.2.2 场景二:如果返回的前两列是 Yes 或者 Implicit 

如果返回的前两列是 Yes 或者 Implicit,则表示只开启了 identification key logging(标识键日志),需要开启全补充日志。

单表开启 full supplemental logging(全补充日志),使用如下命令:

ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

所有表开启 full supplemental logging(全补充日志),使用如下命令:

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

3.png

提交更改的配置:

ALTER SYSTEM SWITCH LOGFILE;

然后可以使用命令查看单表的补全日志权限是否开启:

SELECT OWNER, TABLE_NAME, LOG_GROUP_NAME, ALWAYS, LOGGING_COLUMNS
FROM DBA_LOG_GROUPS
WHERE TABLE_NAME = '你的表名';

4.3 Oracle 12c、18c、19c、21c、RAC集群的 CDB 开启方式

用户根据实际情况,选择其中一种方案:

方案说明步骤
开启单表补全日志

同步某张表时,就需要开启该表的补全日

优势:操作比较精准

开启单表的全补充得在运行管道任务前,不然有可能会出现数据丢失

劣势:需要一张一张开启

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;    
ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;


开启全库补全日志

若用户库里的表数据量可控,且希望一劳永逸(不想每同步一张表就开启一次),可开启全库补全日

劣势:会占用较多数据库空间

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;

5. 分配数据库账号权限编辑

需要规划一个可访问数据源的账号,用于后续数据管道过程中访问数据源并进行数据提取、写入的同步操作。

创建账号操作详情请参见: 创建 Oracle 账号

5.1 创建用户账户并分配权限

用户根据实际的数据库版本,参考下面文档进行操作。

5.1.1 Oracle 10g、11g版本

使用如下命令创建用户帐户并分配权限:

CREATE USER <user name> IDENTIFIED BY <password>;
GRANT create session, alter session, execute_catalog_role, select any dictionary, select any transaction, select any table, unlimited tablespace to <user name>;

此时即可在进行数据连接时使用该用户账号,例如上述使用的是Roxy,则数据连接如下图所示:

5.1.2 Oracle 12c、18c、19c、21c standard databases 版本

创建用户并赋予权限。

1)以具有 DBA 权限的用户身份登录数据库

2)创建普通用户:

CREATE USER <user name> IDENTIFIED BY <password>;
GRANT create session, alter session, select any dictionary, select any transaction,select any table,logmining, execute_catalog_role TO <username>;

根据对表的权限需求,重复执行最后一个命令来赋予 select 权限。

5.2 检查用户权限

注:Oracle 11g 及以下版本不需要 LOGMINING 权限

输入以下命令检查判断当前用户是否有 LOGMINER 权限。

WITH required_sys_privileges AS (
    SELECT column_value AS PRIVILEGE
    FROM TABLE (
        sys.odcivarchar2list(
                'SELECT ANY TRANSACTION',
                'CREATE SESSION',
                'SELECT ANY DICTIONARY',
                'SELECT ANY TABLE',
                'FLASHBACK ANY TABLE',
                'LOGMINING'
            )
        )
),
     required_role_privileges AS (
         SELECT column_value AS ROLE_NAME
         FROM TABLE (
             sys.odcivarchar2list(
                     'EXECUTE_CATALOG_ROLE',
                     'RESOURCE'
                 )
             )
     ),
     required_table_privileges AS (
         SELECT column_value AS PRIVILEGE
         FROM TABLE (
             sys.odcivarchar2list(
                     'DBMS_FLASHBACK',
                     'DBMS_LOGMNR',
                     'DBMS_LOGMNR_D'
                 )
             )
     )
SELECT r.PRIVILEGE,
       NVL2(p.USERNAME, 'OK', 'REQUIRED') AS PRIVILEGE_STATUS
FROM required_sys_privileges r
         LEFT JOIN user_sys_privs p
                   ON r.PRIVILEGE = p.PRIVILEGE
UNION
SELECT r.ROLE_NAME,
       NVL2(p.USERNAME, 'OK', 'REQUIRED') AS PRIVILEGE_STATUS
FROM required_role_privileges r
         LEFT JOIN user_role_privs p
                   ON r.ROLE_NAME = p.GRANTED_ROLE
UNION
SELECT r.PRIVILEGE,
       NVL2(p.GRANTEE, 'OK', 'REQUIRED') AS PRIVILEGE_STATUS
FROM required_table_privileges r
         LEFT JOIN user_tab_privs p
                   ON r.PRIVILEGE = p.TABLE_NAME;

对于返回结果,若显示为 Required 则是未开启 logminer 权限,显示为 OK 则是有权限。

对于缺乏的权限,需要进行开启。

6. 数据来源为 PDB编辑

如果数据来源为 PDB ,则无法直接读取数据库的 redolog ,需要借助 CDB 来读取。

6.1 准备工作

若数据来源为 PDB(参考本文第二章内容进行判断):参考本文第三章、4.3 节开启数据库日志权限。

6.2 判断连接用户是否为 Common User 以及是否拥有 Set Container 权限

6.2.1 启动所有的 PDB

在 sqlplus 下使用命令查看当前 PDB 状态,如下图所示:

show pdbs;

或者也可以在数据库查询界面使用命令

SELECT name, open_mode
FROM   v$pdbs
ORDER BY name;

2)此时可以看出 PDBORCL 和 ORCLPDB 均未启动,此时需要将其开启。

使用如下命令:

注: PDB 名称需要根据数据库实际情况修改。

ALTER PLUGGABLE DATABASE ORCLPDB1 OPEN;
ALTER PLUGGABLE DATABASE PDBORCL OPEN;

然后再次查看PDB 状态,PDB 均开启:

6.2.2 创建账号

注:在 CDB 中创建公共用户, PDBS 中也会创建相同用户。若 CDB 下 GRANT 命令赋权时未指定container=all,则赋权只在 CDB 中生效,并不会在 PDB 中生效,这个用户要能够访问PDB,需要切换到 PDB 再赋权。若赋权时指定 container=all,则赋权在 CDB 中生效,也在 PDB 中生效。

1)创建用户账号

CREATE USER "C##ROXY122" IDENTIFIED BY 123 CONTAINER=all; 

注1:用户名和密码此处分别为 C##ROXY122 和 123,用户可根据实际情况修改。

注2:当 Oracle 处于多租户模式下时,用户名需增加 C## 前缀。

2)授予权限

GRANT create session, alter session, select any dictionary, select any transaction,select any table,logmining, execute_catalog_role,set container TO "C##ROXY122" container=all;

此处仅为新增账号的授权操作,数据库权限需要参考本文 6.1 节开启:

ALTER USER "C##ROXY122" QUOTA UNLIMITED ON "USERS";
SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_all FROM v$database;
GRANT create session, alter session, select any dictionary, select any transaction,select any table,logmining, execute_catalog_role TO "C##ROXY122";

最后授予用户 V_$PDBS 的权限,如下图所示:

alter user "C##ROXY122" set container_data=all for sys.v_$pdbs container = current; 

此时再查询这个新增账号的权限:

SELECT USERNAME, OBJECT_NAME FROM CDB_CONTAINER_DATA WHERE USERNAME = 'C##ROXY122' AND OBJECT_NAME = 'V_$PDBS';

可以查到对应的 v$pdbs 权限,如下图所示:

远程 Oracle 所在服务器并切换到 sqlplus 模式下,执行赋予权限命令:

grant restricted session TO "C##ROXY122" container=all;

然后执行命令,赋予建表权限:

GRANT CREATE TABLE TO <username> CONTAINER=ALL;

执行后查询是否还有建表权限:

SELECT PRIVILEGE FROM USER_SYS_PRIVS WHERE PRIVILEGE = 'CREATE TABLE';

此时可以正常建表。

7. 后续步骤编辑

在配置好数据库后,即可完成数据源配置。

需要在使用数据管道进行实时同步任务配置前,在 FineDataLink 中配置好需要同步的源端和目标端数据库数据连接,以便在同步任务配置过程中,通过选择数据源名称来控制同步任务,详情参见:配置数据连接

此时需要注意的是,如果数据来源为 PDB,则创建的数据连接所选数据库需要是 PDB 模式数据库,需要如下图所示:

然后设置数据管道任务即可,详情参见:配置数据管道任务

8. 注意事项编辑

归档日志会占用较多的磁盘空间,若磁盘空间满了会影响业务,请定期清理过期归档日志,详情参见:清理Oracle归档日志