1. 概述
需要规划一个可访问数据源的账号,用于后续数据管道过程中访问数据源并进行数据提取、写入的同步操作。
创建账号操作详情请参见: 创建 Oracle 账号
2. 场景一:非PDB必做
提示:需要参考本章内容进行操作的场景:
1)Oracle 10g、11g
2)12c、18c、19c、21c、Oracle RAC集群:非 PDB 架构都需要做
2.1 创建用户账户并分配权限
用户根据实际的数据库版本,参考下面文档进行操作。
2.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,则数据连接如下图所示:

2.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 权限。
2.2 检查用户权限
注:Oracle 11g 及以下版本不需要 LOGMINING 权限;但需要 DBMS_LOGMNR 和 DBMS_LOGMNR_D 这两个权限,这两个权限一般默认开启,若用户之前关闭过这两个权限,自行百度开启。
输入以下命令检查判断当前用户是否有 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',
'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_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 则是有权限。

对于缺乏的权限,需要进行开启。
3. 场景二:PDB架构必做
如果数据来源为 PDB ,则无法直接读取数据库的 redolog ,需要借助 CDB 来读取。
下面步骤判断连接用户是否为 Common User 以及是否拥有 Set Container 权限。
3.1 启动所有的 PDB
1)在 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 均开启:

3.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';

此时可以正常建表。
4. 后续步骤
在配置好数据库后,即可完成数据源配置。
需要在使用数据管道进行实时同步任务配置前,在 FineDataLink 中配置好需要同步的源端和目标端数据库数据连接,以便在同步任务配置过程中,通过选择数据源名称来控制同步任务,详情参见:配置数据连接
此时需要注意的是,如果数据来源为 PDB,则创建的数据连接所选数据库需要是 PDB 模式数据库,需要如下图所示:

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

