#DBMS_YSTREAM_ADM

DBMS_YSTREAM_ADM包提供了一组内置函数,用于数据变更捕获(CDC,Change Data Capture)解析数据库附加日志,并通过不同函数对解析服务进行创建、调整配置、启停以及删除等管理操作。

解析服务通过状态标示其运行情况,且在不同状态下允许对其执行的管理操作略有不同。

状态 描述 允许执行的操作
CREATED 服务的初始状态,表示服务已创建但未启动 * ADD_TABLES
* DROP_TABLES
* SET_PARAMETER
* START
* DROP
STARTED 表示服务已启动,等待客户端连接 STOP
RUNNING 表示客户端已连接,服务运行中 STOP
STOPPED 表示服务已停止 * ADD_TABLES
* DROP_TABLES
* SET_PARAMETER
* START
* DROP

DBMS_YSTREAM_ADM包仅适用于单机部署。

# CREATE

DBMS_YSTREAM_ADM.CREATE(
    server_name    IN  VARCHAR(64), 
    connect_user   IN  VARCHAR(64) DEFAULT NULL, 
    start_scn      IN  BIGINT DEFAULT NULL
);

CREATE函数用于新建一个服务,最多允许创建32个服务。

仅允许在主库调用该函数。

参数 描述
server_name 服务名,不能与已有服务名冲突,该参数不能为NULL
connect_user 允许连接该服务的数据库用户,指定用户必须具备YSTREAM_CAPTURE权限。设置为NULL表示允许所有数据库用户连接
start_scn 日志解析的起始点。设置为NULL表示从当前位置开始

示例(单机部署)

EXEC DBMS_YSTREAM_ADM.CREATE('server_1');
EXEC DBMS_YSTREAM_ADM.CREATE('server_2', 'sales');
EXEC DBMS_YSTREAM_ADM.CREATE('server_3', 'sales', 563517721634004992);
EXEC DBMS_YSTREAM_ADM.CREATE('server_4');
EXEC DBMS_YSTREAM_ADM.CREATE('server_5');

# ADD_TABLES

DBMS_YSTREAM_ADM.ADD_TABLES(
    server_name   IN  VARCHAR(64),
    table_names   IN  VARCHAR(4096),
    schemas       IN  VARCHAR(4096)
);

ADD_TABLES函数用于为已有服务新增解析表名和模式,对应服务必须处于允许执行当前操作的状态(可通过查询V$YSTREAM_SERVER视图获取服务的状态)。

仅允许在主库调用该函数,允许为同一服务多次新增解析表名和模式,最终结果将为多次操作的累加(重复的表和模式会自动去重)。

参数 描述
server_name 服务名,该参数不能为NULL
table_names 添加的表名清单,若表名或schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个表名以,分隔,每个服务最多支持10000个表。指定表名时可以指定表所在的模式,例如'sales.tab',表的默认模式为当前模式。该参数不能为NULL,若不指定表名,请传入空字符串''
schemas 添加的模式清单,若schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个模式以,分隔,每个服务最多支持100个模式。该参数不能为NULL,若不指定模式,请传入空字符串''

函数使用规则如下:

  • 若不执行ADD_TABLES或执行ADD_TABLES时将table_names和schemas参数均设置为空字符串,表示不做任何过滤,解析所有表和模式。
  • 系统不会校验table_names和schemas参数所传入的表名和schema名称是否存在,可用于过滤规划中暂未创建的表或schema。
  • 允许table_names和schemas参数传入重复的表名、shcema名称,系统会自动去重,且不会报错。

示例(单机部署)

EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_1', 'sales.employees', '');
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_2', 'sales.employees,sales.employees,sales.department,sales.branches', '');
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_3', '', 'schema1,schema2');
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_4', 'sales.department,sales.branches', '"schema{3}",schema4');
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_5', '', '');

# DROP_TABLES

DBMS_YSTREAM_ADM.DROP_TABLES(
    server_name   IN  VARCHAR(64), 
    table_names   IN  VARCHAR(4096),
    schemas       IN  VARCHAR(4096)
);

DROP_TABLES函数用于为已有服务删除表名、模式,对应服务必须处于允许执行当前操作的状态(可通过查询V$YSTREAM_SERVER视图获取服务的状态)。

仅允许在主库调用该函数。

参数 描述
server_name 服务名,该参数不能为NULL
table_names 删除的表名清单,若表名或schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个表名以','分隔。指定表名时可以指定表所在的模式,例如'sales.tab',表的默认模式为当前模式。该参数不能为NULL,若不指定表名,请传入空字符串''
schemas 删除的模式清单,若schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个模式以','分隔。该参数不能为NULL,若不指定模式,请传入空字符串''

函数使用规则如下:

  • 系统不会校验table_names和schemas参数所传入的表名和schema名称是否存在。
  • 允许table_names和schemas参数传入重复的表名、shcema名称,系统会自动去重,且不会报错。

示例(单机部署)

EXEC DBMS_YSTREAM_ADM.DROP_TABLES('server_1', 'sales.department,sales.branches', '');
EXEC DBMS_YSTREAM_ADM.DROP_TABLES('server_2', 'sales.department,sales.department', 'schema1,schema2');

# SET_PARAMETER

DBMS_YSTREAM_ADM.SET_PARAMETER(
    server_name   IN  VARCHAR(64), 
    parameter     IN  VARCHAR(64), 
    value         IN  VARCHAR(64)
);

SET_PARAMETER函数用于为已有服务设置参数,对应服务必须处于允许执行当前操作的状态(可通过查询V$YSTREAM_SERVER视图获取服务的状态)。

仅允许在主库调用该函数。

参数 描述
server_name 服务名,该参数不能为NULL
parameter 参数名,该参数不能为NULL
value 参数值,应在取值范围内,该参数不能为NULL

支持设置以下参数:

参数名 取值范围 默认值 描述
PARALLELISM [1,128] 1 Redo解析线程并发数,提高解析线程并发数可以提升性能但会消耗更多资源,请合理配置该值。
TXN_AGE_SPILL_THRESHOLD [1,100000] 600 LCR溢出触发的时间阈值,单位为秒。解析过程中,若某个事务长时间不提交,等待时间超过该值时该事务所有LCR会溢出到系统表进行持久化并释放内存,此类LCR所对应的日志无需再被重复解析,用户可自行按需清理归档日志。
TXN_LCR_SPILL_THRESHOLD [32K,1T] 128M LCR溢出触发的内存占用阈值,单位为字节。解析过程中,若某个事务所占内存超过该值,该事务所有LCR会溢出到系统表进行持久化并释放内存,此类LCR所对应的日志无需再被重复解析,用户可自行按需清理归档日志。
CHECKPOINT_INTERVAL [1,3600] 3 Checkpoint执行的间隔,单位为秒。每次Checkpoint会在系统表持久化最新的重启恢复点。客户端设置最新的applied position后,需要等待一个Checkpoint间隔才能被数据库感知。

示例(单机部署)

EXEC DBMS_YSTREAM_ADM.SET_PARAMETER('server_1', 'PARALLELISM', '3');

# START

DBMS_YSTREAM_ADM.START(
    server_name   IN  VARCHAR(64)
);

START函数用于启动一个已有服务,对应服务必须处于允许执行当前操作的状态(可通过查询V$YSTREAM_SERVER视图获取服务的状态)。

可在主库或备库执行,启动服务后客户端只允许连接到执行该指令的节点。如需将客户端连接到其他节点,需先在已启动的节点上停止服务,再在其他节点启动服务。

参数 描述
server_name 服务名,该参数不能为NULL

示例(单机部署)

EXEC DBMS_YSTREAM_ADM.START('server_1');
EXEC DBMS_YSTREAM_ADM.START('server_2');

# STOP

DBMS_YSTREAM_ADM.STOP(
    server_name   IN  VARCHAR(64),
    force         IN  BOOL DEFAULT FALSE
);

STOP函数用于停止一个已有服务,对应服务必须处于允许执行当前操作的状态(可通过查询V$YSTREAM_SERVER视图获取服务的状态)。

请在执行START函数的节点调用,如果启动节点不可用,请在主库停止。

参数 描述
server_name 服务名,该参数不能为NULL
force 强制停止服务。当连接到备库,备库与备库断连时,忽略错误直接停止服务,系统表中状态不会发生变化

示例(单机部署)

EXEC DBMS_YSTREAM_ADM.STOP('server_1');
EXEC DBMS_YSTREAM_ADM.STOP('server_2', TRUE);

# DROP

DBMS_YSTREAM_ADM.DROP(
    server_name   IN  VARCHAR(64)
);

DROP函数用于删除一个已有服务,对应服务必须处于允许执行当前操作的状态(可通过查询V$YSTREAM_SERVER视图获取服务的状态)。

仅允许在主库调用该函数。

参数 描述
server_name 服务名,该参数不能为NULL

示例(单机部署)

EXEC DBMS_YSTREAM_ADM.DROP('server_1');
pdf-btn 下载文档
copy-btn 复制链接