在运行DMDRS服务前,数据库管理员需要对数据库做如下准备工作。
| 配置服务 | 准备工作 |
|---|---|
| 源DMDRS |
|
| 目标DMDRS |
|
| DMDSS | 无 |
为了保证源DMDRS服务运行中数据的一致性,源DMDRS服务需要读源数据库的归档和逻辑日志,因此源数据库需要开启归档和逻辑日志功能。数据库管理员可按下列方式进行配置。
逻辑日志中,最小附加日志是必须启用项。库级的支持全列附加日志和主键附加日志,表级的支持全列附加日志、主键附加日志和无条件记录的自定义日志组附加日志。后续的步骤以库级全列为示例讲解。
注意修改数据库为归档模式需重启数据库服务,生产环境中需确认能否停机维护。
使用SQL*Plus登录到源数据库。
$ sqlplus / as sysdba
查看数据库归档模式是否开启。若数据库已经开启归档模式,则跳过步骤3~步骤7。
SQL> archive log list;
暂停数据库服务。
SQL> shutdown immediate;
以mount方式启动Oracle数据库服务。
SQL> startup mount;
开启数据库归档,并设置归档文件路径。
SQL> alter database archivelog;
SQL> alter system set db_recovery_file_dest='';
SQL> alter system set log_archive_dest='/oradata/arch';
重启数据库,使归档路径生效。
SQL> shutdown immediate;
SQL> startup mount;
将数据库切换到正常的工作状态。
SQL> alter database open;
查看数据库最小附加日志及全列日志是否开启。若数据库已经开启最小附加日志及全列日志,则跳过步骤9。
SQL> select supplemental_log_data_min from v$database;
SQL> select supplemental_log_data_all from v$database;
开启数据库最小附加日志及全列日志。
SQL> alter database add supplemental log data;
SQL> alter database add supplemental log data (ALL) columns;
Oracle 12c及以上版本需要开启enable_goldengate_replication参数。
SQL> alter system set enable_goldengate_replication = TRUE;
查看日志数据块校验是否开启。若已经开启数据块校验,则跳过步骤12。
SQL> select name, value from v$parameter where name = 'db_block_checksum';
开启日志数据块校验。
SQL> alter system set db_block_checksum = TYPICAL scope = BOTH;
请源数据库管理员和目标数据库管理员分别创建数据库同步用户DMDRS,并赋予同步所需权限。建议源数据库DMDRS用户不赋予DBA权限,仅赋予同步所需的最小权限即可,建议目标数据库DMDRS用户赋予DBA权限,为确保同步的正确性,仍需赋予DMDRS用户同步所需的最小权限,最小权限配置具体请参见3.3 配置数据库同步用户最小权限章节。
说明
- 如果数据库管理员已赋予DMDRS同步用户DBA权限,由于DBA权限中不一定包含最小权限中的所有权限,仍需配置数据库同步用户最小权限。
- 目标数据库管理员须先创建表空间DMDRS,再创建数据库同步用户DMDRS并指定表空间为DMDRS。
- 当数据库为容器数据库时使用公共用户登录,根据Oracle规定公共用户名须以C##开头。
- 在双向同步场景下,Oracle容器数据库的登录用户需为本地用户。
- 数据库同步用户DMDRS创建完成后,如果需要在用户下进行DDL和DML操作,需要数据库管理员赋予相应的操作权限。
DMDRS服务运行过程中,使用的数据库同步用户需要一定的权限访问数据库数据,为确保同步的正确性,数据库管理员可根据应用场景配置数据库同步用户的最小权限。
赋予Oracle源数据库同步用户最小权限的脚本示例请参见 8.2.1 Oracle源数据库同步用户最小权限脚本示例,具体的权限说明如下表所示。
说明当使用容器数据库且以公共用户登录时,需要将权限传递到所有可插拔数据库。权限示例如下:
- 赋予C##DMDRS用户会话权限,并传递到可插拔数据库。
GRANT CONNECT TO C##DMDRS CONTAINER=ALL;- 赋予C##DMDRS用户查询SYS.OBJ$表权限。先切换到对应的可插拔数据库,再授权(以PDB1为例):
ALTER SESSION SET CONTAINER=PDB1;
GRANT SELECT ON SYS.OBJ$ TO C##DMDRS;
| 权限类别 | 权限说明 | 权限 |
|---|---|---|
| 基础权限 | 需要创建会话权限。 | 需要赋予如下权限:CONNECT |
| 装载相关权限 | 需要非同步用户下待装载表/序列的查询权限。 | 需要赋予如下权限:SELECT ON <待装载表/序列的模式名>.<待装载表名/序列名> |
| 需要如下系统表、系统字典及动态视图的权限。 | 需要赋予如下对象的查询权限: SYS.OBJ$、SYS.TAB$、SYS.USER$、SYS.NTAB$、SYS.SEG$、SYS.EXTERNAL_TAB$、DBA_CONS_COLUMNS、DBA_CONSTRAINTS、SYS.COLTYPE$、SYS.TYPE$、SYS.ATTRIBUTE$、SYS.COLLECTION$、SYS.PARTOBJ$、SYS.COM$、V_$DATABASE、SYS.CON$、SYS.IND$、SYS.COL$、SYS.CCOL$、SYS.TS$、SYS.DEFERRED_STG$、SYS.TABPART$、SYS.TABCOMPART$、SYS.SUBPARTCOL$、SYS.SEQ$(装载序列)、DBA_INDEXES(装载索引)、DBA_IND_COLUMNS(装载索引)、SYS.PARTCOL$(装载分区表)、SYS.DEFSUBPART$(装载分区表)、SYS.SOURCE$、SYS.TYPED_VIEW$(装载视图)、SYS.VIEW$(装载视图)、SYS.SYN$(装载同义词)、SYS."_ALL_SYNONYMS_TREE"(装载同义词)、V_$CONTAINERS(Oracle 12c及以上版本且带有容器的数据库)、DBA_EXTENTS、SYS.SNAP$、V_$PARAMETER、SYS.TRIGGER$、SYS.V_$THREAD、V_$DATABASE_INCARNATION、V_$TRANSACTION(单机)、V_$LOCKED_OBJECT(单机)、GV_$TRANSACTION(RAC)、GV_$LOCKED_OBJECT(RAC)、DBA_PART_INDEXES、SYS.SUM$、SYS.LOBCOMPPART$、SYS.PARTLOB$、SYS.ATTRCOL$、SYS.ECOL$、SYS.ICOL$、SYS.METHOD$、SYS.RESULT$、SYS.PARAMETER$、SYS.PLAN_TABLE$、V_$MANAGED_STANDBY(Oracle DG且源DMDRS部署在备数据库)、V_$DATAGUARD_CONFIG(Oracle DG且源DMDRS部署在备数据库) | |
| 需要锁表权限。 | 需要赋予如下权限:LOCK ANY TABLE | |
| 装载使用FLASHBACK掩码,需要闪回权限。 | 需要赋予如下权限:FLASHBACK ANY TABLE | |
| 同步相关权限 | 需要获取系统SCN权限。 | 需要赋予如下权限:EXECUTE ON DBMS_FLASHBACK |
| 需要系统表、系统字典及动态视图的查询权限。 | 需要赋予如下对象的查询权限: SYS.COL$、SYS.LOB$、SYS.TABPART$、SYS.TABCOMPART$、SYS.LOBFRAG$ 、V_$LOGFILE、V_$LOG、V_$ARCHIVED_LOG、SYS.CDEF$、SYS.TABSUBPART$、SYS.CCOL$、SYS.TS$、SYS.TYPE$、SYS.ATTRIBUTE$、SYS.COLLECTION$、V_$SESSION、V_$SESSTAT、V_$STATNAME、V_$INSTANCE、GV_$INSTANCE、V_$STANDBY_LOG(Oracle DG且源DMDRS部署在备数据库) | |
| 若需要同步XMLTYPE类型的数据,需要将XDB模式下XDB$TTSET、表名开头为X$NM和X$QN的表的查询权限赋予用户。若使用可插拔数据库,管理员用户需先切换到可插拔数据库再授权。 | 需要赋予如下对象的查询权限: XDB.XDB$TTSET、XDB.<以X$NM开头的表名>、XDB.<以X$QN开头的表名> |
Oracle目标数据库同步用户最小权限
赋予Oracle目标数据库同步用户最小权限的脚本示例请参见8.2.2 Oracle目标数据库同步用户最小权限脚本示例,具体的权限说明如下表所示。
| 权限类别 | 权限说明 | 权限 |
|---|---|---|
| 基础权限 | 启动时需要在目标数据库中创建辅助表和辅助存储过程。 | 需要赋予如下权限:RESOURCE |
| 连接数据库时需要创建会话。 | 需要赋予如下权限:CONNECT | |
| 启动时需要查询数据库的相关参数信息。 | 需要赋予如下对象的查询权限:V_$INSTANCE、V_$PARAMETER、GV_$LOCK、GV_$SESSION、DBA_TAB_PARTITIONS | |
| 装载与同步相关权限 | 需要系统表、系统字典及动态视图的查询权限。 | 需要赋予如下对象的查询权限: SYS.OBJ$、SYS.USER$、SYS.COL$、SYS.COLTYPE$、SYS.CCOL$、SYS.CDEF$、SYS.ATTRCOL$、DBA_IND_COLUMNS、DBA_INDEXES、SYS.IND$、SYS.SEQ$、DBA_TAB_SUBPARTITIONS、DBA_CONSTRAINTS、GV_$INSTANCE、V_$DATABASE、SYS.PARTOBJ$ |
| 需要非同步用户模式下已存在的待同步表/序列的操作权限。 | 需要赋予如下权限: INSERT|UPDATE|DELETE ON <目标表的模式名>.<目标表名> SELECT ON <目标序列的模式名>.<目标序列名> | |
| 需要非同步用户模式下未存在的表/序列的数据的操作权限。也可以在目标同步表创建后,同上行所述单独为每张表赋予操作权限。 | 需要赋予如下权限: INSERT|UPDATE|DELETE|SELECT ANY TABLE SELECT|ALTER ANY SEQUENCE | |
| 需要非同步用户模式下对象的DDL权限。 | 需要赋予如下权限: CREATE|ALTER|DROP ANY <对象类型> | |
| 需要自定义类型对象的查询权限。 | 需要赋予如下对象的查询权限: SYS.TYPE$、SYS.ATTRIBUTE$、SYS.COLLECTION$ | |
| 同步用户创建时未指定表空间且未配额时,需要修改用户表空间配额。 | ALTER USER DMDRS QUOTA UNLIMITED ON USERS; |
DM8目标数据库同步用户最小权限
赋予DM8目标数据库同步用户最小权限的脚本示例请参见8.2.3 DM8目标数据库同步用户最小权限脚本示例,具体的权限说明如下表所示。
| 权限类别 | 权限说明 | 权限 |
|---|---|---|
| 基础权限 | 目标DMDRS在执行DML时需要数据操作权限。 | 需要赋予如下权限:PUBLIC |
| 目标DMDRS在启动时需要在目标数据库中创建辅助表和辅助存储过程。 | 需要赋予如下权限:RESOURCE | |
| 目标DMDRS在启动时需要查询数据库的相关参数信息、系统表字典信息。 | 需要赋予如下权限:SOI、VTI | |
| 目标DMDRS在启动时需要同步用户有创建会话的权限。 | 需要赋予如下权限:CREATE SESSION | |
| 装载与同步相关权限 | 若需要同步在非同步用户模式下已存在的表/序列的数据,需要赋予在待同步表/序列上的DML权限或查询权限。 | 需要赋予如下权限: INSERT|UPDATE|DELETE ON <目标表的模式名>.<目标表名> SELECT ON <目标序列的模式名>.<目标序列名> |
| 若需要同步在非同步用户模式下未存在的表/序列的数据,可以先在装载时使用CREATE掩码同步创建表/序列DDL语句,然后赋予该表/序列的DML权限或查询权限。也可为同步用户赋予在所有表/序列上的DML权限或查询权限。 | 需要赋予如下权限: INSERT|UPDATE|DELETE|SELECT ANY TABLE SELECT ANY SEQUENCE | |
| 若需要同步在非同步用户模式下表的注释,需要赋予创建表注释的权限。 | 需要赋予如下权限: COMMENT ANY TABLE | |
| 若需要同步在非同步用户模式下的对象的DDL语句,需要赋予相应的DDL权限。 注:装载表时需要赋予TABLE和INDEX的权限。授予ANY权限前,需先执行语句“ALTER SYSTEM SET 'ENABLE_DDL_ANY_PRIV'=1 BOTH;”开启ANY的授权权限。 |
需要赋予如下权限: CREATE|ALTER|DROP ANY <对象类型> | |
| 若需要非模式对象(表空间、用户、角色和公共同义词)的DDL操作权限,需要赋予同步用户相应的DDL权限。其中角色和公共同义词不需要ALTER权限。 | 需要赋予如下权限: CREATE|ALTER|DROP <对象类型> | |
| 若需要同步在非同步用户模式下的非表对象的DDL语句或源DMDRS的DDL_MASK配置SQL掩码情况下同步对象的DDL语句,需要赋予同步用户辅助存储过程的执行权限以及非同步用户下模式所属用户的存储过程的创建权限。 | 需要赋予如下权限: EXECUTE ON PROCEDURE "DRS_$DDL_SQL_PROC" CREATE PROCEDURE TO <非同步用户下模式所属的用户> |
说明
- 对于旧版本DM8无SOI、VTI权限的情况,使用同等权限的对象查询权限即可。 SYS.V$DM_INI V$IFUN SYS.V$LOCK SYS.V$SESSIONS
- 对于旧版本DM8无CREATE SESSION权限的情况,删除该权限即可。
PostgreSQL目标数据库同步用户最小权限
赋予PostgreSQL目标数据库同步用户最小权限的脚本示例请参见8.2.4 PostgreSQL目标数据库同步用户最小权限脚本示例,具体的权限说明如下表所示。
| 权限类别 | 权限说明 | 权限 |
|---|---|---|
| 基础权限 | 启动时需要在dbname参数指定的目标库下创建辅助表和辅助存储过程。 | 需要赋予如下权限: CREATE ON DATABASE <目标库名> |
| 连接数据库时需要创建会话(用户创建时默认授予)。 | 需要赋予如下权限:CONNECT ON DATABASE <目标库名> | |
| 装载与同步相关权限 | 需要public模式下辅助表的操作权限。 | 需要赋予如下权限: USAGE ON SCHEMA public INSERT|UPDATE|DELETE|SELECT ON ALL TABLES IN SCHEMA public |
| 需要目标数据库中已存在的待同步表上的操作和查询权限。 | 需要赋予如下权限: USAGE ON SCHEMA <目标表的模式名> INSERT|UPDATE|DELETE|SELECT ON <目标表的模式名>.<目标表名> | |
| 需要目标数据库中未存在的待同步表上的操作和查询权限。也可以在目标同步表创建后,同上行所述单独为每张表赋予操作和查询权限。 | 需要赋予如下权限: USAGE ON SCHEMA <目标表的模式名> INSERT|UPDATE|DELETE|SELECT ON ALL TABLES IN SCHEMA <目标表的模式名> | |
| 需要非同步用户模式下未存在的表/序列的数据的操作权限。也可以在目标同步表创建后,同上行所述单独为每张表赋予操作权限。 | 需要赋予如下权限: USAGE ON SCHEMA <目标表的模式名> INSERT|UPDATE|DELETE|SELECT ON ALL TABLES IN SCHEMA <目标表的模式名> | |
| 需要目标数据库中待同步对象的DDL权限。 | 需要赋予如下权限: CREATE ON SCHEMA <目标模式名> |
Oracle XStream包含一组相关数据库组件和应用程序接口(API),客户端应用可通过这些组件和API接口接收Oracle数据库的数据变更,并支持将这些变更发送至Oracle数据库或者其他系统。XStream包含两个主要的组件:XStream Out和XStream In。其中XStream Out提供相关数据库组件和API,支持通过API获取数据库变更,这些变更包括DML和DDL。XStream In提供相关数据库组件和API,支持将数据库变更应用至Oracle目标数据库。
DMDRS支持通过XStream Out获取Oracle源数据库的数据变更,并将这些数据实时同步至目标数据库系统。本章节主要介绍如何为Oracle数据库开启XStream模式的CDC功能,另外根据Oracle数据库类型为CDB数据库还是非CDB数据库,Oracle XStream配置有所区别。
Oracle数据库需具备OGG License(无需安装OGG)。
装载含大对象的表不能使用分组装载功能。
配置XStream后,归档日志会占用较多的磁盘空间,若磁盘空间满会影响业务,请定期清理过期归档日志。
Oracle数据库需要支持enable_goldengate_replication参数,仅支持12c以上版本。
含大对象表不支持ROWID_ASSIST、ROW_HASH执行功能掩码。
建议由数据库管理员进行Oracle XStream功能的配置操作。
参考3.1 开启源数据库的归档和逻辑日志章节。
SQL> alter system set enable_goldengate_replication = TRUE;
以sys用户连接到Oracle数据库实例,执行如下SQL。
CREATE TABLESPACE xstream_tbs datafile '/opt/app/oracle/oradata/orcl/xstream_tbs.dbf' size 25M reuse autoextend on maxsize unlimited;
CREATE USER xstrmadmin identified by password default tablespace xstream_tbs quota unlimited on xstream_tbs;
GRANT CREATE SESSION to xstrmadmin;
BEGIN
DBMS_XSTREAM_AUTH.GRANT_ADMIN_PRIVILEGE(
grantee => 'xstrmadmin ',
privilege_type => 'CAPTURE',
grant_select_privileges => TRUE
);
END;
xstream_tbs为XStream管理员用户的表空间名,请根据实际规划配置。
/opt/app/oracle/oradata/orcl/xstream_tbs.dbf为XStream管理员用户的表空间文件,请根据实际规划设置。
xstrmadmin为XStream管理员用户名,请根据实际规划设置。
password为XStream管理员用户密码,请根据实际规划设置。
如果使用上述XStream管理员用户作为DMDRS同步用户,参考配置数据库同步用户最小权限章节继续配置其他权限。
以XStream管理员用户连接数据库服务器,执行如下命令。
DECLARE
tables DBMS_UTILITY.UNCL_ARRAY;
schemas DBMS_UTILITY.UNCL_ARRAY;
BEGIN
tables(1) := NULL;
schemas(1) := 'DMDRS_TEST';
DBMS_XSTREAM_ADM.CREATE_OUTBOUND(
server_name => 'xout',
table_names => tables,
schema_names =>schemas
);
END;
DMDRS_TEST为要同步数据表所在的模式,也即XStream需要捕获哪个模式下的数据,请根据实际情况设置。
xout为出站服务器名称,需保证唯一,请根据实际情况设置。
tables设置为NULL表示捕获模式下的全部表,如果要指定表,可以配置表名称。
其他具体配置规则,可参考相关Oracle XStream官方手册说明。
建议由数据库管理员进行Oracle XStream功能的配置操作。
参考3.1 开启源数据库的归档和逻辑日志章节。
SQL> alter system set enable_goldengate_replication = TRUE;
以sys用户连接到Oracle数据库实例,执行如下SQL,如果包含多个PDB,则每个PDB都需要创建对应表空间。
CREATE TABLESPACE xstream_tbs datafile '/opt/app/oracle/oradata/orcl/xstream_tbs.dbf' size 25M reuse autoextend on maxsize unlimited;
alter session set container = ORCLPDB1;
CREATE TABLESPACE xstream_tbs datafile '/opt/app/oracle/oradata/ORCLPDB/ORCLPDB1/xstream_tbs.dbf' size 25M reuse autoextend on maxsize unlimited;
alter session set container = cdb$root;
CREATE USER c##xstrmadmin identified by password default tablespace xstream_tbs quota unlimited on xstream_tbs container = all;
GRANT CREATE SESSION, SET CONTAINER to c##xstrmadmin container = all;
BEGIN
DBMS_XSTREAM_AUTH.GRANT_ADMIN_PRIVILEGE(
grantee => 'c##xstrmadmin ',
privilege_type => 'CAPTURE',
grant_select_privileges => TRUE,
container => 'ALL'
);
END;
xstream_tbs为XStream管理员用户的表空间名,请根据实际规划配置。
/opt/app/oracle/oradata/orcl/xstream_tbs.dbf为CDB中XStream管理员用户的表空间文件,请根据实际规划设置。
ORCLPDB1为PDB数据库的名称。
/opt/app/oracle/oradata/ORCLPDB/ORCLPDB1/xstream_tbs.dbf为PDB中XStream管理员用户的表空间文件,请根据实际规划设置。
c##xstrmadmin为XStream管理员用户名,请根据实际规划设置。
password为XStream管理员用户密码,请根据实际规划设置。
如果使用上述XStream管理员用户作为DMDRS同步用户,参考配置数据库同步用户最小权限章节继续配置其他权限。
以XStream管理员用户c##xstrmadmin连接数据库服务器,执行如下命令。
DECLARE
tables DBMS_UTILITY.UNCL_ARRAY;
schemas DBMS_UTILITY.UNCL_ARRAY;
BEGIN
tables(1) := NULL;
schemas(1) := 'DMDRS_TEST';
DBMS_XSTREAM_ADM.CREATE_OUTBOUND(
server_name => 'xout',
table_names => tables,
schema_names =>schemas
);
END;
DMDRS_TEST为要同步数据表所在的模式,也即XStream需要捕获哪个模式下的数据,请根据实际情况设置。
xout为出站服务器名称,需保证唯一,请根据实际情况设置。
tables设置为NULL表示捕获模式下的全部表,如果要指定表,可以配置表名称。
其他具体配置规则,可参考相关Oracle XStream官方手册说明。
在源DMDRS配置文件中cpt标签下新增如下两个参数:
<login>
<outbound_name>xout</outbound_name>
</login>
<cpt_mask>net_read</cpt_mask>
xout即为上述配置的XStream出站服务器名称。
net_read表示远程读取,启用DMDRS Oracle XStream数据实时同步。
在配置和运行DMDRS服务前,需要对DMDRS做如下准备工作。
在配置DMDRS服务前,需规划DMDRS服务的Manager模块的端口号,包括源DMDRS、目标DMDRS服务和DMDSS服务的Manager模块的端口号。
注意不同的应用场景,DMDRS所包括的DMDRS服务不同。不同的服务如果部署在同一台服务器上,必须确保不同服务的Manager模块的端口号的唯一性。
说明DMDRS的运行用户与安装用户使用同一个用户dmdrs,安装用户请参见《DMDRS安装手册》。
DMDRS运行用户需要以下权限:
Windows:运行用户具有管理员权限。
Linux/Unix系统:运行用户具有DMDRS服务所在目录及子目录的读、写和执行权限。源DMDRS的运行用户应同数据库归档文件目录属同一用户组,该用户组对归档文件所在目录及子目录有读权限。
DMDRS服务运行过程中,需要使用数据库的驱动文件访问数据库数据。
源DMDRS服务:需要使用OCI驱动文件访问Oracle源数据库数据,用户需要在源DMDRS服务器的环境变量中添加OCI驱动文件路径。
目标DMDRS服务:需要使用目标数据库对应的驱动文件访问目标数据库数据,用户需要在目标DMDRS服务器的环境变量中添加各数据库对应的驱动文件路径。
不同数据库对应的驱动如下所示。
DM8数据库:DMDPI驱动
Oracle数据库:OCI驱动
Kafka:librdkafka驱动
PostgreSQL数据库:ODBC驱动
说明
- 设置环境变量前,请确保源DMDRS与目标DMDRS服务器上已安装数据库的驱动,且驱动版本与数据库版本相匹配。
- 设置环境变量前,请向数据库管理员获取数据库驱动路径。
- 由于操作系统、终端不同,设置环境变量命令或操作步骤会略有差异。
以设置Oracle数据库的OCI驱动的环境变量为例,介绍常用操作系统下设置环境变量的方法。
Linux系统
在终端的配置文件中添加设置环境变量命令。
export LD_LIBRARY_PATH=<OCI驱动路径>:$LD_LIBRARY_PATH
UNIX系统
在终端的配置文件中添加设置环境变量命令。
export LIBPATH=<OCI驱动路径>:$LIBPATH
Windows系统
在Windows桌面或“开始”菜单,右键单击“此电脑”,选择“属性”。
在打开的“设置”窗口中,选择“高级系统设置”。
在弹出的“系统属性”对话框的“高级”选项卡中,选择“环境变量”。
在“环境变量”对话框中,选择“系统变量”中系统变量“Path”,再选择“系统变量”下的“编辑”。
在“编辑环境变量”表格中,填写“OCI驱动路径”。
文章
阅读量
获赞
