#DBMS_YSTREAM_ADM
DBMS_YSTREAM_ADM包提供了一组内置函数,用于数据变更捕获(CDC,Change Data Capture)解析数据库附加日志,并通过不同函数对YStream服务进行创建、调整配置、启停以及删除等管理操作。
Note:
- 该高级包不适用于分布式部署。
- 执行该高级包的用户需具备YSTREAM_CAPTURE权限。
使用YStream服务的前提条件如下:
创建YStream服务前,必须先按需合理配置STREAM_POOL_SIZE值。
创建YStream服务前,必须先开启归档模式(ARCHIVELOG)。
创建YStream服务前,建议先开启附加日志(库级或表级)。若不开启,则只能解析已有日志中的附加信息,且在已有YStream服务时再开启附加日志会报错。
YStream服务通过状态标示其运行情况,且在不同状态下允许对其执行的管理操作略有不同,YStream服务的状态、类型等信息均可通过查询V$YSTREAM_SERVER视图获取。
| 状态 | 描述 | 允许执行的操作 |
|---|---|---|
| CREATED | 初始状态,表示YStream服务已创建但未启动 | * ADD_TABLES:新增解析表名和模式 * DROP_TABLES:删除解析表名和模式 * SET_PARAMETER:设置参数 * START:启动YStream服务 * DROP:删除YStream服务 |
| STARTED | 表示YStream服务已启动,等待客户端连接至启动实例 | 启动YStream服务的实例允许: * ADD_TABLES:新增解析表名和模式 * STOP:停止YStream服务 启动YStream服务的实例离线时,集群其他实例允许: * STOP:停止YStream服务 |
| RUNNING | * 表示客户端已连接,YStream服务在当前实例运行中 * 表示当前实例正在执行TEST函数 | 启动YStream服务的实例允许: * ADD_TABLES:新增解析表名和模式 * STOP:停止YStream服务 启动YStream服务的实例离线时,集群其他实例允许: * STOP:停止YStream服务 |
| STOPPED | 表示YStream服务已停止 | * ADD_TABLES:新增解析表名和模式 * DROP_TABLES:删除解析表名和模式 * SET_PARAMETER:设置参数 * START:启动YStream服务 * DROP:删除YStream服务 |
# CREATE
DBMS_YSTREAM_ADM.CREATE(
server_name IN VARCHAR(64),
connect_user IN VARCHAR(64) DEFAULT NULL,
start_scn IN BIGINT DEFAULT NULL
);
CREATE函数用于新建一个YStream服务。
YStream服务创建时,会记录日志解析起始点。若数据库已开启归档,不论YStream服务处于何种状态,日志解析起始点后的所有未被解析的归档都不会自动清理。若无需再使用某个服务对应的日志解析,请及时删除不必要的YStream服务,以免妨碍数据库自动清理归档,造成存储空间浪费。
函数使用规则:
- YStream服务数量上限:
- 单机部署中,每个实例最多创建32个YStream服务。
- 共享集群部署中,每个集群最多创建32个YStream服务,各服务可以运行在集群的任意实例上。
- 在HA环境中,仅允许在主库调用该函数。
| 参数 | 描述 |
|---|---|
| server_name | YStream服务的名称,不能与已有服务名冲突,该参数不能为NULL |
| connect_user | 允许连接该YStream服务的数据库用户,指定用户必须具备YSTREAM_CAPTURE权限,设置为NULL表示允许所有数据库用户连接 |
| start_scn | 日志解析的起始点,设置为NULL表示从当前位置开始 如果start_scn位于一个DDL事务中间,则只能解析到该DDL事务在start_scn之后的部分日志,YStream无法通过不完整的DDL解析构建元数据,后续与该DDL相关的日志均无法解析而被忽略。如遇此种场景,需重新创建YStream服务,指定新的start_scn,以避免start_scn在某个DDL事务内部 您可以在创建和启动YStream服务后,调用TEST函数测试start_scn是否合适 |
示例(单机、共享集群部署)
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函数用于为已有YStream服务新增解析表名和模式。
函数使用规则如下:
- 执行该操作的目标YStream服务的状态等要求请查阅服务状态介绍。
- 在HA环境中,仅允许在主库调用该函数。
- 若不执行ADD_TABLES或执行ADD_TABLES时将table_names和schemas参数均设置为空字符串,表示不做任何过滤,解析所有表和模式。
- 系统不会校验table_names和schemas参数所传入的表名和schema名称是否存在,方便扩展配置(预先将规划中暂未创建的表或schema加至YStream服务)。
- 允许table_names和schemas参数传入重复的表名、shcema名称,系统会自动去重,且不会报错。
- 允许为同一YStream服务多次新增解析表名和模式,最终结果将为多次操作的之和(系统自动去重后的并集)。
| 参数 | 描述 |
|---|---|
| server_name | YStream服务的名称,该参数不能为NULL |
| table_names | 添加的表名清单,若表名或schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个表名以,分隔,每个服务最多支持1000000个表。指定表名时可以指定表所在的模式,例如'sales.tab',表的默认模式为当前模式。若不指定表名,请传入NULL |
| schemas | 添加的模式清单,若schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个模式以,分隔,每个YStream服务最多支持10000个模式。若不指定模式,请传入NULL |
示例(单机、共享集群部署)
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函数用于为YStream服务删除表名、模式。
函数使用规则如下:
- 执行该操作的目标YStream服务的状态等要求请查阅服务状态介绍。
- 在HA环境中,仅允许在主库调用该函数。
- 系统不会校验table_names和schemas参数所传入的表名和schema名称是否存在。
- 允许table_names和schemas参数传入重复的表名、shcema名称,系统会自动去重,且不会报错。
|参数| 描述 |
| :---- |:-----------|
|server_name|YStream服务的名称,该参数不能为NULL|
|table_names|删除的表名清单,若表名或schema名称中存在空格、逗号等特殊字符需使用双引号
""包围,多个表名以,分隔。指定表名时可以指定表所在的模式,例如'sales.tab',表的默认模式为当前模式。若不指定表名,请传入NULL| |schemas|删除的模式清单,若schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个模式以,分隔。若不指定模式,请传入NULL|
示例(单机、共享集群部署)
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函数用于为已有服务设置参数。
函数使用规则如下:
- 执行该操作的目标服务的状态等要求请查阅服务状态介绍。
- 在HA环境中,仅允许在主库调用该函数。
| 参数 | 描述 |
|---|---|
| server_name | YStream服务的名称,该参数不能为NULL |
| parameter | 参数名,该参数不能为NULL |
| value | 参数值,应在取值范围内,该参数不能为NULL |
支持设置以下参数:
| 参数名 | 取值范围 | 默认值 | 描述 |
|---|---|---|---|
| PARALLELISM | [1,128] | 1 | Redo解析线程并发数,指定1个YStream服务中解析1个实例日志的并发线程数 * 共享集群部署中,YStream服务需同时解析所有实例的日志,在M个实例的集群中,启动一个并行度为N的YStream服务,该服务创建的日志解析线程数为 M*N* 单机部署中,YStream服务仅需解析当前实例的日志,启动一个并行度为N的YStream服务,该服务创建的日志解析线程数= 1*N并发数设置过高会消耗更多资源,可能触发操作系统的线程数限制,请合理配置或调整并发数 |
| 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函数用于启动一个已有YStream服务。
函数使用规则如下:
| 参数 | 描述 |
|---|---|
| server_name | YStream服务的名称,该参数不能为NULL |
示例(单机、共享集群部署)
EXEC DBMS_YSTREAM_ADM.START('server_1');
EXEC DBMS_YSTREAM_ADM.START('server_2');
# TEST
DBMS_YSTREAM_ADM.TEST(
server_name IN VARCHAR(64),
target_scn IN BIGINT
);
TEST函数用于测试一个已有YStream服务的start_scn是否合适,测试过程中不会产生逻辑日志,客户端无需连接服务端。
该函数会从YStream服务的日志解析的起始点start_scn开始扫描redo文件直至用户给定的目标target_scn,检测start_scn是否处于某个DDL事务的过程中。
如果测试过程中发现一个DDL事务commit日志,但该DDL的事务begin scn在当前YStream服务的start_scn之前,则无法完整解析该DDL,相应元数据无法被正确维护,解析将无法继续。此时需要重新创建YStream服务并指定合适的start_scn,避免start_scn处于某个DDL事务的过程中。
函数使用规则如下:
- 执行该操作的目标YStream服务的状态等要求请查阅服务状态介绍。
- 每个YStream服务对应的客户端仅允许连接到启动该服务的实例,后续使用中如需切换连接,需先停止该服务再通过目标实例重新启动YStream服务。
| 参数 | 描述 |
|---|---|
| server_name | YStream服务的名称,该参数不能为NULL |
| target_scn | 测试结束点对应的SCN,可以指定为当前数据库最新的SCN,该参数不能为NULL |
示例(单机、共享集群部署)
EXEC DBMS_YSTREAM_ADM.TEST('server_1', 563517721634005992);
# STOP
DBMS_YSTREAM_ADM.STOP(
server_name IN VARCHAR(64),
force IN BOOL DEFAULT FALSE
);
STOP函数用于停止一个已有YStream服务。
函数使用规则如下:
- 执行该操作的目标YStream服务的状态等要求请查阅服务状态介绍。
- 在共享集群部署中,同一YStream服务的启停通常要求在同一个实例上操作,除非对应实例不可用(例如已离线)方才允许在其他实例上停止该服务。若为主备集群部署,则始终不允许在备集群实例停止主集群实例启动的YStream服务。
| 参数 | 描述 |
|---|---|
| server_name | YStream服务的名称,该参数不能为NULL |
| force | 强制停止YStream服务。当连接到备库,备库与备库断连时,忽略错误直接停止YStream服务,系统表中状态不会发生变化 |
示例(单机、共享集群部署)
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函数用于删除一个已有YStream服务。
函数使用规则如下:
- 执行该操作的目标YStream服务的状态要求请查阅服务状态介绍。
- 在HA环境中,仅允许在主库调用该函数。
| 参数 | 描述 |
|---|---|
| server_name | YStream服务的名称,该参数不能为NULL |
示例(单机、共享集群部署)
EXEC DBMS_YSTREAM_ADM.DROP('server_1');

